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: DefaultContextMaxTokens 16K→128K, SmallContextThreshold 16K→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_verbatim auto-compute (internal/agent/actor.go, internal/settings/defs.go). Setting 0 (новый 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: ToolResultPruneTokens 10K→50K, ToolResultTrimToTokens 1.5K→4K, toolResultBudgetCap 100K (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 не обрезаются. Тесты обновлены.