command_center — это локальный хаб для управления AI‑агентами, пайплайнами и базой знаний.
Проект разворачивается в Docker и использует OpenAI API, PostgreSQL (с pgvector), Redis и Celery.
- Проекты — логические рабочие пространства.
- База знаний — загрузка документов (PDF/MD/TXT), разбиение на фрагменты, эмбеддинги и семантический поиск.
- MCP‑серверы и инструменты — регистрация MCP‑серверов и вызов инструментов через Django API.
- Агенты — OpenAI‑агенты с привязкой к MCP‑инструментам, режимами работы (
auto/required) и выбором модели из LLM Registry. - Делегирование — агенты могут вызывать друг друга через generated tools (
delegate_to_agent_*). - Личный ассистент — диалоги, долговременная память, поиск по MemoryEvent и
tool_tracesдля каждого ответа. - Многоуровневая память — AGENT MEMORY (AgentMemory) + AGENT GRAPH MEMORY (KnowledgeNode/Edge) + AGENT RAG DOCUMENTS (KnowledgeEmbedding) автоматически добавляются в системный контекст каждого запроса.
- Пайплайны — последовательности шагов (агенты + инструменты), выполняемые через Celery.
- UI командного центра — проекты, агенты, чат, память, MCP и пайплайны + новый блок управления доступами к инструментам и быстрые действия для Filesystem MCP (архивы, JSON/YAML и т.д.).
- LLM Registry — централизованный реестр доступных LLM‑моделей, синхронизируемый с OpenAI.
- История диалогов и вложения — чат в стиле ChatGPT с хранением переписки, предпросмотром tool traces и поддержкой изображений/документов.
- Project docs — при создании проекта автоматически создаётся
docs/<slug>/README.md, и уже существующие проекты можно покрыть командойgenerate_project_docs. - Knowledge Extractor — скрытый агент и Celery‑таски, автоматически извлекающие факты/сущности из семантических диффов и «информативных» ответов для пополнения Graph Memory.
Каждый ответ агента автоматически строится на основе трёх слоёв знаний:
- AGENT MEMORY — релевантные записи из
AgentMemory(факты/предпочтения). - AGENT GRAPH MEMORY — ближайшие узлы графа (
KnowledgeNode/Edge) + их связи. - AGENT RAG DOCUMENTS — top‑K фрагментов внешней документации (
KnowledgeEmbedding).
Эти блоки попадают в системный контекст перед историей диалога, а их содержимое отображается в tool_traces как memory_recall, graph_recall, rag_recall.
-
PROJECT_DOCS_ROOT(/docs/) хранит каталоги каждого проекта. -
После сохранения
Projectсигнал создаёт папкуdocs/<slug>/и записываетREADME.mdс названием, описанием и ссылкой на структуру. -
Чтобы создать документацию для существующих проектов, выполните:
docker-compose exec web python manage.py generate_project_docs
- Каждый проект × агент теперь имеет отдельный Conversation. Повторное открытие агента подхватывает последнюю беседу, а кнопка «Новый диалог» создаёт свежую сессию.
POST /api/projects/<id>/assistant/chat/принимаетconversation_id, а также мульти‑часть с полемattachments— туда можно загрузить изображения (PNG/JPEG) и произвольные файлы. Файлы сохраняются вmedia/chat_attachments/<date>/и показываются с превью прямо в чате.GET/POST /api/projects/<id>/assistant/conversation/— API для получения или сброса текущей беседы (используется UI).- Tool traces, память и RAG‑вставки выводятся компактными «плашками» под ответом. По клику открывается модальное окно с полным JSON.
- Левая колонка содержит плоский список агентов + блок LLM Registry (синхронизация делается из UI). Правая панель показывает MCP‑серверы и пайплайны проекта, а сам чат визуально и по UX ориентирован на ChatGPT.
- Лимит цепочек инструментов на одно сообщение регулируется переменной окружения
AGENT_TOOL_MAX_ITERATIONS(по умолчанию 25,0— отключить лимит). - Агенты вроде Document Collector используют Web Knowledge MCP (
search_and_collect_knowledge). Сохранённые материалы автоматически пишутся вdocs/<project>/web_knowledge/и сразу ставятingest_project_docsв очередь — поэтому RAG Librarian видит новые знания без ручных действий.
- В верхнем меню появились вкладки «Чат» и «Память». Страница памяти показывает:
- журнал AgentMemory (с кнопкой обновления);
- Graph Memory с overview (qty узлов/связей, топ‑концепты, свежие отношения) и переключателем pinned;
- RAG панель — статус последнего синка, ошибки, changelog файлов, быстрый вызов RAG Librarian;
- «Память проекта» — последние MemoryEvent.
- Данные подгружаются через новые REST‑эндпоинты (
/graph/overview/,/rag/changelog/и т.д.) и могут обновляться без перезагрузки страницы.
- Миграцией
0030_create_knowledge_extractorфиксируется агентknowledge-extractor. Он не отображается в UI, но вызывается фоном:- после любого Semantic Diff RAG (
KnowledgeChangeLog); - после ответов агентов, удовлетворяющих
is_knowledge_rich_text; - по ручным запросам пользователя («обнови граф», «извлеки знания...»).
- после любого Semantic Diff RAG (
- Сервис
core/services/knowledge_extraction.pyформирует JSON (nodes+edges) и передаёт вgraph_ingest, который:- дедуплицирует узлы по
label/type; - наращивает
usage_countиlast_used_at; - создаёт связи только при отсутствии дублей;
- может прикреплять
object_type/object_idи embedding.
- дедуплицирует узлы по
GET /api/projects/<slug>/graph/overview/— агрегированная статистика, которая питает UI и внешние интеграции.
Projectхранитrag_last_full_sync_at,rag_last_error_at,rag_error_count. Фоновая задачаsync_all_projects_rag(Celery beat, раз в сутки) автоматически ставит на переиндексацию «протухшие» проекты.KnowledgeSourceVersionиKnowledgeChangeLogфиксируют каждый синк: хэш,text_head, полный снапшот (для текстов ≤ 512КБ) и unified diff. Из diff извлекаются «новые/удалённые факты», которыми можно сразу обновлять Graph Memory.- UI показывает changelog таблицу, баннер при ошибках и позволяет одним кликом «попросить RAG‑агента» пересобрать индекс.
- REST‑слой (
/api/projects/<slug>/rag/sources/,/rag/ingest/,/rag/changelog/) используется как UI, так и RAG Librarian/другие агенты, обеспечивая единый контракт.
- Backend: Django 5 + Django REST Framework
- База: PostgreSQL + pgvector
- Очередь/кэш: Redis
- Фоновая обработка: Celery
- LLM: OpenAI API
- Фронтенд: Django Templates + немного JS
- Контейнеры: Docker + docker‑compose
-
Скопируйте
.env.exampleв.envи заполните переменные:OPENAI_API_KEY— ключ OpenAIPOSTGRES_*,REDIS_*— при необходимости- опционально
DJANGO_SECRET_KEY,DJANGO_DEBUG,DJANGO_ALLOWED_HOSTS
-
Соберите и запустите сервисы:
docker-compose up --build
-
Примените миграции и создайте суперпользователя:
docker-compose exec web python manage.py migrate docker-compose exec web python manage.py createsuperuser
-
Откройте:
- Админку:
http://localhost:8000/admin/ - Командный центр (UI):
http://localhost:8000/
- Админку:
- Healthcheck:
GET /api/health - Проекты и база знаний:
POST /api/projects/POST /api/projects/{id}/knowledge-bases/POST /api/projects/{id}/documents/GET /api/projects/{id}/search/?q=...
- MCP:
GET/POST /api/mcp/servers/GET /api/mcp/servers/{id}/tools/POST /api/mcp/servers/{id}/sync-tools/POST /api/mcp/tools/{tool_id}/invoke/
- Агенты:
GET/POST /api/agents/GET/PATCH /api/agents/{id}/POST /api/agents/{id}/invoke/GET/POST /api/agents/{id}/mcp-access/
- Ассистент проекта:
POST /api/projects/{project_id}/assistant/chat/GET /api/conversations/{id}/
- Пайплайны:
GET/POST /api/pipelines/GET/PATCH /api/pipelines/{id}/
POST /api/pipelines/{id}/run/GET /api/tasks/{id}/- Память и диалоги:
GET/POST /api/projects/{project_id}/assistant/conversation/GET /api/conversations/{id}/
- Graph Memory:
GET /api/projects/{slug}/graph/overview/
- RAG:
GET /api/projects/{slug}/rag/sources/POST /api/projects/{slug}/rag/ingest/GET /api/projects/{slug}/rag/changelog/
- LLM Registry:
GET /api/models/registry/— текущее состояние реестра моделейPOST /api/models/registry/sync/— ручной запуск синхронизации (только для админов)
В веб-интерфейсе (панель справа) есть отдельный блок для Filesystem MCP:
- переключатели доступа к MCP‑инструментам по каждому серверу;
- формы для «быстрых действий» (
fs_zip,fs_unzip,fs_read_json,fs_write_json, …); - журнал выполненных команд (ответы MCP попадают в лог, ошибки подсвечены красным);
- панель автоматически скрывается, если у выбранного агента нет доступа к Filesystem MCP.
Для проверки MCP‑инструментов без UI предусмотрен минимальный smoke‑набор tests/test_smoke.py в проекте filesystem-mcp. Он проверяет initialize → tools.list → запись/чтение файла → zip/unzip → JSON read/write.
cd filesystem-mcp
MCP_BASE_URL=http://localhost:8020/mcp python3 -m unittest tests.test_smokeПеред запуском убедитесь, что контейнер Filesystem MCP поднят (docker-compose up -d внутри каталога filesystem-mcp).
В репозитории есть скрипт scripts/backup_command_center.sh, который сохраняет:
- дамп PostgreSQL (
postgres.sql, черезpg_dumpвнутри контейнераpostgres); - ключевые конфигурации (.env, docker-compose, requirements) и пользовательские данные (
docs/,media/,command_center/config/); - служебный файл
backup_info.txtс метаданными бэкапа.
Запуск из корня проекта:
./scripts/backup_command_center.shПо умолчанию архивы попадают в backups/command_center_YYYYmmdd_HHMMSS.tar.gz. Можно переопределить каталог и env-файл:
BACKUP_DIR=/mnt/backups ENV_FILE=/path/to/.env ./scripts/backup_command_center.shВосстановление:
- Распаковать архив (
tar -xzf command_center_*.tar.gz). - Вернуть нужные файлы/директории из каталога
files/(например.env,docs,media). - Загрузить БД:
docker compose exec -T postgres bash -c "PGPASSWORD='$POSTGRES_PASSWORD' psql -U '$POSTGRES_USER' '$POSTGRES_DB'" < postgres.sql
Перед запуском убедитесь, что переменные `POSTGRES_*` совпадают с теми, что использовались при создании бэкапа.
## Экспорт / импорт конфигурации
- `docker-compose exec web python manage.py export_cc_config export.json` — сохраняет проекты, MCP‑серверы, агентов и доступы (включая привязанные инструменты) в один JSON.
- `docker-compose exec web python manage.py import_cc_config export.json` — восстанавливает те же сущности, синхронизирует инструменты серверов и заново генерирует `docs/<slug>/README.md`.
- Команды полезны для миграции окружений и репликации настроек.
### Агент “RAG Librarian”
- При миграции `0026_create_rag_librarian` автоматически создаётся глобальный агент **RAG Librarian** (`slug=rag-librarian`), который отвечает за сканирование `/docs/<project_slug>/` и переиндексацию RAG.
- Все primary-агенты автоматически получают его в делегаты (сигнал `post_save` следит за новыми агентами); при запросах, связанных с документацией, основной ассистент обязан вызывать инструмент `delegate_to_agent_<id>` и передавать задачу библиотекарю.
- Если нужен кастомный вариант для конкретного проекта — можно клонировать агента в админке и указать `project`, система всё равно подключит его как делегата и добавит инструкцию в системный промпт.
## LLM Registry
Реестр моделей хранится в `command_center/config/models_registry.json` и:
- обновляется через management‑команду:
```bash
docker-compose exec web python manage.py update_llm_registry
- синхронизируется по расписанию (Celery beat, 1‑е число месяца в 03:00);
- может быть обновлён вручную из UI кнопкой “Sync from OpenAI”.
Агенты используют:
Agent.model_name— явный выбор модели (может быть пустым);Agent.resolved_model_name— фактическая модель (явная илиchat.primaryиз реестра).
command_center/— Django‑проект, настройки, Celery, LLM‑реестр, сервисы.core/— основное приложение (модели, API, задачи, админка).templates/— шаблоны Django (UI командного центра).docker/,Dockerfile,docker-compose.yml— контейнеризация.COMMAND_CENTER_PLAN.md— детализация спринтов и архитектуры (игнорируется git по умолчанию).CHECKLISTS.md— чек‑листы по спринтам (также игнорируется).
-
Установить зависимости:
python -m venv .venv source .venv/bin/activate pip install -r requirements.txt -
Настроить
.envи PostgreSQL, затем:python manage.py migrate python manage.py runserver
Проект создаётся как внутренний инструмент; лицензию можно добавить позже при необходимости.