- Move contract files to inner/outer directory structure - Add create-contract and update-contract skills - Update agent-ops rules and domain rules - Update roadmap and SDD documentation - Update README files across apps
7.3 KiB
OpenAI-Compatible API Contract
계약 메타
- id:
iop.openai-compatible-api - boundary:
outer - status: active
- 원본 경로:
apps/edge/internal/openai/routes.goapps/edge/internal/openai/chat_handler.goapps/edge/internal/openai/responses_handler.goapps/edge/internal/openai/types.gopackages/go/config/config.goconfigs/edge.yaml
- human docs:
docs/openai-compatible-api-contract.md
범위
이 문서는 외부 프로젝트가 IOP Edge의 OpenAI-compatible HTTP 표면을 호출할 때 확인할 계약 원문이다.
IOP 내부 실행은 adapter + target 기준이며, OpenAI-compatible 경계에서는 호환성을 위해 model을 사용한다.
IOP 고유 실행 문맥은 별도 iop wrapper field를 만들지 않고 OpenAI request의 metadata에 둔다.
Auth
Edge 설정의 openai.bearer_token이 비어 있지 않으면 OpenAI-compatible HTTP 표면은 다음 헤더를 요구한다.
Authorization: Bearer <token>
토큰이 없거나 일치하지 않으면 401 unauthorized OpenAI-compatible error response를 반환한다. openai.bearer_token이 빈 값이면 auth를 적용하지 않는다.
Responses API
Endpoint:
POST /v1/responses
Content-Type: application/json
CLI agent 실행으로 라우팅되는 요청의 최소 형태:
{
"model": "codex",
"input": "현재 워크스페이스의 테스트 상태를 확인해줘.",
"metadata": {
"workspace": "/config/workspace/iop"
}
}
현재 /v1/responses에서 허용하는 표준형 요청 예시:
{
"model": "codex",
"instructions": "응답은 짧게 작성해.",
"input": "현재 워크스페이스의 테스트 상태를 확인해줘.",
"stream": false,
"background": false,
"max_output_tokens": 4096,
"temperature": 0,
"top_p": 1,
"metadata": {
"workspace": "/config/workspace/iop",
"request_id": "req-001",
"task_id": "task-123"
}
}
필드 의미:
model: Edge가 내부adapter + target으로 해석할 외부 route 이름이다. IOP Edge에서는 라우팅을 위해 필수다.instructions: OpenAI Responses API의 top-level instruction field다. 있으면input앞에 배치해 agent 실행 prompt를 만든다.input: agent에게 전달할 사용자 요청이다. 현재 구현은 string input만 지원한다.stream: 현재 구현은false또는 생략만 지원한다.background: 현재 구현은false또는 생략만 지원한다.metadata.workspace: CLI process를 실행할 작업 디렉터리다. CLI agent route에서는 필수 실행 문맥이다.metadata: OpenAI 표준 metadata container다. string key/value를 허용하고, IOP는workspace만 실행 문맥으로 해석한다. 나머지 key는 caller-defined metadata로 보존하되source는 지원하지 않는다.metadata.request_id,metadata.task_id: caller-defined metadata 예시다. 특별한 wrapper나 제품 전용 field가 아니다.max_output_tokens: 출력 길이 상한이다. 내부 provider option의max_tokens로 전달된다.temperature: 생성 다양성 option이다. 대상 adapter가 지원하지 않으면 무시될 수 있다.top_p: nucleus sampling option이다. 대상 adapter가 지원하지 않으면 무시될 수 있다.
금지:
metadata.cli같은 CLI 전용 wrapper를 추가하지 않는다.metadata.inference처럼modelroute와 겹치는 target wrapper를 추가하지 않는다.metadata.nomadcode처럼 특정 소비자 제품명에 묶인 wrapper를 추가하지 않는다.metadata.source처럼 의미가 불명확한 호출 출처 field를 추가하지 않는다.- root-level
iop같은 별도 wrapper field를 추가하지 않는다. /v1/responses에optionswrapper를 추가하지 않는다. Responses API option은 OpenAI 표준 top-level field를 따른다.session_id,timeout_sec같은 IOP 실행 제어 field를 request body 계약에 추가하지 않는다. logical session과 timeout은 route/config 기본값을 따른다.- workspace를 prompt 본문에 섞어 전달하지 않는다.
현재 구현 메모:
/v1/responses는 non-streaming 요청만 지원한다.metadata는 최대 16개 string key/value를 허용한다. key는 64자 이하, value는 512자 이하를 기준으로 한다.- CLI route의
metadata.workspace는 이 문서의 계약 기준이다. 구현은 이 값을 Edge service의 run workspace와 Node CLI adapter의 process working directory로 전달해야 한다. metadata.workspace는RunRequest.Workspace로 전달하고 generic run metadata에는 복사하지 않는다.- 다른 Responses API 표준 field는 구현 필요가 생길 때 계약을 갱신한 뒤 추가한다.
Generic Authoring Handoff
외부 caller가 IOP Edge HTTP 표면으로 workspace authoring 작업을 넘길 때의 최소 요청 형태:
{
"model": "codex",
"input": "Todo 항목에 필요한 산출물을 현재 checkout에 작성해줘.",
"metadata": {
"workspace": "/config/workspace/work-slot-123",
"task_id": "todo-123"
}
}
이 handoff는 model, input, metadata.workspace, 필요한 caller-defined metadata만으로 충분해야 한다.
호출자는 metadata.cli, 소비자 전용 metadata wrapper, root-level iop wrapper, IOP CLI 직접 실행, prompt 본문 workspace 주입을 요구받지 않는다.
Workspace-bound route는 workspace가 없거나 상대 경로이면 OpenAI-compatible error로 거부한다. 존재하지 않는 경로, 권한 오류, agent process exit failure는 기본 cwd fallback으로 숨기지 않고 호출자가 실패로 구분할 수 있어야 한다.
Chat Completions
/v1/chat/completions도 같은 metadata 원칙을 따른다. CLI route의 workspace는 metadata.workspace에 둔다. Chat Completions의 provider sampling option은 해당 endpoint의 OpenAI-compatible top-level request field를 따르며, /v1/responses와 마찬가지로 별도 options wrapper를 두지 않는다.
{
"model": "codex",
"messages": [
{
"role": "user",
"content": "현재 워크스페이스의 테스트 상태를 확인해줘."
}
],
"metadata": {
"workspace": "/config/workspace/iop"
}
}
현재 지원하는 Chat Completions request field:
modelmessagesstreammetadatamax_tokensmax_completion_tokenstemperaturetop_ppresence_penaltyfrequency_penaltyseedstopresponse_formattools
금지:
metadata.source,metadata.cli,metadata.inference,metadata.nomadcodeoptions,think,format,keep_alive같은 provider/Ollama 전용 request fieldsession_id,timeout_sec같은 IOP 실행 제어 field
Legacy Completions
POST /v1/completions는 현재 IOP Edge OpenAI-compatible 표면에서 제공하지 않는다.
text completion 형태의 신규 호출은 /v1/responses를 사용하고, message 기반 호출은 /v1/chat/completions를 사용한다.
Routing
Edge 설정이 openai.model_routes[]를 제공하면 model은 먼저 route catalog에서 해석된다.
매칭 route가 없으면 기존 fallback 규칙에 따라 openai.target 또는 요청의 model을 내부 target으로 사용한다.
CLI agent를 OpenAI-compatible API로 노출할 때는 route catalog에서 해당 model을 명시적으로 adapter: "cli"와 target profile로 매핑하는 방식을 우선한다.