use serde::{Deserialize, Serialize};
use super::*;
#[derive(Debug, Deserialize)]
#[allow(dead_code)]
pub struct ResponsesRequest {
pub model: String,
pub input: serde_json::Value,
#[serde(default)]
pub instructions: Option<String>,
#[serde(default)]
pub max_output_tokens: Option<usize>,
#[serde(default)]
pub temperature: Option<f32>,
#[serde(default)]
pub top_p: Option<f32>,
#[serde(default)]
pub stream: bool,
#[serde(default)]
pub tools: Option<Vec<serde_json::Value>>,
#[serde(default)]
pub tool_choice: Option<serde_json::Value>,
#[serde(default)]
pub metadata: Option<std::collections::HashMap<String, String>>,
#[serde(default)]
pub reasoning: Option<ReasoningConfig>,
#[serde(default)]
pub service_tier: Option<String>,
#[serde(default)]
pub previous_response_id: Option<String>,
#[serde(default)]
pub store: Option<bool>,
#[serde(default)]
pub background: Option<bool>,
#[serde(default)]
pub include: Option<Vec<String>>,
#[serde(default)]
pub truncation: Option<String>,
#[serde(default)]
pub conversation: Option<serde_json::Value>,
#[serde(default)]
pub parallel_tool_calls: Option<bool>,
#[serde(default)]
pub max_tool_calls: Option<u32>,
#[serde(default)]
pub text: Option<serde_json::Value>,
}
#[derive(Debug, Serialize)]
pub struct ResponsesResponse {
pub id: String,
pub object: &'static str,
pub created_at: u64,
pub model: String,
pub status: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<serde_json::Value>,
pub output: Vec<ResponsesOutputItem>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning: Option<serde_json::Value>,
pub usage: ResponsesUsage,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<std::collections::HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponsesOutputItem {
Message {
id: String,
status: &'static str,
role: &'static str,
content: Vec<ResponsesContentPart>,
},
FunctionCall {
id: String,
call_id: String,
name: String,
arguments: String,
status: &'static str,
},
Reasoning {
id: String,
summary: Vec<ResponsesSummaryPart>,
},
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponsesSummaryPart {
SummaryText { text: String },
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponsesContentPart {
OutputText {
text: String,
#[serde(skip_serializing_if = "Option::is_none")]
annotations: Option<Vec<Annotation>>,
},
}
#[derive(Debug, Serialize)]
pub struct ResponsesUsage {
pub input_tokens: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_tokens_details: Option<PromptTokensDetails>,
pub output_tokens: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_tokens_details: Option<CompletionTokensDetails>,
pub total_tokens: usize,
}
#[derive(Debug, Serialize)]
#[serde(tag = "type")]
pub enum ResponsesStreamEvent {
#[serde(rename = "response.created")]
Created {
sequence_number: u64,
response: ResponsesStreamEnvelope,
},
#[serde(rename = "response.in_progress")]
InProgress {
sequence_number: u64,
response: ResponsesStreamEnvelope,
},
#[serde(rename = "response.output_item.added")]
OutputItemAdded {
sequence_number: u64,
output_index: usize,
item: ResponsesOutputItem,
},
#[serde(rename = "response.content_part.added")]
ContentPartAdded {
sequence_number: u64,
item_id: String,
output_index: usize,
content_index: usize,
part: ResponsesContentPart,
},
#[serde(rename = "response.output_text.delta")]
OutputTextDelta {
sequence_number: u64,
item_id: String,
output_index: usize,
content_index: usize,
delta: String,
},
#[serde(rename = "response.output_text.done")]
OutputTextDone {
sequence_number: u64,
item_id: String,
output_index: usize,
content_index: usize,
text: String,
},
#[serde(rename = "response.function_call_arguments.delta")]
FunctionCallArgumentsDelta {
sequence_number: u64,
item_id: String,
output_index: usize,
delta: String,
},
#[serde(rename = "response.function_call_arguments.done")]
FunctionCallArgumentsDone {
sequence_number: u64,
item_id: String,
output_index: usize,
arguments: String,
},
#[serde(rename = "response.output_item.done")]
OutputItemDone {
sequence_number: u64,
output_index: usize,
item: ResponsesOutputItem,
},
#[serde(rename = "response.refusal.delta")]
RefusalDelta {
sequence_number: u64,
item_id: String,
output_index: usize,
content_index: usize,
delta: String,
},
#[serde(rename = "response.refusal.done")]
RefusalDone {
sequence_number: u64,
item_id: String,
output_index: usize,
content_index: usize,
refusal: String,
},
#[serde(rename = "response.reasoning_summary_part.added")]
ReasoningSummaryPartAdded {
sequence_number: u64,
item_id: String,
output_index: usize,
summary_index: usize,
part: ResponsesSummaryPart,
},
#[serde(rename = "response.reasoning_summary_text.delta")]
ReasoningSummaryTextDelta {
sequence_number: u64,
item_id: String,
output_index: usize,
summary_index: usize,
delta: String,
},
#[serde(rename = "response.reasoning_summary_text.done")]
ReasoningSummaryTextDone {
sequence_number: u64,
item_id: String,
output_index: usize,
summary_index: usize,
text: String,
},
#[serde(rename = "response.reasoning_summary_part.done")]
ReasoningSummaryPartDone {
sequence_number: u64,
item_id: String,
output_index: usize,
summary_index: usize,
part: ResponsesSummaryPart,
},
#[serde(rename = "response.completed")]
Completed {
sequence_number: u64,
response: ResponsesResponse,
},
#[serde(rename = "response.failed")]
Failed {
sequence_number: u64,
response: ResponsesStreamEnvelope,
error: serde_json::Value,
},
}
#[derive(Debug, Serialize)]
pub struct ResponsesStreamEnvelope {
pub id: String,
pub object: &'static str,
pub created_at: u64,
pub model: String,
pub status: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<std::collections::HashMap<String, String>>,
}
pub fn responses_event_name(ev: &ResponsesStreamEvent) -> &'static str {
match ev {
ResponsesStreamEvent::Created { .. } => "response.created",
ResponsesStreamEvent::InProgress { .. } => "response.in_progress",
ResponsesStreamEvent::OutputItemAdded { .. } => "response.output_item.added",
ResponsesStreamEvent::ContentPartAdded { .. } => "response.content_part.added",
ResponsesStreamEvent::OutputTextDelta { .. } => "response.output_text.delta",
ResponsesStreamEvent::OutputTextDone { .. } => "response.output_text.done",
ResponsesStreamEvent::FunctionCallArgumentsDelta { .. } => {
"response.function_call_arguments.delta"
}
ResponsesStreamEvent::FunctionCallArgumentsDone { .. } => {
"response.function_call_arguments.done"
}
ResponsesStreamEvent::OutputItemDone { .. } => "response.output_item.done",
ResponsesStreamEvent::RefusalDelta { .. } => "response.refusal.delta",
ResponsesStreamEvent::RefusalDone { .. } => "response.refusal.done",
ResponsesStreamEvent::ReasoningSummaryPartAdded { .. } => {
"response.reasoning_summary_part.added"
}
ResponsesStreamEvent::ReasoningSummaryTextDelta { .. } => {
"response.reasoning_summary_text.delta"
}
ResponsesStreamEvent::ReasoningSummaryTextDone { .. } => {
"response.reasoning_summary_text.done"
}
ResponsesStreamEvent::ReasoningSummaryPartDone { .. } => {
"response.reasoning_summary_part.done"
}
ResponsesStreamEvent::Completed { .. } => "response.completed",
ResponsesStreamEvent::Failed { .. } => "response.failed",
}
}