大規模エージェント業務のための受入レイヤー
エージェントは、どのチームよりも速く成果物を出荷します。SeaOtter の批評家はすべてのアーティファクトにスコアを付け、ポリシーを通過するまで修正を押し戻します。エージェント↔批評家が機械速度で回ります。
エージェント規模で
エージェントが採点のために成果物を提出します。高速なワンショットパス、またはサンドボックスで成果物を実行して検証する深いエージェント駆動チェックにルーティング。敵対的な批評家モデルが決定し、支払いは要したコンピュート分のみ。引いて見ると—数千のエージェントが並列で採点、同期でも非同期でも。
ローカライズ済みフィードバック
批評家は「間違っている」と言うだけではありません。エージェントが修正すべき正確な行・ページ・スライド・セル・フレーム・タイムスタンプを特定します。
「このアーティファクトのどこかに問題がある可能性があります。」
hallucinated_api · 高
self.tasks.add_item(task)add_item は list の有効なメソッドではないため、実行時に例外となります。期待されるのは self.tasks.append(task) です。
批評家が正確な範囲をピン留めしファイルを特定する能力に関する初期のホールドアウト検証済みの読み取りです。検出は依然として訓練中であり、ここでの主張は一般的な批評ではなく位置特定品質に関するものです。
SUBMIT → GRADE
エージェントは作成した成果物を POST で提出し、SeaOtter が受入ポリシーに照らして採点します。小さく速いチェックはインラインで判定を返します。重いチェックはジョブ ID を返し、エージェントはポーリング・ストリーム・Webhook で受領。長いレビューが、依頼したエージェントをブロックしません。
人間向け
SeaOtter の受信箱へ送れば採点済みの OtterScore が返り、Web 上に貼り付ければブラウザで採点できます。エージェントは不要です。
エージェント向け
任意のエージェントを HTTP または MCP で配線し、ループ内で自分の出力を採点。ポリシーも OtterScore も同一、機械速度で。60 秒のクイックスタートはすぐ下です。
同期
成果物を POST し、接続を保持、OtterScore の判定(バンド・欠陥・アンカー・アップグレード)を同一レスポンスで取得。エージェントの内側のループで次のステップ前に回答が必要な単発チェックに最適です。
POST /api/v1/eval/score → 200 { band, flaws[], upgrades[] }
非同期
成果物を POST し、即時にジョブ ID を受領。その後はジョブのポーリング、結果ストリーム購読、Webhook 登録が可能。サンドボックスで複数パスにわたり検証するエージェント駆動チェックに最適で、生産側エージェントは先へ進み、判定到着時に呼び戻されます。
POST /api/v1/eval/jobs → 202 { job_id } · poll · stream (SSE) · webhook
同期 · 単発
敵対的批評家による 1 パスをインライン返却。低コスト・定額。
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":[...] }非同期 · エージェント駆動
批評家がサンドボックスで成果物を実行し、複数パスで検証します。
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, or stream, or await the webhookエージェントがどのトランスポートを選んでも、ポリシーも OtterScore も署名済みの監査記録も同一です。
エージェント向け · MCP クイックスタート
3 ステップです。キーを発行し、MCP サーバーを 1 つ追加、あとはエージェントが自身のループで otter_score / otter_iterate を呼びます。OtterScore と受入ポリシーは同一、機械速度で。批評家が採点し、エージェントは欠陥に対して反復し、バンドが閾値を通過するまで続けます。これは先ほどのフリートでご覧いただいたループです。フラグ付きアーティファクト(route_to_fix、アンバーの弧)は otter_iterate 経由でもう一度ゲートに入り、ready_to_ship が true になったときだけ出荷されます。内側のサイクルに人間は不要で、記名承認は最後のゲートであり、唯一のゲートではありません。
サインイン中の組織ユーザーが一度だけエージェントの評価キーを発行します。sk-otter-… シークレットは 1 回のみ表示。エージェントに渡してください。
1 つの otterloop サーバーを .mcp.json(Claude / Cursor)または config.toml(Codex)に追加。エージェントは読み取り専用の批評家ツールを自動承認で利用できます。
エージェントが成果物を提出し、アンカー付き欠陥を読み、修正し、再提出します。ready_to_ship が false の間はループを継続。批評家を通過すること自体がプロダクトです。
1 — 登録
署名済みユーザー JWT で /api/v1/agent-keys に POST。シークレットは 1 回のみ返却。もしくは開発者コンソールで「Generate eval API key」をクリック。
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":"..." }
# Hand `key` to the agent as OTTERLOOP_API_KEY.2 — MCP サーバーを追加
.mcp.json(Claude / Cursor)。Codex は config.toml の [mcp_servers.otterloop] を使用。初回のみ: pip install "otterloop[mcp]"。本番ベース: 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 — 採点と反復
エージェントが MCP だけで submit → 欠陥 → 修正 → 再提出 を実行。判定は権威的として扱い、自分で採点しないでください。
# submit your work -> authoritative verdict
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 }
# revise against flaws[]/upgrades[], then re-submit the SAME 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 }
# keep iterating while ready_to_ship is false.反復 → 収束
otter_iterate の返り値。上のフリートが示した route_to_fix → ship の収束を、読みやすい差分で固定表示。
resolved_flaws ↓ 2 · score_change ↑ +18.0 · ready_to_ship → true
純粋な HTTP 等価(MCP なし): POST /api/v1/eval/runs → { run_id, first_iteration.critic_verdict }、続いて POST /api/v1/eval/runs/{run_id}/iterate { "decision":"re_prompt", "new_artifact_parts":[…] } → { verdict, delta }。批評家の障害時はクローズドに失敗(band:quarantine)し、サイレント合格はしません。
2 つの検査モード
すべての出力に同一の精査は不要です。ワンショットは敵対的批評家による単一パス—高速・低計算・インライン返却。エージェント駆動は、インターネット対応の使い捨てサンドボックスで複数パスにわたり検証—より遅く計算多め・非同期返却。低コスト作業はワンショットへ、高リスク作業はエージェント駆動へ。同一ポリシー上でルーティング可能です。
| ワンショット単一の敵対的パス | Agenticサンドボックス・マルチパス | |
|---|---|---|
| 批評家の動作 | アーティファクト・ポリシー・プロンプト・参照を 1 パスで読みます。 | 使い捨てサンドボックスで実行し、複数パスで検証します。 |
| レイテンシ | インライン — レスポンスで判定。 | 非同期 — ジョブ ID を返し、ポーリング・ストリーム・Webhook。 |
| 計算コスト | 低く予測可能。 | 高め — パス数とサンドボックス時間に比例。 |
| 適用例 | 内側ループのチェック、高ボリュームの下書き、迅速なゲート。 | 実行が必要なコード、再現が必要な主張、影響範囲が大きい作業。 |
| 課金 | 安価・チェックごとに定額。 | 計算量とサンドボックス時間に応じた従量。 |
どちらのモードも同じ OtterScore 判定形式を返し、同じ署名済み監査記録を書き込みます。
従量課金
請求は実際に走らせた採点分であり、席数ではありません。ワンショットチェックは安価で定額。エージェント駆動チェックは計算・サンドボックス時間に応じた従量。これにより、サンプルに限らず、すべての出力—ひいてはフリート全体—を経済的に採点できます。
ONE-SHOT CHECK
安価・定額
チェックあたり・定額
敵対的批評家による単一パスをインライン返却。あらゆるエージェントの内側ループに常駐し、高ボリュームの下書きを採点できる価格設計です。
AGENTIC CHECK
コンピュート従量
計算量 + サンドボックス時間に応じた従量
サンドボックス化されたマルチパスレビュー。必要なパス数とサンドボックス時間に応じてお支払い。費用対効果の高い高リスク出力に絞ってご利用ください。
エンタープライズ導入は シャドウ → 適用 → マネージド の流れを維持し、下層の採点は従量で計測します。具体的なお見積り(£建て)はお問い合わせください。
OTTERLOOP インフラ
任意のエージェントが成果物を出力:コード、テキスト、画像、デック、シート、動画、あるいは完全な軌跡。
SeaOtter が適切なルーブリックと組織依存の基準で採点します。
判定は、エージェントが直接狙える欠陥・アップグレード・アンカーを返します。
エージェントが批評家の指摘を用いてアーティファクトまたは次の手順を書き直します。
帯域がゲートを通過し、監査証跡が書き込まれたときにのみループは止まります。
MCP
Claude、Codex、Cursor、またはカスタムランタイムの `.mcp.json` か `config.toml` に追加するだけ。
{ "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
HTTP を話せる任意のランタイムで、単発採点もループ継続も可能。
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
1 回のループ呼び出しで、批評家が「出荷可」と言うまで produce → grade → revise。
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")