Files
botbot/README.md

132 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Botbot
*Botbot, your not so friendly Bot*
**Botbot** aimsto be a multiservice chat assistant for [Matrix](https://matrix.org) that captures room conversations, stores them, and uses LargeLanguageModels to provide concise summaries, answer followup questions, and surface action points.
### Roadmap / Aspirational goals
* Persistent conversation store (PostgreSQL) for longrange context.
* Pluggable LLM backends (local models, Ollama, etc.).
* Structured meeting summaries with actionitems and deadlines.
* Additional chat frontends (Telegram, WhatsApp, …).
---
## Architecture
```mermaid
flowchart LR
MS["matrix_service<br/>(Python & nio)"]
AI["ai_service<br/>(FastAPI)"]
Redis["Redis<br/>Deduplicates replies / guarantees idempotency"]
MS -- "HTTP (Bearer token)" --> AI
AI -- "Matrix Events" --> MS
MS -.-> Redis
AI -.-> Redis
```
| Component | Image / EntryPoint | Purpose |
| ------------------- | ------------------------------------- | ------------------------------------------------------------------------------------- |
| **matrix\_service** | `python matrix_service/main.py` | Listens to Matrix rooms, forwards each message to `ai_service`, posts the reply back. |
| **ai\_service** | `python ai_service/main.py` (FastAPI) | Builds a prompt, calls the configured LLM (OpenAI today), caches the reply in Redis. |
| **redis** | `redis:7` | Reply cache & simple key/value store. |
The services talk to each other over the internal Docker network. Authentication between them is a static bearer token (`AI_HANDLER_TOKEN`).
---
## Current Features
* **AutoJoin on Invite** secure E2EE join including device verification.
* **Stateless AI handler** FastAPI endpoint `/api/v1/message` receiving a JSON payload.
* **Idempotent replies** duplicate Matrix events reuse the cached answer.
---
## Quick Start (development)
```bash
# clone & cd
$ git clone https://gitea.alluna.pt/jfig/botbot.git
$ cd botbot
# copy environment template
$ cp .env.example .env
# edit .env with your homeserver, credentials and OpenAI key
# start everything (hotreload volumes mounted)
$ docker compose up --build
```
The default compose file launches three containers:
* `matrix_service` watches your rooms
* `ai_service` handles AI prompts
* `redis` reply cache
Stop with <kbd>CtrlC</kbd> or `docker compose down`.
### Production (single image per service)
Build once, then deploy with your orchestrator of choice:
```bash
$ docker compose -f docker-compose.yml --profile prod build
$ docker compose -f docker-compose.yml --profile prod up -d
```
---
## Configuration
All settings are environment variables. The table below reflects the current codebase (commit `ae27a2c`).
| Variable | Service | Default | Description |
| ------------------------------ | --------------- | ------------------------ | ---------------------------------------- |
| `LOG_LEVEL` | both | `INFO` | Python logging level. |
| `MATRIX_HOMESERVER_URL` | matrix\_service | |  Matrix homeserver base URL. |
| `MATRIX_USER_ID` | matrix\_service | |    Full user id of the bot. |
| `MATRIX_PASSWORD` | matrix\_service | |    Password for the bot account. |
| `MATRIX_LOGIN_TRIES` | matrix\_service |  `5` |    Number of login attempts before exit. |
| `MATRIX_LOGIN_DELAY_INCREMENT` | matrix\_service |  `5` | Seconds added per retry. |
| `AI_HANDLER_URL` | matrix\_service | `http://ai_service:8000` | Where to POST messages. |
| `AI_HANDLER_TOKEN` | both | | Shared bearer token (keep secret). |
| `OPENAI_API_KEY` | ai\_service | | Key for `openai` Python SDK. |
| `REDIS_URL` | ai\_service | `redis://redis:6379` | Connection string used by `redis-py`. |
---
## API (ai\_service)
```http
POST /api/v1/message
Authorization: Bearer <AI_HANDLER_TOKEN>
Content-Type: application/json
{
"roomId": "!foo:matrix.org",
"userId": "@alice:matrix.org",
"eventId": "$abc123",
"serverTimestamp": 1714821630123,
"content": "Hello there"
}
```
Returns `{"reply": "Hello Alice!"}` or HTTP 401/500 on error.
---
## Contributing
Pull requests are welcome! Please open an issue first to discuss what you want to change. All source code is formatted with **ruff** / **black** run `pre-commit run --all-files` before pushing.
---
## License
[MIT](LICENSE)