0.166.0
Changed
Эффективность tool-call: context window, collapse groups, stream usage. Диагностика логов agent #1 (Yashka, glm-5.2, context_window=1M) выявила: агент работал с бюджетом 16K токенов вместо 1M (fallback
DefaultContextMaxTokens=16000приagents.context_max_tokens=0), после 5-6 tool-вызововcollapseToolGroupsсхлопывал группы в маркеры[Ранее: N вызов exec — результаты сжаты]— LLM не видел ни команд, ни результатов и перечитывал тот же файл 12+ раз.prompt_tokens=0во всех записяхllm_request_logиз-за отсутствияstream_options.include_usage. Шесть фиксов:Fix 1:
resolveContextMaxTokens(internal/agent/actor.go). Приagent.context_max_tokens=0используетсяprovider.ContextWindowSize()(изmodels.context_window) вместо жёсткогоDefaultContextMaxTokens. Для agent #1: 16K → 1M. Приоритет: agent override → model context window → DefaultContextMaxTokens. Устранён дублирующийGetAgent(2→1 вызов, -3 SQL-запроса на inbound). Тесты:TestResolveContextMaxTokens_*(4 кейса).Fix 2:
DefaultContextMaxTokens16K→128K,SmallContextThreshold16K→32K (internal/agent/context.go). 128K — безопасный минимум для современных LLM (GPT-4o 128K, Claude 200K, Llama-3 128K).ComputeBudgetтеперь имеет per-section floor: при context < 128K секции не масштабируются ниже базовых значений (Skills≥3000, RAG≥3500, Soul≥1500). Тесты:TestComputeBudget_DefaultIsModern,TestComputeBudget_SmallContextHasFloorSections.Fix 3: Удалён
collapseToolGroups(internal/agent/tool_group_collapse.goудалён,tool_trace.goсоздан). Phase 2 вtrimInLoopMessagesзаменяла старые группыassistant(tool_calls)+tool*Nмаркером[Ранее: N вызов <tool> — результаты сжаты]— без команд и результатов.FastTrimToolResults(Phase 1, head+tail) сохраняет полезную информацию и достаточен при корректном context window.buildToolTraceMessageперенесён вtool_trace.go. Тесты обновлены:TestTrimInLoopMessages_PersistentOverflow_TrimsButNoCollapse.Fix 4:
history_verbatimauto-compute (internal/agent/actor.go,internal/settings/defs.go). Setting0(новый default) = авто:max(10, ctx_tokens/4000), cap 250. Для 1M → 250, 128K → 32, 16K → 10. Негативные значения коэрсятся к auto. Тесты:TestResolveVerbatimCount_*(3 кейса).Fix 5:
stream_options.include_usage+ авто-fallback (internal/providers/openai_compat.go,error_classify.go).ChatStreamтеперь отправляетstream_options.include_usage=true— OpenAI-совместимые API (incl. LiteLLM) возвращаютusageв финальном chunk → реальныйprompt_tokensвместо 0. Если провайдер 400’ит наstream_options,markStreamUsageUnsupportedфлипает atomic-флаг (sticky, never reset) и retry происходит без опции — паттернmarkToolCallingUnsupported. Классификаторы оцениваются независимо (не if/else), чтобы 400 с обоими признаками (tools + stream_options) флипал оба флага.IsStreamUsageUnsupportedErrorпринимает только*ProviderErrorсStatusCode==400(plain-error fallback удалён — предотвращает false-positive от URL с “stream_options”). Тесты:TestIsStreamUsageUnsupportedError(7 кейсов),TestOpenAICompatProvider_ChatStream_UsagePopulated,TestOpenAICompatProvider_ChatStream_FallbackOnStreamOptions400,TestOpenAICompatProvider_ChatStream_UsageZeroWhenAbsent.Fix 6:
ToolResultPruneTokens10K→50K,ToolResultTrimToTokens1.5K→4K,toolResultBudgetCap100K (internal/agent/tool_result_truncate.go,runner.go). Старые tool-результаты обрезаются до ~14000 chars (head ~9334 + tail ~4667) вместо ~6000. Бюджет старых tool-результатов: 30% контекста, cap 100K (вместо clamp к 10K). Для 1M контекста: 100K бюджет — старые results суммарно до 100K не обрезаются. Тесты обновлены.