пн–пт: 9:00 – 20:00
+7 (958) 141-14-61next-core.ru@yandex.ru@NextCoreConsultingMAX
NextCore Logo
NextCore
Главная
Услуги
Продукты
Кейсы
О насПартнёрамБлог
Обсудить задачуИконка для кнопки
NextCore
Главная
Все услуги →
Распознавание документов под 1СПодготовка КП в 1С с помощью ИИИИ-проверка смет и КС-2 / КС-3NextCore LeadGen AIИИ-Оператор и авто-продавецИИ-Агенты и базы знаний (RAG)AI для закупок и тендеровAI-Аудит и RoadMap (3–5 дней)Все ИИ-решения под ключ
Mini Apps в TelegramTelegram-боты под ключБоты MAX под задачуИИ-запись в MAXMini Apps в экосистеме MAXВсе мини-приложения и боты
SaaS-платформы под ключB2B-порталы и кабинеты дилеровИндивидуальные ERP и MESСкладской учёт WMSАгрегаторы и маркетплейсыТендерные площадки (ЭТП)
Разработка ПО под ключSaaS-платформы под ключРазработка на Python и FastAPIКорпоративные сайты и сервисыАвтоматизация бизнес-процессовB2B-субподряд для IT-компаний
Реестры и защищённые системыЗаказные CRM-системыИнтеграции и шлюзы APIСопровождение ПО и SLAАутстаффинг Python/AIАудит и ревью кода
Все продукты →NextCore LeadGen AITimeFlow SaaSAnalyze-Tender
Все кейсы →
AI-обработка документов и 1СИИ-сверка смет и актов КС-2ИИ-Аудит тендеров за 3 минNextCore LeadGen AITimeFlow: ERP учёта времениВсе кейсы внедрения ИИ
Реестр участников СВОДвижение ПервыхЭлектронный деканат в MAX«Ритор.Х»: Анализ речиOraro: Платформа знакомствВсе реализованные проекты
О насПартнёрамБлог
Контакты
Телефон+7 (958) 141-14-61
Emailnext-core.ru@yandex.ru
Telegram@NextCoreConsulting
MAXНаписать в MAX
пн–пт: 9:00 – 20:00 (по пермскому времени)
БЛОГ

Опыт и аналитика

Разработка ПО, AI и автоматизация бизнеса — с цифрами, решениями и выводами из наших реальных проектов.

Иконка буквы N
NC
←Ко всем статьям
Главная/Блог/Как устроен бэкенд мультиагентной системы TimeFlow: LangGraph, ReAct-петля, SSE-стриминг и CAP-безопасность на Python & FastAPI
9 сентября 2026 г.

Как устроен бэкенд мультиагентной системы TimeFlow: LangGraph, ReAct-петля, SSE-стриминг и CAP-безопасность на Python & FastAPI

Глубокий технический разбор бэкенда автономного ИИ-агента TimeFlow: архитектура agent_core на Python 3.13 и FastAPI, графы состояний LangGraph 0.2+, алгоритмы компактификации контекста, AsyncPostgresSaver чекпоинты, Human-in-the-Loop с interrupt(), потоковый SSE-стриминг и RS256 CAP-безопасность.

ИИ-АгентыLangGraphLangChainPythonFastAPIАрхитектураReActPostgreSQL

Сегодня простые чат-боты на базе LLM уже не способны решать задачи современного бизнеса. В реальных экосистемах — от корпоративных ERP/CRM до платформ управления проектами и трекинга времени, таких как TimeFlow — требуется не просто отвечать на вопросы, а автономно выполнять целевые действия: анализировать БД, вызывать API внешних сервисов, запускать длинные фоновые задачи и гарантировать абсолютную безопасность данных.

В этой статье мы заглянем «под капот» сервиса agent_core — бэкенда мультиагентного ИИ-помощника Гоши (Gosha Agent Service) в экосистеме TimeFlow, написанного на Python 3.13, FastAPI и LangGraph. Разберём структуру графа состояний StateGraph, алгоритмы управления памятью LLM, механизм Human-in-the-Loop на базе interrupt(), персистентные чекпоинты в PostgreSQL, потоковый SSE-стриминг и систему CAP-безопасности.

1. Общая архитектурная схема микросервиса agent_core

Сервис agent_core проектировался как изолированный асинхронный микросервис, взаимодействующий с основными системами TimeFlow по REST/SSE API и выделенной базе данных PostgreSQL. Высокая производительность и надежность достигаются за счёт связки Python 3.13, FastAPI, LangGraph 0.2+, LangChain Core, SQLAlchemy 2.0 (asyncio), Asyncpg и Pydantic v2.

  • FastAPI & Uvicorn: асинхронный HTTP/SSE сервер для высоконагруженных потоковых соединений и REST-эндпоинтов.
  • LangGraph StateGraph & LangChain Core: декларативный фреймворк оркестрации графов состояний агента, сообщений (AIMessage, HumanMessage, ToolMessage) и динамического роутинга.
  • PostgreSQL + AsyncPostgresSaver + Alembic: персистентное хранение чекпоинтов граф-сессий в PostgreSQL через langgraph-checkpoint-postgres с прозрачным fallback на MemorySaver.
  • LLM Client Layer: отчуждаемый адаптер для работы с LLM-провайдерами (Gemini 2.5/3.0, OpenAI, локальные модели через vLLM/Ollama) с обработкой таймаутов, экспоненциальных retries и автоформатированием tool call schemas.
  • Event Broker: шина событий для непрерывной трансляции каждого действия агента в интерфейс пользователя в реальном времени.

2. Анатомия состояния графа: AgentState и компактификация контекста

Состояние графа в LangGraph описывается структурой AgentState (engine/state.py). Она содержит не только список сообщений диалога, но и системный контекст пользователя:

  • messages: последовательность сообщений с использованием редуктора add_messages.
  • tenant_id: идентификатор арендатора системы для строгой изоляции данных.
  • cap_code & cap_claims: токены безопасности и права доступа на вызов конкретных API-методов.
  • tool_names: динамический список разрешённых инструментов для текущего шага.
  • pending_tool_call & requires_approval: метаданные для заморозки исполнения при согласовании с человеком.

Одной из главных проблем долгоживущих диалогов ИИ-агентов является исчерпание контекстного окна LLM и сжигание бюджетов на токены при возврате больших ответов от API (например, JSON-списков лидов из CRM на 50 КБ). В GoshaGraphEngine (engine/graph.py) реализован алгоритм двухранговой компактификации контекста:

  • Ограничение глубины истории (MAX_CONTEXT_MESSAGES = 32): при превышении 32 сообщений система сохраняет первое системное сообщение и последние 31 сообщение, отсекая устаревшие промежуточные шаги.
  • Усечение результатов вызова инструментов (MAX_TOOL_RESULT_CHARS = 6000): если вызов инструмента (ToolMessage) возвращает данные длиннее 6000 символов, результат усекается с добавлением метки [Результат усечён], защищая LLM от перегрузки.

3. Оркестрация на LangGraph StateGraph: условный роутинг и узлы графа

Сердцем оркестратора является граф GoshaGraphEngine. Вместо последовательных скриптов выполнение состоит из циклического перехода по узлам:

  • START -> agent_node: узел генерации ответа LLM. Агент анализирует текущую историю сообщений и формирует либо финальный текст, либо намерения вызова инструментов (tool_calls).
  • route_request (условный перекрёсток): функция-роутер проверяет ответ LLM. Если получен финальный текст — граф переходит в END. Если запрошен инструмент — роутер проверяет его политику безопасности.
  • tools_node: исполнение инструментов из Tool Registry в изолированном контексте. Результаты оборачиваются в ToolMessage и возвращаются обратно в agent_node.
  • human_node: пауза исполнения при вызове критических инструментов, требующих одобрения человека.

4. Human-in-the-Loop: Пауза через interrupt(), чекпоинты и возобновление через Command

Предоставление ИИ-агенту права изменять состояние продуктов (например, удалять задачи, переводить сделки в CRM или списывать бюджет) без контроля человека недопустимо. В agent_core реализован паттерн Human-in-the-Loop на базе возможностей LangGraph:

1. Когда LLM запрашивает инструмент с флагом requires_approval = True, роутер направляет выполнение в human_node. Граф вызывает функцию interrupt(), передавая в нее детали планируемого вызова (имя инструмента, аргументы).

2. Вызов interrupt() мгновенно замораживает поток выполнения графа. AsyncPostgresSaver записывает текущий точный снимок состояния (checkpoint) в таблицы PostgreSQL (langgraph_checkpoints), а сервер отправляет пользователю через SSE событие action_required.

3. Пользователь видит карточку запроса разрешения в фронтенде TimeFlow и нажимает «Подтвердить» или «Отклонить». Фронтенд отправляет REST-запрос на эндпоинт /chat/thread/{thread_id}/approve.

4. Бэкенд восстанавливает граф из PostgreSQL по thread_id и передаёт объект Command(resume={"action": "approve"}). Граф «просыпается» точно на шаге остановки, выполняет инструмент и продолжается дальше по циклу ReAct.

Связка LangGraph interrupt() и AsyncPostgresSaver позволила построить промышленную систему безопасных вызовов: агент может ждать реакцию человека часами или днями, не нагружая оперативную память сервера.

Команда разработки TimeFlow

5. Real-time обратная связь через Server-Sent Events (SSE) и шину Event Broker

Для пользователя критически важно понимать, о чем думает агент и какие инструменты он запускает прямо сейчас. Обычный заблокированный HTTP-запрос создаёт ощущение «зависшего» приложения.

В agent_core разработан асинхронный Event Broker (engine/event_broker.py), который подписчикам в режиме реального времени транслирует поток GraphEvent через FastAPI StreamingResponse:

  • token: потоковая генерация текста ответа (символ за символом).
  • tool_start: уведомление о начале работы инструмента с подсвеченными аргументами.
  • tool_result: результат работы инструмента с таймингом выполнения.
  • action_required: пауза выполнения и ожидание действия человека.
  • final: успешное завершение выполнения графа.

6. Динамический реестр инструментов (Tool Registry) и система скиллов (Skills Engine)

Агент взаимодействует со внешними сервисами исключительно через строго типизированные интерфейсы BaseTool и ToolRegistry (agent_core/tools). Каждый инструмент описан базовой Pydantic-схемой, что исключает передачу невалидных типов в бизнес-логику.

В системе выделены 4 доменных кластера инструментов:

  • TimeFlow Client & Navigator: получение структуры проектов, трекинг времени, чтение и смена статусов задач.
  • CRM Tools & Import: поиск потенциальных клиентов, автоматический валидирующий импорт контактов, смена этапов сделок.
  • Projects & Tasks Tools: создание проектных сущностей, назначение исполнителей, перерасчёт сроков.
  • Web Search & Extractor: внешняя разведка рынка, генерация B2B-лидов, извлечение чистого контента с веб-страниц.

Сверху над инструментами построена система динамических скиллов (Skills Engine в agent_core/skills). Скилл — это изолированная папка (manifest.json + skill.md), объединяющая доменные промпты и разрешённые инструменты. Это позволяет добавлять новые бизнес-сценарии (например, фин-анализ или автоматизацию техподдержки) без модификации кода самого движка.

7. Многоуровневый контур безопасности: RS256 JWT, CAP-политики и изоляция арендаторов

Предоставление ИИ-агенту прямого доступа к API-инструментам несёт риски утечки данных клиентов и выполнения несанкционированных действий (например, инъекции вредоносных промптов из внешнего веб-поиска). В agent_core реализована многослойная защита:

  • Мультиарендность (Tenant Isolation): любой запрос и экземпляр ToolContext привязаны к tenant_id. База данных и API-клиенты физически не могут выдать данные чужого клиента.
  • Проверка токенов CAP (CapCode Validation): перед запуском инструмента модуль policy.py вычисляет claims из криптографического RS256 JWT-токена пользователя. Если у пользователя нет права timeflow:tasks:delete, агент вернёт ошибку доступа еще до вызова метода.
  • Контекстные границы (Context Boundary): инструменты работают в песочнице и не имеют доступа к переменным окружения сервера или локальной файловой системе.

8. Сводный стек технологий и выгода архитектуры

КомпонентТехнологический стекНазначение в agent_core
API СерверPython 3.13, FastAPI, UvicornАсинхронные REST & SSE эндпоинты
Движок ОркестрацииLangGraph (StateGraph), LangChain CoreЦиклические графы состояний, условный роутинг
Персистентность ГрафаAsyncPostgresSaver, PostgreSQL 16Хранение чекпоинтов, откладываемое исполнение
Human-in-the-LoopLangGraph interrupt() & CommandБезопасное паузирование и согласование действий
Real-time СтримингFastAPI SSE, Event BrokerТрансляция мыслей агента и логов инструментов в UI
Безопасность & ДоступRS256 JWT, CAP Policies, CFFIИзоляция арендаторов, проверка прав на вызов методов
Инструменты & СкиллыPydantic v2, Skills Engine ManifestsТипизированные вызовы CRM, TimeFlow API и веб-поиска

Использование LangGraph в сочетании с асинхронным FastAPI дало TimeFlow надежный фундамент для создания автономных ИИ-агентов промышленного уровня. Системный подход к компактификации контекста, чекпоинтам и CAP-безопасности позволил ускорить выполнение бизнес-сценариев на 45% при 100% контролируемости действий ИИ.

← Предыдущая статьяAI-First против Vibe Coding: дилемма MVPСледующая статья →Почему IT-продукт не продаёт себя сам: маркетинг

Решения и услуги по теме

ИИ-агент по базе знаний: ответы по регламентам за 2 секунды без риска утечек→Разработка веб-сервисов на Python и FastAPI под ключ→Интеграция систем и API→

Читайте также

B2B-портал1 октября 2026 г.

Архитектура B2B-портала для дилеров на FastAPI и 1С

Практическое руководство по проектированию и разработке B2B-порталов и платформ для дилеров: архитектура на FastAPI и Next.js, двусторонний обмен с 1С без перегрузки базы, ролевая модель RBAC и личные кабинеты контрагентов.

Читать статью →
Python14 июля 2026 г.

Корпоративные системы на Python: стек и архитектура

FastAPI, PostgreSQL, Redis, RabbitMQ и Next.js — почему этот стек подходит для корпоративных систем: ERP/CRM-подобных продуктов, реестров и SaaS. Разбираем архитектурные решения на реальных проектах.

Читать статью →
AI24 августа 2026 г.

Как ИИ ускорил аудит тендеров с 4 часов до 5 минут

SaaS-платформа, которая анализирует тендерную документацию на 500+ страниц за 5 минут вместо 4–6 часов. Разбираем архитектуру: map-reduce пайплайн, транзакционный Outbox, RabbitMQ и антивирусную проверку файлов.

Читать статью →
←Вернуться ко всем статьям блога
Иконка буквы N
NC

Частые вопросы

Как в agent_core решается проблема переполнения контекстного окна LLM при многочисленных вызовах массивных API-инструментов?

Проблема решается на двух уровнях: 1) Компактификация истории сообщений до MAX_CONTEXT_MESSAGES (32 сообщения), сохраняя первое системное сообщение и хвост диалога; 2) Строгое усечение результатов ToolMessage до MAX_TOOL_RESULT_CHARS (6000 символов) с добавлением служебной метки усечения, что предотвращает переполнение токенов при загрузке больших JSON-массивов.

В чём главное преимущество AsyncPostgresSaver в LangGraph перед обычным сохранением истории сообщений в БД?

Обычная таблица истории хранит только текст сообщений. AsyncPostgresSaver сохраняет полный физический чекпоинт внутреннего состояния графа execution state: текущий узел исполнения, стек вызовов, локальные переменные узлов и состояние ожидания interrupt(). Это позволяет остановить процесс на любой стадии и возобновить его без повторного запуска предыдущих шагов.

Как реализован механизм Human-in-the-Loop и возобновление работы после паузы?

Если инструмент требует одобрения, узел графа вызывает interrupt({"tool": name, "args": args}). LangGraph замораживает execution thread и записывает чекпоинт в PostgreSQL. Когда пользователь нажимает «Одобрить» в UI, клиент отправляет запрос на /chat/thread/{thread_id}/approve, а бэкенд выбывает graph.astream(Command(resume={"action": "approve"})), возобновляя граф с точного места остановки.

Как бэкенд защищён от Prompt Injection через результаты веб-поиска или внешних API?

Результаты веб-поиска и внешних API помещаются исключительно в сообщения с ролью ToolMessage и проходят сантехнику данных. Кроме того, перед вызовом любого инструмента система проверяет CAP-токен пользователя в policy.py: даже если сторонний текст «прикажет» агенту удалить БД, проверка прав CAP заблокирует выполнение этой функции.

Как бэкенд обрабатывает ошибки самих LLM (rate limits, таймауты или 500 от провайдера)?

В слой LLMClient встроена система автоматических повторных попыток (retries) с экспоненциальной задержкой (exponential backoff) и авто-переключением на резервный провайдер (fallback model). Если основная модель не отвечает, запрос прозрачно перенаправляется на резервный LLM-эндпоинт.

Можно ли адаптировать этот бэкенд агента для работы в изолированном контуре (On-Premise) без доступа в интернет?

Да. Архитектура agent_core полностью абстрагирована от внешних облаков. В качестве LLM-провайдера подключаются локально развернутые модели через Ollama, vLLM или TGI, а в качестве базы данных используется локальный PostgreSQL.

Как измеряются задержки (latency) и потребление токенов на каждом шаге графа?

В микросервис встроен модуль telemetry.py, который оборачивает каждый шаг графа и вызов инструмента в OpenTelemetry-трейсы. Потребление токенов (prompt_tokens, completion_tokens) и время выполнения каждого узла логируются в БД и выводятся в метрики для Prometheus/Grafana.

NextCore

Заказная разработка ПО, веб-систем, ИИ-агентов и Mini Apps в Telegram и MAX под ключ. Прозрачный бюджет и результат за 2–4 недели.

+7 (958) 141-14-61next-core.ru@yandex.ruTelegramMAX

пн–пт 9:00–20:00 (пермское время)

Услуги и B2B

  • Заказная разработка ПО
  • ИИ и AI-агенты для бизнеса
  • B2B-лидогенератор Гоша
  • B2B-порталы и дилеры
  • Индивидуальные ERP и MES
  • Складской учёт WMS
  • Агрегаторы и маркетплейсы
  • Тендерные площадки (ЭТП)
  • Автоматизация строительства
  • Кастомные CRM-системы
  • Разработка SaaS-платформ
  • Защищённые реестры RBAC
  • Все услуги компании

Telegram и MAX

  • Боты MAX под ключ
  • ИИ-запись в MAX
  • Mini Apps в MAX
  • Электронный деканат в MAX
  • Разработка Telegram-ботов
  • Mini Apps в Telegram
  • Telegram & MAX Mini Apps

Продукты и кейсы

  • TimeFlow — ERP для IT
  • Лидогенератор Гоша AI
  • Sales-Agent — ИИ-продажи
  • Analyze-Tender — аудит тендеров
  • Doc-AI — ввод первички в 1С
  • КС-2 & Сметы — аудит для 1С
  • Реестр участников СВО
  • Oraro — платформа знакомств
  • Движение Первых
  • «Ритор.Х»: Анализ речи
  • Все продукты
  • Все кейсы

Компания

  • О компании
  • Партнёрам и субподряд
  • Аутстаффинг и субподряд
  • Сопровождение ПО
  • Аудит и ревью кода
  • Интеграции систем и API
  • Разработка на Python
  • Блог
NextCore
Иконка для copyright

© 2026 ООО НЕКСТКОР. Все права защищены.

ИНН 5948077081 · Пермский край, Пермский район, п. Сылва

Политика обработки персональных данныхУсловия использования