본문으로 건너뛰기

Responses (OpenAI)

OpenAI Responses 형식 인바운드 어댑터. OpenAI의 Codex CLI는 /v1/responses만 사용하므로, 이 엔드포인트로 Codex와 Responses SDK를 연결합니다.

OpenAI의 Codex CLI는 /v1/responses 형식만 말합니다. PleumRouter는 이 형식을 받아 내부 모델 호출로 변환하는 인바운드 어댑터를 제공하므로, Codex CLI(및 OpenAI Responses SDK)를 PleumRouter에 그대로 붙일 수 있습니다.

POST/v1/responses

연결하기#

base URL을 https://apirouter.pleum.ai/v1로, API 키를 plm_ 키로 설정하세요. Codex에서는 wire_api = "responses"로 지정하면 이 엔드포인트로 호출됩니다.

responses.ts

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);
POST/v1/responses/{request_id}/feedback
POST /v1/responses/{request_id}/feedback는 응답 생성 API와 별개인 라우팅 피드백 엔드포인트입니다. 대시보드 세션 JWT로 인증하며 plm_ 추론 키는 사용할 수 없습니다.

요청 본문#

파라미터타입필수설명
modelstring필수모델 ID. GET /v1/models에서 전체 목록 확인.
inputstring | array필수문자열, 또는 항목 배열(message / function_call / function_call_output).
instructionsstring선택system 메시지로 앞에 추가됩니다.
max_output_tokensinteger선택기본값 4096. 내부 max_tokens로 매핑됩니다.
temperaturenumber선택샘플링 온도.
top_pnumber선택누클리어스 샘플링.
streamboolean선택true면 Responses SSE 스트리밍 응답.
toolsarray선택Responses 플랫 함수 도구({type:"function", name, description, parameters})는 변환됩니다. 함수가 아닌 도구(예: web_search)는 조용히 무시됩니다.
tool_choicestring | object선택문자열 auto | none | required, 또는 {type:"function", name}.
parallel_tool_callsboolean선택병렬 도구 호출 허용 여부.
metadataobject선택임의의 키-값 메타데이터.
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선택
request
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)는 수용되지만 무시됩니다.

200 OK
{
  "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로 판단합니다.

Responses SSE stream
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#

POST/v1/responses/compact

OpenAI의 서버 compact(POST /v1/responses/compact)는 불투명한 encrypted_content 아이템입니다. 이 게이트웨이는 암호 항목을 위조하지 않습니다. 같은 채팅 인증으로 호출하면 501과 기존 에러 envelope만 반환합니다. Codex는 로컬 compact를 쓰세요.

web_search 같은 내장 도구는 전달되지 않고 조용히 제거됩니다. 오직 {type:"function"} 도구만 변환되어 모델로 전달됩니다.