use crate::models::ModelInfo;
use crate::tool_choice::ToolChoice;
use mcp_protocol::tool::Tool;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(tag = "type")]
pub enum MessageContent {
#[serde(rename = "text")]
Text { text: String },
#[serde(rename = "tool_use")]
ToolUse {
id: String,
name: String,
input: serde_json::Value,
},
#[serde(rename = "tool_result")]
ToolResult {
tool_use_id: String,
content: serde_json::Value,
is_error: Option<bool>,
},
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Message {
pub role: String,
pub content: Vec<MessageContent>,
}
impl Message {
pub fn new_structured(role: impl Into<String>, content: Vec<MessageContent>) -> Self {
Self {
role: role.into(),
content,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CompletionRequest {
pub model: String,
pub messages: Vec<Message>,
pub max_tokens: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ToolChoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disable_parallel_tool_use: Option<bool>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Usage {
pub input_tokens: u32,
pub output_tokens: u32,
pub cache_read_input_tokens: Option<u32>,
pub cache_creation_input_tokens: Option<u32>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CompletionResponse {
pub content: Vec<MessageContent>,
pub id: String,
pub model: String,
pub role: String,
pub stop_reason: Option<StopReason>,
pub stop_sequence: Option<String>,
#[serde(rename = "type")]
pub message_type: Option<String>,
pub usage: Usage,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum StopReason {
#[serde(rename = "end_turn")]
EndTurn,
#[serde(rename = "max_tokens")]
MaxTokens,
#[serde(rename = "stop_sequence")]
StopSequence,
#[serde(rename = "tool_use")]
ToolUse,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum OperationType {
#[serde(rename = "ChatCompletion")]
ChatCompletion,
#[serde(rename = "ListModels")]
ListModels,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AnthropicRequest {
pub version: String,
pub operation_type: OperationType,
pub request_id: String,
pub completion_request: Option<CompletionRequest>,
pub params: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum ResponseStatus {
#[serde(rename = "Success")]
Success,
#[serde(rename = "Error")]
Error,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AnthropicResponse {
pub version: String,
pub request_id: String,
pub status: ResponseStatus,
pub error: Option<String>,
pub completion: Option<CompletionResponse>,
pub tool_result: Option<String>,
pub models: Option<Vec<ModelInfo>>,
}