Skip to content
DriftCaught

Feature type

Evals for classification

Classification has labels, so accuracy alone can mislead. Start with One feature at $1,900 a month, which reports per class precision and recall and reruns on every tracked provider update.

Classification assigns a label: routing a ticket, tagging an intent, flagging content, picking a category. It is the feature type where evaluation is on the firmest ground, because the output comes from a fixed set and there is a right answer to compare against. The trap here is not the absence of metrics. It is reporting the wrong one.

What typically breaks in classification after a model change

The borderline cases flip

Clear cases stay clear. A billing question is still billing. What moves is the band between two classes: the ticket that is both a complaint and a cancellation, the message that is either urgent or merely annoyed. A new model version draws that line in a slightly different place, and the cases sitting on it change sides.

That is why a golden dataset (a fixed, versioned set of inputs with the verdict a domain expert gave each one) for a classifier is deliberately overweighted with borderline examples. A dataset of easy cases will pass every run and tell you nothing.

A rare class collapses while the headline number holds

If one class is 2 percent of your traffic and the model stops predicting it, aggregate accuracy moves by about those same two points, which is the arithmetic and not a measurement. The feature is broken for everyone in that class and the dashboard looks fine.

Galtea recommends measuring with accuracy, precision, recall, F1, Pearson correlation, Spearman correlation and Cohen's kappa rather than one statistic, and writes that 0.9 accuracy with 0.1 Cohen's kappa[src] is essentially guessing. [Galtea] Hamel Husain makes the same argument from the other end: raw agreement misleads when classes are imbalanced, so true positive rate and true negative rate should be reported separately against human labels. [Hamel Husain]

The output stops being a valid label

The model returns a class that is not in your enum, or the right class in different casing, or a short explanation wrapped around the label. Your mapping drops it into a fallback bucket and the fallback rate climbs. This is a formatting failure wearing a classification costume, and a code check catches it immediately if the fallback rate is a reported number rather than a log line.

Class drift in production makes an unchanged model look worse

The model has not changed and your traffic has. A new campaign, a new market, a seasonal peak, and the mix of classes arriving shifts. Aggregate numbers on the production sample move while the fixed dataset stays flat. This is drift (a measured change in a feature's scores between two runs) with a cause on your side rather than the provider's, and it is only separable because the two runs exist side by side. Langfuse says observation-level evaluators are the recommended target for live production data and lists sampling a percentage of traces as a way to manage the cost of judged evaluation. [Langfuse] The sampling method is EV-PROD.

The labels themselves stop matching the product

Six months in, your taxonomy has a class nobody uses and is missing two that support agents invented in a spreadsheet. The model is scored against a rubric (the written scoring standard applied to an output, in your expert's words) your product left behind. Future AGI recommends refreshing a golden dataset monthly by default, sampling 200-500 recent production traces[src] stratified by intent and persona, weekly during rapid change and immediately after model or corpus updates. [Future AGI]

Which scorers apply

LangSmith documents four evaluator types: human review, rule based code functions, LLM as judge (a model that scores another model's output against a written rubric) in reference free and reference based variants, and pairwise comparison of two application versions. [LangChain] Classification sits almost entirely in the second one. The label has a right answer, so the scorer (one automated check that turns an output into a number or a pass and fail verdict) set is conventional and cheap, and a judge is an unnecessary expense on most classifiers.

  • Exact label match code check. Catches a wrong label against the expected label. Misses how wrong it was, since confusing two adjacent classes and confusing two unrelated ones score the same.
  • Per class precision and recall. Catches a single class collapsing, which is the failure aggregates hide. Misses nothing about that class, and says nothing about the rest of the set, so it is always read alongside the whole table.
  • Macro F1 across classes. Catches a drop weighted equally across classes rather than by traffic volume. Misses the business weighting, because your rare class may matter more or less than an equal share.
  • Cohen's kappa against human labels. Catches agreement that is no better than chance given the class balance. Misses which class is at fault, so it is a warning light rather than a diagnosis.
  • Fallback and unknown label rate. Catches outputs that are not valid labels at all. Misses valid labels that are wrong.

A judge belongs here only where the label is genuinely interpretive, for example a severity or a tone class your experts argue about. In that case it stops being a free measurement and picks up the whole calibration burden described in EV-SCORE.

What a baseline includes for this feature type

The eval baseline for a classifier is built around the confusion pairs, not around the easy cases.

  • Real inputs per class, with the rare classes deliberately oversampled so each one has enough rows to move a number.
  • Borderline cases collected on purpose, including the ones your own experts disagreed about, with the disagreement recorded.
  • The label taxonomy itself versioned with the dataset, so a taxonomy change shows up as a dataset change rather than as a mysterious score drop.
  • Written label rules from your domain expert, including the tie-break rule for cases that could sit in two classes.
  • A report that leads with the per class table and shows the aggregate second, plus the fallback rate as its own line.
  • threshold (the number agreed with you at which a measured drop counts as a finding on this dataset) values set per class where a class matters more, with blocking failures separated from regressions (a case that passed on the previous run and fails on this one) that gate on the change in fail rate. [Galtea] Construction is EV-DATA.

Which plan fits

One feature at $1,900 a month fits a classifier in production, after the baseline. The work is cheaper here than on any other feature type, because the scorers are code and there is no judge to recalibrate, so most of the monthly value is in the reruns themselves: every tracked update in the change log, every prompt change you flag, and the weekly schedule. The caveat is about what a number means. A per class score is a statement about the dataset it was measured on, not a prediction about next week's traffic, and a classifier that holds on the fixed set can still slip on production if your class mix moves. Both runs appear in the same report for that reason. The structured output side of this problem is on the extraction hub, and every figure here traces to the evidence list.

Scorers that apply here

  • exact label match code check
  • per class precision and recall
  • macro F1 across classes
  • Cohen's kappa against human labels
  • fallback and unknown label rate

Every scorer catches something and misses something else. Which ones we run, and what each one cannot see, is set out in EV-SCORE.

Tracked changes with a note for Classification

These entries carry an impact note for this feature type, each one citing a published practitioner source. The note says what this kind of change typically touches, not what it did to anyone's feature.

GoogleNew version

gemini-3.6-flash, gemini-3.5-flash-lite

Google released gemini-3.6-flash and gemini-3.5-flash-lite as generally available. The same entry deprecates the sampling parameters temperature, top_p and top_k.

  • Classification: Classifiers usually pin sampling parameters in the request builder, so a deprecation here is a change to caller code rather than to the model you chose. Anthropic made the same kind of change from Claude Opus 4.7 onward, where a non default temperature, top_p or top_k returns a 400 error.
  • Extraction: Removing sampling parameters changes the request every fixture runs through. Braintrust tracks every change to a dataset so experiments can pin to specific versions, which is what keeps the run before the edit comparable with the run after it.
Revisit the promptSearch your request builders for temperature, top_p and top_k on Gemini calls and plan their removal, then rerun the affected cases with the parameters dropped.

Source: Google, Gemini API changelog . verified 2026-09-22

AnthropicNew version

claude-sonnet-5

Anthropic launched claude-sonnet-5 at an introductory $2 and $10 per million tokens with a 1M token context window and 128k maximum output tokens. The notes state that adaptive thinking is on by default, that manual extended thinking was removed and returns a 400 error, that non default sampling parameters return a 400 error, and that a new tokenizer produces about 30 percent more tokens.

  • Classification: Non default sampling parameters now return a 400 error, which breaks caller code without any model swap on your side. Anthropic first made this parameter deprecation from Claude Opus 4.7 onward.
  • RAG: A tokenizer that produces about 30 percent more tokens changes how much retrieved text fits in one prompt. Ragas defines faithfulness as the share of claims in a response that can be inferred from the retrieved context, so a smaller retrieved context can move the score by itself.
  • Summarisation: The same input now costs more tokens, so what reaches the summariser can change before the model does anything. Galtea warns against updating ground truth to match model behaviour when the summaries come back different.
Revisit the promptRecalculate token budgets and cost estimates against the new tokenizer, and strip manual thinking and non default sampling parameters from requests before they start failing.

Source: Anthropic, Claude API release notes . verified 2026-09-22

OpenAINew version

gpt-5.4-mini, gpt-5.4-nano

OpenAI released GPT-5.4 mini and GPT-5.4 nano to the Chat Completions and Responses APIs.

  • Classification: Weights & Biases documents an evaluation as a dataset of test examples plus one or more scoring functions, used to measure performance against repeatable test cases, compare changes over time and identify regressions. That is the structure a move to a smaller id is judged on.
Rerun the suiteIf you are considering a cheaper id for routing or tagging, run the same labelled set through gpt-5.4-mini and gpt-5.4-nano and compare it against the model you use today.

Source: OpenAI, API changelog . verified 2026-09-22

GoogleDeprecation

gemini-3-pro-preview

Google shut down Gemini 3 Pro Preview.

  • RAG: A retrieval feature pinned to a preview id can lose that id on short notice. Google says Gemini preview models may be used in production but will be deprecated with at least 2 weeks' notice.
  • Classification: A classifier that runs unattended is the last place a shutdown gets noticed. Google's documentation says most production apps should use a specific stable model, and hedges that stable models usually do not change.
Plan a migrationReplace any gemini-3-pro-preview pin with a current Gemini 3 id and rerun the affected suites, since the preview id no longer serves.

Source: Google, Gemini API changelog . verified 2026-09-22

AnthropicTool change

claude-sonnet-4-5-20250929

Anthropic took structured outputs out of beta on the Claude API for Claude Sonnet 4.5, Claude Opus 4.5 and Claude Haiku 4.5. The notes state that the output_format parameter moved to output_config.format, and that structured outputs remain in public beta on Amazon Bedrock and Microsoft Foundry.

  • Extraction: The parameter that carries your schema moved, so the request changes while the fields you expect do not. DeepEval defines a golden as an input plus the expected result, which becomes a full test case once the application produces the actual output.
  • Classification: Where labels come back through a structured output, the shape of the response is part of the feature. Galtea recommends a tiered release gate in which blocking failures such as safety or policy violations block a deploy at any rate, while regressions gate on the change in fail rate.
Revisit the promptMove output_format to output_config.format in your request builders and rerun the schema validation cases on both the Claude API and any partner platform you use.

Source: Anthropic, Claude API release notes . verified 2026-09-22

AnthropicDeprecation

claude-3-7-sonnet-20250219

On October 28, 2025, Anthropic notified developers using Claude Sonnet 3.7 of its upcoming retirement on the Claude API. The model retired on February 19, 2026, with claude-sonnet-4-6 listed as the recommended replacement.

  • Classification: A retired id stops serving, so an unattended classifier fails outright rather than quietly scoring worse. Anthropic says it gives customers with active deployments at least 60 days' notice before retiring a publicly released model, and states that partner platforms set their own schedules.
  • Generation: Prompts written for the retired model produce different text on the replacement. Galtea warns against updating ground truth to match model behaviour.
Plan a migrationConfirm that nothing still calls claude-3-7-sonnet-20250219, since requests to the retired id now fail, and rerun the prompts that were written for it.

Source: Anthropic, Model deprecations . verified 2026-09-22

OpenAIDeprecation

gpt-3.5-turbo-instruct, babbage-002, davinci-002, gpt-3.5-turbo-1106

OpenAI announced on September 26, 2025 the deprecation of gpt-3.5-turbo-instruct, babbage-002, davinci-002 and gpt-3.5-turbo-1106, with a shutdown date of September 28, 2026. The listed migration target is gpt-5.6-terra.

  • Classification: Older ids tend to sit in batch jobs and internal classifiers that nobody watches. OpenAI says it gives at least 6 months' notice before retiring a generally available model, at least 3 months for specialized variants, and that preview models may be retired with much shorter notice, such as 2 weeks, with no minimum committed.
  • Extraction: Moving an extractor onto a current model is a release like any other. Galtea recommends a tiered release gate in which blocking failures such as safety or policy violations block a deploy at any rate, while regressions gate on the change in fail rate.
Plan a migrationCheck batch jobs and older internal tools for these four ids ahead of the stated shutdown date, and move any remaining traffic to a current model.

Source: OpenAI, OpenAI API deprecations . verified 2026-09-22

Which plan fits

Start with the eval baseline at $1,800, which is where the suite for this feature comes from. Then One feature at $1,900.

What we cannot do

We cannot make a model deterministic or guarantee its outputs. We measure against an agreed dataset and thresholds and report what changed. We do not train or fine-tune models, and we do not replace human review for policy or legal decisions. Coverage is bounded by the dataset and the plan.

The longer version, with the reasoning

$1,900per month, after the baseline

A team with one AI feature in production that a provider update can change.

Reruns trigger on

  • A tracked provider announces an update
  • You flag a prompt change
  • You flag a retrieval or index change
  • The weekly scheduled run

Included

  • Reruns on every trigger with a written verdict
  • Production sampling and online scoring
  • Monthly drift report
  • Async channel

Not included

  • Agent span-level evals
  • CI gate integration
  • Same-day reruns

Questions about evaluating classification

Do we need a judge to evaluate a classifier?
Usually not. The output is a label from a fixed set, so a code check compares it against the expected label and needs no calibration. A judge only earns its place where the label itself is a matter of interpretation.
Our accuracy is 94 percent. Is that good?
It depends entirely on class balance. Galtea writes that a judge showing 0.9 accuracy with 0.1 Cohen's kappa is essentially guessing. The same arithmetic applies to any classifier scored on one number.
What is class drift?
The mix of classes arriving in production changes, even though the model has not. A new campaign, a new market or a seasonal peak shifts the balance, and an unchanged classifier looks worse on aggregate numbers.
How do we tell a model change from a traffic change?
By running both. The golden dataset is fixed, so a move there is about the model. The production sample moves with your traffic. Comparing the two separates the two causes.
Can a provider update really change a label?
It changes the borderline ones. The clear cases stay clear. The cases sitting between two classes are the ones that flip, and they are the ones the dataset has to hold enough of.

Coverage is bounded by the dataset and the plan. A suite for this feature type says nothing about the other features you ship.