Перейти к основному содержимому

Обзор API

Архитектура API

Думатель использует API Gateway паттерн: все клиентские запросы проходят через Sprut, который маршрутизирует их к специализированным микросервисам. Межсервисное взаимодействие происходит через HTTP/REST (синхронное) и NATS JetStream (асинхронное).

OpenAPI-спецификация

ПараметрЗначение
URLhttps://sprut-api-dev01.monsterscorp.ru/openapi.json
Генерация типовpnpm generate-api-typesshared/api/openapi/types.generated.ts
Swagger UI/docs (на каждом FastAPI-сервисе)
ReDoc/redoc (на каждом FastAPI-сервисе)

Sprut — API Gateway

Центральная точка входа. Python 3.14, FastAPI с автоматической OpenAPI-документацией.

Endpoints

ГруппаПутьНазначение
Auth/auth/*Аутентификация через Keycloak (SSO/OIDC)
Chat/chat/*Управление чатами: создание, список, удаление
Message/message/*Отправка и получение сообщений в чате
Document/document/*Загрузка, метаданные, управление документами
Attachment/attachment/*Управление вложениями к документам
Directory/directory/*Справочники и каталоги
Project/project/*Управление проектами (пространствами)
Organization/organization/*Управление организациями
Profile/profile/*Профили пользователей
Billing/billing/*Платежи, баланс, тарифы
Notification/notification/*Уведомления пользователей
Onboarding/onboarding/*Онбординг новых пользователей
Legal Document/legal_document/*Юридические документы и соглашения
Tree/tree/*Древовидные структуры данных (карты знаний)
Yandex/yandex/*Интеграция с Yandex API

Аутентификация

  • Метод: Bearer token через Keycloak OIDC
  • SSO: Single Sign-On через Keycloak realm
  • Межсервисная: SERVICE_AUTH_TOKEN для внутренних вызовов

Протоколы коммуникации

НаправлениеПротоколОписание
Browser → SeadragonHTTPSSPA
Seadragon → SprutREST (HTTPS)CRUD operations, OpenAPI
Seadragon ← NATSSSE (через Next.js API Route)AI-стриминг ответов
Sprut → PostgreSQLasyncpgОсновные данные
Sprut → MilvuspymilvusВекторный поиск RAG
Sprut → KeycloakHTTPВерификация токенов
Sprut → NATSProducerПубликация задач воркерам
Sprut → DoubloonHTTPБиллинговые операции
Workers ← NATSConsumer (orker)Получение задач
Workers → NATSFrontProducerРезультаты → фронтенд
Amigofish → LLMHTTPSOpenAI/Claude API
Anglerfish → MilvuspymilvusЗапись embeddings
Doubloon → TinkoffHTTPПлатежи
Gull → BitrixHTTPCRM события
Chronograf → NATSProducerScheduling задач

Doubloon — Billing API

Сервис обработки платежей и управления подписками.

Endpoints

ПутьМетодНазначение
/billingGET/POSTОсновные операции биллинга
/healthGETHealth check

Схемы данных

СущностьОписание
balanceБаланс пользователя
cardПривязанные платёжные карты
transactionИстория транзакций
subscriptionАктивные подписки
tariffДоступные тарифы
charge_offСписания
freezeЗаморозка подписки
holdХолдирование средств
sbpОплата через СБП
periodПериоды тарификации

Kraken — Math Evaluation API

Stateless сервис для математических вычислений.

Endpoints

ПутьМетодНазначение
POST /evaluatePOSTВычисление математического выражения
GET /healthGETHealth check

Пример запроса

POST /evaluate
{
"expression": "integrate(x^2, x, 0, 1)"
}

Sealayers — ML Classification API

Классификация пользовательских запросов через нейросеть.

Endpoints

ПутьМетодНазначение
POST /classifyPOSTКлассификация запроса (тип, сложность)
GET /healthGETHealth check

Асинхронные API (NATS JetStream)

Сервисы, работающие через очереди сообщений:

СервисStream/SubjectНазначение
Amigofishcomplete_tasks / completion.{chat_id}Обработка AI-запросов, стриминг результатов
Anglerfishindex, attachment_index, unindexИндексирование документов
GullEmail task streamОтправка email-уведомлений
ChronografScheduled tasks streamВыполнение задач по расписанию
AnchorNotification eventsОбработка платёжных событий
BilgeBilling tasksУправление подписками
SharkShark tasksScheduled worker
ConvictFishConvictFish tasksDaily Bitrix CRM sync

Формат событий NATS (AI-стриминг)

{ "type": "text-delta", "data": "..." }
{ "type": "reasoning-delta", "data": "..." }
{ "type": "tool", "data": { "name": "web_search", "result": "..." } }
{ "type": "finish" }

Паттерн обработки (Orker Worker)

Producer → NATS JetStream → Durable Consumer → Orker Worker → Result

├── Success → ack
├── Retry → redeliver (до 3 попыток)
└── Fail → on_fail handler + Sentry

Streaming Event Contract (Amigofish)

Все события генерации стримятся как JSON-объекты в NATS subject completion.{chat_id} (stream COMPLETIONS, max_age=24h). Фронтенд (Seadragon) подписывается через SSE и обрабатывает события в реальном времени.

Типы событий

ТипКлючевые поляОписание
reasoning-startidОткрытие блока reasoning
reasoning-deltaid, delta, [tool, meta]Фрагмент «размышления» (на русском, user-facing)
reasoning-endid, [duration]Закрытие блока reasoning
text-startidНачало текстового блока ответа
text-deltaid, deltaИнкрементальная часть текста
text-endidЗавершение текстового блока
citation-markertextId, markerId, sourceId, index, length, unitИнлайн-маркер цитаты в тексте
citation-sourceid, kind (document/web), documentId/url, ...Источник цитаты (документ или веб-ссылка)
citations-finalizeorder, unusedФинальный порядок цитат (после завершения стрима)
tool-input-starttoolCallId, toolName, inputНачало вызова инструмента
tool-calltoolCallId, toolName, inputВызов инструмента (MindMap / file artifact)
tool-resulttoolCallId, toolName, resultРезультат инструмента
clarification-requestchat_id, thread_id, questions, timeout_seconds, round, max_roundsЗапрос уточнения (при LangGraph interrupt)
finishВсегда последнее событие

Соседние text-delta с одинаковым id объединяются (сжатие) при сохранении в БД.

NATS-конфигурация

ПараметрЗначение
Input streamcomplete_tasks
Output streamCOMPLETIONS
Output subjectcompletion.{chat_id}
max_age24 часа
Clarification subjectclarification_answer.{complete_id} (ephemeral, не JetStream)

Устаревшие сообщения NATS subject очищаются при старте каждой задачи, чтобы избежать воспроизведения предыдущего ответа.

LLM Tools (каталог инструментов Amigofish)

Все определения инструментов хранятся в schemas/function.py как OpenAI-shaped function specs (strict=True). Реализации — в tools/.

ИнструментАгент-владелецВход / Выход
RAG (query, document_ids)rag_agentMilvus hybrid dense+sparse search -> list[Chunk]
Tree ()rag_agentSprut tree endpoint -> вложенный dict директорий/файлов
GetDocumentContent (document_id)rag_agentSprut document full-text -> строка
WebSearch (query)web_agentTavily search (search_depth="advanced") -> list[WebSearchResponse]
WebExtract (link_ids)web_agentTavily extract -> list[WebExtractResponse]
GenerateDocument (query, raw_data)document_agentStonefish /api/document/generate -> ArtifactItem + DB row
GetArtifact ()document_agentСписок артефактов чата (до 10, по created_at desc)
EditDocument (artifact_id, instructions)document_agentStonefish /api/document/edit с сохранённым base_code

| Answer (chunks) | synthesis_agent | Финальный ответ: text / citation / link чанки | | MindMap (nodes, edges) | synthesis_agent | Визуализация дерева; макс. один вызов; BFS-фильтрация циклов/orphans |

Каждый инструмент имеет опциональные reasoning formatters (*_input_reasoning_formatter, *_reasoning_formatter), которые превращают вызов в человекочитаемую мысль на русском (напр. «Ищу в сети "..."», «Изучаю документ "..."»). Они формируют поток reasoning-delta на фронтенде.

Stonefish — Document Generation API

FastAPI-сервис генерации бинарных документов. README в репозитории отсутствует; информация получена из структуры репозитория (stonefish-tree.md) и CI-конфига.

Назначение

ПараметрЗначение
ФреймворкFastAPI (Python)
Веткаmaster
Helm charttools/charts/stonefish/
Окруженияdev, pro (отдельные ConfigMap и Ingress на каждое)
МасштабированиеHPA (задан в templates/hpa.yaml)

Endpoints

ПутьНазначение
POST /api/document/generateГенерация нового документа (PDF, DOCX, XLSX, PPTX)
POST /api/document/editРедактирование существующего документа по artifact_id + instructions
GET /healthHealth check

Роутеры расположены в source/src/api/router/document.py и health.py. Схемы данных — в source/src/schemas/document.py.

Интеграция с Claude

Сервис использует Claude API через модуль source/src/services/claude.py. Dockerfile устанавливает Claude Code CLI (npm install -g @anthropic-ai/claude-code) поверх базового образа cr.monsterscorp.ru:5000/python:latest, что указывает на programmatic использование Claude для синтеза содержимого документов.

Аутентификация

Модуль source/src/api/auth.py реализует авторизацию для входящих запросов от Amigofish (межсервисный SERVICE_AUTH_TOKEN).

CI/CD

Stonefish использует стандартный набор workflow-шаблонов (dot.mind/devops/workflows): version → test (SAST + linters + pytest) → build_docker → build_chart → push_chart → update_umbrella_chart → deploy_env → verify → test_env. Интеграция с Sentry: проект stonefish. Registry: cr.monsterscorp.ru:5000.

Межсервисное взаимодействие

┌──────────┐ HTTP ┌──────────┐
│ Sprut │─────────▶│ Doubloon │ Синхронные запросы на биллинг
└──────────┘ └──────────┘

┌──────────┐ HTTP ┌──────────┐
│ Anchor │─────────▶│ Doubloon │ Обработка платёжных событий
└──────────┘ └──────────┘

┌──────────┐ HTTP ┌──────────┐
│ Bilge │─────────▶│ Doubloon │ Управление подписками
└──────────┘ └──────────┘

┌──────────┐ HTTP ┌──────────┐
│ Descent │─────────▶│ Sprut │ Справочные данные
└──────────┘ └──────────┘

┌──────────┐ NATS ┌──────────┐
│ All │─────────▶│ All │ Асинхронные события
│ producers│ │ consumers│
└──────────┘ └──────────┘

Связанные страницы