docs: agent manager, SDK, adapters, lifecycle
This commit is contained in:
parent
d39354f7dd
commit
bea657938e
152
IDEAS.md
152
IDEAS.md
@ -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)?
|
||||
|
||||
Loading…
Reference in New Issue
Block a user