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)]
8pub enum MessageContent {
9 Text {
10 text: String,
11 },
12
13 ToolUse {
14 id: String,
15 name: String,
16 input: serde_json::Value,
17 },
18
19 ToolResult {
20 tool_use_id: String,
21 content: Vec<ToolContent>,
22 is_error: Option<bool>,
23 },
24}
25
26#[derive(Serialize, Deserialize, Debug, Clone)]
28pub struct Message {
29 pub role: String,
31
32 pub content: Vec<MessageContent>,
34}
35
36impl Message {
37 pub fn new_structured(role: impl Into<String>, content: Vec<MessageContent>) -> Self {
39 Self {
40 role: role.into(),
41 content,
42 }
43 }
44}
45
46#[derive(Serialize, Deserialize, Debug, Clone)]
48pub struct CompletionRequest {
49 pub model: String,
51
52 pub messages: Vec<Message>,
54
55 pub max_tokens: u32,
57
58 pub temperature: Option<f32>,
60
61 pub system: Option<String>,
63
64 pub tools: Option<Vec<Tool>>,
66
67 pub tool_choice: Option<ToolChoice>,
69
70 pub disable_parallel_tool_use: Option<bool>,
72}
73
74#[derive(Serialize, Deserialize, Debug, Clone)]
76pub struct Usage {
77 pub input_tokens: u32,
78
79 pub output_tokens: u32,
80}
81
82#[derive(Serialize, Deserialize, Debug, Clone)]
84pub struct CompletionResponse {
85 pub content: Vec<MessageContent>,
87
88 pub id: String,
90
91 pub model: String,
93
94 pub role: String,
96
97 pub stop_reason: StopReason,
98
99 pub stop_sequence: Option<String>,
100
101 #[serde(rename = "type")]
103 pub message_type: String,
104
105 pub usage: Usage,
107}
108
109#[derive(Serialize, Deserialize, Debug, Clone)]
111pub enum StopReason {
112 #[serde(rename = "end_turn")]
114 EndTurn,
115
116 #[serde(rename = "max_tokens")]
118 MaxTokens,
119
120 #[serde(rename = "stop_sequence")]
122 StopSequence,
123
124 #[serde(rename = "tool_use")]
126 ToolUse,
127}
128
129#[derive(Serialize, Deserialize, Debug, Clone)]
131pub enum ProxyRequest {
132 ListModels,
133
134 GenerateCompletion { request: CompletionRequest },
135}
136
137#[derive(Serialize, Deserialize, Debug, Clone)]
139pub enum ProxyResponse {
140 ListModels { models: Vec<ModelInfo> },
142
143 Completion { completion: CompletionResponse },
145
146 Error { error: String },
148}