llm-agent-backend/docs/tech_assignment/Target2.md
2026-06-06 19:29:23 +03:00

21 KiB
Raw Blame History

Для реализации вашего комплексного агента с учётом всех требований предлагаю следующий план и архитектуру. Ниже — ключевые моменты, архитектурные решения и рекомендации, а в конце — пример кода для базового LLM-клиента с заглушкой под Ollama и интеграцией Gemini через LangChain.

1. Поддержка только внешних моделей (Gemini и Mistral), заглушка под Ollama

  • В MODELS оставляем только внешние модели, как вы указали.
  • Создаём пустой словарь LOCAL_MODELS = {} для будущей интеграции Ollama.
  • Для Gemini используем официальный LangChain-пакет langchain-google-genai (рекомендуется, т.к. поддерживает чат, vision, структурированные ответы).
  • Для Mistral — пока простой HTTP-клиент (зависит от API).

2. Веб-интерфейс (React + React Flow + Dagre)

  • Три панели:
    • Левая — история диалогов (ветки графа)
    • Средняя — визуализация графа сообщений (React Flow + Dagre для layout)
    • Правая — чат с выбранной веткой (последовательность сообщений от корня до выбранного узла)
  • Активный чат — выбранный лист графа. Новое сообщение добавляет новый лист (ребёнок) в граф.
  • При клике на узел графа показываем в чате цепочку сообщений от корня до этого узла.
  • Ноды разного цвета: пользователь — один цвет, LLM — другой.
  • Для хранения истории и графа — локальное хранилище (IndexedDB) или backend (например, FastAPI + БД).
  • Для суммаризации истории и формирования промптов:
    • Использовать суммаризацию через LLM (например, Gemini) — для сжатия истории до лимита токенов.
    • Альтернативно — скользящее окно последних сообщений с ограничением по токенам.
    • Можно комбинировать: последние N сообщений + суммаризация более старых.

3. Бесплатное решение и работа на GTX 1060 Ti

  • Для LLM — использовать только внешние API (Gemini, Mistral), чтобы не нагружать локальную видеокарту.
  • Для визуализации — React + React Flow — лёгкие и бесплатные.
  • Для анализа изображений — использовать возможности Gemini Vision или внешние бесплатные API (например, CLIP + локальный сервер, если потребуется).
  • Для git — локальные команды через subprocess (git diff) — бесплатно.
  • Для субтитров — интеграция с выбранной платформой звонков (см. ниже).

4. Описание и стиль

  • Подробные комментарии в коде.
  • Документация API.
  • UI с подсказками и автодополнением.
  • Локализация на русский.

5. Платформа для видеозвонков с субтитрами

Варианты:

Платформа Особенности субтитров API для извлечения субтитров
Zoom Автоматические субтитры, можно получать через API Есть Webhooks и API для получения транскриптов
Microsoft Teams Автоматические субтитры, API ограничены Можно использовать Graph API для записи
Google Meet Субтитры в реальном времени, API нет Можно использовать сторонние решения для захвата
Jitsi Открытый исходный код, можно интегрировать субтитры Можно реализовать собственный плагин

Рекомендация: Zoom — наиболее зрелая платформа с API для субтитров.

6. Интеграция с Obsidian

  • Можно запускать dataviewjs скрипты через Obsidian API.
  • Для интеграции в агент — сделать отдельный узел, который запускает скрипт и получает результат.
  • Для удалённого эндпоинта генерации изображений — сделать HTTP-клиент, который отправляет промпт и получает JSON с 4 ссылками.

7. Команды с автодополнением и контекстом

  • Ввод команд через слеш / в поле ввода.
  • Автодополнение реализуется через локальный индекс команд (хранить в папках).
  • При вводе / показывать popup с командами, фильтровать по введённому тексту.
  • Команды могут подставляться в виде /.
  • Можно использовать библиотеку для автокомплита (например, React Autosuggest).

8. Язык — русский

Резюме и дальнейшие шаги

  • Для веб-интерфейса рекомендую React + React Flow + Dagre. Можно использовать готовые шаблоны и расширять их.
  • Для суммаризации истории — использовать Gemini для генерации кратких резюме, комбинировать с оконным ограничением по токенам.
  • Для субтитров — рекомендую рассмотреть Zoom API или Jitsi с кастомной интеграцией.
  • Для git diff — использовать Python subprocess с git diff --staged.
  • Для автодополнения команд — React Autosuggest или аналогичные библиотеки.
  • Для генерации и анализа изображений — использовать Gemini Vision API и ваш удалённый эндпоинт с bingart.
  • Вся логика с графом сообщений и ветвлениями — на фронтенде и backend (FastAPI или Node.js).

Если хотите, могу помочь с примером React-приложения для визуализации графа и чата или с backend для интеграции git и субтитров.

Жду ваших комментариев или уточнений для следующего шага!


  1. ОК
  2. хранение через indexed db. 3.давай комбинацию gemini vision - ок пока, добавь заглушку для расширения. Пока для Google Meet и Microsoft TEams.
  3. React Autosuggest - годится

Ваши уточнения приняты, предлагаю архитектуру и ключевые технические решения для вашего агента, а также примерный план реализации фронтенда с React Flow + Dagre и IndexedDB, и backend-структуру.

Архитектура и ключевые решения

Требование Решение / Технология
LLM Внешние модели Gemini и Mistral через API, заглушка под Ollama (пока пустая).
Веб-интерфейс React + React Flow для графа + Dagre для автоматического layout, React Autosuggest для автодополнения.
Хранение истории и графа IndexedDB (через библиотеку idb или dexie.js) для локального хранения диалогов и графа.
Визуализация графа React Flow с динамическим пересчётом layout через Dagre (пример из [1][2][4]).
Чат с историей и ветвлениями Правая панель — чат, показывающий цепочку сообщений от корня до выбранного узла графа.
Суммаризация истории Комбинация: последние N сообщений + вызов Gemini для суммаризации старой истории (с учётом лимита токенов).
Анализ изображений Использовать Gemini Vision API, заглушка для расширения.
Платформы для субтитров Google Meet и Microsoft Teams (API для получения транскриптов, интеграция через polling или webhook).
Git интеграция Локальный запуск git diff --staged через Python subprocess, формирование сообщения коммита.
Генерация изображений Вызов удалённого эндпоинта с bingart (пример функции из вашего запроса).
Команды с автодополнением React Autosuggest, команды хранятся в IndexedDB, показываются в popup при вводе /.
Язык интерфейса Русский.

Краткое описание React Flow + Dagre для графа

  • Используйте пример из [1], где через dagre вычисляется layout для узлов и рёбер.
  • При добавлении нового сообщения создаётся новый узел и ребро к предыдущему.
  • При клике на узел — обновляется чат справа, показывая цепочку сообщений от корня до выбранного узла.
  • Используйте разные цвета и стили для нодов пользователя и LLM.
  • Для автодополнения команд — React Autosuggest, данные команд загружать из IndexedDB.

IndexedDB для хранения

  • Используйте dexie.js или idb для удобной работы с IndexedDB.
  • Структура БД:
    • Таблица dialogs — id, название, дата создания.
    • Таблица nodes — id, dialog_id, parent_id, content, role (user/llm), timestamp.
    • Таблица commands — id, folder, command_text, description.

Рекомендации по дальнейшей реализации

  • Frontend:

    • Создайте React-приложение с тремя панелями.
    • Используйте React Flow с Dagre для графа (примеры из [1][2][4]).
    • Реализуйте IndexedDB для хранения истории и команд.
    • Подключите React Autosuggest для автодополнения команд.
  • Backend:

    • API для вызова LLM (Gemini).
    • API для git diff, генерации сообщений коммита.
    • API для получения субтитров (интеграция с Google Meet / MS Teams).
    • API для генерации и анализа изображений (bingart).
  • Суммаризация истории:

    • При отправке нового сообщения формируйте промпт из последних N сообщений + краткое резюме старой истории через LLM.

Если хотите, могу помочь с примером React-компонента для графа на React Flow + Dagre или примером IndexedDB-схемы. Также могу подготовить пример автодополнения команд через React Autosuggest.

Жду ваших пожеланий по следующему шагу!


а langgrpah - здесь нужен? потому что я хочу, чтобы по слешу не просто промпты поставлялись, а целые действия выполнялись. Где-то промпт присовокупляется к запросу (но промпт не подставляется, т.е. пользователь не видит), а где неявносначала выполняется скрипт генерации с рандомизацией, а его вывод + запрос подается на вход llm через api


LangGraph — это именно тот инструмент, который вам нужен для реализации описанной логики с «целыми действиями» по слеш-командам, где:

  • не просто подставляются промпты, а
  • запускаются сложные workflow с несколькими узлами (например, генерация с рандомизацией, вызов внешних API, анализ изображений, git diff и т.д.),
  • с хранением состояния и ветвлением диалога в графе,
  • с возможностью динамически добавлять новые узлы и ветви,
  • и с контролем, какие промпты и когда подмешиваются к запросам (причём прозрачно для пользователя).

Почему LangGraph подходит именно для вашей задачи

  • Графовая модель: вы описываете логику как набор узлов (actions, LLM вызовы, скрипты), связанных рёбрами — именно это и есть LangGraph[1][3][5].
  • Вызов функций и внешних API: LangGraph позволяет в узлах выполнять произвольный код (скрипты, запросы), а результат подмешивать к промптам или использовать отдельно[3][4].
  • Состояние и память: хранит состояние диалога, можно реализовать суммаризацию, ветвления, переключение контекста[1][5].
  • Мультиагентность и сложные сценарии: можно объединять разные LLM, инструменты, API, что идеально для ваших слеш-команд с разными действиями[2][6].
  • Поддержка потоковой генерации и трассировки: удобно для интерактивных чатов с визуализацией и отладкой[5].
  • Расширяемость под Ollama и другие LLM: можно подключать любые модели и переключаться между ними[6].

Как это будет работать в вашем случае

  1. Пользователь вводит в чат команду с / — фронтенд (React) через автодополнение предлагает варианты.
  2. По выбору команды LangGraph запускает соответствующий узел или цепочку узлов:
    • например, сначала запускает скрипт генерации с рандомизацией (не показывая пользователю),
    • потом подмешивает результат в промпт,
    • вызывает LLM через API,
    • получает ответ,
    • анализирует изображения,
    • при необходимости вызывает git diff, субтитры и т.д.
  3. Каждый шаг — отдельный узел графа с состоянием, что позволяет легко отлаживать и расширять логику.
  4. Визуализация графа в React Flow отражает структуру диалога и действия агента.
  5. Активный узел и ветвь подсвечиваются, чат показывает цепочку сообщений от корня до текущего узла.

Итог

  • LangGraph — это не просто вызов LLM, а полноценный оркестратор сложных агентных workflow с хранением состояния и ветвлением.
  • Он идеально подходит, если нужно, чтобы по слеш-командам выполнялись не только промпты, а целые сценарии с вызовами функций, API, анализом и генерацией.
  • Простые случаи (только промпты) можно реализовать и без него, но для вашей задачи с динамическими действиями и состоянием — LangGraph значительно упростит поддержку и масштабирование.

Рекомендация

Используйте LangGraph как основу backend-логики для вашего агента. Реализуйте узлы для:

  • генерации промптов с рандомизацией,
  • вызова LLM (Gemini и Mistral),
  • анализа изображений (Gemini Vision или кастомные API),
  • git diff и обработки субтитров,
  • управления состоянием диалога и ветвлениями.

Фронтенд будет взаимодействовать с LangGraph через API, получать состояние графа и визуализировать его.

Если хотите, могу помочь с примером простого LangGraph workflow, который реализует слеш-команду с генерацией и вызовом LLM, или с архитектурой API для интеграции с React.

Кратко: Да, LangGraph нужен и рекомендован для вашей задачи, чтобы управлять сложными действиями, а не просто подставлять промпты.


`ConversationSummaryMemory, ConversationSummaryBufferMemory - позволяет задать окно (в токенах), в рамках которого мы сохраняем диалоги в неизменной форме, а при превышении - суммаризируем.

ConversationBufferWindowMemory - сохраняет только последние k диалогов.

ConversationKGMemory - использует граф знаний для сохранения памяти.

ConversationEntityMemory - сохраняет в памяти знания об определенном объекте.` здесь не использовать что-то из этого? как вообще с графом быть?