Responses (OpenAI)
OpenAI Responses 형식 인바운드 어댑터. OpenAI의 Codex CLI는 /v1/responses만 사용하므로, 이 엔드포인트로 Codex와 Responses SDK를 연결합니다.
OpenAI의 Codex CLI는 /v1/responses 형식만 말합니다. PleumRouter는 이 형식을 받아 내부 모델 호출로 변환하는 인바운드 어댑터를 제공하므로, Codex CLI(및 OpenAI Responses SDK)를 PleumRouter에 그대로 붙일 수 있습니다.
연결하기#
base URL을 https://apirouter.pleum.ai/v1로, API 키를 plm_ 키로 설정하세요. Codex에서는 wire_api = "responses"로 지정하면 이 엔드포인트로 호출됩니다.
OpenAI Responses API (Codex)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "plm_xxxxxxxxxxxxxxxx",
baseURL: "https://apirouter.pleum.ai/v1",
});
const response = await client.responses.create({
model: "gpt-4.1",
input: "Why is the sky blue?",
});
console.log(response.output_text);OpenAI Responses API (Codex)
from openai import OpenAI
client = OpenAI(
api_key="plm_xxxxxxxxxxxxxxxx",
base_url="https://apirouter.pleum.ai/v1",
)
response = client.responses.create(
model="gpt-4.1",
input="Why is the sky blue?",
)
print(response.output_text)OpenAI Responses API (Codex)
curl https://apirouter.pleum.ai/v1/responses \
-H "Authorization: Bearer plm_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4.1",
"input": "Why is the sky blue?"
}'POST /v1/responses/{request_id}/feedback는 응답 생성 API와 별개인 라우팅 피드백 엔드포인트입니다. 대시보드 세션 JWT로 인증하며 plm_ 추론 키는 사용할 수 없습니다.요청 본문#
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| model | string | 필수 | 모델 ID. GET /v1/models에서 전체 목록 확인. |
| input | string | array | 필수 | 문자열, 또는 항목 배열(message / function_call / function_call_output). |
| instructions | string | 선택 | system 메시지로 앞에 추가됩니다. |
| max_output_tokens | integer | 선택 | 기본값 4096. 내부 max_tokens로 매핑됩니다. |
| temperature | number | 선택 | 샘플링 온도. |
| top_p | number | 선택 | 누클리어스 샘플링. |
| stream | boolean | 선택 | true면 Responses SSE 스트리밍 응답. |
| tools | array | 선택 | Responses 플랫 함수 도구({type:"function", name, description, parameters})는 변환됩니다. 함수가 아닌 도구(예: web_search)는 조용히 무시됩니다. |
| tool_choice | string | object | 선택 | 문자열 auto | none | required, 또는 {type:"function", name}. |
| parallel_tool_calls | boolean | 선택 | 병렬 도구 호출 허용 여부. |
| metadata | object | 선택 | 임의의 키-값 메타데이터. |
modelstring필수inputstring | InputItem[]필수
A single user string or an item array (message / function_call / function_call_output).
typestring선택rolestring선택contentstring | Part[]선택call_idstring선택namestring선택argumentsstring선택outputstring | object[]선택instructionsstring선택max_output_tokensinteger선택default: 4096
range: 1–128000
temperaturenumber선택top_pnumber선택streamboolean선택default: false
toolsobject[]선택
typestring선택namestring선택parametersobject선택tool_choicestring | object선택parallel_tool_callsboolean선택metadataobject선택reasoningobject선택
effortstring선택modestring선택enum: standard pro
reasoning_effortstring선택reasoning_modestring선택enum: standard pro
service_tierstring선택curl https://apirouter.pleum.ai/v1/responses \
-H "Authorization: Bearer $PLEUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4.1",
"instructions": "You are a helpful assistant.",
"input": [
{
"type": "message",
"role": "user",
"content": "Hello"
}
],
"max_output_tokens": 4096,
"stream": false
}'응답#
비스트리밍 응답은 output 배열에 어시스턴트 메시지를 담아 반환합니다. 각 메시지의 content는 output_text 파트로 구성되고,usage에는 input_tokens / output_tokens / total_tokens가 포함됩니다. 비용은 본문이 아니라 X-Cost-Krw / X-Cost-Usd 응답 헤더로 반환됩니다. Codex가 보내는 추가 필드(reasoning, text, store, previous_response_id, include, prompt_cache_key)는 수용되지만 무시됩니다.
{
"id": "resp_gpt-4.1-841ms",
"object": "response",
"created_at": 1735689600,
"status": "completed",
"model": "gpt-4.1",
"output": [
{
"id": "msg_abc123",
"type": "message",
"status": "completed",
"role": "assistant",
"content": [
{"type": "output_text", "text": "Hi!", "annotations": []}
]
}
],
"usage": {
"input_tokens": 12,
"output_tokens": 5,
"total_tokens": 17
}
}스트리밍#
stream: true로 요청하면 Responses SSE 이벤트가 전송됩니다 — response.created → response.in_progress → output_item.added / content_part.added / output_text.delta → output_text.done / output_item.done → 전체 usage가 담긴 response.completed. Codex는 완성된 항목을 output_item.done에서 읽고, 종료는 response.completed로 판단합니다.
data: {"type":"response.created","response":{"id":"resp_abc","status":"in_progress"}}
data: {"type":"response.in_progress","response":{"id":"resp_abc"}}
data: {"type":"output_item.added","item":{"id":"msg_abc","type":"message","role":"assistant"}}
data: {"type":"content_part.added","item_id":"msg_abc","part":{"type":"output_text","text":""}}
data: {"type":"response.output_text.delta","item_id":"msg_abc","delta":"Hi"}
data: {"type":"response.output_text.delta","item_id":"msg_abc","delta":"!"}
data: {"type":"response.output_text.done","item_id":"msg_abc","text":"Hi!"}
data: {"type":"output_item.done","item":{"id":"msg_abc","type":"message","role":"assistant","content":[{"type":"output_text","text":"Hi!"}]}}
data: {"type":"response.completed","response":{"id":"resp_abc","status":"completed","usage":{"input_tokens":12,"output_tokens":5,"total_tokens":17}}}Compact#
OpenAI의 서버 compact(POST /v1/responses/compact)는 불투명한 encrypted_content 아이템입니다. 이 게이트웨이는 암호 항목을 위조하지 않습니다. 같은 채팅 인증으로 호출하면 501과 기존 에러 envelope만 반환합니다. Codex는 로컬 compact를 쓰세요.
web_search 같은 내장 도구는 전달되지 않고 조용히 제거됩니다. 오직 {type:"function"} 도구만 변환되어 모델로 전달됩니다.