Skip to content

Commit 746bc28

Browse files
authored
fix(evaluations): Compact traces for prompt (#1274)
1 parent fc0b6c5 commit 746bc28

15 files changed

Lines changed: 357 additions & 65 deletions

File tree

‎backend/app/crud/evaluations/__init__.py‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,8 @@
5959
EvaluationScore,
6060
NumericSummaryScore,
6161
SummaryScore,
62-
TraceData,
63-
TraceScore,
6462
)
63+
from app.models.evaluation import TraceData, TraceScore
6564

6665
__all__ = [
6766
# Core

‎backend/app/crud/evaluations/core.py‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212
from app.core.util import now
1313
from app.crud.config.version import ConfigVersionCrud
1414
from app.crud.evaluations.langfuse import fetch_trace_scores_from_langfuse
15-
from app.crud.evaluations.score import DEFAULT_CATEGORY, EvaluationScore, TraceData
15+
from app.crud.evaluations.score import (
16+
DEFAULT_CATEGORY,
17+
EvaluationScore,
18+
)
1619
from app.models import EvaluationRun, EvaluationRunUpdate
17-
from app.models.evaluation import RunModeEnum
20+
from app.models.evaluation import RunModeEnum, TraceData
1821
from app.models.config.config import ConfigTag
1922
from app.models.llm.request import ConfigBlob, LLMCallConfig
2023
from app.models.stt_evaluation import EvaluationType

‎backend/app/crud/evaluations/fast.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@
114114
EvaluationScore,
115115
OverallSummary,
116116
SummaryScore,
117-
TraceData,
118117
compute_overall_summary,
119118
)
119+
from app.models.evaluation import TraceData
120120
from app.crud.evaluations.summary import generate_run_ai_summary
121121
from app.crud.job import create_batch_job, get_batch_job
122122
from app.models import EvaluationRun, EvaluationRunUpdate

‎backend/app/crud/evaluations/fast_traces.py‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@
1414
DEFAULT_CATEGORY,
1515
GUARDRAIL_TRACE_KEYS,
1616
JUDGE_FAILED_REASON,
17-
TraceData,
18-
TraceScore,
1917
verdict_from_score,
2018
)
19+
from app.models.evaluation import TraceData, TraceScore
2120

2221
# How many top KB matches to name in the knowledge_base trace comment.
2322
_KB_TOP_CHUNKS = 3

‎backend/app/crud/evaluations/langfuse.py‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@
2222
COSINE_SCORE_NAME,
2323
DEFAULT_CATEGORY,
2424
EvaluationScore,
25-
TraceData,
26-
TraceScore,
2725
)
26+
from app.models.evaluation import TraceData, TraceScore
2827

2928
logger = logging.getLogger(__name__)
3029

‎backend/app/crud/evaluations/merge.py‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@
2121
EvaluationScore,
2222
NumericSummaryScore,
2323
SummaryScore,
24-
TraceData,
25-
TraceScore,
2624
UNSCOREABLE_REASONS,
2725
)
26+
from app.models.evaluation import TraceData, TraceScore
2827

2928
logger = logging.getLogger(__name__)
3029

‎backend/app/crud/evaluations/processing.py‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,11 @@
5757
COSINE_SCORE_COMMENT,
5858
COSINE_SCORE_NAME,
5959
EvaluationScore,
60-
TraceData,
6160
)
6261
from app.crud.job import get_batch_job, update_batch_job
6362
from app.models import EvaluationRun, EvaluationRunUpdate
6463
from app.models.batch_job import BatchJob, BatchJobUpdate
65-
from app.models.evaluation import RunModeEnum
64+
from app.models.evaluation import RunModeEnum, TraceData
6665
from app.utils import get_langfuse_client, get_openai_client
6766

6867
logger = logging.getLogger(__name__)

‎backend/app/crud/evaluations/score.py‎

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from enum import Enum
44
from typing import Literal, NotRequired, TypedDict
55

6+
from app.models.evaluation import TraceData
7+
68
DEFAULT_CATEGORY: str = "Other"
79

810

@@ -61,35 +63,6 @@ def verdict_from_score(score: float) -> VerdictEnum:
6163
)
6264

6365

64-
class TraceScore(TypedDict):
65-
"""A score attached to a trace."""
66-
67-
name: str
68-
value: float | str
69-
data_type: str
70-
comment: NotRequired[str]
71-
verdict: NotRequired[str]
72-
# True for placeholder scores on unscoreable items; excluded from summary stats.
73-
unscoreable: NotRequired[bool]
74-
75-
76-
class TraceData(TypedDict):
77-
"""Data for a single trace including Q&A and scores."""
78-
79-
trace_id: str
80-
question: str
81-
llm_answer: str
82-
question_id: int | None
83-
ground_truth_answer: str
84-
category: NotRequired[str]
85-
# "blocked: ..." | "rephrased" | "applied"; None if guardrails didn't fire.
86-
guardrail: NotRequired[str | None]
87-
# LLM input after input guardrails / output before output guardrails.
88-
input_to_llm: NotRequired[str | None]
89-
output_from_llm: NotRequired[str | None]
90-
scores: list[TraceScore]
91-
92-
9366
# Merged key-by-key since None is meaningful.
9467
GUARDRAIL_TRACE_KEYS: tuple[
9568
Literal["guardrail", "input_to_llm", "output_from_llm"], ...

‎backend/app/crud/evaluations/summary.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import logging
55

66
from app.core.config import settings
7-
from app.crud.evaluations.score import TraceData
7+
from app.models.evaluation import TraceData
88
from app.services.llm.providers.claude import (
99
STOP_REASON_COMPLETE,
1010
ClaudeProvider,

‎backend/app/models/evaluation.py‎

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from datetime import datetime
22
from enum import Enum
3-
from typing import TYPE_CHECKING, Any, Literal, Optional
3+
from typing import TYPE_CHECKING, Any, Literal, NotRequired, Optional, TypedDict
44
from uuid import UUID
55

66
from pydantic import BaseModel, Field, HttpUrl
@@ -629,3 +629,57 @@ class PromptRecommendationJobPublic(SQLModel):
629629
recommendation_type: Literal["prompt"] = "prompt"
630630
config_version: ConfigVersionPublic | None = None
631631
error_message: str | None = None
632+
633+
634+
class TraceScore(TypedDict):
635+
"""A score attached to a trace."""
636+
637+
name: str
638+
value: float | str
639+
data_type: str
640+
comment: NotRequired[str]
641+
verdict: NotRequired[str]
642+
# True for placeholder scores on unscoreable items; excluded from summary stats.
643+
unscoreable: NotRequired[bool]
644+
645+
646+
class TraceData(TypedDict):
647+
"""Data for a single trace including Q&A and scores."""
648+
649+
trace_id: str
650+
question: str
651+
llm_answer: str
652+
question_id: int | None
653+
ground_truth_answer: str
654+
category: NotRequired[str]
655+
# "blocked: ..." | "rephrased" | "applied"; None if guardrails didn't fire.
656+
guardrail: NotRequired[str | None]
657+
# LLM input after input guardrails / output before output guardrails.
658+
input_to_llm: NotRequired[str | None]
659+
output_from_llm: NotRequired[str | None]
660+
scores: list[TraceScore]
661+
662+
663+
class TraceScoreSummary(TypedDict):
664+
"""A TraceScore without the UI-only fields (data_type, verdict)."""
665+
666+
name: str
667+
value: float | str
668+
comment: NotRequired[str]
669+
unscoreable: NotRequired[bool]
670+
671+
672+
class TraceAttempt(TypedDict):
673+
"""One run of a question: its answer and scores."""
674+
675+
llm_answer: str
676+
scores: list[TraceScoreSummary]
677+
678+
679+
class TraceQuestion(TypedDict):
680+
"""A dataset question with one attempt per duplication-factor repeat."""
681+
682+
question_id: int | str | None
683+
question: str
684+
ground_truth_answer: str
685+
attempts: list[TraceAttempt]

0 commit comments

Comments
 (0)