Agent Loop, Tool Calling и Мышление

Нативный механизм вызова инструментов позволяет модели обращаться к внешним функциям и API в несколько шагов (run_agent_loop).

flowchart TD Start["Входящее сообщение"] --> CallLLM["Вызов LLM Client (tools=[...])"] CallLLM --> CheckResponse{"Тип ответа модели"} CheckResponse -->|Plain Text| Finish["Отправка ответа пользователю"] CheckResponse -->|tool_calls| Status["send_tool_status('Поиск...')"] Status --> Exec["Исполнение инструмента (execute_tool)"] Exec --> AddResult["Добавление tool_result в сообщения"] AddResult --> CallLLM CallLLM -.->|400 Error / Incapable| Cache["Probe Cache: tool_capable=False (Redis 1h)"] Cache --> Fallback["Переключение в Plain Chat Mode"]

Особые Режимы и Возможности

1. Стриминг Мышления (Reasoning Tokens)

Для моделей с поддержкой рассуждений (Qwen / DashScope chat_think_enabled, Ollama think: true) токены мыслей стримятся через StreamChunk.reasoning_delta и отображаются во фронтенде прозрачным блоком в фазе "thinking".

2. Отключение Bubble Mode

При активном вызове инструментов (tool_calling_enabled=True) автоматическое разбитие текста на бабблы отключается — итоговый ответ генерируется единым цельным сообщением.

3. Кэширование Проб (probe_cache.py)

При получении 400 ошибки от модели на отправку схемы или инструментов статус сбоя кэшируется в Redis (struct_mode:{bot_id} и tool_capable:{bot_id}:{model}) на 1 час. Это защищает от циклических падений при запросах к моделям без поддержки вызова инструментов.