From 6f911cffb027f2a7183216b6dc9a01a499f59e2b Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 21 Jun 2026 20:50:52 +0600 Subject: [PATCH] [2026-06-21] eagle: personal/projects/balda/balda-valera.md personal/projects/balda/fix-openaimodel-tools.md --- personal/projects/balda/balda-valera.md | 28 +++++++++++++++++++ .../projects/balda/fix-openaimodel-tools.md | 17 +++++++++++ 2 files changed, 45 insertions(+) create mode 100644 personal/projects/balda/fix-openaimodel-tools.md diff --git a/personal/projects/balda/balda-valera.md b/personal/projects/balda/balda-valera.md index 19d48a3b..7314b661 100644 --- a/personal/projects/balda/balda-valera.md +++ b/personal/projects/balda/balda-valera.md @@ -159,3 +159,31 @@ DOCKER_OPTS={"max_tokens": 2048, "temperature": 0.7} ### composerestart vs compose up -d - `restart` — не перечитывает `.env` - `up -d` — пересоздаёт контейнер с обновлённым `.env` + + +--- + +## Диагноз: MCP не работают — инструменты не передаются модели + +**Статус (2026-06-21):** MCP резолвятся, но не вызываются. + +**Установлено через BALDA-DEBUG:** +``` +BALDA-DEBUG: mcpServerIDs=[balda obsidian fast-rlm] +resolvedMCP=map[balda:{http http://127.0.0.1:33545/mcp} + fast-rlm:{http http://fast-rlm-mcp:3333/mcp} + obsidian:{sse http://obsidian-mcp:3101/sse}] +``` +MCP серверы зарезолвлены, тулсеты переданы в `hostedagent.Config`. + +**Почему не работают:** +`OpenAIModel.generate()` → `buildChatRequest()` не читает `req.Config.Tools` (поле `genai.GenerateContentConfig`). ADK кладёт инструменты туда, но `buildChatRequest` сериализует только `model`, `messages`, `temperature`, `top_p`, `max_tokens`, `stop`. DeepSeek получает запрос без `tools` → отвечает текстом. + +**Логи подтверждают:** `function_call_part_count=0` в ответе DeepSeek. + +**Фикс:** в `pkg/runtime/hostedagent/openai.go`: +1. Добавить поле `Tools` в `openAIChatRequest` + `openAIToolDefinition` +2. В `buildChatRequest` читать `req.Config.Tools` → конвертировать в OpenAI tool definitions +3. В `parseChatResponse` парсить `tool_calls` из ответа (ADK сам выполнит MCP) + +**Важно:** upstream `norma` v0.0.10 (`bf2b25d`) уже корректно передаёт MCP тулсеты через `agentfactory.hostedToolsets()`. Проблема только в том, что `OpenAIModel` — кастомная реализация, не умеющая прокидывать tools. Если бы использовался Gemini/ACP provider — MCP бы работали. diff --git a/personal/projects/balda/fix-openaimodel-tools.md b/personal/projects/balda/fix-openaimodel-tools.md new file mode 100644 index 00000000..a48e1fc4 --- /dev/null +++ b/personal/projects/balda/fix-openaimodel-tools.md @@ -0,0 +1,17 @@ +# План: фикс MCP для OpenAIModel + +## Что сделать +1. В `openAIChatRequest` добавить поле `Tools []openAIToolDefinition` +2. Структура `openAIToolDefinition` (name, description, input_schema) +3. В `buildChatRequest` — прочитать `req.Config.Tools` из `genai` конфига, сконвертировать в OpenAI tool definitions +4. В `parseChatResponse` — парсить `tool_calls` из ответа (message может содержать и content, и tool_calls) +5. Написать тесты + +## Тесты покрывают: +- `buildChatRequest` с tools и без +- `parseChatResponse` с tool_calls, с content, с обоими +- Интеграционный: `OpenAIModel.generate()` с мок-сервером + +## Риски +- GenAI `Tool` структура — как конвертировать в OpenAI tool definition +- `tool_calls` формат в ответе DeepSeek