fix(gateway): report the most recent status model

This commit is contained in:
fangliquanflq
2026-09-13 00:57:49 +08:00
committed by Teknium
parent e30d0639bb
commit 280ede95a7
3 changed files with 23 additions and 6 deletions

View File

@@ -83,7 +83,7 @@ def _quiet_sync(call, default=None):
def _status_model_route(status_agent, persisted_route: dict, session_row: dict, session_entry):
"""``(model, provider, context_used, context_total)`` for /status.
Order: live/cached agent route -> persisted dominant route -> SessionDB row -> gateway config
Order: live/cached agent route -> persisted recent route -> SessionDB row -> gateway config
(only loaded when something is still missing).
"""
from gateway.run import _AGENT_PENDING_SENTINEL, _load_gateway_config, _resolve_gateway_model
@@ -308,7 +308,7 @@ class GatewayStatusCommandsMixin:
_int_value(session_row.get(k))
for k in ("input_tokens", "output_tokens", "cache_read_tokens", "cache_write_tokens", "reasoning_tokens")
)
route = await _quiet(lambda: db.get_dominant_session_model_route(session_id))
route = await _quiet(lambda: db.get_recent_session_model_route(session_id))
return title, session_row, db_total_tokens, route if isinstance(route, dict) else {}
@staticmethod

View File

@@ -765,6 +765,23 @@ class SessionSessionsMixin:
)
return dict(row) if row else None
def get_recent_session_model_route(self, session_id: str) -> Optional[Dict[str, Any]]:
"""Most recently used main-loop model route as one coherent per-call tuple."""
self.flush_token_counts()
row = self._read_one(
"""SELECT model, billing_provider, billing_base_url, billing_mode,
api_call_count
FROM session_model_usage
WHERE session_id = ?
AND task = ''
AND model <> 'unknown'
AND billing_provider <> ''
ORDER BY last_seen DESC
LIMIT 1""",
(session_id,),
)
return dict(row) if row else None
def resolve_session_id(self, session_id_or_prefix: str) -> Optional[str]:
"""Exact id, else the single unambiguous prefix match, else None."""
exact = self.get_session(session_id_or_prefix)

View File

@@ -142,8 +142,8 @@ async def test_status_command_includes_live_agent_model_and_context():
@pytest.mark.asyncio
async def test_status_command_uses_dominant_persisted_model_route(tmp_path):
"""Persisted status must not combine a model and provider from different calls."""
async def test_status_command_uses_most_recent_persisted_model_route(tmp_path):
"""Persisted status uses the latest coherent route, not the lifetime-dominant route."""
session_entry = SessionEntry(
session_key=build_session_key(_make_source()),
session_id="sess-1",
@@ -183,8 +183,8 @@ async def test_status_command_uses_dominant_persisted_model_route(tmp_path):
result = await runner._handle_message(_make_event("/status"))
assert "**Model:** `z-ai/glm-5.2` (nvidia)" in result
assert "**Model:** `z-ai/glm-5.2` (nous)" not in result
assert "**Model:** `upstage/solar-pro4:free` (nous)" in result
assert "**Model:** `z-ai/glm-5.2` (nvidia)" not in result
finally:
db.close()