docs: agent integration research (runners model, contract, SDK)
This commit is contained in:
parent
bea657938e
commit
74f00799a1
192
AGENTS-INTEGRATION.md
Normal file
192
AGENTS-INTEGRATION.md
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
# Интеграция агентов — ресёрч
|
||||||
|
|
||||||
|
## Аналогия с GitLab Runners
|
||||||
|
|
||||||
|
| GitLab | Team Board |
|
||||||
|
|--------|------------|
|
||||||
|
| Runner | Agent Instance |
|
||||||
|
| Runner Token | Agent Token |
|
||||||
|
| `.gitlab-ci.yml` | Контракт (contract.json) |
|
||||||
|
| Job | Task |
|
||||||
|
| Executor (docker/shell) | Adapter (OpenClaw/Anthropic/CLI) |
|
||||||
|
| Runner registration | `POST /api/v1/agents/register` |
|
||||||
|
| Runner tags | Agent capabilities |
|
||||||
|
|
||||||
|
## Архитектура подключения
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Админ создаёт Agent в UI → получает registration token
|
||||||
|
2. На сервере запускается Agent Instance с этим токеном
|
||||||
|
3. Agent Instance регистрируется: POST /ws?token=<reg_token>
|
||||||
|
4. Tracker подтверждает → выдаёт session token
|
||||||
|
5. Agent слушает задачи через WebSocket
|
||||||
|
6. При получении задачи → выполняет через адаптер
|
||||||
|
```
|
||||||
|
|
||||||
|
## Контракт агента (contract)
|
||||||
|
|
||||||
|
Файл, описывающий что агент умеет и как с ним взаимодействовать.
|
||||||
|
Хранится в трекере, привязан к конкретному агенту.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": "1",
|
||||||
|
"capabilities": ["coding", "review", "docs"],
|
||||||
|
"max_concurrent_tasks": 2,
|
||||||
|
"timeout_seconds": 600,
|
||||||
|
"accept_task_types": ["coding", "review"],
|
||||||
|
"tools": {
|
||||||
|
"file_read": true,
|
||||||
|
"file_write": true,
|
||||||
|
"git_commit": true,
|
||||||
|
"git_pr": true,
|
||||||
|
"web_search": false,
|
||||||
|
"shell_exec": false
|
||||||
|
},
|
||||||
|
"limits": {
|
||||||
|
"max_file_size_mb": 10,
|
||||||
|
"max_files_per_task": 20,
|
||||||
|
"max_comment_length": 5000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Операции агента (через WebSocket)
|
||||||
|
|
||||||
|
Агент должен уметь:
|
||||||
|
|
||||||
|
### Задачи
|
||||||
|
| Операция | WS Event | Описание |
|
||||||
|
|----------|----------|----------|
|
||||||
|
| Получить задачу | `task.assigned` (входящее) | Трекер назначает задачу агенту |
|
||||||
|
| Взять задачу | `task.take` | Агент сам берёт задачу из TODO |
|
||||||
|
| Обновить статус | `task.status` | draft→ready→in_progress→review→completed |
|
||||||
|
| Обновить описание | `task.update` | Изменить title, description |
|
||||||
|
| Создать задачу | `task.create` | Агент создаёт подзадачу |
|
||||||
|
| Создать подзадачу | `task.create` (с parent_id) | Декомпозиция |
|
||||||
|
| Добавить зависимость | `task.dependency.add` | TEA-3 depends on TEA-1 |
|
||||||
|
|
||||||
|
### Комментарии
|
||||||
|
| Операция | WS Event | Описание |
|
||||||
|
|----------|----------|----------|
|
||||||
|
| Добавить комментарий | `task.comment` | Текст, code snippets |
|
||||||
|
| Читать комментарии | `task.comments.list` | История обсуждения |
|
||||||
|
|
||||||
|
### Файлы
|
||||||
|
| Операция | WS Event / HTTP | Описание |
|
||||||
|
|----------|-----------------|----------|
|
||||||
|
| Загрузить файл | `POST /api/v1/tasks/{id}/files` | Результат работы |
|
||||||
|
| Скачать файл | `GET /api/v1/tasks/{id}/files/{fid}` | Входные данные |
|
||||||
|
| Список файлов | `task.files.list` | Что есть в задаче |
|
||||||
|
|
||||||
|
### Чат
|
||||||
|
| Операция | WS Event | Описание |
|
||||||
|
|----------|----------|----------|
|
||||||
|
| Сообщение в чат | `chat.send` | Обсуждение |
|
||||||
|
| Читать чат | `chat.history` | Контекст |
|
||||||
|
|
||||||
|
## Страница настройки в UI
|
||||||
|
|
||||||
|
### /settings/agents
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────┐
|
||||||
|
│ Агенты [+ Создать] │
|
||||||
|
├─────────────────────────────────────────────┤
|
||||||
|
│ ● Кодер online 2 tasks │
|
||||||
|
│ claude-opus coding, review │
|
||||||
|
│ Подключён: 2 часа назад │
|
||||||
|
│ │
|
||||||
|
│ ● Аналитик offline │
|
||||||
|
│ gpt-4 analytics, docs │
|
||||||
|
│ Последний раз: вчера │
|
||||||
|
│ │
|
||||||
|
│ ○ Тестировщик не зарегистрирован │
|
||||||
|
│ Токен: tb-agent-abc123... [Копировать] │
|
||||||
|
└─────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### Создание агента
|
||||||
|
1. Имя + slug
|
||||||
|
2. Системный промпт (роль)
|
||||||
|
3. Контракт (capabilities, tools, limits)
|
||||||
|
4. Генерация registration token
|
||||||
|
5. Инструкция по запуску:
|
||||||
|
```bash
|
||||||
|
team-board-agent register \
|
||||||
|
--tracker wss://team.uix.su/ws \
|
||||||
|
--token tb-agent-abc123... \
|
||||||
|
--adapter anthropic \
|
||||||
|
--api-key sk-ant-...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Регистрация и аутентификация
|
||||||
|
|
||||||
|
### Шаг 1: Создание (UI)
|
||||||
|
- Админ создаёт агента в UI
|
||||||
|
- Генерируется одноразовый registration token
|
||||||
|
- Токен показывается один раз
|
||||||
|
|
||||||
|
### Шаг 2: Регистрация (Agent Instance)
|
||||||
|
```
|
||||||
|
Agent → Tracker: ws connect + registration token
|
||||||
|
Tracker: validates token, marks agent as registered
|
||||||
|
Tracker → Agent: session token (долгоживущий)
|
||||||
|
Agent: сохраняет session token локально
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 3: Работа
|
||||||
|
```
|
||||||
|
Agent → Tracker: ws connect + session token
|
||||||
|
Tracker: validates, marks online
|
||||||
|
Agent ←→ Tracker: events (tasks, chat, files)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Отзыв токена
|
||||||
|
- Админ в UI нажимает "Отозвать"
|
||||||
|
- Tracker закрывает WebSocket
|
||||||
|
- Agent не может переподключиться
|
||||||
|
- Нужна новая регистрация
|
||||||
|
|
||||||
|
## SDK (Python)
|
||||||
|
|
||||||
|
```python
|
||||||
|
from team_board import Agent, AnthropicAdapter
|
||||||
|
|
||||||
|
agent = Agent(
|
||||||
|
tracker_url="wss://team.uix.su/ws",
|
||||||
|
token="tb-session-xyz...",
|
||||||
|
)
|
||||||
|
|
||||||
|
@agent.on_task
|
||||||
|
async def handle_task(task):
|
||||||
|
# Читаем описание и файлы
|
||||||
|
files = await task.list_files()
|
||||||
|
|
||||||
|
# Работаем через адаптер
|
||||||
|
result = await agent.adapter.complete(
|
||||||
|
system=agent.system_prompt,
|
||||||
|
messages=[{"role": "user", "content": task.description}],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Добавляем комментарий
|
||||||
|
await task.comment(result.text)
|
||||||
|
|
||||||
|
# Загружаем файл
|
||||||
|
await task.upload_file("result.py", result.code)
|
||||||
|
|
||||||
|
# Меняем статус
|
||||||
|
await task.set_status("review")
|
||||||
|
|
||||||
|
agent.run()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Приоритеты реализации
|
||||||
|
|
||||||
|
1. [ ] Tracker: token generation + WS auth
|
||||||
|
2. [ ] Tracker: agent events (task.take, task.status, task.comment, task.create)
|
||||||
|
3. [ ] Tracker: file upload/download API
|
||||||
|
4. [ ] UI: /settings/agents page
|
||||||
|
5. [ ] SDK: Python package (team-board-agent)
|
||||||
|
6. [ ] SDK: AnthropicAdapter + OpenClawAdapter
|
||||||
|
7. [ ] Первый агент: тестовый (echo/summarize)
|
||||||
|
8. [ ] Первый реальный агент: Кодер (через OpenClaw/Claude)
|
||||||
Loading…
Reference in New Issue
Block a user