use crate::error::OpenAIError;
use crate::types::mcp::{MCPListToolsTool, MCPTool};
use crate::types::responses::{
CustomGrammarFormatParam, Filter, ImageDetail, ReasoningEffort, ResponseFormatJsonSchema,
ResponseUsage, SummaryTextContent,
};
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum MessagePhase {
Commentary,
FinalAnswer,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ToolSearchExecutionType {
Server,
Client,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SearchContentType {
Text,
Image,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum FunctionCallStatus {
InProgress,
Completed,
Incomplete,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum FunctionCallOutputStatusEnum {
InProgress,
Completed,
Incomplete,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct ComputerTool {}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Builder, Default)]
#[builder(
name = "NamespaceToolParamArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct NamespaceToolParam {
pub name: String,
pub description: String,
pub tools: Vec<NamespaceToolParamTool>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum NamespaceToolParamTool {
Function(FunctionToolParam),
Custom(CustomToolParam),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "FunctionToolParamArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct FunctionToolParam {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub strict: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub defer_loading: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "ToolSearchToolParamArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct ToolSearchToolParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub execution: Option<ToolSearchExecutionType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<serde_json::Value>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ToolSearchCall {
pub id: String,
pub call_id: Option<String>,
pub execution: ToolSearchExecutionType,
pub arguments: serde_json::Value,
pub status: FunctionCallStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct ToolSearchCallItemParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execution: Option<ToolSearchExecutionType>,
#[serde(default)]
pub arguments: serde_json::Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ToolSearchOutput {
pub id: String,
pub call_id: Option<String>,
pub execution: ToolSearchExecutionType,
pub tools: Vec<Tool>,
pub status: FunctionCallOutputStatusEnum,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct ToolSearchOutputItemParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub call_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execution: Option<ToolSearchExecutionType>,
pub tools: Vec<Tool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum Role {
#[default]
User,
Assistant,
System,
Developer,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum OutputStatus {
InProgress,
Completed,
Incomplete,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum InputParam {
Text(String),
Items(Vec<InputItem>),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Item {
Message(MessageItem),
FileSearchCall(FileSearchToolCall),
ComputerCall(ComputerToolCall),
ComputerCallOutput(ComputerCallOutputItemParam),
WebSearchCall(WebSearchToolCall),
FunctionCall(FunctionToolCall),
FunctionCallOutput(FunctionCallOutputItemParam),
ToolSearchCall(ToolSearchCallItemParam),
ToolSearchOutput(ToolSearchOutputItemParam),
Reasoning(ReasoningItem),
Compaction(CompactionSummaryItemParam),
ImageGenerationCall(ImageGenToolCall),
CodeInterpreterCall(CodeInterpreterToolCall),
LocalShellCall(LocalShellToolCall),
LocalShellCallOutput(LocalShellToolCallOutput),
ShellCall(FunctionShellCallItemParam),
ShellCallOutput(FunctionShellCallOutputItemParam),
ApplyPatchCall(ApplyPatchToolCallItemParam),
ApplyPatchCallOutput(ApplyPatchToolCallOutputItemParam),
McpListTools(MCPListTools),
McpApprovalRequest(MCPApprovalRequest),
McpApprovalResponse(MCPApprovalResponse),
McpCall(MCPToolCall),
CustomToolCallOutput(CustomToolCallOutput),
CustomToolCall(CustomToolCall),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum InputItem {
ItemReference(ItemReference),
Item(Item),
EasyMessage(EasyInputMessage),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum MessageItem {
Output(OutputMessage),
Input(InputMessage),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ItemReference {
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<ItemReferenceType>,
pub id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ItemReferenceType {
ItemReference,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionCallOutputItemParam {
pub call_id: String,
pub output: FunctionCallOutput,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum FunctionCallOutput {
Text(String),
Content(Vec<InputContent>), }
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ComputerCallOutputItemParam {
pub call_id: String,
pub output: ComputerScreenshotImage,
#[serde(skip_serializing_if = "Option::is_none")]
pub acknowledged_safety_checks: Option<Vec<ComputerCallSafetyCheckParam>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>, }
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ComputerScreenshotImageType {
ComputerScreenshot,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ComputerScreenshotImage {
pub r#type: ComputerScreenshotImageType,
#[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, Serialize, Deserialize, Clone, PartialEq)]
pub struct LocalShellToolCallOutput {
pub id: String,
pub output: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct LocalShellOutput {
#[serde(skip_serializing_if = "Option::is_none")]
pub stdout: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stderr: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exit_code: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize, Clone, 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, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum CustomToolCallOutputOutput {
Text(String),
List(Vec<InputContent>),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CustomToolCallOutput {
pub call_id: String,
pub output: CustomToolCallOutputOutput,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "EasyInputMessageArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct EasyInputMessage {
#[serde(default)]
pub r#type: MessageType,
pub role: Role,
pub content: EasyInputContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub phase: Option<MessagePhase>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "InputMessageArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct InputMessage {
pub content: Vec<InputContent>,
pub role: InputRole,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum InputRole {
#[default]
User,
System,
Developer,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum EasyInputContent {
Text(String),
ContentList(Vec<InputContent>),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum InputContent {
InputText(InputTextContent),
InputImage(InputImageContent),
InputFile(InputFileContent),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct InputTextContent {
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "InputImageArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct InputImageContent {
pub detail: ImageDetail,
#[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, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "InputFileArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct InputFileContent {
#[serde(skip_serializing_if = "Option::is_none")]
file_data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
file_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
filename: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct Conversation {
pub id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum ConversationParam {
ConversationID(String),
Object(Conversation),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub enum IncludeEnum {
#[serde(rename = "file_search_call.results")]
FileSearchCallResults,
#[serde(rename = "web_search_call.results")]
WebSearchCallResults,
#[serde(rename = "web_search_call.action.sources")]
WebSearchCallActionSources,
#[serde(rename = "message.input_image.image_url")]
MessageInputImageImageUrl,
#[serde(rename = "computer_call_output.output.image_url")]
ComputerCallOutputOutputImageUrl,
#[serde(rename = "code_interpreter_call.outputs")]
CodeInterpreterCallOutputs,
#[serde(rename = "reasoning.encrypted_content")]
ReasoningEncryptedContent,
#[serde(rename = "message.output_text.logprobs")]
MessageOutputTextLogprobs,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ResponseStreamOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub include_obfuscation: Option<bool>,
}
#[derive(Clone, Serialize, Deserialize, Debug, Default, Builder, PartialEq)]
#[builder(
name = "CreateResponseArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CreateResponse {
#[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<IncludeEnum>>,
pub input: InputParam,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tool_calls: Option<u32>,
#[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<Prompt>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_retention: Option<PromptCacheRetention>,
#[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<ResponseStreamOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<ResponseTextParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoiceParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<Truncation>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum ResponsePromptVariables {
String(String),
Content(InputContent),
Custom(serde_json::Value),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct Prompt {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variables: Option<ResponsePromptVariables>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum ServiceTier {
#[default]
Auto,
Default,
Flex,
Scale,
Priority,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Truncation {
Auto,
Disabled,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct Billing {
pub payer: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "ReasoningArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct Reasoning {
#[serde(skip_serializing_if = "Option::is_none")]
pub effort: Option<ReasoningEffort>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<ReasoningSummary>,
}
#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Verbosity {
Low,
Medium,
High,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ReasoningSummary {
Auto,
Concise,
Detailed,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
pub enum PromptCacheRetention {
#[serde(rename = "in_memory")]
InMemory,
#[serde(rename = "24h")]
Hours24,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ResponseTextParam {
pub format: TextResponseFormatConfiguration,
#[serde(skip_serializing_if = "Option::is_none")]
pub verbosity: Option<Verbosity>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum TextResponseFormatConfiguration {
Text,
JsonObject,
JsonSchema(ResponseFormatJsonSchema),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Tool {
Function(FunctionTool),
FileSearch(FileSearchTool),
ComputerUsePreview(ComputerUsePreviewTool),
WebSearch(WebSearchTool),
#[serde(rename = "web_search_2025_08_26")]
WebSearch20250826(WebSearchTool),
Mcp(MCPTool),
CodeInterpreter(CodeInterpreterTool),
ImageGeneration(ImageGenTool),
LocalShell,
Shell(FunctionShellToolParam),
Custom(CustomToolParam),
Computer(ComputerTool),
Namespace(NamespaceToolParam),
ToolSearch(ToolSearchToolParam),
WebSearchPreview(WebSearchTool),
#[serde(rename = "web_search_preview_2025_03_11")]
WebSearchPreview20250311(WebSearchTool),
ApplyPatch,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
pub struct CustomToolParam {
pub name: String,
pub description: Option<String>,
pub format: CustomToolParamFormat,
#[serde(skip_serializing_if = "Option::is_none")]
pub defer_loading: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum CustomToolParamFormat {
#[default]
Text,
Grammar(CustomGrammarFormatParam),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "FileSearchToolArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct FileSearchTool {
pub vector_store_ids: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_num_results: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub filters: Option<Filter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ranking_options: Option<RankingOptions>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "FunctionToolArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
pub struct FunctionTool {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub defer_loading: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct WebSearchToolFilters {
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_domains: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "WebSearchToolArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
pub struct WebSearchTool {
#[serde(skip_serializing_if = "Option::is_none")]
pub filters: Option<WebSearchToolFilters>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_location: Option<WebSearchApproximateLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub search_context_size: Option<WebSearchToolSearchContextSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub search_content_types: Option<Vec<SearchContentType>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum WebSearchToolSearchContextSize {
Low,
#[default]
Medium,
High,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum ComputerEnvironment {
Windows,
Mac,
Linux,
Ubuntu,
#[default]
Browser,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "ComputerUsePreviewToolArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
pub struct ComputerUsePreviewTool {
environment: ComputerEnvironment,
display_width: u32,
display_height: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
pub enum RankVersionType {
#[serde(rename = "auto")]
Auto,
#[serde(rename = "default-2024-11-15")]
Default20241115,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct HybridSearch {
pub embedding_weight: f32,
pub text_weight: f32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct RankingOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub hybrid_search: Option<HybridSearch>,
pub ranker: RankVersionType,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_threshold: Option<f32>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum WebSearchApproximateLocationType {
#[default]
Approximate,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "WebSearchApproximateLocationArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct WebSearchApproximateLocation {
#[serde(default)]
pub r#type: WebSearchApproximateLocationType,
#[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, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CodeInterpreterToolContainer {
Auto(CodeInterpreterContainerAuto),
#[serde(untagged)]
ContainerID(String),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct CodeInterpreterContainerAuto {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_limit: Option<u64>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "CodeInterpreterToolArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CodeInterpreterTool {
pub container: CodeInterpreterToolContainer,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ImageGenToolInputImageMask {
#[serde(skip_serializing_if = "Option::is_none")]
pub image_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum InputFidelity {
#[default]
High,
Low,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenToolModeration {
#[default]
Auto,
Low,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenActionEnum {
Generate,
Edit,
#[default]
Auto,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default, Builder)]
#[builder(
name = "ImageGenerationArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct ImageGenTool {
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<ImageGenToolBackground>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_fidelity: Option<InputFidelity>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_image_mask: Option<ImageGenToolInputImageMask>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moderation: Option<ImageGenToolModeration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_compression: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_format: Option<ImageGenToolOutputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub partial_images: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<ImageGenToolQuality>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<ImageGenToolSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub action: Option<ImageGenActionEnum>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenToolBackground {
Transparent,
Opaque,
#[default]
Auto,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenToolOutputFormat {
#[default]
Png,
Webp,
Jpeg,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenToolQuality {
Low,
Medium,
High,
#[default]
Auto,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum ImageGenToolSize {
#[default]
Auto,
#[serde(rename = "1024x1024")]
Size1024x1024,
#[serde(rename = "1024x1536")]
Size1024x1536,
#[serde(rename = "1536x1024")]
Size1536x1024,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ToolChoiceAllowedMode {
Auto,
Required,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ToolChoiceAllowed {
pub mode: ToolChoiceAllowedMode,
pub tools: Vec<serde_json::Value>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ToolChoiceTypes {
FileSearch,
WebSearchPreview,
Computer,
ComputerUsePreview,
ComputerUse,
#[serde(rename = "web_search_preview_2025_03_11")]
WebSearchPreview20250311,
CodeInterpreter,
ImageGeneration,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ToolChoiceFunction {
pub name: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ToolChoiceMCP {
pub name: String,
pub server_label: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ToolChoiceCustom {
pub name: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ToolChoiceParam {
AllowedTools(ToolChoiceAllowed),
Function(ToolChoiceFunction),
Mcp(ToolChoiceMCP),
Custom(ToolChoiceCustom),
ApplyPatch,
Shell,
#[serde(untagged)]
Hosted(ToolChoiceTypes),
#[serde(untagged)]
Mode(ToolChoiceOptions),
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ToolChoiceOptions {
None,
Auto,
Required,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ErrorObject {
pub code: String,
pub message: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct IncompleteDetails {
pub reason: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct TopLogProb {
pub bytes: Vec<u8>,
pub logprob: f64,
pub token: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct LogProb {
pub bytes: Vec<u8>,
pub logprob: f64,
pub token: String,
pub top_logprobs: Vec<TopLogProb>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ResponseTopLobProb {
pub logprob: f64,
pub token: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ResponseLogProb {
pub logprob: f64,
pub token: String,
pub top_logprobs: Vec<ResponseTopLobProb>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct OutputTextContent {
pub annotations: Vec<Annotation>,
pub logprobs: Option<Vec<LogProb>>,
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Annotation {
FileCitation(FileCitationBody),
UrlCitation(UrlCitationBody),
ContainerFileCitation(ContainerFileCitationBody),
FilePath(FilePath),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FileCitationBody {
file_id: String,
filename: String,
index: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct UrlCitationBody {
end_index: u32,
start_index: u32,
title: String,
url: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ContainerFileCitationBody {
container_id: String,
end_index: u32,
file_id: String,
filename: String,
start_index: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FilePath {
file_id: String,
index: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct RefusalContent {
pub refusal: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct OutputMessage {
pub content: Vec<OutputMessageContent>,
pub id: String,
pub role: AssistantRole,
#[serde(skip_serializing_if = "Option::is_none")]
pub phase: Option<MessagePhase>,
pub status: OutputStatus,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum MessageType {
#[default]
Message,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default)]
#[serde(rename_all = "lowercase")]
pub enum AssistantRole {
#[default]
Assistant,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum OutputMessageContent {
OutputText(OutputTextContent),
Refusal(RefusalContent),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum OutputContent {
OutputText(OutputTextContent),
Refusal(RefusalContent),
ReasoningText(ReasoningTextContent),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ReasoningTextContent {
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ReasoningItem {
pub id: String,
pub summary: Vec<SummaryPart>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<Vec<ReasoningTextContent>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub encrypted_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum SummaryPart {
SummaryText(SummaryTextContent),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FileSearchToolCall {
pub id: String,
pub queries: Vec<String>,
pub status: FileSearchToolCallStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<FileSearchToolCallResult>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum FileSearchToolCallStatus {
InProgress,
Searching,
Incomplete,
Failed,
Completed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FileSearchToolCallResult {
pub attributes: HashMap<String, serde_json::Value>,
pub file_id: String,
pub filename: String,
pub score: f32,
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ComputerCallSafetyCheckParam {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum WebSearchToolCallStatus {
InProgress,
Searching,
Completed,
Failed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct WebSearchActionSearchSource {
pub r#type: String,
pub url: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct WebSearchActionSearch {
pub query: String,
pub sources: Option<Vec<WebSearchActionSearchSource>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct WebSearchActionOpenPage {
pub url: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct WebSearchActionFind {
pub url: String,
pub pattern: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum WebSearchToolCallAction {
Search(WebSearchActionSearch),
OpenPage(WebSearchActionOpenPage),
Find(WebSearchActionFind),
FindInPage(WebSearchActionFind),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct WebSearchToolCall {
pub action: WebSearchToolCallAction,
pub id: String,
pub status: WebSearchToolCallStatus,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ComputerToolCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub action: Option<ComputerAction>,
#[serde(skip_serializing_if = "Option::is_none")]
pub actions: Option<Vec<ComputerAction>>,
pub call_id: String,
pub id: String,
pub pending_safety_checks: Vec<ComputerCallSafetyCheckParam>,
pub status: OutputStatus,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CoordParam {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ComputerAction {
Click(ClickParam),
DoubleClick(DoubleClickAction),
Drag(DragParam),
Keypress(KeyPressAction),
Move(MoveParam),
Screenshot,
Scroll(ScrollParam),
Type(TypeParam),
Wait,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ClickButtonType {
Left,
Right,
Wheel,
Back,
Forward,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ClickParam {
pub button: ClickButtonType,
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DoubleClickAction {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DragParam {
pub path: Vec<CoordParam>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct KeyPressAction {
pub keys: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MoveParam {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ScrollParam {
pub scroll_x: i32,
pub scroll_y: i32,
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TypeParam {
pub text: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionToolCall {
pub arguments: String,
pub call_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OutputStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ImageGenToolCallStatus {
InProgress,
Completed,
Generating,
Failed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ImageGenToolCall {
pub id: String,
pub result: Option<String>,
pub status: ImageGenToolCallStatus,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum CodeInterpreterToolCallStatus {
InProgress,
Completed,
Incomplete,
Interpreting,
Failed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CodeInterpreterToolCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
pub container_id: String,
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub outputs: Option<Vec<CodeInterpreterToolCallOutput>>,
pub status: CodeInterpreterToolCallStatus,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CodeInterpreterToolCallOutput {
Logs(CodeInterpreterOutputLogs),
Image(CodeInterpreterOutputImage),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CodeInterpreterOutputLogs {
pub logs: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CodeInterpreterOutputImage {
pub url: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CodeInterpreterFile {
file_id: String,
mime_type: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct LocalShellToolCall {
pub action: LocalShellExecAction,
pub call_id: String,
pub id: String,
pub status: OutputStatus,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct LocalShellExecAction {
pub command: Vec<String>,
pub env: HashMap<String, String>,
pub timeout_ms: Option<u64>,
pub user: Option<String>,
pub working_directory: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellActionParam {
pub commands: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout_ms: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_length: Option<u64>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum FunctionShellCallItemStatus {
InProgress,
Completed,
Incomplete,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum FunctionShellCallItemEnvironment {
Local(LocalEnvironmentParam),
ContainerReference(ContainerReferenceParam),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellCallItemParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub call_id: String,
pub action: FunctionShellActionParam,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<FunctionShellCallItemStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub environment: Option<FunctionShellCallItemEnvironment>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellCallOutputExitOutcomeParam {
pub exit_code: i32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum FunctionShellCallOutputOutcomeParam {
Timeout,
Exit(FunctionShellCallOutputExitOutcomeParam),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellCallOutputContentParam {
pub stdout: String,
pub stderr: String,
pub outcome: FunctionShellCallOutputOutcomeParam,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellCallOutputItemParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub call_id: String,
pub output: Vec<FunctionShellCallOutputContentParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_length: Option<u64>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ApplyPatchCallStatusParam {
InProgress,
Completed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchCreateFileOperationParam {
pub path: String,
pub diff: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchDeleteFileOperationParam {
pub path: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchUpdateFileOperationParam {
pub path: String,
pub diff: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ApplyPatchOperationParam {
CreateFile(ApplyPatchCreateFileOperationParam),
DeleteFile(ApplyPatchDeleteFileOperationParam),
UpdateFile(ApplyPatchUpdateFileOperationParam),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchToolCallItemParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub call_id: String,
pub status: ApplyPatchCallStatusParam,
pub operation: ApplyPatchOperationParam,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ApplyPatchCallOutputStatusParam {
Completed,
Failed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchToolCallOutputItemParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub call_id: String,
pub status: ApplyPatchCallOutputStatusParam,
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellAction {
pub commands: Vec<String>,
pub timeout_ms: Option<u64>,
pub max_output_length: Option<u64>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum LocalShellCallStatus {
InProgress,
Completed,
Incomplete,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum FunctionShellCallEnvironment {
Local,
ContainerReference(ContainerReferenceResource),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellCall {
pub id: String,
pub call_id: String,
pub action: FunctionShellAction,
pub status: LocalShellCallStatus,
pub environment: Option<FunctionShellCallEnvironment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellCallOutputContent {
pub stdout: String,
pub stderr: String,
#[serde(flatten)]
pub outcome: FunctionShellCallOutputOutcome,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum FunctionShellCallOutputOutcome {
Timeout,
Exit(FunctionShellCallOutputExitOutcome),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellCallOutputExitOutcome {
pub exit_code: i32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct FunctionShellCallOutput {
pub id: String,
pub call_id: String,
pub output: Vec<FunctionShellCallOutputContent>,
pub max_output_length: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ApplyPatchCallStatus {
InProgress,
Completed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchCreateFileOperation {
pub path: String,
pub diff: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchDeleteFileOperation {
pub path: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchUpdateFileOperation {
pub path: String,
pub diff: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ApplyPatchOperation {
CreateFile(ApplyPatchCreateFileOperation),
DeleteFile(ApplyPatchDeleteFileOperation),
UpdateFile(ApplyPatchUpdateFileOperation),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchToolCall {
pub id: String,
pub call_id: String,
pub status: ApplyPatchCallStatus,
pub operation: ApplyPatchOperation,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ApplyPatchCallOutputStatus {
Completed,
Failed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ApplyPatchToolCallOutput {
pub id: String,
pub call_id: String,
pub status: ApplyPatchCallOutputStatus,
pub output: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct MCPToolCall {
pub arguments: String,
pub id: String,
pub name: String,
pub server_label: String,
pub approval_request_id: Option<String>,
pub error: Option<String>,
pub output: Option<String>,
pub status: Option<MCPToolCallStatus>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum MCPToolCallStatus {
InProgress,
Completed,
Incomplete,
Calling,
Failed,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct MCPListTools {
pub id: String,
pub server_label: String,
pub tools: Vec<MCPListToolsTool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct MCPApprovalRequest {
pub arguments: String,
pub id: String,
pub name: String,
pub server_label: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum Instructions {
Text(String),
Array(Vec<InputItem>),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct Response {
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub billing: Option<Billing>,
#[serde(skip_serializing_if = "Option::is_none")]
pub conversation: Option<Conversation>,
pub created_at: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed_at: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ErrorObject>,
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub incomplete_details: Option<IncompleteDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<Instructions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, String>>,
pub model: String,
pub object: String,
pub output: Vec<OutputItem>,
#[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<Prompt>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_retention: Option<PromptCacheRetention>,
#[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>,
pub status: Status,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<ResponseTextParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoiceParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<Truncation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<ResponseUsage>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum Status {
Completed,
Failed,
InProgress,
Cancelled,
Queued,
Incomplete,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type")]
#[serde(rename_all = "snake_case")]
pub enum OutputItem {
Message(OutputMessage),
FileSearchCall(FileSearchToolCall),
FunctionCall(FunctionToolCall),
WebSearchCall(WebSearchToolCall),
ComputerCall(ComputerToolCall),
Reasoning(ReasoningItem),
Compaction(CompactionBody),
ImageGenerationCall(ImageGenToolCall),
CodeInterpreterCall(CodeInterpreterToolCall),
LocalShellCall(LocalShellToolCall),
ShellCall(FunctionShellCall),
ShellCallOutput(FunctionShellCallOutput),
ApplyPatchCall(ApplyPatchToolCall),
ApplyPatchCallOutput(ApplyPatchToolCallOutput),
McpCall(MCPToolCall),
McpListTools(MCPListTools),
McpApprovalRequest(MCPApprovalRequest),
CustomToolCall(CustomToolCall),
ToolSearchCall(ToolSearchCall),
ToolSearchOutput(ToolSearchOutput),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[non_exhaustive]
pub struct CustomToolCall {
pub call_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
pub input: String,
pub name: String,
pub id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct DeleteResponse {
pub object: String,
pub deleted: bool,
pub id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct AnyItemReference {
pub r#type: Option<String>,
pub id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ItemResourceItem {
Message(MessageItem),
FileSearchCall(FileSearchToolCall),
ComputerCall(ComputerToolCall),
ComputerCallOutput(ComputerCallOutputItemParam),
WebSearchCall(WebSearchToolCall),
FunctionCall(FunctionToolCall),
FunctionCallOutput(FunctionCallOutputItemParam),
ToolSearchCall(ToolSearchCall),
ToolSearchOutput(ToolSearchOutput),
ImageGenerationCall(ImageGenToolCall),
CodeInterpreterCall(CodeInterpreterToolCall),
LocalShellCall(LocalShellToolCall),
LocalShellCallOutput(LocalShellToolCallOutput),
ShellCall(FunctionShellCallItemParam),
ShellCallOutput(FunctionShellCallOutputItemParam),
ApplyPatchCall(ApplyPatchToolCallItemParam),
ApplyPatchCallOutput(ApplyPatchToolCallOutputItemParam),
McpListTools(MCPListTools),
McpApprovalRequest(MCPApprovalRequest),
McpApprovalResponse(MCPApprovalResponse),
McpCall(MCPToolCall),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum ItemResource {
ItemReference(AnyItemReference),
Item(ItemResourceItem),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ResponseItemList {
pub object: String,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
pub data: Vec<ItemResource>,
}
#[derive(Clone, Serialize, Deserialize, Debug, Default, Builder, PartialEq)]
#[builder(
name = "TokenCountsBodyArgs",
pattern = "mutable",
setter(into, strip_option),
default
)]
#[builder(build_fn(error = "OpenAIError"))]
pub struct TokenCountsBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub conversation: Option<ConversationParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<InputParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<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 reasoning: Option<Reasoning>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<ResponseTextParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoiceParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<Truncation>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct TokenCountsResource {
pub object: String,
pub input_tokens: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CompactionSummaryItemParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub encrypted_content: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CompactionBody {
pub id: String,
pub encrypted_content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_by: Option<String>,
}
#[derive(Clone, Serialize, Default, Debug, Deserialize, Builder, PartialEq)]
#[builder(name = "CompactResponseRequestArgs")]
#[builder(pattern = "mutable")]
#[builder(setter(into, strip_option), default)]
#[builder(derive(Debug))]
#[builder(build_fn(error = "OpenAIError"))]
pub struct CompactResponseRequest {
pub model: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<InputParam>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_response_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CompactResource {
pub id: String,
pub object: String,
pub output: Vec<OutputItem>,
pub created_at: u64,
pub usage: ResponseUsage,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ContainerNetworkPolicyDomainSecretParam {
pub domain: String,
pub name: String,
pub value: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct ContainerNetworkPolicyAllowlistDetails {
pub allowed_domains: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain_secrets: Option<Vec<ContainerNetworkPolicyDomainSecretParam>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ContainerNetworkPolicy {
Disabled,
Allowlist(ContainerNetworkPolicyAllowlistDetails),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct SkillReferenceParam {
pub skill_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct InlineSkillSourceParam {
pub media_type: String,
pub data: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct InlineSkillParam {
pub name: String,
pub description: String,
pub source: InlineSkillSourceParam,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum SkillParam {
SkillReference(SkillReferenceParam),
Inline(InlineSkillParam),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct ContainerAutoParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network_policy: Option<ContainerNetworkPolicy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub skills: Option<Vec<SkillParam>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct LocalSkillParam {
pub name: String,
pub description: String,
pub path: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct LocalEnvironmentParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub skills: Option<Vec<LocalSkillParam>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ContainerReferenceParam {
pub container_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ContainerReferenceResource {
pub container_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum FunctionShellEnvironment {
ContainerAuto(ContainerAutoParam),
Local(LocalEnvironmentParam),
ContainerReference(ContainerReferenceParam),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct FunctionShellToolParam {
#[serde(skip_serializing_if = "Option::is_none")]
pub environment: Option<FunctionShellEnvironment>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ContextManagementParam {
#[serde(rename = "type")]
pub type_: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub compact_threshold: Option<u32>,
}