[2026-06-21] eagle: personal/projects/balda/balda-valera.md personal/projects/balda/fix-openaimodel-tools.md
This commit is contained in:
@@ -159,3 +159,31 @@ DOCKER_OPTS={"max_tokens": 2048, "temperature": 0.7}
|
|||||||
### composerestart vs compose up -d
|
### composerestart vs compose up -d
|
||||||
- `restart` — не перечитывает `.env`
|
- `restart` — не перечитывает `.env`
|
||||||
- `up -d` — пересоздаёт контейнер с обновлённым `.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 бы работали.
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user