Guides
Référence du SDK
Chaque nom qu’exportent les paquets oloproof et oloproof.evaluators, avec sa signature, son caractère synchrone ou asynchrone, et ce qu’il renvoie. Pour une introduction guidée, lisez d’abord L’API Python.
Seuls ces deux paquets constituent la surface publique. Tout ce qui est importé de oloproof_core relève des rouages internes du moteur et peut changer sans préavis. Chaque fonction ci-dessous s’exécute en local sur le magasin du projet ; aucune n’envoie de données où que ce soit, sauf si un évaluateur que vous passez appelle un fournisseur de modèles.
Lancer une évaluation
evaluate et aevaluate
def evaluate(*, system, dataset, evaluators, policy=None, **kwargs) -> EvaluationResult
async def aevaluate(*, system, dataset, evaluators, policy=None, **kwargs) -> EvaluationResult| Argument | Type | Ce que c’est |
|---|---|---|
| system | une fonction @system, une classe ou instance @rag_system, ou un appelable | Le système évalué. |
| dataset | chemin | Une suite JSONL. Voyez Écrire une suite. |
| evaluators | liste | Des instances de oloproof.evaluators, ou des fonctions @evaluator. |
| policy | chemin vers un release.yaml, un ReleasePolicy, ou None | La politique de publication. None n’exécute aucune porte : result.gate vaut None et rien n’est décidé. |
| concurrency | ConcurrencyConfig ou un dictionnaire tel que {"system": 8, "judge": 4} | Les appels en cours simultanément. |
| slices | liste de chaînes | Des segments exploratoires, comme dans oloproof.yaml. |
| min_slice_support | entier | En dessous de ce nombre de cas éligibles, un segment n’a pas d’intervalle. Par défaut 30. |
| replicates | entier | Mesurer chaque cas ce nombre de fois. Par défaut 1. |
evaluate est synchrone. Appelée sans boucle d’événements active, elle utilise asyncio.run ; appelée depuis une boucle active (un notebook, un test asynchrone), elle exécute l’évaluation sur un fil séparé et bloque jusqu’à la fin, si bien qu’elle est sûre dans les deux cas. aevaluate est la coroutine ; attendez-la avec await depuis du code asynchrone.
Les arguments nommés restants (metrics, store, predictive, event_sink, retry_policy, traffic_draw_id) prennent des types du moteur issus de oloproof_core et ne font pas partie de la surface stable.
from oloproof import evaluate, system, current_case
from oloproof.evaluators import ExactMatch, evaluator
@system(name="support-bot", version="1")
def answer(case):
current_case().usage(input_tokens=12, output_tokens=3)
return {"label": "refund" if "refund" in case["question"].lower() else "other"}
@evaluator(criterion="short_label")
def short_label(case):
return len(case.output["label"]) <= 6
result = evaluate(
system=answer,
dataset="cases.jsonl",
evaluators=[ExactMatch(criterion="correct_label", field="label"), short_label],
)
for metric in result.metrics:
print(metric.metric, metric.estimate, metric.interval, metric.n_observed, metric.n_missing)Exécuté sur une suite de deux cas sans politique, cela a affiché :
correct_label 1.0 lower=0.15811388300841903 upper=1.0 2 0
short_label 1.0 lower=0.15811388300841903 upper=1.0 2 0EvaluationResult
| Membre | Type | Ce que c’est |
|---|---|---|
| run | enregistrement d’exécution | L’exécution stockée, avec son id, son statut et sa complétude. |
| suite, system, evaluators | enregistrements de version | Les versions exactes que cette exécution a mesurées. |
| metrics | tuple de résultats de métrique | Un par critère et par métrique déclarée : metric, estimate, interval, n_total, n_eligible, n_observed, n_missing, exclusions, method. |
| gate | résultat de porte ou None | Avec une politique : release_action, exit_code, decisions et reasons. |
| decisions | tuple | Les décisions de la porte, ou vide sans politique. |
| cases() | liste | Chaque cas avec son exécution et ses jugements. |
| failures() | liste | Les cas qui ne se sont pas terminés, ont été en erreur, ou ont échoué à au moins un évaluateur. |
| print(stderr=False) | aucun | Le rapport de terminal qu’affiche oloproof run. |
| to_bundle(path) | chemin | Écrit un paquet portable, comme le fait oloproof export. |
Ce que signifient les états, les codes de raison et les effectifs se trouve dans Résultats et exécution.
evaluate_comparison et aevaluate_comparison
def evaluate_comparison(*, candidate_system, baseline_system, dataset, evaluators, policy, **kwargs) -> ComparisonEvaluationResult
async def aevaluate_comparison(*, candidate_system, baseline_system, dataset, evaluators, policy, **kwargs) -> ComparisonEvaluationResultExécute les deux systèmes sur la même suite dans un même ordre fixé par une graine et décide les règles de comparaison de la politique. policy est obligatoire et doit contenir au moins une règle superiority, non_inferiority ou equivalence, sinon l’appel lève une erreur de configuration. Arguments nommés supplémentaires : concurrency, replicates, et metrics, store et retry_policy, typés par le moteur. Les comportements synchrone et asynchrone sont ceux de evaluate.
ComparisonEvaluationResult a candidate et baseline (chacun un EvaluationResult) et comparison, qui porte les différences appariées et leurs décisions. Voyez Comparer deux versions.
Déclarer un système
@system
def system(func=None, *, name=None, version=None, config=None, timeout_s=None, records=())Utilisable nu (@system) ou avec des arguments (@system(name=..., version=...)), ou appelé sur un objet (system(model.answer, version="v2")). La fonction reçoit l’objet input du cas, et non le cas entier, et renvoie la sortie que lisent les évaluateurs. Elle peut être def ou async def ; une fonction synchrone s’exécute sur un fil de travail.
| Argument | Par défaut | Ce que c’est |
|---|---|---|
| name | le nom de la fonction | Fait partie de l’identité de la version. |
| version | absent | Obligatoire pour une méthode liée ou un objet appelable, parce que leur comportement dépend d’un état qu’Oloproof ne peut pas voir. |
| config | vide | Des réglages enregistrés avec la version. |
| timeout_s | 120 | La limite par appel. Un appel qui la dépasse est enregistré comme une exécution ayant dépassé son délai. |
| records | vide | Les sortes d’artefacts que le système enregistre, comme retrieval/v1. Un évaluateur qui exige une sorte que le système ne déclare pas est refusé avant le début de l’exécution. |
Le source du module de la fonction entre dans l’empreinte de la version, si bien que le modifier invalide les exécutions en cache. Voyez la Référence de configuration pour ce qui l’invalide aussi et ce qui ne l’invalide pas.
current_case
def current_case() -> CaseRecorderDisponible seulement pendant qu’Oloproof appelle votre système ; ailleurs, elle lève RuntimeError. Les méthodes de l’enregistreur :
| Méthode | Enregistre |
|---|---|
| usage(*, input_tokens=None, output_tokens=None, cost_usd=None) | Les jetons et le coût d’un appel de modèle. Une valeur omise reste non enregistrée, pas nulle. |
| artifact(kind, data) | Toute valeur JSON ou tout modèle Pydantic sous une sorte comme trace ou conversation/v1. |
| retrieval(retrieval) | Les candidats classés qu’a renvoyés un récupérateur (retrieval/v1). |
| context(context) | Le contexte assemblé pour la génération (context/v1). |
| citations(ids) | Les identifiants que cite une réponse, sous la forme doc_id ou doc_id#chunk_id (citations/v1). |
| agent_trajectory(trajectory) | Les étapes d’un agent, ses appels d’outils et leurs résultats, et ses points de contrôle (agent_trajectory/v1). |
Chacune renvoie un ArtifactRef (sauf usage, qui ne renvoie rien). Les charges typées sont exportées pour construire ces enregistrements : Retrieval, Passage, Context, ContextItem, DroppedItem, Citations, StageTimings, AgentTrajectory, AgentStep, AgentCheckpoint, AgentConstraintCheck, et le nom de sorte CONVERSATION (conversation/v1).
@rag_system
def rag_system(*, name, depth, top_k, token_budget=None, index_version=None, version=None, config=None, citations_path="citations")Un décorateur de classe. La classe fournit retrieve(input, depth) et generate(input, context), plus count_tokens(passage) quand elle fixe un token_budget. context est la liste des objets Passage qui ont survécu à top_k et au budget, dans l’ordre du classement. Oloproof enregistre lui-même retrieval/v1, context/v1, citations/v1 et stage_timings/v1, et met chaque étape en cache séparément. citations_path nomme le champ de sortie qui contient les identifiants que cite la réponse. Voyez Évaluation RAG.
Évaluateurs
Toutes les classes sont dans oloproof.evaluators. Le criterion de chacune nomme la métrique qu’elle produit. Les artefacts que lit chacune, et son équivalent YAML, sont dans le tableau des évaluateurs de la Référence de configuration.
| Classe | Signature |
|---|---|
| ExactMatch | (*, criterion, field=None, expected_field=None, strip=True, casefold=False) |
| Contains | (*, criterion, field=None, expected_field=None) |
| Regex | (*, criterion, pattern, field=None, pass_if="match") |
| JsonSchema | (*, criterion, schema, field=None) |
| RubricJudge | (*, criterion, provider, model, rubric_text=None, rubric_file=None, api_key_env=None, base_url=None, temperature=0, max_tokens=512, timeout_s=60.0) |
| Groundedness | (*, provider, model, criterion="groundedness", **options) |
| CitationSupport | (*, provider, model, criterion="citation_support", **options) |
| CitationValidity | (*, criterion="citations_valid", require_citations=False) |
| HitRate, Recall | (k=None, *, criterion=None, relevance_unit="doc"), k vaut 5 par défaut |
| MRR, NDCG | (k=None, *, criterion=None, relevance_unit="doc"), k vaut 10 par défaut |
| AgentMaxSteps | (max_steps, *, criterion=None) |
| AgentToolCalled | (tool_name, *, min_calls=1, criterion=None) |
| AgentNoToolLoop | (*, max_repeats=2, criterion="agent_no_tool_loop") |
| AgentToolSequence | (*, ordered=True, criterion="agent_tool_sequence") |
| AgentNoUndeclaredTool | (*, criterion="agent_no_undeclared_tool") |
| AgentConstraintsSatisfied | (constraints=(), *, criterion="agent_constraints_satisfied") |
| AgentRoute | (*, criterion="agent_route") |
| AgentToolPermissions | (permissions, *, criterion="agent_tool_permissions") |
| AgentMaxHandoffs | (max_handoffs, *, criterion=None) |
| ConversationCompleted | (*, criterion="conversation_completed") |
| ConversationJudge | comme RubricJudge |
| PredictiveCorrect, PredictiveRecall, PredictivePrecision | (*, criterion, positive=True, field="label", expected_field="label") |
| AbsoluteError | (*, criterion, target_range, field="label", expected_field="label") |
| Brier, PredictiveRanking | (*, criterion, positive=True, field="score", expected_field="label") |
| LogLoss | (*, clip, criterion, positive=True, field="score", expected_field="label") |
| CustomEvaluator | (func, *, criterion, reads=("output", "expected"), cacheable=False, version=None, value_type="binary", score_range=None) |
provider vaut "anthropic", "openai" ou "openai_compatible". Un juge lit sa clé dans la variable d’environnement que nomme api_key_env (ANTHROPIC_API_KEY ou OPENAI_API_KEY par défaut) et est facturé par ce fournisseur. Groundedness et CitationSupport prennent le reste des réglages de RubricJudge via **options. Le juge probabiliste, le classifieur modèle et la cascade n’ont pas de classe dans le SDK ; ils n’existent qu’en YAML.
ConversationCompleted et ConversationJudge lisent un artefact conversation/v1 que votre système enregistre. Oloproof ne pilote pas la conversation : votre application exécute chaque tour et enregistre la transcription. Voyez Agents et outils.
@evaluator
def evaluator(*, criterion, reads=("output", "expected"), cacheable=False, version=None, value_type="binary", score_range=None)Enveloppe une fonction d’un argument, le cas, dans un CustomEvaluator. Le cas a output, expected et scenario, et artifacts(name) renvoie les charges d’une sorte enregistrée. La fonction peut être def ou async def. Un évaluateur binaire renvoie True ou False ; un évaluateur de score déclare value_type="score" et score_range=(low, high) et renvoie un nombre. Une exception levée par la fonction enregistre le cas comme manquant pour ce critère, jamais comme un échec.
reads doit lister chaque champ que lit la fonction (input, output, expected, metadata, metadata.<key> ou artifacts.<name>), parce que le jugement en cache est indexé exactement sur ceux-là. Les jugements ne sont réutilisés d’une exécution à l’autre qu’avec cacheable=True. Le source du module qui la définit entre dans la version, si bien que le modifier les invalide. Le YAML ne peut pas nommer un évaluateur personnalisé.
Diagnostic
diagnose et adiagnose
def diagnose(run_id, **kwargs) -> InterventionResult
async def adiagnose(run_id, *, system, evaluators, intervention, criterion, control=True, top_k=None, reranker=None, reranker_root=None, store=None, concurrency=None) -> InterventionResultRéexécute les cas en échec d’une exécution stockée sous une intervention : "gold-context", "top-k" (avec top_k) ou "reranker" (avec reranker). system et evaluators doivent être les versions qu’a utilisées l’exécution ; une version différente est refusée avant toute exécution. Avec control=True, un échantillon de contrôle frais s’exécute à côté de l’intervention, si bien qu’on peut distinguer un changement de la variation d’une exécution à l’autre. diagnose est la forme synchrone et se comporte dans une boucle active comme evaluate. Voyez Évaluation RAG pour la démarche.
InterventionResult contient l’identifiant de l’exécution parente, l’intervention, si elle était prise en charge, les exécutions d’intervention et de contrôle, un résultat par cas, et un DiagnosisReport d’entrées CaseDiagnosis quand il en a été produit un.
Rejeu d’agent
def supports_replay(system) -> bool
def checkpoint_for(trajectory, step_index) -> AgentCheckpoint | None
async def replay_case(system, *, scenario_id, trajectory, checkpoint, change) -> ReplayOutcome
def label_case(outcome) -> CaseDiagnosis
def label_cases(outcomes) -> tuple[CaseDiagnosis, ...]
def unnecessary_steps(labels) -> tuple[UnnecessaryStep, ...]Le rejeu est quelque chose que fait votre système, pas quelque chose qu’Oloproof simule. Un système ne le prend en charge qu’en implémentant async def replay(self, trajectory, *, checkpoint, change) -> AgentTrajectory, qui renvoie ce que l’agent a fait à partir du point de contrôle ; Oloproof y raccorde le préfixe enregistré et compare. Votre application possède son état, ses sessions et les effets de bord de ses outils, y compris leur réinitialisation avant un rejeu. supports_replay indique si un système déclare la méthode.
replay_case est une coroutine : attendez-la avec await, ou appelez-la via asyncio.run. Elle exécute un contrôle (le même point de contrôle avec ReplayChange(kind="resume")) avant le rejeu, et ne tente pas le rejeu quand le contrôle ne reproduit pas l’enregistrement. change vaut ReplayChange(kind="drop_step", step_index=...) ou ReplayChange(kind="resume"). checkpoint_for choisit le dernier point de contrôle enregistré strictement avant une étape, ou None, auquel cas le résultat est écarté comme no_checkpoint_recorded sans toucher au système.
ReplayOutcome porte scenario_id, change, les statuts terminaux du rejeu et du contrôle, et discarded avec une raison quand le cas ne produit aucune preuve. Un cas écarté n’est pas un cas en échec. label_case transforme un résultat en CaseDiagnosis avec un FailureLabel et son LabelReason ; unnecessary_steps liste les étapes dont la suppression a laissé le résultat intact. Voyez Agents et outils.
Étiquettes humaines et confiance dans les évaluateurs
def record_label(*, run_id, scenario_id, criterion, passed, labelled_by, note=None, purpose="measurement", sample_index=0, config="oloproof.yaml", store=None, ...) -> HumanLabelStocke le verdict réussite/échec d’une personne sur un cas d’une exécution stockée. Les étiquettes alimentent oloproof evaluators validate, qui mesure l’accord d’un juge avec elles (AgreementResult) et enregistre son statut (RegistryEntry). Les arguments supplémentaires measurement_sample_* lient une étiquette à un échantillon de mesure ; oloproof labels export et oloproof labels import de l’outil en ligne de commande les remplissent pour vous. Voyez Juges.
Les politiques dans le code
ReleasePolicy, IntervalThresholdRule, ObservedCountRule et DecisionRule (l’union des deux) construisent une politique sans fichier. Leurs champs sont les champs de release.yaml de la Référence de configuration ; une règle d’intervalle prend direction (min ou max) et threshold au lieu de min: ou max:. Les règles de comparaison n’ont pas de classe exportée ; écrivez-les dans release.yaml et passez son chemin.
from oloproof import IntervalThresholdRule, ReleasePolicy
policy = ReleasePolicy(
rules=(IntervalThresholdRule(id="accuracy", metric="correct_label", direction="min", threshold=0.8),),
)Autres exports
| Nom | Ce que c’est |
|---|---|
| ConcurrencyConfig | Les limites system et judge, comme dans oloproof.yaml. |
| TransientError | Levez-la depuis un système, avec retryable=True, pour que l’appel soit retenté avec recul. |
| ArtifactRef | La référence que renvoie un artefact enregistré : sa sorte et son empreinte. |
| __version__ | La version du paquet installé. |