1use crate::models::ModelInfo;
2use crate::tool_choice::ToolChoice;
3use mcp_protocol::tool::{Tool, ToolContent};
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize, Debug, Clone)]
8#[serde(tag = "type", rename_all = "snake_case")]
9pub enum MessageContent {
10 Text {
11 text: String,
12 },
13
14 ToolUse {
15 id: String,
16 name: String,
17 input: serde_json::Value,
18 },
19
20 ToolResult {
21 tool_use_id: String,
22 content: Vec<ToolContent>,
23 is_error: Option<bool>,
24 },
25}
26
27#[derive(Serialize, Deserialize, Debug, Clone)]
29pub struct Message {
30 pub role: Role,
32
33 pub content: Vec<MessageContent>,
35}
36
37#[derive(Serialize, Deserialize, Debug, Clone)]
39pub enum Role {
40 #[serde(rename = "user")]
41 User,
42
43 #[serde(rename = "assistant")]
44 Assistant,
45
46 #[serde(rename = "system")]
47 System,
48}
49
50impl Message {
51 pub fn new_structured(role: impl Into<String>, content: Vec<MessageContent>) -> Self {
53 Self {
54 role: match role.into().as_str() {
55 "user" => Role::User,
56 "assistant" => Role::Assistant,
57 "system" => Role::System,
58 _ => panic!("Invalid role"),
59 },
60 content,
61 }
62 }
63}
64
65#[derive(Serialize, Deserialize, Debug, Clone)]
67pub struct CompletionRequest {
68 pub model: String,
70
71 pub messages: Vec<Message>,
73
74 pub max_tokens: u32,
76
77 pub temperature: Option<f32>,
79
80 pub system: Option<String>,
82
83 pub tools: Option<Vec<Tool>>,
85
86 pub tool_choice: Option<ToolChoice>,
88
89 pub disable_parallel_tool_use: Option<bool>,
91}
92
93#[derive(Serialize, Deserialize, Debug, Clone)]
95pub struct Usage {
96 pub input_tokens: u32,
97
98 pub output_tokens: u32,
99}
100
101#[derive(Serialize, Deserialize, Debug, Clone)]
103pub struct CompletionResponse {
104 pub content: Vec<MessageContent>,
106
107 pub id: String,
109
110 pub model: String,
112
113 pub role: Role,
115
116 pub stop_reason: StopReason,
117
118 pub stop_sequence: Option<String>,
119
120 #[serde(rename = "type")]
122 pub message_type: String,
123
124 pub usage: Usage,
126}
127
128#[derive(Serialize, Deserialize, Debug, Clone)]
130pub enum StopReason {
131 #[serde(rename = "end_turn")]
133 EndTurn,
134
135 #[serde(rename = "max_tokens")]
137 MaxTokens,
138
139 #[serde(rename = "stop_sequence")]
141 StopSequence,
142
143 #[serde(rename = "tool_use")]
145 ToolUse,
146}
147
148#[derive(Serialize, Deserialize, Debug, Clone)]
150pub enum ProxyRequest {
151 ListModels,
152
153 GenerateCompletion { request: CompletionRequest },
154}
155
156#[derive(Serialize, Deserialize, Debug, Clone)]
158pub enum ProxyResponse {
159 ListModels { models: Vec<ModelInfo> },
161
162 Completion { completion: CompletionResponse },
164
165 Error { error: String },
167}