0.167.42

Fixed

  • isReasoningModel: подстрочный матчинг ложно срабатывал на посторонних именах моделей и лишал их temperature ( — P3, аудит 2026-08-context). Проверка strings.Contains по «o1/o3/o4/gpt-5/reasoning/opus-4» матчила «o1» внутри «mistral-nemo1» (и любое слово с этими парами внутри: «co1-model», «zzz-o3xyz») — OpenAI-compat путь при этом подавлял temperature (openai_compat.go) для нерассуждающих моделей. Заменено граничным вхождением (boundaryContains): паттерн валиден только на границах сегментов — начало/конец имени, -, .; namespace OpenRouter-стиля отрезается до последнего / («openrouter/openai/o3» → «o3»). «opus-4» по-прежнему матчится в середине («claude-opus-4-5»), т.к. границы сегментов соблюдены. Тесты (+3): 19 положительных (все семейства, суффиксы -mini/-pro/-nano, версии через ., namespace) и 16 отрицательных (nemo1, qwen2-7b, gpt-4o, sonnet-4, co1-model, zzz-o3xyz, пустая строка…), плюс кейс-нормализация.

Removed

  • Мёртвые поля ProviderSpec ( — P3). Удалены объявленные, но ни разу не читавшиеся поля: SupportsPromptCaching (prompt caching уже работает без флага — cache_control-брейкпоинты #278), ThinkingStyle (проставлялся deepseek/qwen/minimax), ReasoningAsContent (deepseek), ModelOverrides, EnvExtras (yandexgpt). WebUI ни одно из полей не читало (проверено поиском по web/src), JSON /api/v1/providers/specs просто похудел; задокументированный в ADR «замысел» раззора reasoning-полей (DeepSeek reasoning_content, OpenRouter reasoning) не удалён вместе с флагами, а вынесен в #306. В исторический ADR 2026-05-04-llm-провайдеры.md добавлено уточнение о суперседировании полей. Слайдер hard threshold из UI и мёртвые поля CompactConfig были удалены ранее в v0.167.15 (#284).