Improve AI daily report operations and dedupe observability

This commit is contained in:
Ubuntu
2026-06-10 21:55:29 +08:00
parent b46cef2c7b
commit 2159ee733b
23 changed files with 761 additions and 57 deletions

View File

@@ -9,6 +9,7 @@ from .clients import BlogApiClient, OpenAICompatibleClient, fetch_text as defaul
from .config import load_pipeline_config, load_source_configs
from .env import load_env, resolve_blog_token, resolve_llm_config
from .models import SourceConfig
from .observability import LlmCallObserver, summarize_observed_calls
from .pipeline import run_stage0_to_stage8
from .publish import load_published_urls, update_published_urls
from .sources.registry import get_source_fetcher
@@ -135,15 +136,33 @@ def run_daily_report(
else:
raise ValueError("source_mode must be 'mock' or 'live'")
llm_observability_config = pipeline_config.get("llm_observability", {}) or {}
llm_observers: list[LlmCallObserver] = []
observe_llm = bool(llm_observability_config.get("enabled", True))
prompt_preview_chars = int(llm_observability_config.get("prompt_preview_chars", 500))
response_preview_chars = int(llm_observability_config.get("response_preview_chars", 500))
def maybe_observe(stage: str, call):
if not observe_llm:
return call
observer = LlmCallObserver(
call=call,
stage=stage,
prompt_preview_chars=prompt_preview_chars,
response_preview_chars=response_preview_chars,
)
llm_observers.append(observer)
return observer
if llm_mode == "mock":
semantic_llm_call = _mock_semantic_llm
rewrite_llm_call = _mock_rewrite_llm
guide_llm_call = _mock_guide_llm
semantic_llm_call = maybe_observe("stage3", _mock_semantic_llm)
rewrite_llm_call = maybe_observe("stage4", _mock_rewrite_llm)
guide_llm_call = maybe_observe("stage6", _mock_guide_llm)
elif llm_mode == "live":
llm_client = llm_client_factory(**resolve_llm_config(env))
semantic_llm_call = llm_client.chat
rewrite_llm_call = llm_client.chat
guide_llm_call = llm_client.chat
semantic_llm_call = maybe_observe("stage3", llm_client.chat)
rewrite_llm_call = maybe_observe("stage4", llm_client.chat)
guide_llm_call = maybe_observe("stage6", llm_client.chat)
else:
raise ValueError("llm_mode must be 'mock' or 'live'")
@@ -182,6 +201,9 @@ def run_daily_report(
max_age_days=cross_day_max_age_days,
)
llm_observability_report = summarize_observed_calls(llm_observers)
result["reports"]["llm_observability"] = llm_observability_report
run_dir = out_dir / run_date
run_dir.mkdir(parents=True, exist_ok=True)
(run_dir / "blog_markdown.md").write_text(result["markdown"], encoding="utf-8")