docs: agent manager, SDK, adapters, lifecycle

This commit is contained in:
Markov 2026-02-15 18:34:27 +01:00
parent d39354f7dd
commit bea657938e

152
IDEAS.md
View File

@ -540,6 +540,158 @@ CREATE TABLE task_files (
---
## Управление агентами (Agent Manager)
### Принцип
**Агент = отдельный процесс.** Не привязан к OpenClaw или конкретному серверу. Может быть запущен локально, на другом сервере, в Docker — где угодно. Подключается к Tracker по WebSocket.
### Архитектура
```
┌─────────────────────────┐
│ Agent Process │
│ ┌───────────────────┐ │
│ │ Agent SDK │ │ ← общая Python-библиотека
│ │ ┌──────────────┐ │ │
│ │ │ Adapter │ │ │ ← OpenClaw / OpenAI / Ollama / CLI
│ │ └──────────────┘ │ │
│ └─────────┬─────────┘ │
└────────────┼────────────┘
│ WebSocket (локально или через интернет)
┌──────┴──────┐
│ Tracker │
│ AgentManager │
└─────────────┘
```
### Agent SDK (Python-пакет)
Общая библиотека для всех агентов:
```python
from team_board.agent import Agent
from team_board.adapters import OpenClawAdapter
adapter = OpenClawAdapter(
gateway_url="http://localhost:18789",
gateway_token="...",
)
agent = Agent(
name="Кодер",
tracker_url="ws://localhost:8100",
adapter=adapter,
system_prompt="Ты — backend разработчик...",
)
agent.run() # подключается к Tracker, слушает задачи
```
Что делает SDK:
- **WebSocket клиент** → подключение к Tracker, переподключение при разрыве
- **Heartbeat** → автоматический пинг каждые N секунд
- **Обработка задач** → получил задачу → передал адаптеру → вернул результат
- **Файловые операции** → загрузка/скачивание файлов задачи
### Адаптеры (BaseAdapter)
```python
class BaseAdapter(ABC):
@abstractmethod
async def send(self, messages: list[Message]) -> Response:
"""Отправить сообщения нейросети и получить ответ."""
...
@abstractmethod
async def capabilities(self) -> list[str]:
"""Возвращает capabilities адаптера."""
...
```
Реализации:
| Адаптер | Подключение | Особенности |
|---------|-------------|-------------|
| `OpenClawAdapter` | Webhooks / sessions_spawn | Доступ к инструментам OpenClaw |
| `AnthropicAdapter` | Claude API напрямую | Чистый API, без инструментов |
| `OpenAIAdapter` | GPT / Codex API | |
| `OllamaAdapter` | Локальная модель | Бесплатно, офлайн |
| `CLIAdapter` | Claude Code CLI | Доступ к файловой системе |
### AgentManager (в Tracker)
Tracker управляет жизненным циклом агентов:
```yaml
Реестр агентов:
- id: uuid
name: "Кодер"
adapter: "Claude Opus"
status: online | offline | busy | dead
host: "localhost" # где запущен
pid: 12345 # PID процесса (если локальный)
last_heartbeat: timestamp
current_tasks: [task_id]
```
Функции AgentManager:
1. **Запуск** — поднимает агента как отдельный процесс (локально: subprocess/systemd)
2. **Мониторинг** — следит за heartbeat, помечает dead если пропал
3. **Перезапуск** — dead агент → повторный запуск (макс 3 попытки)
4. **Назначение задач** — матчит задачу → подходящего агента по capabilities + загрузке
5. **Остановка** — graceful shutdown через WebSocket команду
### Запуск агентов
**Локально (MVP):**
```bash
# Tracker запускает как subprocess
python -m team_board.agent --name coder --tracker ws://localhost:8100
```
**Через systemd (production):**
```ini
[Unit]
Description=Team Board Agent: Coder
[Service]
ExecStart=/opt/team-board/venv/bin/python -m team_board.agent --name coder
Restart=on-failure
RestartSec=5
```
**Удалённо (будущее):**
- SSH: `ssh remote-host 'python -m team_board.agent --tracker ws://tracker:8100'`
- Docker: `docker run team-board-agent --tracker ws://tracker:8100`
- HTTP API на удалённом хосте
### Heartbeat и мониторинг
```
Агент → Tracker: agent.heartbeat (каждые 30 сек)
{
status: "idle" | "busy",
current_tasks: [...],
uptime: 3600,
memory_mb: 150
}
Если heartbeat не пришёл 90 секунд → статус = dead → перезапуск
```
### Таблица БД
```sql
-- Расширение таблицы agents
ALTER TABLE agents ADD COLUMN host TEXT DEFAULT 'localhost';
ALTER TABLE agents ADD COLUMN pid INT;
ALTER TABLE agents ADD COLUMN last_heartbeat TIMESTAMPTZ;
ALTER TABLE agents ADD COLUMN restart_count INT DEFAULT 0;
ALTER TABLE agents ADD COLUMN max_restarts INT DEFAULT 3;
```
---
## Открытые вопросы
1. Как интегрировать CLI-агентов (Claude Code, Cline)?