mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-27 20:20:20 +00:00
106 lines
4.2 KiB
Python
106 lines
4.2 KiB
Python
"""Regression coverage for #732 LLM Gateway routing metadata display."""
|
|
|
|
from pathlib import Path
|
|
|
|
from api.models import Session
|
|
from api.streaming import _normalize_gateway_routing_metadata
|
|
|
|
|
|
REPO = Path(__file__).resolve().parents[1]
|
|
STREAMING_PY = (REPO / "api" / "streaming.py").read_text(encoding="utf-8")
|
|
MESSAGES_JS = (REPO / "static" / "messages.js").read_text(encoding="utf-8")
|
|
UI_JS = (REPO / "static" / "ui.js").read_text(encoding="utf-8")
|
|
SESSIONS_JS = (REPO / "static" / "sessions.js").read_text(encoding="utf-8")
|
|
STYLE_CSS = (REPO / "static" / "style.css").read_text(encoding="utf-8")
|
|
|
|
|
|
def test_gateway_routing_metadata_is_safely_normalized_from_response_metadata():
|
|
metadata = {
|
|
"used_provider": "Alibaba Cloud",
|
|
"used_model": "deepseek-v3.2",
|
|
"requested_provider": "CanopyWave",
|
|
"requested_model": "deepseek-v3.2",
|
|
"api_key": "fake_credential",
|
|
"routing": [
|
|
{
|
|
"provider": "CanopyWave",
|
|
"status": "failed",
|
|
"reason": "timeout",
|
|
"score": 0.12,
|
|
"api_key": "fake_credential",
|
|
},
|
|
{"provider": "Alibaba Cloud", "status": "selected", "score": 0.91},
|
|
],
|
|
}
|
|
|
|
normalized = _normalize_gateway_routing_metadata(metadata, requested_model="deepseek-v3.2", requested_provider="CanopyWave")
|
|
|
|
assert normalized == {
|
|
"used_provider": "Alibaba Cloud",
|
|
"used_model": "deepseek-v3.2",
|
|
"requested_provider": "CanopyWave",
|
|
"requested_model": "deepseek-v3.2",
|
|
"provider_changed": True,
|
|
"model_changed": False,
|
|
"has_failover": True,
|
|
"routing": [
|
|
{"provider": "CanopyWave", "status": "failed", "reason": "timeout", "score": 0.12},
|
|
{"provider": "Alibaba Cloud", "status": "selected", "score": 0.91},
|
|
],
|
|
}
|
|
assert "fake_credential" not in repr(normalized)
|
|
|
|
|
|
def test_gateway_routing_metadata_absent_returns_none_without_placeholder_noise():
|
|
assert _normalize_gateway_routing_metadata({}, requested_model="gpt-5.5", requested_provider="openai-codex") is None
|
|
assert _normalize_gateway_routing_metadata(None, requested_model="gpt-5.5", requested_provider="openai-codex") is None
|
|
|
|
|
|
def test_session_persists_latest_gateway_routing_and_history_across_reload():
|
|
routing = _normalize_gateway_routing_metadata(
|
|
{
|
|
"used_provider": "provider-b",
|
|
"used_model": "model-b",
|
|
"requested_provider": "provider-a",
|
|
"requested_model": "model-a",
|
|
"routing": [
|
|
{"provider": "provider-a", "status": "failed"},
|
|
{"provider": "provider-b", "status": "selected"},
|
|
],
|
|
},
|
|
requested_model="model-a",
|
|
requested_provider="provider-a",
|
|
)
|
|
session = Session(session_id="732gateway", title="Gateway", gateway_routing=routing, gateway_routing_history=[routing])
|
|
session.messages = [{"role": "assistant", "content": "done", "_gatewayRouting": routing}]
|
|
session.save()
|
|
|
|
reloaded = Session.load("732gateway")
|
|
|
|
assert reloaded.gateway_routing == routing
|
|
assert reloaded.gateway_routing_history == [routing]
|
|
assert reloaded.messages[-1]["_gatewayRouting"] == routing
|
|
compact = reloaded.compact()
|
|
assert compact["gateway_routing"] == routing
|
|
assert compact["gateway_routing_history"] == [routing]
|
|
|
|
|
|
def test_streaming_captures_gateway_metadata_into_usage_payload_and_assistant_turn():
|
|
assert "_extract_gateway_routing_metadata" in STREAMING_PY
|
|
assert "usage['gateway_routing']" in STREAMING_PY
|
|
assert "_dm['_gatewayRouting']" in STREAMING_PY
|
|
assert "s.gateway_routing_history" in STREAMING_PY
|
|
|
|
|
|
def test_frontend_copies_and_formats_gateway_metadata_without_absent_noise():
|
|
assert "d.usage.gateway_routing" in MESSAGES_JS
|
|
assert "lastAsst._gatewayRouting" in MESSAGES_JS
|
|
assert "_formatGatewayModelLabel" in UI_JS
|
|
assert "_gatewayRoutingLabel" in UI_JS
|
|
assert "msg-gateway-inline" in UI_JS
|
|
assert "msg-model-warning-inline" in UI_JS
|
|
assert "gateway-failover-inline" in UI_JS
|
|
assert "if(!routing)return''" in UI_JS.replace(" ", "")
|
|
assert "_formatSessionModelWithGateway" in SESSIONS_JS
|
|
assert ".msg-model-warning-inline" in STYLE_CSS
|