Add INFO/DEBUG logging to factory: log resolved base_url per model

build_models now logs: judge=<model>-><url> embedding=<model>-><url>

Makes it easy to confirm which gateway is actually used for each model.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
wangwei
2026-07-01 21:24:59 +08:00
co-authored by Copilot
parent f6e10145cd
commit 1dec4c8372
+26 -7
View File
@@ -2,6 +2,7 @@
from __future__ import annotations from __future__ import annotations
import logging
from typing import Any from typing import Any
from openai import AsyncOpenAI from openai import AsyncOpenAI
@@ -28,14 +29,17 @@ from .judge_prompts import localize_pipeline_prompts
from .pipeline import MetricPipeline from .pipeline import MetricPipeline
logger = logging.getLogger("rag_eval.metrics.factory")
def _resolve_openai_client_kwargs( def _resolve_openai_client_kwargs(
judge_model: str, model: str,
settings: EvaluationSettings, settings: EvaluationSettings,
) -> dict[str, Any]: ) -> dict[str, Any]:
"""Return AsyncOpenAI kwargs, preferring a matching LLM Profile over .env settings. """Return AsyncOpenAI kwargs, preferring a matching LLM Profile over .env settings.
Lookup order: Lookup order:
1. LLM Profile whose model name equals judge_model (exact match) 1. LLM Profile whose model name equals `model` (exact match)
2. Fall back to EvaluationSettings (.env) 2. Fall back to EvaluationSettings (.env)
""" """
try: try:
@@ -43,26 +47,35 @@ def _resolve_openai_client_kwargs(
from webapp.services.profile_manager import profile_manager from webapp.services.profile_manager import profile_manager
profiles = profile_manager.list_all() profiles = profile_manager.list_all()
for profile in profiles: for profile in profiles:
if profile.model == judge_model: if profile.model == model:
kwargs: dict[str, Any] = { kwargs: dict[str, Any] = {
"api_key": profile.api_key or "sk-placeholder", "api_key": profile.api_key or "sk-placeholder",
"timeout": float(profile.timeout_seconds or 30), "timeout": float(profile.timeout_seconds or 30),
} }
if profile.base_url and profile.base_url.strip(): if profile.base_url and profile.base_url.strip():
kwargs["base_url"] = profile.base_url.strip() kwargs["base_url"] = profile.base_url.strip()
logger.debug(
"[factory] model=%s source=profile base_url=%s",
model, kwargs.get("base_url", "(not set, using default)")
)
return kwargs return kwargs
except Exception: # noqa: BLE001 except Exception as exc: # noqa: BLE001
# If profile lookup fails for any reason, fall through to .env settings. # If profile lookup fails for any reason, fall through to .env settings.
pass logger.warning("[factory] profile lookup failed for model=%s: %s", model, exc)
return settings.openai_client_kwargs fallback = settings.openai_client_kwargs
logger.debug(
"[factory] model=%s source=env base_url=%s",
model, fallback.get("base_url", "(not set)")
)
return fallback
def resolve_openai_client_kwargs( def resolve_openai_client_kwargs(
judge_model: str, judge_model: str,
settings: EvaluationSettings, settings: EvaluationSettings,
) -> dict[str, Any]: ) -> dict[str, Any]:
"""Public accessor for profile-aware AsyncOpenAI kwargs (matched by judge_model). """Public accessor for profile-aware AsyncOpenAI kwargs (matched by model name).
Exposed so other components (e.g. the optimization advisor's direct LLM call) Exposed so other components (e.g. the optimization advisor's direct LLM call)
can build a client that honors the same saved-profile/.env resolution used by can build a client that honors the same saved-profile/.env resolution used by
@@ -106,6 +119,12 @@ def build_models(
llm_kwargs = _resolve_openai_client_kwargs(judge_model, settings) llm_kwargs = _resolve_openai_client_kwargs(judge_model, settings)
emb_kwargs = _resolve_openai_client_kwargs(embedding_model, settings) emb_kwargs = _resolve_openai_client_kwargs(embedding_model, settings)
logger.info(
"[factory] build_models judge=%s%s embedding=%s%s",
judge_model, llm_kwargs.get("base_url", "(env default)"),
embedding_model, emb_kwargs.get("base_url", "(env default)"),
)
llm_client = AsyncOpenAI(**llm_kwargs) llm_client = AsyncOpenAI(**llm_kwargs)
# Only allocate a second client when the embedding model needs different settings. # Only allocate a second client when the embedding model needs different settings.
emb_client = AsyncOpenAI(**emb_kwargs) if emb_kwargs != llm_kwargs else llm_client emb_client = AsyncOpenAI(**emb_kwargs) if emb_kwargs != llm_kwargs else llm_client