module Response
Converts Codex Responses API results into OpenAI Chat Completions.
Definitions
def completed(response, requested_model: nil)
Convert a completed Responses object to Chat Completions format.
Signature
-
parameter
responseHash The completed Codex response.
-
option
:requested_modelString | Nil The model requested by the client.
-
returns
Hash A Chat Completions response object.
Implementation
def completed(response, requested_model: nil)
output = response.fetch("output", [])
content = []
tool_calls = []
output.each do |item|
case item["type"]
when "message"
Array(item["content"]).each do |part|
content << part["text"] if part["type"] == "output_text" && part["text"]
content << part["refusal"] if part["type"] == "refusal" && part["refusal"]
end
when "function_call"
tool_calls << {
id: item["call_id"] || item["id"],
type: "function",
function: {
name: item["name"],
arguments: json_arguments(item["arguments"]),
},
}
end
end
message = {role: "assistant", content: content.empty? ? nil : content.join}
message[:tool_calls] = tool_calls unless tool_calls.empty?
usage = usage(response["usage"])
result = {
id: completion_id(response["id"]),
object: "chat.completion",
created: response["created_at"] || Time.now.to_i,
model: response["model"] || requested_model,
choices: [{index: 0, message: message, finish_reason: tool_calls.empty? ? "stop" : "tool_calls"}],
}
result[:usage] = usage if usage
return result
end
def stream_chunk(response_id:, model:, created:, delta:, finish_reason: nil, usage: nil)
Build a Chat Completions streaming chunk.
Signature
-
parameter
response_idString | Nil The Codex response ID.
-
parameter
modelString | Nil The response model name.
-
parameter
createdInteger | Nil The creation timestamp.
-
parameter
deltaHash The incremental assistant message.
-
option
:finish_reasonString | Nil The terminal reason, if final.
-
option
:usageHash | Nil Token usage for the response.
-
returns
Hash A Chat Completions chunk.
Implementation
def stream_chunk(response_id:, model:, created:, delta:, finish_reason: nil, usage: nil)
chunk = {
id: completion_id(response_id),
object: "chat.completion.chunk",
created: created || Time.now.to_i,
model: model,
choices: [{index: 0, delta: delta, finish_reason: finish_reason}],
}
chunk[:usage] = usage if usage
return chunk
end
def usage(value)
Convert Codex input and output token counts to OpenAI usage fields.
Signature
-
parameter
valueHash | Nil Codex usage information.
-
returns
Hash | Nil OpenAI-compatible usage details.
Implementation
def usage(value)
return unless value.is_a?(Hash)
input_tokens = value["input_tokens"]
output_tokens = value["output_tokens"]
return unless input_tokens && output_tokens
{
prompt_tokens: input_tokens,
completion_tokens: output_tokens,
total_tokens: value["total_tokens"] || input_tokens + output_tokens,
prompt_tokens_details: {cached_tokens: value.dig("input_tokens_details", "cached_tokens") || 0},
}
end
def json_arguments(arguments)
Encode function arguments as a JSON string.
Signature
-
parameter
argumentsString | Object | Nil The function arguments.
-
returns
String The serialized function arguments.
Implementation
def json_arguments(arguments)
return arguments if arguments.is_a?(String)
JSON.dump(arguments || {})
end
def completion_id(response_id)
Produce an OpenAI-style completion ID.
Signature
-
parameter
response_idString | Nil An optional Codex response ID.
-
returns
String A
chatcmpl-ID.
Implementation
def completion_id(response_id)
return "chatcmpl-#{response_id}" if response_id
"chatcmpl-#{SecureRandom.hex(12)}"
end