Improve AI daily report operations and dedupe observability
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user