use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Deserialize)]
pub struct MessagesRequest {
pub model: String,
pub max_tokens: u32,
#[serde(default)]
pub messages: Vec<InputMessage>,
#[serde(default)]
pub system: Option<System>,
#[serde(default)]
pub stream: bool,
#[serde(default)]
pub temperature: Option<f32>,
#[serde(default)]
pub top_p: Option<f32>,
#[serde(default)]
pub top_k: Option<u32>,
#[serde(default)]
pub stop_sequences: Option<Vec<String>>,
#[serde(default)]
pub tools: Option<Vec<Tool>>,
#[serde(default)]
pub tool_choice: Option<Value>,
#[serde(default)]
pub thinking: Option<Value>,
}
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum System {
Text(String),
Blocks(Vec<ContentBlock>),
}
#[derive(Debug, Deserialize)]
pub struct InputMessage {
pub role: String,
pub content: Content,
}
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum Content {
Text(String),
Blocks(Vec<ContentBlock>),
}
#[derive(Debug, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ContentBlock {
Text {
text: String,
#[serde(default)]
cache_control: Option<Value>,
},
Image {
source: ImageSource,
#[serde(default)]
cache_control: Option<Value>,
},
ToolUse {
id: String,
name: String,
input: Value,
#[serde(default)]
cache_control: Option<Value>,
},
ToolResult {
tool_use_id: String,
#[serde(default)]
content: Option<ToolResultContent>,
#[serde(default)]
is_error: Option<bool>,
#[serde(default)]
cache_control: Option<Value>,
},
#[serde(other)]
Other,
}
#[derive(Debug, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ImageSource {
Base64 { media_type: String, data: String },
Url { url: String },
}
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum ToolResultContent {
Text(String),
Blocks(Vec<Value>),
}
#[derive(Debug, Deserialize)]
pub struct Tool {
pub name: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub input_schema: Option<Value>,
#[serde(default)]
pub cache_control: Option<Value>,
}
#[derive(Debug, Serialize)]
pub struct MessagesResponse {
pub id: String,
#[serde(rename = "type")]
pub message_type: MessageType,
pub role: ResponseRole,
pub model: String,
pub content: Vec<ResponseContentBlock>,
pub stop_reason: Option<StopReason>,
pub stop_sequence: Option<String>,
pub usage: Usage,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MessageType {
Message,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ResponseRole {
Assistant,
}
#[derive(Debug, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseContentBlock {
Thinking {
thinking: String,
#[serde(skip_serializing_if = "Option::is_none")]
signature: Option<String>,
},
Text {
text: String,
},
ToolUse {
id: String,
name: String,
input: Value,
},
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum StopReason {
EndTurn,
MaxTokens,
ToolUse,
StopSequence,
}
#[derive(Debug, Serialize)]
pub struct Usage {
pub input_tokens: u64,
pub output_tokens: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_read_input_tokens: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cache_creation_input_tokens: Option<u64>,
}
#[derive(Debug, Serialize)]
pub struct ModelsListResponse {
pub data: Vec<ModelObject>,
pub has_more: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_id: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct ModelObject {
#[serde(rename = "type")]
pub object_type: ModelObjectType,
pub id: String,
pub display_name: String,
pub created_at: String,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ModelObjectType {
Model,
}
#[derive(Debug, Serialize)]
pub struct ErrorResponse {
#[serde(rename = "type")]
pub envelope_type: ErrorEnvelopeType,
pub error: ErrorDetail,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ErrorEnvelopeType {
Error,
}
#[derive(Debug, Serialize)]
pub struct ErrorDetail {
#[serde(rename = "type")]
pub error_type: ErrorType,
pub message: String,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ErrorType {
InvalidRequestError,
AuthenticationError,
PermissionError,
NotFoundError,
RequestTooLarge,
RateLimitError,
OverloadedError,
ApiError,
}