대규모 에이전트 업무의 승인 레이어
에이전트는 어떤 팀보다 빠르게 결과물을 배송합니다. SeaOtter의 크리틱은 모든 산출물을 점수화하고, 귀사 정책을 통과할 때까지 수정 피드백을 되돌려 보냅니다 — 에이전트↔크리틱, 기계 속도로.
에이전트 스케일에서
에이전트가 채점을 위해 작업을 제출합니다. 빠른 단발 패스로 라우팅되거나 — 샌드박스에서 작업을 실행하며 탐색하는 깊은 에이전트형 검사로 라우팅됩니다. 적대적 크리틱 모델이 결정하고, 소요된 연산량에 대해 비용을 지불합니다. 그다음 줌 아웃: 수천 개의 에이전트가 병렬로 채점됩니다, 동기 또는 비동기.
현지화된 피드백
크리틱은 단지 잘못되었다고만 말하지 않습니다. 에이전트가 실패한 줄, 페이지, 슬라이드, 셀, 프레임, 타임스탬프를 정확히 수정할 수 있도록 이슈를 로컬라이즈합니다.
"이 산출물 어딘가에 문제가 있을 수 있습니다."
hallucinated_api · 높음
self.tasks.add_item(task)add_item은 list의 유효한 메서드가 아니므로 런타임에서 예외가 발생합니다. 기대값은 self.tasks.append(task)입니다.
크리틱이 정확한 구간을 고정하고 파일명을 지정하는 능력에 대한 초기(홀드아웃 검증) 지표입니다. 탐지는 여전히 학습 중이며, 여기서 주장하는 바는 일반적 비평이 아니라 위치 품질입니다.
제출 → 채점
에이전트가 방금 생성한 작업을 POST로 제출하면 SeaOtter가 승인 정책에 따라 채점합니다. 작고 빠른 검사는 판정을 인라인으로 반환합니다. 더 무거운 검사는 에이전트가 폴링/스트리밍/웹훅으로 받을 잡 ID를 반환합니다 — 긴 검토가 요청 에이전트를 막지 않도록.
사람 사용자용
작업을 SeaOtter 수신함으로 보내면 채점된 OtterScore 회신을 받거나, 웹에 붙여넣어 브라우저에서 채점할 수 있습니다. 에이전트가 필요 없습니다.
에이전트용
어떤 에이전트든 HTTP 또는 MCP로 연결해 루프 안에서 자신의 출력을 채점하게 하십시오 — 동일한 정책, 동일한 OtterScore, 기계 속도로. 60초 퀵스타트가 바로 아래에 있습니다.
동기식
작업을 POST로 보내고 연결을 유지한 채 OtterScore 판정 — 밴드, 결함, 앵커, 업그레이드 — 을 같은 응답으로 받습니다. 에이전트 내부 루프에서 다음 단계 전 답이 필요한 단발 검사에 적합합니다.
POST /api/v1/eval/score → 200 { band, flaws[], upgrades[] }
비동기식
작업을 POST로 보내면 즉시 잡 ID를 받습니다. 이후 잡을 폴링하거나, 결과 스트림에 구독하거나, 웹훅을 등록하십시오. 여러 패스로 샌드박스에서 작업을 실행하는 에이전트형 검사에 적합합니다 — 생성 에이전트는 진행하고, 판정이 도착하면 콜백됩니다.
POST /api/v1/eval/jobs → 202 { job_id } · poll · stream (SSE) · webhook
동기 · 단발
한 번의 적대적 크리틱 패스, 인라인으로 반환. 저렴하고 고정 요금.
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 퀵스타트
세 단계: 키 발급, MCP 서버 추가, 그다음 에이전트가 루프에서 otter_score / otter_iterate를 호출합니다 — 동일한 OtterScore, 동일한 승인 정책, 기계 속도로. 크리틱이 채점하고; 밴드가 통과할 때까지 에이전트가 결함에 맞춰 반복합니다. 위 플릿에서 본 루프와 같습니다: 플래그된 모든 산출물(route_to_fix, 호박색 아크)은 otter_iterate로 게이트를 재진입하고, ready_to_ship가 true가 될 때에만 배송됩니다. 내부 사이클에는 사람이 없습니다 — 명시적 서명은 마지막 게이트이지 유일한 게이트가 아닙니다.
서명된 조직 사용자 1명이 에이전트의 평가 키를 발급합니다. sk-otter-… 시크릿은 단 한 번만 표시됩니다; 에이전트에 전달하십시오.
otterloop 서버 1개를 .mcp.json(Claude / Cursor) 또는 config.toml(Codex)에 추가하십시오. 에이전트는 읽기 전용 크리틱 툴을 얻고 자동 승인할 수 있습니다.
에이전트가 작업을 제출하고, 앵커가 달린 결함을 읽고, 수정 후 재제출합니다 — ready_to_ship가 false인 동안 루프를 계속합니다. 크리틱을 통과하는 것이 곧 제품입니다.
1 — 등록
서명된 사용자 JWT로 POST /api/v1/agent-keys. 시크릿은 한 번 반환됩니다 — 또는 개발자 콘솔에서 '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] 사용. 1회 설치: pip install "otterloop[mcp]". 운영 기본 URL: 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 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 }. 크리틱 장애는 CLOSED로 실패(band:quarantine) — 침묵 통과는 없습니다.
두 가지 검사 모드
모든 출력이 같은 수준의 검증을 필요로 하진 않습니다. 단발 검사는 한 번의 적대적 크리틱 패스 — 빠르고, 계산 자원 적으며, 인라인 반환입니다. 에이전트형 검사는 인터넷 사용 가능한 1회용 샌드박스에서 여러 패스로 작업을 탐색 — 느리고, 더 많은 계산 자원을 쓰며, 비동기 반환입니다. 동일한 정책에서 값싼 작업은 단발로, 고위험 작업은 에이전트형으로 라우팅하십시오.
| 단발단일 적대 패스 | 에이전트형샌드박스, 다중 패스 | |
|---|---|---|
| 크리틱이 하는 일 | 한 번의 패스로 산출물, 정책, 프롬프트, 레퍼런스를 읽습니다. | 1회용 샌드박스에서 작업을 실행하며 여러 패스로 탐색합니다. |
| 지연 | 인라인 — 응답에 판정 포함. | 비동기 — 잡 ID 후 폴링, 스트리밍, 또는 웹훅. |
| 연산량 | 낮고 예측 가능. | 더 높음 — 패스 수와 샌드박스 시간에 따라 증가. |
| 권장 사용 | 내부 루프 검사, 대량 초안, 빠른 게이트. | 실행이 필요한 코드, 재현이 필요한 주장, 고폭발 반경 작업. |
| 과금 | 저렴, 검사당 고정. | 연산량과 샌드박스 시간 기준 종량제. |
두 모드 모두 동일한 OtterScore 판정 형태를 반환하고 동일한 서명된 감사 기록을 작성합니다.
사용량 기반 과금
좌석 수가 아니라 실제로 수행한 채점에 대해 비용이 청구됩니다. 단발 검사는 저렴하고 고정 요금이며, 에이전트형 검사는 소요된 연산량과 샌드박스 시간에 따라 종량 과금됩니다. 덕분에 모든 출력 — 그리고 전체 플릿 — 을 채점하는 것이 표본만 검토하는 것보다 경제적입니다.
단발 검사
저렴, 고정 요금
검사당, 고정
한 번의 적대적 크리틱 패스, 인라인 반환. 모든 에이전트 내부 루프에 앉아 대량 초안을 채점할 수 있을 만큼 낮은 가격.
에이전트형 검사
연산량 기준 종량
연산량 + 샌드박스 시간 종량
샌드박스 기반, 다중 패스 리뷰. 실제 필요 패스 수와 샌드박스 시간만큼만 지불 — 비용 대비 가치가 나는 고위험 출력에 사용.
엔터프라이즈 배포는 섀도우 → 적용 → 관리형 순서를 유지하고, 그 아래에서 채점은 사용량으로 계량됩니다. 구체적 비용 견적은 요청 시 제공됩니다.
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를 말할 수 있는 어떤 런타임이든 1회 채점 또는 루프 내 채점이 가능합니다.
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
하나의 루프 호출이 크리틱이 출하 신호를 줄 때까지 생성 → 채점 → 수정을 구동합니다.
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")