use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateMessageRequest {
pub model: String,
pub messages: Vec<InputMessage>,
pub max_tokens: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ServiceTier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop_sequences: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system: Option<SystemContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thinking: Option<ThinkingConfig>,
#[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_k: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub container: Option<ContainerConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mcp_servers: Option<Vec<McpServerConfig>>,
}
impl CreateMessageRequest {
pub fn is_stream(&self) -> bool {
self.stream.unwrap_or(false)
}
pub fn get_model(&self) -> &str {
&self.model
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Metadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ServiceTier {
Auto,
StandardOnly,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum SystemContent {
String(String),
Blocks(Vec<TextBlock>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMessage {
pub role: Role,
pub content: InputContent,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Role {
User,
Assistant,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum InputContent {
String(String),
Blocks(Vec<InputContentBlock>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum InputContentBlock {
Text(TextBlock),
Image(ImageBlock),
Document(DocumentBlock),
ToolUse(ToolUseBlock),
ToolResult(ToolResultBlock),
Thinking(ThinkingBlock),
RedactedThinking(RedactedThinkingBlock),
ServerToolUse(ServerToolUseBlock),
SearchResult(SearchResultBlock),
WebSearchToolResult(WebSearchToolResultBlock),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextBlock {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
#[serde(skip_serializing_if = "Option::is_none")]
pub citations: Option<Vec<Citation>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageBlock {
pub source: ImageSource,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ImageSource {
Base64 { media_type: String, data: String },
Url { url: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DocumentBlock {
pub source: DocumentSource,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub context: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub citations: Option<CitationsConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum DocumentSource {
Base64 { media_type: String, data: String },
Text { data: String },
Url { url: String },
Content { content: Vec<InputContentBlock> },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolUseBlock {
pub id: String,
pub name: String,
pub input: Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolResultBlock {
pub tool_use_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<ToolResultContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_error: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ToolResultContent {
String(String),
Blocks(Vec<ToolResultContentBlock>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ToolResultContentBlock {
Text(TextBlock),
Image(ImageBlock),
Document(DocumentBlock),
SearchResult(SearchResultBlock),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThinkingBlock {
pub thinking: String,
pub signature: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedactedThinkingBlock {
pub data: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerToolUseBlock {
pub id: String,
pub name: String,
pub input: Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResultBlock {
pub source: String,
pub title: String,
pub content: Vec<TextBlock>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
#[serde(skip_serializing_if = "Option::is_none")]
pub citations: Option<CitationsConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSearchToolResultBlock {
pub tool_use_id: String,
pub content: WebSearchToolResultContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum WebSearchToolResultContent {
Results(Vec<WebSearchResultBlock>),
Error(WebSearchToolResultError),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSearchResultBlock {
pub title: String,
pub url: String,
pub encrypted_content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_age: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSearchToolResultError {
#[serde(rename = "type")]
pub error_type: String,
pub error_code: WebSearchToolResultErrorCode,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WebSearchToolResultErrorCode {
InvalidToolInput,
Unavailable,
MaxUsesExceeded,
TooManyRequests,
QueryTooLong,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum CacheControl {
Ephemeral,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CitationsConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Citation {
CharLocation(CharLocationCitation),
PageLocation(PageLocationCitation),
ContentBlockLocation(ContentBlockLocationCitation),
WebSearchResultLocation(WebSearchResultLocationCitation),
SearchResultLocation(SearchResultLocationCitation),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CharLocationCitation {
pub cited_text: String,
pub document_index: u32,
pub document_title: Option<String>,
pub start_char_index: u32,
pub end_char_index: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PageLocationCitation {
pub cited_text: String,
pub document_index: u32,
pub document_title: Option<String>,
pub start_page_number: u32,
pub end_page_number: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentBlockLocationCitation {
pub cited_text: String,
pub document_index: u32,
pub document_title: Option<String>,
pub start_block_index: u32,
pub end_block_index: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSearchResultLocationCitation {
pub cited_text: String,
pub url: String,
pub title: Option<String>,
pub encrypted_index: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResultLocationCitation {
pub cited_text: String,
pub search_result_index: u32,
pub source: String,
pub title: Option<String>,
pub start_block_index: u32,
pub end_block_index: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Tool {
Custom(CustomTool),
Bash(BashTool),
TextEditor(TextEditorTool),
WebSearch(WebSearchTool),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CustomTool {
pub name: String,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub tool_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub input_schema: InputSchema,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputSchema {
#[serde(rename = "type")]
pub schema_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
#[serde(flatten)]
pub additional: HashMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BashTool {
#[serde(rename = "type")]
pub tool_type: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextEditorTool {
#[serde(rename = "type")]
pub tool_type: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSearchTool {
#[serde(rename = "type")]
pub tool_type: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_domains: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub blocked_domains: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_uses: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_location: Option<UserLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserLocation {
#[serde(rename = "type")]
pub location_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ToolChoice {
Auto {
#[serde(skip_serializing_if = "Option::is_none")]
disable_parallel_tool_use: Option<bool>,
},
Any {
#[serde(skip_serializing_if = "Option::is_none")]
disable_parallel_tool_use: Option<bool>,
},
Tool {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
disable_parallel_tool_use: Option<bool>,
},
None,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ThinkingConfig {
Enabled {
budget_tokens: u32,
},
Disabled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub id: String,
#[serde(rename = "type")]
pub message_type: String,
pub role: String,
pub content: Vec<ContentBlock>,
pub model: String,
pub stop_reason: Option<StopReason>,
pub stop_sequence: Option<String>,
pub usage: Usage,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ContentBlock {
Text {
text: String,
#[serde(skip_serializing_if = "Option::is_none")]
citations: Option<Vec<Citation>>,
},
ToolUse {
id: String,
name: String,
input: Value,
},
Thinking { thinking: String, signature: String },
RedactedThinking { data: String },
ServerToolUse {
id: String,
name: String,
input: Value,
},
WebSearchToolResult {
tool_use_id: String,
content: WebSearchToolResultContent,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum StopReason {
EndTurn,
MaxTokens,
StopSequence,
ToolUse,
PauseTurn,
Refusal,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Usage {
pub input_tokens: u32,
pub output_tokens: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_creation_input_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_read_input_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_creation: Option<CacheCreation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub server_tool_use: Option<ServerToolUsage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CacheCreation {
#[serde(flatten)]
pub tokens_by_ttl: HashMap<String, u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerToolUsage {
pub web_search_requests: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MessageStreamEvent {
MessageStart { message: Message },
MessageDelta {
delta: MessageDelta,
usage: MessageDeltaUsage,
},
MessageStop,
ContentBlockStart {
index: u32,
content_block: ContentBlock,
},
ContentBlockDelta {
index: u32,
delta: ContentBlockDelta,
},
ContentBlockStop { index: u32 },
Ping,
Error { error: ErrorResponse },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageDelta {
#[serde(skip_serializing_if = "Option::is_none")]
pub stop_reason: Option<StopReason>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop_sequence: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageDeltaUsage {
pub output_tokens: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_creation_input_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_read_input_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub server_tool_use: Option<ServerToolUsage>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ContentBlockDelta {
TextDelta { text: String },
InputJsonDelta { partial_json: String },
ThinkingDelta { thinking: String },
SignatureDelta { signature: String },
CitationsDelta { citation: Citation },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorResponse {
#[serde(rename = "type")]
pub error_type: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ApiError {
InvalidRequestError { message: String },
AuthenticationError { message: String },
BillingError { message: String },
PermissionError { message: String },
NotFoundError { message: String },
RateLimitError { message: String },
TimeoutError { message: String },
ApiError { message: String },
OverloadedError { message: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CountMessageTokensRequest {
pub model: String,
pub messages: Vec<InputMessage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system: Option<SystemContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thinking: Option<ThinkingConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CountMessageTokensResponse {
pub input_tokens: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelInfo {
#[serde(rename = "type")]
pub model_type: String,
pub id: String,
pub display_name: String,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListModelsResponse {
pub data: Vec<ModelInfo>,
pub has_more: bool,
pub first_id: Option<String>,
pub last_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContainerConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub skills: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpServerConfig {
pub name: String,
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_configuration: Option<McpToolConfiguration>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpToolConfiguration {
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_tools: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpToolUseBlock {
pub id: String,
pub name: String,
pub server_name: String,
pub input: Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpToolResultBlock {
pub tool_use_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<ToolResultContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_error: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpToolset {
#[serde(rename = "type")]
pub toolset_type: String,
pub mcp_server_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_config: Option<McpToolDefaultConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub configs: Option<HashMap<String, McpToolConfig>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpToolDefaultConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub defer_loading: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpToolConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub defer_loading: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeExecutionTool {
#[serde(rename = "type")]
pub tool_type: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_callers: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub defer_loading: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub strict: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeExecutionResultBlock {
pub stdout: String,
pub stderr: String,
pub return_code: i32,
pub content: Vec<CodeExecutionOutputBlock>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeExecutionOutputBlock {
#[serde(rename = "type")]
pub block_type: String,
pub file_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeExecutionToolResultBlock {
pub tool_use_id: String,
pub content: CodeExecutionToolResultContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CodeExecutionToolResultContent {
Success(CodeExecutionResultBlock),
Error(CodeExecutionToolResultError),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeExecutionToolResultError {
#[serde(rename = "type")]
pub error_type: String,
pub error_code: CodeExecutionToolResultErrorCode,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CodeExecutionToolResultErrorCode {
Unavailable,
CodeExecutionExceededTimeout,
ContainerExpired,
InvalidToolInput,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BashCodeExecutionResultBlock {
pub stdout: String,
pub stderr: String,
pub return_code: i32,
pub content: Vec<BashCodeExecutionOutputBlock>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BashCodeExecutionOutputBlock {
#[serde(rename = "type")]
pub block_type: String,
pub file_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BashCodeExecutionToolResultBlock {
pub tool_use_id: String,
pub content: BashCodeExecutionToolResultContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum BashCodeExecutionToolResultContent {
Success(BashCodeExecutionResultBlock),
Error(BashCodeExecutionToolResultError),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BashCodeExecutionToolResultError {
#[serde(rename = "type")]
pub error_type: String,
pub error_code: BashCodeExecutionToolResultErrorCode,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BashCodeExecutionToolResultErrorCode {
Unavailable,
CodeExecutionExceededTimeout,
ContainerExpired,
InvalidToolInput,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextEditorCodeExecutionToolResultBlock {
pub tool_use_id: String,
pub content: TextEditorCodeExecutionToolResultContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum TextEditorCodeExecutionToolResultContent {
CreateResult(TextEditorCodeExecutionCreateResultBlock),
StrReplaceResult(TextEditorCodeExecutionStrReplaceResultBlock),
ViewResult(TextEditorCodeExecutionViewResultBlock),
Error(TextEditorCodeExecutionToolResultError),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextEditorCodeExecutionCreateResultBlock {
#[serde(rename = "type")]
pub block_type: String, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextEditorCodeExecutionStrReplaceResultBlock {
#[serde(rename = "type")]
pub block_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub snippet: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextEditorCodeExecutionViewResultBlock {
#[serde(rename = "type")]
pub block_type: String,
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextEditorCodeExecutionToolResultError {
#[serde(rename = "type")]
pub error_type: String,
pub error_code: TextEditorCodeExecutionToolResultErrorCode,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TextEditorCodeExecutionToolResultErrorCode {
Unavailable,
InvalidToolInput,
FileNotFound,
ContainerExpired,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebFetchTool {
#[serde(rename = "type")]
pub tool_type: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_callers: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_uses: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebFetchResultBlock {
#[serde(rename = "type")]
pub block_type: String,
pub url: String,
pub content: DocumentBlock,
#[serde(skip_serializing_if = "Option::is_none")]
pub retrieved_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebFetchToolResultBlock {
pub tool_use_id: String,
pub content: WebFetchToolResultContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum WebFetchToolResultContent {
Success(WebFetchResultBlock),
Error(WebFetchToolResultError),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebFetchToolResultError {
#[serde(rename = "type")]
pub error_type: String,
pub error_code: WebFetchToolResultErrorCode,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WebFetchToolResultErrorCode {
InvalidToolInput,
Unavailable,
MaxUsesExceeded,
TooManyRequests,
UrlNotAllowed,
FetchFailed,
ContentTooLarge,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolSearchTool {
#[serde(rename = "type")]
pub tool_type: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_callers: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolReferenceBlock {
#[serde(rename = "type")]
pub block_type: String,
pub tool_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolSearchResultBlock {
#[serde(rename = "type")]
pub block_type: String,
pub tool_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub score: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolSearchToolResultBlock {
pub tool_use_id: String,
pub content: Vec<ToolSearchResultBlock>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContainerUploadBlock {
#[serde(rename = "type")]
pub block_type: String,
pub file_id: String,
pub file_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_path: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryTool {
#[serde(rename = "type")]
pub tool_type: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_callers: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub defer_loading: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub strict: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_examples: Option<Vec<Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComputerUseTool {
#[serde(rename = "type")]
pub tool_type: String,
pub name: String,
pub display_width_px: u32,
pub display_height_px: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_number: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_callers: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_control: Option<CacheControl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum BetaInputContentBlock {
Text(TextBlock),
Image(ImageBlock),
Document(DocumentBlock),
ToolUse(ToolUseBlock),
ToolResult(ToolResultBlock),
Thinking(ThinkingBlock),
RedactedThinking(RedactedThinkingBlock),
ServerToolUse(ServerToolUseBlock),
SearchResult(SearchResultBlock),
WebSearchToolResult(WebSearchToolResultBlock),
McpToolUse(McpToolUseBlock),
McpToolResult(McpToolResultBlock),
CodeExecutionToolResult(CodeExecutionToolResultBlock),
BashCodeExecutionToolResult(BashCodeExecutionToolResultBlock),
TextEditorCodeExecutionToolResult(TextEditorCodeExecutionToolResultBlock),
WebFetchToolResult(WebFetchToolResultBlock),
ToolSearchToolResult(ToolSearchToolResultBlock),
ToolReference(ToolReferenceBlock),
ContainerUpload(ContainerUploadBlock),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum BetaContentBlock {
Text {
text: String,
#[serde(skip_serializing_if = "Option::is_none")]
citations: Option<Vec<Citation>>,
},
ToolUse {
id: String,
name: String,
input: Value,
},
Thinking {
thinking: String,
signature: String,
},
RedactedThinking {
data: String,
},
ServerToolUse {
id: String,
name: String,
input: Value,
},
WebSearchToolResult {
tool_use_id: String,
content: WebSearchToolResultContent,
},
McpToolUse {
id: String,
name: String,
server_name: String,
input: Value,
},
McpToolResult {
tool_use_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
content: Option<ToolResultContent>,
#[serde(skip_serializing_if = "Option::is_none")]
is_error: Option<bool>,
},
CodeExecutionToolResult {
tool_use_id: String,
content: CodeExecutionToolResultContent,
},
BashCodeExecutionToolResult {
tool_use_id: String,
content: BashCodeExecutionToolResultContent,
},
TextEditorCodeExecutionToolResult {
tool_use_id: String,
content: TextEditorCodeExecutionToolResultContent,
},
WebFetchToolResult {
tool_use_id: String,
content: WebFetchToolResultContent,
},
ToolSearchToolResult {
tool_use_id: String,
content: Vec<ToolSearchResultBlock>,
},
ToolReference {
tool_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
},
ContainerUpload {
file_id: String,
file_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
file_path: Option<String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum BetaTool {
Custom(CustomTool),
Bash(BashTool),
TextEditor(TextEditorTool),
WebSearch(WebSearchTool),
CodeExecution(CodeExecutionTool),
McpToolset(McpToolset),
WebFetch(WebFetchTool),
ToolSearch(ToolSearchTool),
Memory(MemoryTool),
ComputerUse(ComputerUseTool),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BetaServerToolName {
WebSearch,
WebFetch,
CodeExecution,
BashCodeExecution,
TextEditorCodeExecution,
ToolSearchToolRegex,
ToolSearchToolBm25,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ServerToolCaller {
Direct,
#[serde(rename = "code_execution_20250825")]
CodeExecution20250825,
}