Spaces:
Runtime error
Runtime error
license: apache-2.0 | |
title: llmOS-Agent | |
sdk: docker | |
emoji: π | |
colorFrom: blue | |
colorTo: yellow | |
short_description: An LLM agent that can use a Linux VM to accomplish tasks. | |
hf_oauth: true | |
# llmOS-Agent | |
`llmOS-Agent` provides an asynchronous chat interface built around Ollama models. It supports running shell commands in an isolated Linux VM and persists conversations in SQLite. | |
## Features | |
- **Persistent chat history** β conversations are stored in `chat.db` per user and session so they can be resumed later. | |
- **Tool execution** β a built-in `execute_terminal` tool runs commands inside a Docker-based VM using `docker exec -i`. Network access is enabled and both stdout and stderr are captured (up to 10,000 characters). The VM is reused across chats when `PERSIST_VMS=1` so installed packages remain available. | |
- **System prompts** β every request includes a system prompt that guides the assistant to plan tool usage, verify results and avoid unnecessary jargon. | |
- **Gradio interface** β a web UI in `gradio_app.py` lets you chat and browse the VM file system. The Files tab now allows navigating any directory inside the container. | |
## Environment Variables | |
Several settings can be customised via environment variables: | |
- `DB_PATH` β location of the SQLite database (default `chat.db` in the project directory). | |
- `LOG_LEVEL` β logging verbosity (`DEBUG`, `INFO`, etc.). | |
- `VM_IMAGE` and `VM_STATE_DIR` control the Docker-based VM. | |
## Quick Start | |
```bash | |
python run.py | |
``` | |
The script issues a sample command to the model and prints the streamed response. Uploaded files go to `uploads` and are mounted in the VM at `/data`. | |
### Uploading Documents | |
```python | |
async with ChatSession() as chat: | |
path = chat.upload_document("path/to/file.pdf") | |
async for part in chat.chat_stream(f"Summarize {path}"): | |
print(part) | |
``` | |
## Discord Bot | |
1. Create a `.env` file with your bot token: | |
```bash | |
DISCORD_TOKEN="your-token" | |
``` | |
2. Start the bot: | |
```bash | |
python -m bot | |
``` | |
Attachments sent to the bot are uploaded automatically and the VM path is returned so they can be referenced in later messages. | |
## VM Configuration | |
The shell commands run inside a Docker container. By default the image defined by `VM_IMAGE` is used (falling back to `python:3.11-slim`). When `PERSIST_VMS=1` (default) each user keeps the same container across sessions. Set `VM_STATE_DIR` to choose where per-user data is stored on the host. | |
To build a more complete environment you can create your own image, for example using `docker/Dockerfile.vm`: | |
```Dockerfile | |
FROM ubuntu:22.04 | |
RUN apt-get update && \ | |
apt-get install -y --no-install-recommends \ | |
python3 \ | |
python3-pip \ | |
sudo \ | |
curl \ | |
git \ | |
build-essential \ | |
&& rm -rf /var/lib/apt/lists/* | |
CMD ["sleep", "infinity"] | |
``` | |
Build and run with: | |
```bash | |
docker build -t llm-vm -f docker/Dockerfile.vm . | |
export VM_IMAGE=llm-vm | |
python run.py | |
``` | |
## REST API | |
Start the API server either as a module or via `uvicorn`: | |
```bash | |
python -m api_app | |
# or | |
uvicorn api_app:app --host 0.0.0.0 --port 8000 | |
``` | |
### Endpoints | |
- `POST /chat/stream` β stream the assistant's response as plain text. | |
- `POST /upload` β upload a document that can be referenced in chats. | |
- `GET /sessions/{user}` β list available session names for a user. | |
- `GET /vm/{user}/list` β list files in a directory under `/data`. | |
- `GET /vm/{user}/file` β read a file from the VM. | |
- `POST /vm/{user}/file` β create or overwrite a file in the VM. | |
- `DELETE /vm/{user}/file` β delete a file or directory from the VM. | |
Example request: | |
```bash | |
curl -N -X POST http://localhost:8000/chat/stream \ | |
-H 'Content-Type: application/json' \ | |
-d '{"user":"demo","session":"default","prompt":"Hello"}' | |
``` | |
### Security | |
Set one or more API keys in the ``API_KEYS`` environment variable. Requests must | |
include the ``X-API-Key`` header when keys are configured. A simple rate limit is | |
also enforced per key or client IP, configurable via ``RATE_LIMIT``. | |
## Command Line Interface | |
Run the interactive CLI on any platform: | |
```bash | |
python -m src.cli --user yourname | |
``` | |
Existing sessions are listed and you can create new ones. Type messages to see streamed replies. Use `exit` or `Ctrl+D` to quit. | |
### Windows Executable | |
For a standalone Windows build install `pyinstaller` and run: | |
```bash | |
pyinstaller --onefile -n llm-chat cli_app/main.py | |
``` | |
The resulting `llm-chat.exe` works on Windows 10/11. | |
## macOS GUI Application | |
A simple graphical client built with Tkinter lives in the `mac_gui` module. It | |
provides a text chat interface and supports file uploads via the REST API. | |
### Run the GUI | |
```bash | |
pip install -r requirements.txt | |
python -m mac_gui | |
``` | |
Use the fields at the top of the window to configure the API URL, optional API | |
key, user name and session. Type a message and press **Send** to chat or click | |
**Upload** to select a document to upload. Responses stream into the main text | |
area. |