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-полей (DeepSeekreasoning_content, OpenRouterreasoning) не удалён вместе с флагами, а вынесен в #306. В исторический ADR2026-05-04-llm-провайдеры.mdдобавлено уточнение о суперседировании полей. Слайдер hard threshold из UI и мёртвые поляCompactConfigбыли удалены ранее в v0.167.15 (#284).