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
128impl From<CompletionResponse> for Message {
129 fn from(request: CompletionResponse) -> Self {
130 Self {
131 role: request.role,
132 content: request.content,
133 }
134 }
135}
136
137#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
139pub enum StopReason {
140 #[serde(rename = "end_turn")]
142 EndTurn,
143
144 #[serde(rename = "max_tokens")]
146 MaxTokens,
147
148 #[serde(rename = "stop_sequence")]
150 StopSequence,
151
152 #[serde(rename = "tool_use")]
154 ToolUse,
155
156 #[serde(rename = "other")]
158 Other(String),
159}
160
161#[derive(Serialize, Deserialize, Debug, Clone)]
163pub enum ProxyRequest {
164 ListModels,
165
166 GenerateCompletion { request: CompletionRequest },
167}
168
169#[derive(Serialize, Deserialize, Debug, Clone)]
171pub enum ProxyResponse {
172 ListModels { models: Vec<ModelInfo> },
174
175 Completion { completion: CompletionResponse },
177
178 Error { error: String },
180}