Многоагентная система, которая работает как реальная IT-компания с иерархией: User → Apigateway → Boss → Manager(s) → Worker(s) → ZIP-архив
┌─────────────┐ HTTP/WS ┌─────────────┐ gRPC ┌─────────────┐
│ User UI │ ───────────────► │ Apigateway │ ──────────────► │ Boss │
│ (frontend) │ :3111 │ (proxy) │ │ (port 50051)│
└─────────────┘ └─────────────┘ └──────┬──────┘
│
gRPC (ПАРАЛЛЕЛЬНО)
┌───────┴───────┐
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Manager #1 │ │ Manager #2 │ ...
│ (port 50052)│ │ (port 50052)│
└──────┬──────┘ └──────┬──────┘
│ │
gRPC (последовательно) │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Worker(s) │ │ Worker(s) │
│ (port 50053)│ │ (port 50053)│
└──────┬──────┘ └──────┬──────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Agents │ │ Agents │
│ (port 50053)│ │ (port 50053)│
└─────────────┘ └─────────────┘
│
LLM API (OpenRouter, Gemini,
OpenAI, Claude, DeepSeek, Grok)
Централизованный сервис для работы с LLM-провайдерами:
- 7 провайдеров: OpenRouter, Gemini, OpenAI, Claude, DeepSeek, Grok, CLIProxyAPI (Qwen Code)
- Per-request токены — API-ключ передаётся в каждом запросе, не хранится на сервере
- Streaming (
GenerateStream) — потоковая генерация ответа - Retry-логика — 3 попытки при transient-ошибках (EOF, timeout, connection reset)
- Все остальные сервисы обращаются к LLM только через Agents
Локальный прокси-сервер для использования Qwen Code CLI через OAuth (бесплатно):
- Бесплатный доступ к Qwen Code без API-ключей через OAuth авторизацию
- OpenAI-совместимый API — интегрируется как провайдер
cliproxyв Agents Service - Локальный запуск — работает на твоей машине, нет rate limits
- Запуск:
.\start-cliproxy.ps1(PowerShell) - Настройка:
cliproxy/config.yaml+ OAuth авторизация через Management API
- HTTP/WebSocket шлюз для клиентских запросов
- Проксирует задачи в Boss сервис через gRPC
- WebSocket стриминг — real-time обновления прогресса
- Эндпоинты:
GET /task/create— WebSocket для создания задачиGET /task/status?task_id=...— статус задачиGET /health— проверка здоровья
- Принимает задачи от apigateway
- ИИ-планирование: через Agents анализирует задачу, определяет стек и архитектуру
- Назначает N менеджеров (обычно 1-3) с ролями и приоритетами
- Параллельный вызов
AssignManagerдля каждого менеджера - Финальная валидация — Boss проверяет итоговый ZIP через AI перед отправкой
- Сохраняет решение в PostgreSQL
AssignManager— назначить одного менеджера (вызывается Boss для каждого отдельно)- ИИ-распределение: через Agents решает, каких воркеров нанять для своей команды
- Review-цикл: проверяет работу каждого воркера через AI
- Если код не прошёл → отправляет
ReviewWorkerс замечаниями - Воркер исправляет → повторная проверка
- Если код не прошёл → отправляет
- Собирает файлы всех воркеров в единую структуру
- Возвращает ZIP + результаты воркеров
- Получает задачу от менеджера с ролью и описанием
- Использует Agents сервис для генерации (не ходит в LLM напрямую)
- N+1 подход:
- Запрос к AI: «Какие файлы создать?» → список файлов
- Для каждого файла — отдельный запрос: «Напиши содержимое»
- Координация: каждый воркер видит результаты предыдущих (контекст)
- Plain text — файлы генерируются как raw code, без JSON-обёрток
- Поддержка
ReviewWorker— исправление кода по замечаниям менеджера
git clone <repository>
cd crewaicp .env.example .env
# Укажите API-ключи провайдеровdocker-compose up -d --buildСервисы запустятся:
- Apigateway: http://localhost:3111
- Boss: localhost:50051
- Manager: localhost:50052
- Worker: localhost:50053
- Agents: localhost:50053
- PostgreSQL: localhost:5432
Создать задачу (через WebSocket):
{
"userId": "user-123",
"username": "pavel",
"title": "Мини прокси",
"description": "Простой HTTP прокси на Go. Один файл main.go. Базовая маршрутизация.",
"tokens": {
"openrouter": "sk-or-v1-...",
"gemini": "AIzaSy..."
},
"meta": {
"provider": "openrouter",
"model": "qwen/qwen3-coder"
}
}Проверить статус:
curl http://localhost:3111/task/status?task_id=<task_id>| Провайдер | Ключ в tokens |
Модель по умолчанию | Бесплатно? |
|---|---|---|---|
| CLIProxyAPI | не требуется | qwen-code |
✅ Да, через OAuth |
| OpenRouter | "openrouter": "sk-or-v1-..." |
qwen/qwen3.6-plus:free |
✅ Да |
| Gemini | "gemini": "AIzaSy..." |
gemini-2.5-flash |
✅ 20 запросов/мин |
| OpenAI | "openai": "sk-..." |
gpt-4o |
❌ |
| Claude | "claude": "sk-ant-..." |
claude-opus-4-6 |
❌ |
| DeepSeek | "deepseek": "sk-..." |
deepseek-chat |
❌ (дешёвый) |
| Grok | "grok": "xai-..." |
grok-3 |
❌ |
qwen-code(через CLIProxyAPI) — лучший вариант для тестов, полностью бесплатный ⭐qwen/qwen3.6-plus:free— OpenRouter, хорошая для кодаmeta-llama/llama-3-8b-instruct:free— OpenRouter, быстраяgemini-2.5-flash— Gemini, 20 запросов/мин
qwen/qwen3-coder— OpenRouter, ~$0.02/1M tokens ⭐ лучшая для кодаopenai/gpt-4o-mini— ~$0.15/1M tokens
crewai/
├── agents/ # Agents сервис (LLM-маршрутизатор)
│ ├── cmd/app/
│ ├── internal/fetcher/providers/
│ │ ├── openrouter/
│ │ ├── gemini/
│ │ ├── openai/
│ │ ├── claude/
│ │ ├── deepseek/
│ │ └── grok/
│ ├── pkg/fetcher/grpc/
│ ├── pkg/models/
│ └── proto/
├── apigateway/ # HTTP/WebSocket шлюз
│ ├── cmd/app/
│ ├── internal/fetcher/
│ └── pkg/requests/
├── boss/ # Boss сервис (CEO)
│ ├── cmd/app/
│ ├── internal/
│ │ ├── fetcher/grpc/
│ │ │ ├── boss/
│ │ │ └── manager/
│ │ └── service/
│ ├── pkg/
│ │ ├── database/
│ │ └── models/
│ └── proto/
├── manager/ # Manager сервис
│ ├── cmd/app/
│ ├── internal/
│ │ ├── fetcher/grpc/
│ │ │ ├── managerpb/
│ │ │ └── worker/
│ │ └── service/
│ ├── pkg/
│ │ ├── database/
│ │ └── models/
│ └── proto/
├── worker/ # Worker сервис
│ ├── cmd/app/
│ ├── internal/
│ │ ├── fetcher/grpc/
│ │ │ └── workerpb/
│ │ └── service/
│ ├── pkg/
│ │ ├── database/
│ │ └── models/
│ └── proto/
├── frontend/ # Тестовый клиент (Node.js)
│ └── npm_client_test/
├── docker-compose.yml
├── go.work
└── .env.example
1. User → Apigateway (WebSocket)
2. Apigateway → Boss (gRPC: CreateTaskStream)
3. Boss → Agents: «Проанализируй задачу, определи стек и менеджеров»
4. Boss → Manager #1, #2, #3 (gRPC: AssignManager — ПАРАЛЛЕЛЬНО)
├── Manager → Agents: «Каких воркеров нанять для моей команды?»
├── Manager → Worker(s) (gRPC: AssignWorkersAndWait)
│ ├── Worker → Agents: «Какие файлы создать?»
│ ├── Worker → Agents: «Напиши файл 1»
│ ├── Worker → Agents: «Напиши файл 2»
│ └── Worker → ZIP-архив
├── Manager → Agents: «Проверить работу воркера»
├── Manager → Worker (gRPC: ReviewWorker — если не одобрено)
└── Manager → ZIP + результаты
5. Boss → Agents: «Валидировать итоговое решение»
6. Boss → Apigateway → User: ZIP-архив
- ID, UserID, Username, Title, Description
- Tokens (JSON), Meta (JSON)
- Status:
pending → boss_planning → managers_assigned → processing → reviewing → done/error - Solution (ZIP архив)
- TaskID, ManagersCount, ManagerRoles (JSON)
- TechnicalDescription, TechStack (JSON), ArchitectureNotes
- TaskID, Role, Status
- WorkerRoles (JSON), WorkersCount
- TaskID, ManagerID, Role, Status
- TaskMD, SolutionMD
- Files (JSON), Success, Approved, Feedback
# PowerShell — генерация для всех сервисов
.\generate-proto.ps1Или вручную:
cd agents && protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
--proto_path=proto proto/agents.proto
cd boss && protoc ... proto/boss-manager.proto
cd manager && protoc ... proto/boss-manager.proto proto/manager-worker.proto
cd worker && protoc ... proto/manager-worker.proto# Terminal 1 — PostgreSQL
docker run -d --name crewai-postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=crewai \
-p 5432:5432 postgres:15-alpine
# Terminal 2 — Agents
cd agents && go run cmd/app/main.go
# Terminal 3 — Boss
cd boss && go run cmd/app/main.go
# Terminal 4 — Manager
cd manager && go run cmd/app/main.go
# Terminal 5 — Worker
cd worker && go run cmd/app/main.go
# Terminal 6 — Apigateway
cd apigateway && go run cmd/app/main.go- API-ключи или CLIProxyAPI — нужен хотя бы один провайдер (рекомендуется CLIProxyAPI для тестов)
- PostgreSQL общий для всех сервисов
- gRPC порты не должны конфликтовать
- Миграции БД запускаются автоматически при старте
- Бесплатные модели медленные —
:freeмодели на OpenRouter могут отвечать 1-5 минут. Весь пайплайн с 15+ воркерами займёт 30+ минут - Для тестов используйте простые задачи: «Маленький скрипт на go», «Один файл main.go»
- Платные модели дешёвые —
qwen/qwen3-coderобойдётся в ~5-10 центов за весь пайплайн
CLIProxyAPI — это прокси-сервер, который оборачивает CLI-инструменты (включая Qwen Code CLI) в OpenAI-совместимый API. Это позволяет использовать Qwen Code бесплатно через OAuth авторизацию, без API-ключей.
✅ Полностью бесплатно — Qwen Code работает через OAuth, без API-ключей
✅ Локальный запуск — работает на твоей машине, нет rate limits
✅ OpenAI-совместимый API — интегрируется как провайдер cliproxy
✅ Идеально для тестов — не нужно тратить деньги на API-ключи
# Установка Qwen Code CLI (требуется Node.js 18+)
npm install -g @qwen/code# Вход через OAuth (откроется браузер)
qwen loginCLIProxyAPI уже настроен в твоём docker-compose.yml:
# Запустить все сервисы включая CLIProxyAPI
docker-compose up -d --buildCLIProxyAPI запустится на порту 8317 и будет доступен для Agents Service.
# Проверить что CLIProxyAPI работает
curl http://localhost:8317/v1/models
# Должен вернуть список моделей включая qwen-codeТеперь можно использовать провайдер cliproxy без API-ключей:
{
"userId": "user-123",
"username": "pavel",
"title": "Тестовая задача",
"description": "Напиши простой HTTP сервер на Go",
"tokens": {}, // ключи НЕ нужны!
"meta": {
"provider": "cliproxy",
"model": "qwen-code"
}
}Если хочешь запустить CLIProxyAPI отдельно:
# Клонировать репозиторий (уже сделано в cliproxy-temp/)
cd cliproxy-temp
# Собрать из исходников
go build -o cliproxy
# Запустить с конфигом
./cliproxy --config ../cliproxy/config.yamlФайл cliproxy/config.yaml уже настроен:
port: 8317
api-keys:
- "cliproxy-dev-key-change-me"
oauth-model-alias:
qwen:
- name: "qwen3-coder-plus"
alias: "qwen-code"При первом запуске CLIProxyAPI потребуется авторизация:
# Вариант 1: Через Docker
docker exec -it crewai-cliproxy /bin/sh
# Внутри контейнера:
qwen login
# Вариант 2: Локально (если CLIProxyAPI запущен без Docker)
qwen loginПосле авторизации OAuth токены сохранятся в volume cliproxy_auth и будут переиспользоваться.
CLIProxyAPI не запускается:
# Проверить логи
docker logs crewai-cliproxy
# Проверить что порт свободен
netstat -an | findstr 8317OAuth ошибка:
# Переавторизоваться
docker exec -it crewai-cliproxy qwen login
# Или удалить volume и начать заново
docker-compose down -v
docker-compose up -d cliproxy
docker exec -it crewai-cliproxy qwen loginAgents Service не видит CLIProxyAPI:
# Проверить переменную окружения
docker exec crewai-agents env | grep CLIPROXY
# Должно быть: CLIPROXY_API_URL=http://cliproxy:8317/v1MIT