.analyze() is the last step in the evaluation chain. It runs the same durable, multi-stage pipeline as the dashboard’s “Analyze” button: each response is scored by 1-3 LLM judges, then reduced through question- and cluster-level summaries into one final qualitative report, returned as a Report object.
Numeric scores (
average_rating, similarity metrics) are ready right after .finalize(), so you don’t need to wait for .analyze() just to see how the run went. Because .analyze() polls a job until it completes, it can take noticeably longer than a single LLM call for larger runs; progress is shown in the terminal while it waits.Controlling the analysis
Check on a long-running analysis without calling
.analyze() again, even from a separate script execution:
Fields
Each
rating sub-field is one of "high", "medium", "low". recommendations[].category is one of "instructions", "tools", "knowledge", "reasoning", "consistency", "other"; priority is "high", "medium", or "low".
Reading it in your terminal
report.dashboard_url to review the full report, per-question breakdowns, and instruction-change suggestions in the dashboard.
Per-result rows without an analysis
results() returns the raw scored rows - no analysis job, no extra judge calls - for asserting
on individual results in scripts and CI:
traceId, latency and token counts,
similarity metrics, and every named scorer row. client.evaluations.get_run(run_id) fetches
the same payload later, from a different process.
