use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use super::super::common::*;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ResponseTool {
#[serde(rename = "function")]
Function {
name: String,
parameters: JsonSchema,
#[serde(skip_serializing_if = "Option::is_none")]
strict: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
defer_loading: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_callers: Option<Vec<ToolCaller>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "file_search")]
FileSearch {
vector_store_ids: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
filters: Option<FileSearchFilter>,
#[serde(skip_serializing_if = "Option::is_none")]
max_num_results: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
ranking_options: Option<FileSearchRankingOptions>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "computer")]
Computer {
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "computer_use_preview")]
ComputerUsePreview {
display_height: u32,
display_width: u32,
environment: ComputerUseEnvironment,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "web_search")]
WebSearch {
#[serde(skip_serializing_if = "Option::is_none")]
filters: Option<WebSearchFilters>,
#[serde(skip_serializing_if = "Option::is_none")]
search_context_size: Option<SearchContextSize>,
#[serde(skip_serializing_if = "Option::is_none")]
user_location: Option<WebSearchUserLocation>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "web_search_2025_08_26")]
WebSearch20250826 {
#[serde(skip_serializing_if = "Option::is_none")]
filters: Option<WebSearchFilters>,
#[serde(skip_serializing_if = "Option::is_none")]
search_context_size: Option<SearchContextSize>,
#[serde(skip_serializing_if = "Option::is_none")]
user_location: Option<WebSearchUserLocation>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "x_search")]
XSearch {
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "collections_search")]
CollectionsSearch {
vector_store_ids: Vec<String>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "mcp")]
Mcp {
server_label: String,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_tools: Option<McpAllowedTools>,
#[serde(skip_serializing_if = "Option::is_none")]
authorization: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
connector_id: Option<McpConnectorId>,
#[serde(skip_serializing_if = "Option::is_none")]
defer_loading: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
headers: Option<BTreeMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
require_approval: Option<McpRequireApproval>,
#[serde(skip_serializing_if = "Option::is_none")]
server_description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
server_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
tunnel_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_callers: Option<Vec<ToolCaller>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "code_execution")]
CodeExecution {
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "code_interpreter")]
CodeInterpreter {
container: CodeInterpreterContainer,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_callers: Option<Vec<ToolCaller>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "image_generation")]
ImageGeneration {
#[serde(skip_serializing_if = "Option::is_none")]
action: Option<ImageGenerationAction>,
#[serde(skip_serializing_if = "Option::is_none")]
background: Option<ImageBackground>,
#[serde(skip_serializing_if = "Option::is_none")]
input_fidelity: Option<ImageInputFidelity>,
#[serde(skip_serializing_if = "Option::is_none")]
input_image_mask: Option<ImageMask>,
#[serde(skip_serializing_if = "Option::is_none")]
model: Option<OpenAiModelId>,
#[serde(skip_serializing_if = "Option::is_none")]
moderation: Option<ImageModeration>,
#[serde(skip_serializing_if = "Option::is_none")]
output_compression: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
output_format: Option<ImageOutputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
partial_images: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
quality: Option<ImageEditQuality>,
#[serde(skip_serializing_if = "Option::is_none")]
size: Option<ResponseImageGenerationSize>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "local_shell")]
LocalShell {
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "shell")]
Shell {
#[serde(skip_serializing_if = "Option::is_none")]
environment: Option<ResponseShellEnvironment>,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_callers: Option<Vec<ToolCaller>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "custom")]
Custom {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
defer_loading: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
format: Option<CustomToolInputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_callers: Option<Vec<ToolCaller>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "namespace")]
Namespace {
description: String,
name: String,
tools: Vec<ResponseNamespaceTool>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "tool_search")]
ToolSearch {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
execution: Option<ToolSearchExecution>,
#[serde(skip_serializing_if = "Option::is_none")]
parameters: Option<Value>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "programmatic_tool_calling")]
ProgrammaticToolCalling {
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "web_search_preview")]
WebSearchPreview {
#[serde(skip_serializing_if = "Option::is_none")]
search_content_types: Option<Vec<SearchContentType>>,
#[serde(skip_serializing_if = "Option::is_none")]
search_context_size: Option<SearchContextSize>,
#[serde(skip_serializing_if = "Option::is_none")]
user_location: Option<WebSearchPreviewUserLocation>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "web_search_preview_2025_03_11")]
WebSearchPreview20250311 {
#[serde(skip_serializing_if = "Option::is_none")]
search_content_types: Option<Vec<SearchContentType>>,
#[serde(skip_serializing_if = "Option::is_none")]
search_context_size: Option<SearchContextSize>,
#[serde(skip_serializing_if = "Option::is_none")]
user_location: Option<WebSearchPreviewUserLocation>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "apply_patch")]
ApplyPatch {
#[serde(skip_serializing_if = "Option::is_none")]
allowed_callers: Option<Vec<ToolCaller>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ResponseNamespaceTool {
#[serde(rename = "function")]
Function {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
defer_loading: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parameters: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
strict: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_callers: Option<Vec<ToolCaller>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "custom")]
Custom {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
defer_loading: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
format: Option<CustomToolInputFormat>,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_callers: Option<Vec<ToolCaller>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum FileSearchFilter {
Comparison(FileSearchComparisonFilter),
Compound(FileSearchCompoundFilter),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FileSearchComparisonFilter {
pub key: String,
#[serde(rename = "type")]
pub type_: FileSearchComparisonOperator,
pub value: FileSearchComparisonValue,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum FileSearchComparisonValue {
String(String),
Number(f64),
Boolean(bool),
List(Vec<FileSearchComparisonListValue>),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum FileSearchComparisonListValue {
String(String),
Number(f64),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum FileSearchComparisonOperator {
#[serde(rename = "eq")]
Eq,
#[serde(rename = "ne")]
Ne,
#[serde(rename = "gt")]
Gt,
#[serde(rename = "gte")]
Gte,
#[serde(rename = "lt")]
Lt,
#[serde(rename = "lte")]
Lte,
#[serde(rename = "in")]
In,
#[serde(rename = "nin")]
Nin,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FileSearchCompoundFilter {
pub filters: Vec<FileSearchFilter>,
#[serde(rename = "type")]
pub type_: FileSearchCompoundOperator,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum FileSearchCompoundOperator {
#[serde(rename = "and")]
And,
#[serde(rename = "or")]
Or,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FileSearchRankingOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub hybrid_search: Option<FileSearchHybridSearch>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ranker: Option<FileSearchRanker>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_threshold: Option<f64>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FileSearchHybridSearch {
pub embedding_weight: f64,
pub text_weight: f64,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum FileSearchRanker {
#[serde(rename = "auto")]
Auto,
#[serde(rename = "default-2024-11-15")]
Default20241115,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ComputerUseEnvironment {
#[serde(rename = "windows")]
Windows,
#[serde(rename = "mac")]
Mac,
#[serde(rename = "linux")]
Linux,
#[serde(rename = "ubuntu")]
Ubuntu,
#[serde(rename = "browser")]
Browser,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WebSearchFilters {
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_domains: Option<Vec<String>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WebSearchUserLocation {
#[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>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub type_: Option<ApproximateLocationType>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum McpAllowedTools {
Names(Vec<String>),
Filter(McpToolFilter),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
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>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum McpConnectorId {
#[serde(rename = "connector_dropbox")]
Dropbox,
#[serde(rename = "connector_gmail")]
Gmail,
#[serde(rename = "connector_googlecalendar")]
GoogleCalendar,
#[serde(rename = "connector_googledrive")]
GoogleDrive,
#[serde(rename = "connector_microsoftteams")]
MicrosoftTeams,
#[serde(rename = "connector_outlookcalendar")]
OutlookCalendar,
#[serde(rename = "connector_outlookemail")]
OutlookEmail,
#[serde(rename = "connector_sharepoint")]
SharePoint,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum McpRequireApproval {
Setting(McpApprovalSetting),
Filter(McpToolApprovalFilter),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum McpApprovalSetting {
#[serde(rename = "always")]
Always,
#[serde(rename = "never")]
Never,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
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>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CodeInterpreterContainer {
Id(String),
Auto(CodeInterpreterAutoContainer),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CodeInterpreterAutoContainer {
#[serde(rename = "type")]
pub type_: CodeInterpreterContainerType,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_limit: Option<CodeInterpreterMemoryLimit>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network_policy: Option<CodeInterpreterNetworkPolicy>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum CodeInterpreterNetworkPolicy {
#[serde(rename = "disabled")]
Disabled {
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
#[serde(rename = "allowlist")]
Allowlist {
allowed_domains: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
domain_secrets: Option<Vec<CodeInterpreterDomainSecret>>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
extra: Extra,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CodeInterpreterDomainSecret {
pub domain: String,
pub name: String,
pub value: String,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ImageMask {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_url: Option<String>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ResponseShellEnvironment {
#[serde(rename = "container_auto")]
ContainerAuto {
#[serde(skip_serializing_if = "Option::is_none")]
file_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
memory_limit: Option<CodeInterpreterMemoryLimit>,
#[serde(skip_serializing_if = "Option::is_none")]
network_policy: Option<CodeInterpreterNetworkPolicy>,
#[serde(skip_serializing_if = "Option::is_none")]
skills: Option<Vec<ResponseShellContainerSkill>>,
},
#[serde(rename = "local")]
Local {
#[serde(skip_serializing_if = "Option::is_none")]
skills: Option<Vec<ResponseShellLocalSkill>>,
},
#[serde(rename = "container_reference")]
ContainerReference { container_id: String },
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ResponseShellContainerSkill {
Reference(ResponseShellSkillReference),
Inline(ResponseShellInlineSkill),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ResponseShellSkillReference {
pub skill_id: String,
#[serde(rename = "type")]
pub type_: ResponseShellSkillReferenceType,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResponseShellSkillReferenceType {
#[serde(rename = "skill_reference")]
SkillReference,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ResponseShellInlineSkill {
pub description: String,
pub name: String,
pub source: ResponseShellInlineSkillSource,
#[serde(rename = "type")]
pub type_: ResponseShellInlineSkillType,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResponseShellInlineSkillType {
#[serde(rename = "inline")]
Inline,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ResponseShellInlineSkillSource {
pub data: String,
pub media_type: ResponseShellInlineSkillMediaType,
#[serde(rename = "type")]
pub type_: ResponseShellInlineSkillSourceType,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResponseShellInlineSkillMediaType {
#[serde(rename = "application/zip")]
ApplicationZip,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResponseShellInlineSkillSourceType {
#[serde(rename = "base64")]
Base64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ResponseShellLocalSkill {
pub description: String,
pub name: String,
pub path: String,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum SearchContentType {
#[serde(rename = "text")]
Text,
#[serde(rename = "image")]
Image,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WebSearchPreviewUserLocation {
#[serde(rename = "type")]
pub type_: ApproximateLocationType,
#[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>,
#[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
pub extra: Extra,
}