LA COUCHE D’ACCEPTATION POUR LE TRAVAIL DES AGENTS, À L’ÉCHELLE
Les agents expédient du travail plus vite que toute équipe ne peut le revoir. Le critique de SeaOtter note chaque artefact et renvoie des correctifs jusqu’à ce que la politique soit respectée — agent↔critique, à vitesse machine.
À L’ÉCHELLE DES AGENTS
Un agent soumet du travail à la notation. Il est routé vers un passage one-shot rapide — ou un contrôle agentique profond qui exécute le travail dans un bac à sable et le sonde. Un modèle critique hostile décide, et vous payez le calcul consommé. Puis reculez : des milliers d’agents, notés en parallèle, en synchrone ou asynchrone.
FEEDBACK LOCALISÉ
Le critique ne se contente pas de dire qu’il y a un problème. Il localise l’anomalie pour que l’agent révise la ligne, la page, la diapositive, la cellule, l’image ou le timestamp exact qui a échoué.
"Il peut y avoir un problème quelque part dans cet artefact."
hallucinated_api · élevé
self.tasks.add_item(task)add_item n’est pas une méthode valide pour list, cela lèvera une exception à l’exécution. Attendu : self.tasks.append(task).
Une lecture précoce, vérifiée sur holdout, de la capacité de notre critique à épingler l’exacte plage et à nommer le fichier. La détection est encore en entraînement actif ; la revendication porte ici sur la qualité de localisation, pas sur la critique générique.
SOUMETTRE → NOTER
Un agent fait un POST du travail qu’il vient de produire et SeaOtter l’évalue selon votre politique d’acceptation. Les contrôles petits et rapides renvoient le verdict inline. Les contrôles plus lourds renvoient un identifiant de job que l’agent scrute, diffuse ou reçoit par webhook — pour qu’une longue relecture ne bloque jamais l’agent demandeur.
POUR PERSONNES
Envoyez le travail à la boîte de réception SeaOtter et recevez une réponse OtterScore notée, ou collez-le sur le web et notez-le dans votre navigateur. Aucun agent requis.
POUR AGENTS
Reliez tout agent via HTTP ou MCP pour qu’il note sa propre sortie dans la boucle — même politique, même OtterScore, à vitesse machine. Le démarrage rapide en 60 secondes est juste ci-dessous.
SYNCHRONE
POSTez le travail, maintenez la connexion, recevez le verdict OtterScore — bande, défauts, repères, améliorations — dans la même réponse. Idéal pour un contrôle one-shot dans la boucle interne d’un agent, où l’agent a besoin de la réponse avant sa prochaine étape.
POST /api/v1/eval/score → 200 { band, flaws[], upgrades[] }
ASYNCHRONE
POSTez le travail, obtenez immédiatement un identifiant de job, puis scrutez le job, abonnez-vous au flux de résultats ou enregistrez un webhook. Idéal pour un contrôle agentique qui exécute le travail dans un bac à sable sur plusieurs passes — l’agent producteur continue et est rappelé à l’arrivée du verdict.
POST /api/v1/eval/jobs → 202 { job_id } · poll · stream (SSE) · webhook
Synchrone · one-shot
Un passage d’un critique hostile, renvoyé inline. Bon marché et forfaitaire.
curl -s https://dev-api.seaotter.ai/api/v1/eval/score \
-H "Authorization: Bearer $OTTER_KEY" -H 'Content-Type: application/json' \
-d '{ "mode":"one_shot", "modality":"text",
"policy_id":"acme-prod-acceptance",
"artifact_parts":[{"mime_type":"text/plain","text":"..."}] }'
# 200 { "band":"route_to_fix", "flaws":[...], "upgrades":[...] }Asynchrone · agentique
Le critique exécute le travail dans un bac à sable et le sonde sur plusieurs passes.
POST /api/v1/eval/jobs
{ "mode":"agentic", "modality":"code",
"policy_id":"acme-prod-acceptance",
"artifact_ref":"gs://...", "max_passes":6,
"webhook":"https://acme.internal/otter-callback" }
# 202 { "job_id":"job_8f21", "status":"running" }
GET /api/v1/eval/jobs/job_8f21 # poll, ou stream, ou attendre le webhookMême politique, même OtterScore, même enregistrement d’audit signé — quel que soit le transport choisi par l’agent.
POUR AGENTS · DÉMARRAGE RAPIDE MCP
Trois étapes : frapper une clé, ajouter un serveur MCP, puis votre agent appelle otter_score / otter_iterate dans sa propre boucle — même OtterScore, même politique d’acceptation, à vitesse machine. Le critique note ; votre agent révise selon les défauts jusqu’à franchir la bande. C’est la boucle que vous venez de voir dans la flotte ci-dessus : chaque artefact signalé (route_to_fix, l’arc ambre) ré-entre dans la gate via otter_iterate et n’est expédié que lorsque ready_to_ship vaut true. Aucun humain dans la boucle interne — le visa nominatif est la dernière gate, pas la seule.
Un utilisateur d’organisation connecté frappe la clé d’évaluation de l’agent une fois. Le secret sk-otter-… est affiché une seule fois ; remettez-le à l’agent.
Ajoutez un serveur otterloop dans .mcp.json (Claude / Cursor) ou config.toml (Codex). L’agent obtient des outils de critique en lecture seule qu’il peut auto-approuver.
L’agent soumet le travail, lit les défauts ancrés, révise et re-soumet — en bouclant tant que ready_to_ship est faux. Survivre au critique EST le produit.
1 — Enregistrer
POST /api/v1/agent-keys avec un JWT utilisateur connecté. Le secret est renvoyé une fois — ou cliquez sur « Generate eval API key » dans la console développeur.
curl -s -X POST https://dev-api.seaotter.ai/api/v1/agent-keys \
-H "Authorization: Bearer $SEAOTTER_USER_JWT" \
-H 'Content-Type: application/json' \
-d '{"name":"my-agent"}'
# -> { "id":"...", "key":"sk-otter-...",
# "key_prefix":"sk-otter-abcde", "created_at":"..." }
# Remettez `key` à l’agent comme OTTERLOOP_API_KEY.2 — Ajouter le serveur MCP
.mcp.json (Claude / Cursor) — Codex utilise [mcp_servers.otterloop] dans config.toml. Installation unique : pip install "otterloop[mcp]". Base prod : https://api.seaotter.ai.
{
"mcpServers": {
"otterloop": {
"command": "python",
"args": ["-m", "otterloop.mcp_server"],
"env": {
"OTTERLOOP_API_URL": "https://dev-api.seaotter.ai",
"OTTERLOOP_API_KEY": "sk-otter-...",
"OTTERLOOP_POLICY_ID": "enterprise-default"
}
}
}
}
# tools: otter_list_policies · otter_score · otter_iterate
# otter_score_workflow · otter_get_feedback_artifact3 — Noter et itérer
L’agent exécute soumettre → défauts → réviser → re-soumettre entièrement via MCP. Considérez le verdict comme faisant autorité — NE VOUS notez PAS vous-même.
# soumettez votre travail -> verdict faisant autorité
v = otter_score(
work="...the artifact your agent produced...",
modality="text",
prompt="Draft the Q3 incident postmortem",
policy_id="enterprise-default")
# -> { run_id, score, band:"route_to_fix",
# flaws:[{criterion,severity,detail,anchor}],
# upgrades:[...], ready_to_ship:false }
# révisez selon flaws[]/upgrades[], puis re-soumettez le MÊME run
d = otter_iterate(
run_id=v["run_id"],
work="...revised draft addressing the flaws...",
prompt="addressed sourcing + tone")
# -> { run_id, verdict:{band:"ship",...},
# delta:{resolved_flaws,new_flaws,persisted_flaws,
# score_change:+18.0}, ready_to_ship:true }
# continuez d’itérer tant que ready_to_ship est faux.ITÉRER → CONVERGER
Ce que renvoie otter_iterate — la même convergence route_to_fix → ship que la flotte anime ci-dessus, figée en delta lisible.
resolved_flaws ↓ 2 · score_change ↑ +18.0 · ready_to_ship → true
Équivalent pure-HTTP (sans MCP) : POST /api/v1/eval/runs → { run_id, first_iteration.critic_verdict }, puis POST /api/v1/eval/runs/{run_id}/iterate { "decision":"re_prompt", "new_artifact_parts":[…] } → { verdict, delta }. Une panne du critique échoue en FERMÉ (band:quarantine) — jamais de réussite silencieuse.
DEUX MODES DE CONTRÔLE
Chaque sortie ne requiert pas le même niveau d’examen. Un contrôle one-shot est un seul passage d’un critique hostile — rapide, peu coûteux, renvoyé inline. Un contrôle agentique exécute le travail dans un bac à sable jetable, connecté à Internet, et le sonde sur plusieurs passes — plus lent, plus coûteux, renvoyé en asynchrone. Dirigez les travaux peu coûteux vers le one-shot et les travaux à fort enjeu vers l’agentique, sous la même politique.
| One-shotun seul passage hostile | Agentiquebac à sable, multi-passes | |
|---|---|---|
| Action du critique | Lit l’artefact, la politique, le prompt et les références en un seul passage. | Exécute le travail dans un bac à sable jetable et le sonde sur plusieurs passes. |
| Latence | Inline — verdict dans la réponse. | Asynchrone — identifiant de job, puis poll, stream ou webhook. |
| Calcul | Faible et prévisible. | Plus élevé — croît avec le nombre de passes et le temps en bac à sable. |
| Idéal pour | Contrôles en boucle interne, brouillons à grand volume, seuils rapides. | Code à exécuter, assertions à reproduire, travaux à fort rayon d’impact. |
| Facturation | Bon marché, forfait par contrôle. | Au compteur selon calcul et temps de bac à sable. |
Les deux modes renvoient la même forme de verdict OtterScore et écrivent le même enregistrement d’audit signé.
TARIFICATION À L’USAGE
Vous êtes facturé pour l’évaluation réellement exécutée, pas au siège. Un contrôle one-shot est bon marché et forfaitaire ; un contrôle agentique est au compteur selon le calcul et le temps en bac à sable. C’est ce qui rend économique l’évaluation de chaque sortie — et de toute la flotte — au lieu de rationner la relecture à un échantillon.
CONTRÔLE ONE-SHOT
Bon marché, forfaitaire
par contrôle, forfait
Un seul passage d’un critique hostile, renvoyé inline. Assez peu cher pour rester dans la boucle interne de chaque agent et noter les brouillons à haut volume.
CONTRÔLE AGENTIQUE
Au compteur selon calcul
au compteur selon calcul + temps bac à sable
Une relecture en bac à sable, multi-passes. Vous payez pour les passes et le temps de bac à sable réellement nécessaires — à réserver aux sorties à fort enjeu où cela se justifie.
Le déploiement Entreprise reste shadow → enforce → managed ; la tarification à l’usage mesure le travail sous-jacent. Chiffrage concret en £ disponible sur demande.
INFRA OTTERLOOP
N’importe quel agent émet du travail : code, texte, image, diaporama, feuille, vidéo, ou une trajectoire complète.
SeaOtter l’évalue selon la bonne rubrique et le seuil conditionné par l’organisation.
Le verdict renvoie des défauts, améliorations et repères directement ciblables par l’agent.
L’agent réécrit l’artefact ou l’étape suivante en s’appuyant sur la contre-analyse du critique.
La boucle s’arrête seulement lorsque la bande franchit le seuil et que la preuve d’audit est écrite.
MCP
Ajoutez dans `.mcp.json` ou `config.toml` pour Claude, Codex, Cursor ou un runtime personnalisé.
{ "mcpServers": { "otterloop": {
"command": "python", "args": ["-m", "otterloop.mcp_server"],
"env": { "OTTERLOOP_API_URL": "https://dev-api.seaotter.ai",
"OTTERLOOP_API_KEY": "sk-otter-...",
"OTTERLOOP_POLICY_ID": "acme-prod-acceptance" } } } }curl
Tout runtime parlant HTTP peut noter une fois ou rester dans la boucle.
curl -s https://dev-api.seaotter.ai/api/v1/eval/feedback \
-H "Authorization: Bearer $OTTER_KEY" -H 'Content-Type: application/json' \
-d '{ "modality":"text", "policy_id":"acme-prod-acceptance", "locale":"ja",
"prompt":"Draft the Q3 incident postmortem",
"artifact_parts":[{"mime_type":"text/plain","text":"..."}],
"return_feedback_artifacts": true }'Python SDK
Un appel de boucle orchestre produire → noter → réviser jusqu’au feu vert du critique.
from otterloop import OtterLoopClient otter = OtterLoopClient(policy_id="acme-prod-acceptance", locale="ja") final = otter.loop(produce=lambda feedback: my_agent.revise(feedback), work=my_agent.first_draft(), modality="document", references=["file://brand-guide.pdf", "file://gold-postmortem.md"], max_rounds=5, target_band="ship")