anthropic_types/
messages.rs

1use crate::models::ModelInfo;
2use crate::tool_choice::ToolChoice;
3use mcp_protocol::tool::{Tool, ToolContent};
4use serde::{Deserialize, Serialize};
5
6/// Different types of content that can be in a message
7#[derive(Serialize, Deserialize, Debug, Clone)]
8#[serde(tag = "type")]
9pub enum MessageContent {
10    #[serde(rename = "text")]
11    Text { text: String },
12
13    #[serde(rename = "tool_use")]
14    ToolUse {
15        id: String,
16        name: String,
17        input: serde_json::Value,
18    },
19
20    #[serde(rename = "tool_result")]
21    ToolResult {
22        tool_use_id: String,
23        content: Vec<ToolContent>,
24        #[serde(skip_serializing_if = "Option::is_none")]
25        is_error: Option<bool>,
26    },
27}
28
29/// A single message in a conversation with Claude
30#[derive(Serialize, Deserialize, Debug, Clone)]
31pub struct Message {
32    /// Role of the message sender (user, assistant, system)
33    pub role: String,
34
35    /// Content of the message as vector of MessageContent objects
36    pub content: Vec<MessageContent>,
37}
38
39impl Message {
40    /// Create a new message with structured content
41    pub fn new_structured(role: impl Into<String>, content: Vec<MessageContent>) -> Self {
42        Self {
43            role: role.into(),
44            content,
45        }
46    }
47}
48
49/// Request to generate a completion from Claude
50#[derive(Serialize, Deserialize, Debug, Clone)]
51pub struct CompletionRequest {
52    /// The Claude model to use
53    pub model: String,
54
55    /// List of messages in the conversation
56    pub messages: Vec<Message>,
57
58    /// Maximum number of tokens to generate
59    pub max_tokens: u32,
60
61    /// Temperature parameter (0.0 to 1.0)
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub temperature: Option<f32>,
64
65    /// System prompt to use
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub system: Option<String>,
68
69    /// Tools to make available to Claude
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub tools: Option<Vec<Tool>>,
72
73    /// Tool choice configuration
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub tool_choice: Option<ToolChoice>,
76
77    /// Whether to disable parallel tool use
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub disable_parallel_tool_use: Option<bool>,
80}
81
82/// Information about token usage
83#[derive(Serialize, Deserialize, Debug, Clone)]
84pub struct Usage {
85    pub input_tokens: u32,
86
87    pub output_tokens: u32,
88
89    pub cache_read_input_tokens: Option<u32>,
90
91    pub cache_creation_input_tokens: Option<u32>,
92}
93
94/// Response from a completion request
95#[derive(Serialize, Deserialize, Debug, Clone)]
96pub struct CompletionResponse {
97    /// Generated content blocks
98    pub content: Vec<MessageContent>,
99
100    /// ID of the message
101    pub id: String,
102
103    /// Model used for generation
104    pub model: String,
105
106    // always "assistant"
107    pub role: String,
108
109    /// Reason why generation stopped
110    /// can be "end_turn", "max_tokens", "stop_sequence", "tool_use", null
111    pub stop_reason: StopReason,
112
113    /// Stop sequence if applicable (deprecated - kept for backward compatibility)
114    pub stop_sequence: Option<String>,
115
116    /// Message type
117    #[serde(rename = "type")]
118    pub message_type: String,
119
120    /// Token usage information
121    pub usage: Usage,
122}
123
124/// Reason why generation stopped
125#[derive(Serialize, Deserialize, Debug, Clone)]
126pub enum StopReason {
127    /// Generation stopped because the end of a turn was reached
128    #[serde(rename = "end_turn")]
129    EndTurn,
130
131    /// Generation stopped because the maximum token limit was reached
132    #[serde(rename = "max_tokens")]
133    MaxTokens,
134
135    /// Generation stopped because a stop sequence was encountered
136    #[serde(rename = "stop_sequence")]
137    StopSequence,
138
139    /// Generation stopped because a tool was used
140    #[serde(rename = "tool_use")]
141    ToolUse,
142}
143
144/// Request format for the anthropic-proxy actor
145#[derive(Serialize, Deserialize, Debug, Clone)]
146pub enum AnthropicRequest {
147    ListModels,
148
149    GenerateCompletion { request: CompletionRequest },
150}
151
152/// Response status
153#[derive(Serialize, Deserialize, Debug, Clone)]
154pub enum ResponseStatus {
155    /// Operation succeeded
156    #[serde(rename = "Success")]
157    Success,
158
159    /// Operation failed
160    #[serde(rename = "Error")]
161    Error,
162}
163
164/// Response format from the anthropic-proxy actor
165#[derive(Serialize, Deserialize, Debug, Clone)]
166pub enum AnthropicResponse {
167    /// List of available models
168    ListModels { models: Vec<ModelInfo> },
169
170    /// Generated completion
171    Completion { completion: CompletionResponse },
172
173    /// Error response
174    Error { error: String },
175}