fix(model): cover typed gateway /model path + async-safe pricing lookups

Follow-ups on top of #26016's expensive-model guard:

- gateway/slash_commands.py: typed '/model <name>' now routes through the
  expensive-model confirmation gate (slash-confirm buttons / text fallback)
  instead of bypassing the guard the pickers enforce. Cancel leaves the
  session override and --global config untouched.
- telegram/discord/web_server: run expensive_model_warning() via
  asyncio.to_thread — it can hit models.dev or a /models endpoint on a
  cache miss, which would otherwise block the event loop.
- telegram: picker callback no longer toasts 'Model switched!' when the
  switch callback raised (both mm: and mc: paths).
- tests: new tests/gateway/test_model_command_expensive_confirm.py pins
  the typed-path gate (prompt, confirm-once, cancel, cheap-model no-op).
This commit is contained in:
Teknium
2026-06-10 00:24:06 -07:00
parent af978ecb17
commit 243cada157
5 changed files with 390 additions and 139 deletions
+4 -1
View File
@@ -2460,7 +2460,10 @@ async def set_model_assignment(body: ModelAssignment):
try:
from hermes_cli.model_cost_guard import expensive_model_warning
warning = expensive_model_warning(
# Pricing lookup can hit models.dev / a /models endpoint on a
# cache miss — keep it off the event loop.
warning = await asyncio.to_thread(
expensive_model_warning,
model,
provider=provider,
base_url=base_url,