Skip to content

OpenAI Responses API Analysis and llm-connector Adaptation Plan

1. Overview

The OpenAI Responses API was released in March 2025 as the successor to Chat Completions and is recommended for new projects.

  • Endpoint: POST /v1/responses (Chat Completions uses POST /v1/chat/completions)
  • Purpose: Unified, agent-oriented interface with native tools, multi-turn conversation, and state management

2. Key Format Differences

2.1 Input

Chat CompletionsResponses API
messages arrayinput: string / message array / Items array
No dedicated instructionsinstructions: top-level system guidance
No stateprevious_response_id: reference to prior response
-store: persist context

2.2 Output

Chat CompletionsResponses API
choices[] with messageoutput[]: Items array
choices[0].message.contentoutput_text: convenience field
No response-level idresponse object has id
n for parallel generationsn removed, single generation per request

2.3 Items Model

Items are a union type including:

  • message: text or multimodal message
  • function_call / function_call_output: tool calls and results
  • Others: reasoning, image, etc.

Unlike Chat Completions (tool_calls embedded in messages), Responses uses separate Item types for tool calls and messages.

2.4 Function Calling

  • Chat Completions: externally tagged, non-strict by default
  • Responses: internally tagged, strict by default
  • Tool calls correlated via call_id, not embedded in message

2.5 Structured Outputs

  • Chat Completions: response_format
  • Responses: text.format (inside top-level text object)

3. Responses API Benefits

CapabilityDescription
CostBetter cache usage, ~40–80% cost reduction vs Chat Completions
Statestore: true keeps reasoning and tool context
AgentMultiple tools in one request (web_search, file_search, code_interpreter, MCP, etc.)
ZDRreasoning.encrypted_content + store: false for zero data retention
ReasoningImproved behavior on reasoning models (e.g. ~3% on SWE-bench)

4. llm-connector Adaptation Strategy

4.1 Approach

Option A: New Responses Protocol (recommended)

  • Add OpenAIResponsesProtocol implementing Protocol
  • Add OpenAIResponsesRequest / OpenAIResponsesResponse
  • Keep existing OpenAIProtocol (Chat Completions); users choose per use case

Option B: Parameter Toggle

  • Switch endpoint in OpenAIProtocol via config
  • Request/response structures differ significantly; mixed implementation is complex; not recommended

4.2 Scope

PhaseScopeDescription
Phase 1Basic textinput (string/messages), instructions, output_text
Phase 2Multi-turn & stateprevious_response_id, store
Phase 3Items & toolsParse output Items, function_call / function_call_output
Phase 4Structured OutputsMap text.format
Phase 5StreamingResponses streaming format parsing

4.3 Type Design Draft

rust
// New types
pub struct ResponsesRequest {
    pub model: String,
    pub input: ResponsesInput,      // String | Vec<Message> | Vec<Item>
    pub instructions: Option<String>,
    pub previous_response_id: Option<String>,
    pub store: Option<bool>,
    pub text: Option<TextConfig>,   // format, etc.
    pub tools: Option<Vec<ResponsesTool>>,
    // ...
}

pub enum ResponsesInput {
    String(String),
    Messages(Vec<Message>),
    Items(Vec<ResponseItem>),
}

pub struct ResponsesResponse {
    pub id: String,
    pub output: Vec<ResponseItem>,
    pub output_text: Option<String>,  // Convenience
    pub usage: Option<Usage>,
    // ...
}

pub enum ResponseItem {
    Message { role: String, content: Vec<ContentBlock> },
    FunctionCall { call_id: String, name: String, arguments: String },
    FunctionCallOutput { call_id: String, output: String },
    // ...
}

4.4 Mapping to Unified Types

  • ChatRequestResponsesRequest: messagesinput (or instructions + input)
  • ResponsesResponseChatResponse: output Items → choices[0].message, output_textcontent

Consider:

  1. ChatRequestResponsesRequest conversion for gradual migration
  2. ResponsesResponseChatResponse conversion for existing consumers

5. Implementation Plan

5.1 Milestones

MilestoneScopeEstimate
M1Design ResponsesRequest / ResponsesResponse1–2 days
M2Implement OpenAIResponsesProtocol (Phase 1)2–3 days
M3Integration tests (text)1 day
M4Phase 2 multi-turn & store1–2 days
M5Phase 3 Items & tools2–3 days
M6Docs and examples1 day

5.2 Dependencies and Compatibility

  • Requires OPENAI_API_KEY or Responses API–compatible proxy
  • Fully compatible with Chat Completions; no breaking changes
  • Optional feature: openai-responses, off by default to avoid impact on non-users

5.3 Acceptance Criteria

  • Unit tests for build_request / parse_response
  • Integration tests for /v1/responses text generation
  • Docs on when to use Chat Completions vs Responses
  • Example: examples/openai_responses.rs

6. References

Released under the MIT License.