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: String,
32
33 pub content: Vec<MessageContent>,
35}
36
37impl Message {
38 pub fn new_structured(role: impl Into<String>, content: Vec<MessageContent>) -> Self {
40 Self {
41 role: role.into(),
42 content,
43 }
44 }
45}
46
47#[derive(Serialize, Deserialize, Debug, Clone)]
49pub struct CompletionRequest {
50 pub model: String,
52
53 pub messages: Vec<Message>,
55
56 pub max_tokens: u32,
58
59 pub temperature: Option<f32>,
61
62 pub system: Option<String>,
64
65 pub tools: Option<Vec<Tool>>,
67
68 pub tool_choice: Option<ToolChoice>,
70
71 pub disable_parallel_tool_use: Option<bool>,
73}
74
75#[derive(Serialize, Deserialize, Debug, Clone)]
77pub struct Usage {
78 pub input_tokens: u32,
79
80 pub output_tokens: u32,
81}
82
83#[derive(Serialize, Deserialize, Debug, Clone)]
85pub struct CompletionResponse {
86 pub content: Vec<MessageContent>,
88
89 pub id: String,
91
92 pub model: String,
94
95 pub role: String,
97
98 pub stop_reason: StopReason,
99
100 pub stop_sequence: Option<String>,
101
102 #[serde(rename = "type")]
104 pub message_type: String,
105
106 pub usage: Usage,
108}
109
110#[derive(Serialize, Deserialize, Debug, Clone)]
112pub enum StopReason {
113 #[serde(rename = "end_turn")]
115 EndTurn,
116
117 #[serde(rename = "max_tokens")]
119 MaxTokens,
120
121 #[serde(rename = "stop_sequence")]
123 StopSequence,
124
125 #[serde(rename = "tool_use")]
127 ToolUse,
128}
129
130#[derive(Serialize, Deserialize, Debug, Clone)]
132pub enum ProxyRequest {
133 ListModels,
134
135 GenerateCompletion { request: CompletionRequest },
136}
137
138#[derive(Serialize, Deserialize, Debug, Clone)]
140pub enum ProxyResponse {
141 ListModels { models: Vec<ModelInfo> },
143
144 Completion { completion: CompletionResponse },
146
147 Error { error: String },
149}