use super::openai_compatible::{CompletionTokensDetails, PromptTokensDetails};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIChatRequest {
pub model: String,
pub messages: Vec<OpenAIMessage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_completion_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop: Option<OpenAIStop>,
#[serde(skip_serializing_if = "Option::is_none")]
pub presence_penalty: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub frequency_penalty: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<OpenAIToolSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<OpenAIToolChoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub functions: Option<Vec<OpenAIFunctionDef>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub function_call: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<OpenAIResponseFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logit_bias: Option<std::collections::HashMap<String, f32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream_options: Option<OpenAIStreamOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modalities: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub audio: Option<OpenAIAudioParams>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parallel_tool_calls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub store: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<std::collections::HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prediction: Option<OpenAIPredictionConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<OpenAIServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<OpenAIReasoningEffort>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verbosity: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub web_search_options: Option<OpenAIWebSearchOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub safety_identifier: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIStreamOptions {
pub include_usage: Option<bool>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum OpenAIReasoningEffort {
Minimal,
Low,
Medium,
High,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum OpenAIStop {
Single(String),
Many(Vec<String>),
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIMessage {
pub role: String,
#[serde(default)]
pub content: OpenAIMessageContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<OpenAIToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum OpenAIMessageContent {
Text(String),
Parts(Vec<OpenAIContentPart>),
}
impl Default for OpenAIMessageContent {
fn default() -> Self {
OpenAIMessageContent::Text(String::new())
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIContentPart {
#[serde(rename = "type")]
pub kind: String,
#[serde(default)]
pub text: Option<String>,
#[serde(default)]
pub image_url: Option<OpenAIImageUrl>,
#[serde(default)]
pub audio: Option<OpenAIAudioContent>,
#[serde(default)]
pub file: Option<OpenAIFileContent>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum OpenAIImageUrl {
Url(String),
Obj { url: String, detail: Option<String> },
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIFileContent {
pub filename: Option<String>,
pub file_data: Option<String>,
pub file_id: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIToolSpec {
pub r#type: String,
pub function: OpenAIFunctionDef,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIFunctionDef {
pub name: String,
pub description: Option<String>,
pub parameters: serde_json::Value,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct OpenAIToolCall {
pub id: String,
pub r#type: String,
pub function: OpenAIFunctionCall,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct OpenAIFunctionCall {
pub name: String,
pub arguments: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct OpenAIToolCallDelta {
pub index: u32,
pub id: Option<String>,
pub r#type: Option<String>,
pub function: Option<OpenAIFunctionCallDelta>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct OpenAIFunctionCallDelta {
pub name: Option<String>,
pub arguments: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIAudioParams {
pub voice: Option<OpenAIVoice>,
pub format: Option<OpenAIAudioFormat>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum OpenAIVoice {
Alloy,
Ash,
Ballad,
Coral,
Echo,
Fable,
Nova,
Onyx,
Sage,
Shimmer,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum OpenAIAudioFormat {
Wav,
Mp3,
Flac,
Opus,
Pcm16,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIAudioContent {
pub data: String,
pub format: OpenAIAudioFormat,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIPredictionConfig {
pub r#type: Option<String>,
pub content: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum OpenAIServiceTier {
Auto,
Default,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIWebSearchOptions {
pub user_location: Option<OpenAIUserLocation>,
pub search_context_size: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIUserLocation {
pub r#type: String,
pub approximate: Option<OpenAIApproximateLocation>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIApproximateLocation {
pub country: Option<String>,
pub region: Option<String>,
pub city: Option<String>,
pub timezone: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum OpenAIToolChoice {
String(String),
Named {
r#type: String, function: OpenAINamedFunction,
},
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAINamedFunction {
pub name: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum OpenAIResponseFormat {
Simple {
r#type: String, },
JsonSchema {
r#type: String, json_schema: OpenAIJsonSchema,
},
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OpenAIJsonSchema {
pub description: Option<String>,
pub name: String,
pub schema: serde_json::Value,
pub strict: Option<bool>,
}
#[derive(Deserialize)]
pub struct OpenAIInputMessageItem {
pub role: Option<String>,
pub content: Option<Vec<OpenAIInputContentPart>>, }
#[derive(Deserialize)]
pub struct OpenAIInputContentPart {
#[serde(rename = "type")]
pub kind: String,
pub text: Option<String>,
pub image_url: Option<String>,
}
#[derive(Serialize, Deserialize)]
pub struct OpenAIChatResponse {
pub id: String,
pub object: String,
pub created: u64,
pub model: String,
pub choices: Vec<OpenAIChoice>,
pub usage: Option<OpenAIUsage>,
pub service_tier: Option<String>,
pub system_fingerprint: Option<String>,
}
#[derive(Serialize, Deserialize)]
pub struct OpenAIChoice {
pub index: u32,
pub message: Option<OpenAIResponseMessage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub delta: Option<OpenAIDelta>,
pub finish_reason: Option<String>,
pub logprobs: Option<serde_json::Value>,
}
#[derive(Serialize, Deserialize, PartialEq)]
pub struct OpenAIResponseMessage {
pub role: String,
pub content: Option<String>,
pub tool_calls: Option<Vec<OpenAIToolCall>>,
pub refusal: Option<String>,
#[serde(default)]
pub annotations: Vec<serde_json::Value>,
}
#[derive(Serialize, Deserialize, PartialEq)]
pub struct OpenAIDelta {
pub role: Option<String>,
pub content: Option<String>,
pub reasoning_content: Option<String>,
pub tool_calls: Option<Vec<OpenAIToolCallDelta>>,
}
#[derive(Serialize, Deserialize, PartialEq)]
pub struct OpenAIUsage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
pub total_tokens: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_tokens_details: Option<PromptTokensDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_tokens_details: Option<CompletionTokensDetails>,
}
#[derive(Serialize, Deserialize)]
pub struct OpenAIStreamChunk {
pub id: String,
pub object: String,
pub created: u64,
pub model: String,
pub choices: Vec<OpenAIStreamChoice>,
}
#[derive(Serialize, Deserialize)]
pub struct OpenAIStreamChoice {
pub index: u32,
pub delta: OpenAIDelta,
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAIResponsesResponse {
pub id: String,
pub object: String,
pub created_at: i64,
pub status: ResponseStatus,
pub background: bool,
pub billing: ResponseBilling,
pub output: Vec<ResponseOutputItem>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ResponseError>,
#[serde(skip_serializing_if = "Option::is_none")]
pub incomplete_details: Option<response::IncompleteDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<Instructions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, String>>,
pub model: String,
pub parallel_tool_calls: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
pub tool_choice: ToolChoice,
pub tools: Vec<Tool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub conversation: Option<response::Conversation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_response_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt: Option<ResponsePrompt>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning: Option<Reasoning>,
#[serde(skip_serializing_if = "Option::is_none")]
pub safety_identifier: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub store: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<ResponseTextConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<TruncationStrategy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<ResponseUsage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
pub mod response {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct IncompleteDetails {
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<IncompleteReason>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IncompleteReason {
MaxOutputTokens,
ContentFilter,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Conversation {
pub id: String,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum Instructions {
Text(String),
Items(Vec<ResponseInputItem>),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ServiceTier {
Auto,
Default,
Flex,
Scale,
Priority,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ResponseStatus {
Completed,
Failed,
InProgress,
Cancelled,
Queued,
Incomplete,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum TruncationStrategy {
Auto,
Disabled,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Tool {
Function(FunctionTool),
FileSearch(FileSearchTool),
ComputerUsePreview(ComputerTool),
WebSearch(WebSearchTool),
Mcp(tool::Mcp),
CodeInterpreter(tool::CodeInterpreter),
ImageGeneration(tool::ImageGeneration),
LocalShell(tool::LocalShell),
Custom(CustomTool),
WebSearchPreview(WebSearchPreviewTool),
}
pub mod tool {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Mcp {
pub server_label: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_tools: Option<AllowedTools>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub connector_id: Option<ConnectorId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub require_approval: Option<RequireApproval>,
#[serde(skip_serializing_if = "Option::is_none")]
pub server_description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub server_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum AllowedTools {
Names(Vec<String>),
Filter(McpToolFilter),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct McpToolFilter {
#[serde(skip_serializing_if = "Option::is_none")]
pub read_only: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_names: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ConnectorId {
ConnectorDropbox,
ConnectorGmail,
ConnectorGooglecalendar,
ConnectorGoogledrive,
ConnectorMicrosoftteams,
ConnectorOutlookcalendar,
ConnectorOutlookemail,
ConnectorSharepoint,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum RequireApproval {
String(String), Filter(McpToolApprovalFilter),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct McpToolApprovalFilter {
#[serde(skip_serializing_if = "Option::is_none")]
pub always: Option<McpToolFilter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub never: Option<McpToolFilter>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CodeInterpreter {
pub container: CodeInterpreterContainer,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum CodeInterpreterContainer {
Id(String),
Auto(CodeInterpreterToolAuto),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum CodeInterpreterToolAuto {
#[serde(rename = "auto")]
Auto {
#[serde(skip_serializing_if = "Option::is_none")]
file_ids: Option<Vec<String>>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ImageGeneration {
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_fidelity: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_image_mask: Option<InputImageMask>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moderation: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_compression: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub partial_images: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct InputImageMask {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct LocalShell {}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FunctionTool {
pub name: String,
pub parameters: serde_json::Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub strict: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FileSearchTool {
pub vector_store_ids: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub filters: Option<serde_json::Value>, #[serde(skip_serializing_if = "Option::is_none")]
pub max_num_results: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ranking_options: Option<file_search_tool::RankingOptions>,
}
pub mod file_search_tool {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RankingOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub ranker: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_threshold: Option<f64>,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ComputerTool {
pub display_height: f64,
pub display_width: f64,
pub environment: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CustomTool {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct WebSearchPreviewTool {
#[serde(skip_serializing_if = "Option::is_none")]
pub search_context_size: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_location: Option<web_search_tool::UserLocation>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct WebSearchTool {
#[serde(skip_serializing_if = "Option::is_none")]
pub filters: Option<web_search_tool::Filters>,
#[serde(skip_serializing_if = "Option::is_none")]
pub search_context_size: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_location: Option<web_search_tool::UserLocation>,
}
pub mod web_search_tool {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Filters {
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_domains: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UserLocation {
#[serde(rename = "type")]
pub type_field: String, #[serde(skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum ToolChoice {
String(String), Object(ToolChoiceObject),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ToolChoiceObject {
AllowedTools(ToolChoiceAllowed),
FileSearch,
WebSearchPreview,
ComputerUsePreview,
#[serde(rename = "web_search_preview_2025_03_11")]
WebSearchPreview20250311,
ImageGeneration,
CodeInterpreter,
Function(ToolChoiceFunction),
Mcp(ToolChoiceMcp),
Custom(ToolChoiceCustom),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolChoiceAllowed {
pub mode: String,
pub tools: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolChoiceFunction {
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolChoiceMcp {
pub server_label: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ToolChoiceCustom {
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseOutputItem {
Message(ResponseOutputMessage),
FileSearchCall(ResponseFileSearchToolCall),
FunctionCall(ResponseFunctionToolCall),
WebSearchCall(ResponseFunctionWebSearch),
ComputerCall(ResponseComputerToolCall),
Reasoning(ResponseReasoningItem),
ImageGenerationCall(ImageGenerationCall),
CodeInterpreterCall(ResponseCodeInterpreterToolCall),
LocalShellCall(LocalShellCall),
McpCall(McpCall),
McpListTools(McpListTools),
McpApprovalRequest(McpApprovalRequest),
CustomToolCall(ResponseCustomToolCall),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseInputItem {
Message(InputMessage),
FileSearchCall(ResponseFileSearchToolCall),
ComputerCall(ResponseComputerToolCall),
ComputerCallOutput(ResponseComputerToolCallOutputItem),
WebSearchCall(ResponseFunctionWebSearch),
FunctionCall(ResponseFunctionToolCall),
FunctionCallOutput(FunctionCallOutput),
Reasoning(ResponseReasoningItem),
ImageGenerationCall(ImageGenerationCall),
CodeInterpreterCall(ResponseCodeInterpreterToolCall),
LocalShellCall(LocalShellCall),
LocalShellCallOutput(LocalShellCallOutput),
McpListTools(McpListTools),
McpApprovalRequest(McpApprovalRequest),
McpApprovalResponse(McpApprovalResponse),
McpCall(McpCall),
CustomToolCallOutput(ResponseCustomToolCallOutput),
CustomToolCall(ResponseCustomToolCall),
ItemReference(ItemReference),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseOutputMessage {
pub id: String,
pub content: Vec<ResponseOutputContent>,
pub role: String, pub status: String, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct InputMessage {
pub content: InputMessageContent,
pub role: InputMessageRole,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum InputMessageContent {
Text(String),
Parts(Vec<ResponseInputContentPart>),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum InputMessageRole {
User,
Assistant,
System,
Developer,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseInputContentPart {
InputText(ResponseInputText),
InputImage(ResponseInputImage),
InputFile(ResponseInputFile),
InputAudio(ResponseInputAudio),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseOutputContent {
OutputText(ResponseOutputText),
Refusal(ResponseOutputRefusal),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseOutputText {
pub text: String,
pub annotations: Vec<Annotation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<Vec<Logprob>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseOutputRefusal {
pub refusal: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseFunctionToolCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub call_id: String,
pub name: String,
pub arguments: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseError {
pub code: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseBilling {
pub payer: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseUsage {
pub input_tokens: u32,
pub input_tokens_details: response_usage::InputTokensDetails,
pub output_tokens: u32,
pub output_tokens_details: response_usage::OutputTokensDetails,
pub total_tokens: i64,
}
pub mod response_usage {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct InputTokensDetails {
pub cached_tokens: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OutputTokensDetails {
pub reasoning_tokens: i64,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponsePrompt {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub variables: Option<HashMap<String, PromptVariable>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum PromptVariable {
String(String),
InputText(ResponseInputText),
InputImage(ResponseInputImage),
InputFile(ResponseInputFile),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseTextConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<ResponseFormatTextConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verbosity: Option<String>, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum ResponseFormatTextConfig {
#[serde(rename = "text")]
Text,
#[serde(rename = "json_schema")]
JsonSchema {
name: String,
schema: serde_json::Value,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
strict: Option<bool>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum OpenAIContentPartPayload {
InputText { text: String },
InputImage { image_url: String, detail: String },
OutputText { text: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAIToolPayload {
#[serde(rename = "type")]
pub tool_type: String,
pub function: OpenAIFunctionPayload,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAIFunctionPayload {
pub name: String,
pub description: Option<String>,
pub parameters: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAIReasoningConfigPayload {
pub effort: Option<String>,
pub summary: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAITextConfigPayload {
pub verbosity: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAIToolCallPayload {
pub id: String,
pub name: String,
pub arguments: String,
pub function: OpenAIFunctionCallPayload,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAIFunctionCallPayload {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct OpenAIResponsesRequestPayload {
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub conversation: Option<ConversationParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include: Option<Vec<ResponseIncludable>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<OpenAIInputMessage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parallel_tool_calls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_response_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt: Option<ResponsePrompt>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning: Option<Reasoning>,
#[serde(skip_serializing_if = "Option::is_none")]
pub safety_identifier: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub store: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream_options: Option<StreamOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<ResponseTextConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<TruncationStrategy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAIStreamingOutputItem {
pub id: String,
pub content: Vec<OpenAIStreamingContent>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum OpenAIStreamingContent {
OutputText { text: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum OpenAIOutputItem {
Message {
role: String,
content: Vec<OpenAIOutputContent>,
},
Reasoning {
reasoning: String,
summary: String,
},
ToolCall {
id: String,
tool_type: String,
function: OpenAIFunctionCallPayload,
},
Preamble {
content: Vec<OpenAIOutputContent>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum OpenAIOutputContent {
OutputText { text: String },
OutputReasoning { reasoning: String, summary: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum ConversationParam {
Id(String),
Object(ResponseConversationParam),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseConversationParam {
pub id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "kebab-case")]
pub enum ResponseIncludable {
FileSearchCallResults,
MessageInputImageImageUrl,
ComputerCallOutputOutputImageUrl,
ReasoningEncryptedContent,
CodeInterpreterCallOutputs,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum OpenAIInputMessage {
String(String),
Items(Vec<ResponseInputItem>),
Message { role: String, content: Vec<OpenAIContentPartPayload> },
UserMessage { content: Vec<OpenAIContentPartPayload> },
AssistantMessage { content: Vec<OpenAIContentPartPayload> },
SystemMessage { content: Vec<OpenAIContentPartPayload> },
DeveloperMessage { content: Vec<OpenAIContentPartPayload> },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StreamOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub include_obfuscation: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct Reasoning {
#[serde(skip_serializing_if = "Option::is_none")]
pub effort: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseInputText {
pub text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseInputImage {
pub detail: ImageDetailLevel,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ImageDetailLevel {
Low,
High,
Auto,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseInputFile {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub filename: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseInputAudio {
pub input_audio: response_input_audio::InputAudio,
}
pub mod response_input_audio {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct InputAudio {
pub data: String, pub format: AudioFormat,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum AudioFormat {
Mp3,
Wav,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Annotation {
FileCitation(FileCitation),
UrlCitation(UrlCitation),
ContainerFileCitation(ContainerFileCitation),
FilePath(FilePath),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FileCitation {
pub file_id: String,
pub filename: String,
pub index: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UrlCitation {
pub end_index: i32,
pub start_index: i32,
pub title: String,
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ContainerFileCitation {
pub container_id: String,
pub end_index: i32,
pub file_id: String,
pub filename: String,
pub start_index: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FilePath {
pub file_id: String,
pub index: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Logprob {
pub token: String,
pub bytes: Vec<u8>,
pub logprob: f64,
pub top_logprobs: Vec<logprob::TopLogprob>,
}
pub mod logprob {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TopLogprob {
pub token: String,
pub bytes: Vec<u8>,
pub logprob: f64,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseFileSearchToolCall {
pub id: String,
pub queries: Vec<String>,
pub status: FileSearchStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<response_file_search_tool_call::Result>>,
}
pub mod response_file_search_tool_call {
use super::*;
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Result {
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub filename: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum FileSearchStatus {
InProgress,
Searching,
Completed,
Incomplete,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseFunctionWebSearch {
pub id: String,
pub status: WebSearchStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum WebSearchStatus {
InProgress,
Searching,
Completed,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseComputerToolCall {
pub id: String,
pub action: ComputerAction,
pub call_id: String,
pub pending_safety_checks: Vec<PendingSafetyCheck>,
pub status: CallStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum CallStatus {
InProgress,
Completed,
Incomplete,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ComputerAction {
Click(ClickAction),
DoubleClick(DoubleClickAction),
Drag(DragAction),
Keypress(KeypressAction),
Move(MoveAction),
Screenshot(ScreenshotAction),
Scroll(ScrollAction),
Type(TypeAction),
Wait(WaitAction),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ClickAction {
pub button: String,
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DoubleClickAction {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DragAction {
pub path: Vec<drag_action::Path>,
}
pub mod drag_action {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Path {
pub x: f64,
pub y: f64,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct KeypressAction {
pub keys: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MoveAction {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ScreenshotAction {}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ScrollAction {
pub scroll_x: f64,
pub scroll_y: f64,
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TypeAction {
pub text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct WaitAction {}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PendingSafetyCheck {
pub id: String,
pub code: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseReasoningItem {
pub id: String,
pub summary: Vec<response_reasoning_item::Summary>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<Vec<response_reasoning_item::Content>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub encrypted_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<CallStatus>,
}
pub mod response_reasoning_item {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Summary {
SummaryText { text: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Content {
ReasoningText { text: String },
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ImageGenerationCall {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<String>, pub status: ImageGenerationStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ImageGenerationStatus {
InProgress,
Completed,
Generating,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseCodeInterpreterToolCall {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
pub container_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub outputs: Option<Vec<CodeInterpreterOutput>>,
pub status: CodeInterpreterStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum CodeInterpreterStatus {
InProgress,
Completed,
Incomplete,
Interpreting,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CodeInterpreterOutput {
Logs { logs: String },
Image { url: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct LocalShellCall {
pub id: String,
pub action: local_shell_call::Action,
pub call_id: String,
pub status: CallStatus,
}
pub mod local_shell_call {
use super::*;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Action {
Exec {
command: Vec<String>,
env: HashMap<String, String>,
#[serde(skip_serializing_if = "Option::is_none")]
timeout_ms: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
user: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
working_directory: Option<String>,
},
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct McpCall {
pub id: String,
pub arguments: String, pub name: String,
pub server_label: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct McpListTools {
pub id: String,
pub server_label: String,
pub tools: Vec<mcp_list_tools::Tool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
pub mod mcp_list_tools {
use super::*;
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Tool {
pub input_schema: Value,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct McpApprovalRequest {
pub id: String,
pub arguments: String, pub name: String,
pub server_label: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseCustomToolCall {
pub call_id: String,
pub input: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseComputerToolCallOutputItem {
pub id: String,
pub call_id: String,
pub output: ResponseComputerToolCallOutputScreenshot,
#[serde(skip_serializing_if = "Option::is_none")]
pub acknowledged_safety_checks: Option<Vec<AcknowledgedSafetyCheck>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<CallStatus>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseComputerToolCallOutputScreenshot {
ComputerScreenshot {
#[serde(skip_serializing_if = "Option::is_none")]
file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
image_url: Option<String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AcknowledgedSafetyCheck {
pub id: String,
pub code: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct FunctionCallOutput {
pub call_id: String,
pub output: String, #[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<CallStatus>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct LocalShellCallOutput {
pub id: String,
pub output: String, #[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<CallStatus>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct McpApprovalResponse {
pub approval_request_id: String,
pub approve: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResponseCustomToolCallOutput {
pub call_id: String,
pub output: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ItemReference {
pub id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponsesStreamEvent {
#[serde(rename = "response.created")]
ResponseCreated { sequence_number: i64, response: serde_json::Value },
#[serde(rename = "response.in_progress")]
ResponseInProgress { sequence_number: i64, response: serde_json::Value },
#[serde(rename = "response.completed")]
ResponseCompleted {
sequence_number: i64,
response: ResponsesStreamCompletedResponse,
},
#[serde(rename = "response.failed")]
ResponseFailed { sequence_number: i64, response: serde_json::Value },
#[serde(rename = "response.incomplete")]
ResponseIncomplete { sequence_number: i64, response: serde_json::Value },
#[serde(rename = "response.queued")]
ResponseQueued { sequence_number: i64, response: serde_json::Value },
#[serde(rename = "response.output_item.added")]
OutputItemAdded {
sequence_number: i64,
output_index: i64,
item: serde_json::Value,
},
#[serde(rename = "response.output_item.done")]
OutputItemDone {
sequence_number: i64,
output_index: i64,
item: serde_json::Value,
},
#[serde(rename = "response.content_part.added")]
ContentPartAdded {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
part: serde_json::Value,
},
#[serde(rename = "response.content_part.done")]
ContentPartDone {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
part: serde_json::Value,
},
#[serde(rename = "response.output_text.delta")]
OutputTextDelta {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
delta: String,
#[serde(default)]
logprobs: Vec<serde_json::Value>,
#[serde(default)]
obfuscation: Option<String>,
},
#[serde(rename = "response.output_text.done")]
OutputTextDone {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
text: String,
#[serde(default)]
logprobs: Vec<serde_json::Value>,
},
#[serde(rename = "response.output_text.annotation.added")]
OutputTextAnnotationAdded {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
annotation_index: i64,
annotation: serde_json::Value,
},
#[serde(rename = "response.function_call_arguments.delta")]
FunctionCallArgumentsDelta {
sequence_number: i64,
item_id: String,
output_index: i64,
delta: String,
},
#[serde(rename = "response.function_call_arguments.done")]
FunctionCallArgumentsDone {
sequence_number: i64,
item_id: String,
output_index: i64,
#[serde(default)]
name: Option<String>,
arguments: String,
},
#[serde(rename = "response.refusal.delta")]
RefusalDelta {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
delta: String,
},
#[serde(rename = "response.refusal.done")]
RefusalDone {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
refusal: String,
},
#[serde(rename = "response.file_search_call.in_progress")]
FileSearchCallInProgress { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.file_search_call.searching")]
FileSearchCallSearching { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.file_search_call.completed")]
FileSearchCallCompleted { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.web_search_call.in_progress")]
WebSearchCallInProgress { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.web_search_call.searching")]
WebSearchCallSearching { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.web_search_call.completed")]
WebSearchCallCompleted { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.reasoning_summary_part.added")]
ReasoningSummaryPartAdded {
sequence_number: i64,
item_id: String,
output_index: i64,
summary_index: i64,
part: serde_json::Value,
},
#[serde(rename = "response.reasoning_summary_part.done")]
ReasoningSummaryPartDone {
sequence_number: i64,
item_id: String,
output_index: i64,
summary_index: i64,
part: serde_json::Value,
},
#[serde(rename = "response.reasoning_summary_text.delta")]
ReasoningSummaryTextDelta {
sequence_number: i64,
item_id: String,
output_index: i64,
summary_index: i64,
delta: String,
},
#[serde(rename = "response.reasoning_summary_text.done")]
ReasoningSummaryTextDone {
sequence_number: i64,
item_id: String,
output_index: i64,
summary_index: i64,
text: String,
},
#[serde(rename = "response.reasoning_text.delta")]
ReasoningTextDelta {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
delta: String,
},
#[serde(rename = "response.reasoning_text.done")]
ReasoningTextDone {
sequence_number: i64,
item_id: String,
output_index: i64,
content_index: i64,
text: String,
},
#[serde(rename = "response.image_generation_call.completed")]
ImageGenerationCallCompleted { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.image_generation_call.generating")]
ImageGenerationCallGenerating { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.image_generation_call.in_progress")]
ImageGenerationCallInProgress { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.image_generation_call.partial_image")]
ImageGenerationCallPartialImage {
sequence_number: i64,
output_index: i64,
item_id: String,
partial_image_index: i64,
partial_image_b64: String,
},
#[serde(rename = "response.mcp_call_arguments.delta")]
McpCallArgumentsDelta {
sequence_number: i64,
output_index: i64,
item_id: String,
delta: String,
},
#[serde(rename = "response.mcp_call_arguments.done")]
McpCallArgumentsDone {
sequence_number: i64,
output_index: i64,
item_id: String,
arguments: String,
},
#[serde(rename = "response.mcp_call.completed")]
McpCallCompleted { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.mcp_call.failed")]
McpCallFailed { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.mcp_call.in_progress")]
McpCallInProgress { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.mcp_list_tools.completed")]
McpListToolsCompleted { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.mcp_list_tools.failed")]
McpListToolsFailed { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.mcp_list_tools.in_progress")]
McpListToolsInProgress { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.code_interpreter_call.in_progress")]
CodeInterpreterCallInProgress { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.code_interpreter_call.interpreting")]
CodeInterpreterCallInterpreting { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.code_interpreter_call.completed")]
CodeInterpreterCallCompleted { sequence_number: i64, output_index: i64, item_id: String },
#[serde(rename = "response.code_interpreter_call_code.delta")]
CodeInterpreterCallCodeDelta {
sequence_number: i64,
output_index: i64,
item_id: String,
delta: String,
},
#[serde(rename = "response.code_interpreter_call_code.done")]
CodeInterpreterCallCodeDone {
sequence_number: i64,
output_index: i64,
item_id: String,
code: String,
},
#[serde(rename = "response.custom_tool_call_input.delta")]
CustomToolCallInputDelta {
sequence_number: i64,
output_index: i64,
item_id: String,
delta: String,
},
#[serde(rename = "response.custom_tool_call_input.done")]
CustomToolCallInputDone {
sequence_number: i64,
output_index: i64,
item_id: String,
input: String,
},
#[serde(rename = "error")]
Error {
sequence_number: i64,
code: Option<String>,
message: String,
#[serde(default)]
param: Option<String>,
},
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponsesStreamCompletedResponse {
pub id: String,
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub usage: Option<ResponsesStreamUsage>,
#[serde(default)]
pub error: Option<ResponseError>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponsesStreamUsage {
pub input_tokens: u32,
pub output_tokens: u32,
#[serde(default)]
pub input_tokens_details: Option<ResponsesStreamInputTokensDetails>,
#[serde(default)]
pub output_tokens_details: Option<ResponsesStreamOutputTokensDetails>,
#[serde(default)]
pub total_tokens: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponsesStreamInputTokensDetails {
#[serde(default)]
pub cached_tokens: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponsesStreamOutputTokensDetails {
#[serde(default)]
pub reasoning_tokens: i64,
}