mcp_protocol/types/sampling/
mod.rs

1// mcp-protocol/src/types/sampling/mod.rs
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5/// Sampling message content types
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(tag = "type")]
8pub enum MessageContent {
9    #[serde(rename = "text")]
10    Text {
11        text: String,
12    },
13    #[serde(rename = "image")]
14    Image {
15        data: String,
16        mime_type: String,
17    },
18}
19
20/// Message role in a conversation
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct Message {
23    pub role: String,
24    pub content: MessageContent,
25}
26
27/// Model hint for sampling
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct ModelHint {
30    pub name: String,
31}
32
33/// Model preferences for sampling
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct ModelPreferences {
36    /// Hints for specific models or model families
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub hints: Option<Vec<ModelHint>>,
39    
40    /// Priority for cost (0.0-1.0), higher values prefer cheaper models
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub cost_priority: Option<f32>,
43    
44    /// Priority for speed (0.0-1.0), higher values prefer faster models
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub speed_priority: Option<f32>,
47    
48    /// Priority for intelligence (0.0-1.0), higher values prefer more capable models
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub intelligence_priority: Option<f32>,
51}
52
53/// Params for creating a sampling message
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct CreateMessageParams {
56    /// The conversation messages to include
57    pub messages: Vec<Message>,
58    
59    /// Model preferences for selection
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub model_preferences: Option<ModelPreferences>,
62    
63    /// Optional system prompt
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub system_prompt: Option<String>,
66    
67    /// Maximum tokens to generate
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub max_tokens: Option<u32>,
70    
71    /// Optional temperature
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub temperature: Option<f32>,
74    
75    /// Optional top_p value
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub top_p: Option<f32>,
78    
79    /// Optional sampling context
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub context: Option<HashMap<String, String>>,
82}
83
84/// Response for a sampling message creation
85#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct CreateMessageResult {
87    /// The role of the response message
88    pub role: String,
89    
90    /// The content of the response
91    pub content: MessageContent,
92    
93    /// The model used for generation
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub model: Option<String>,
96    
97    /// The reason why generation stopped
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub stop_reason: Option<String>,
100    
101    /// Optional metadata
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub metadata: Option<HashMap<String, serde_json::Value>>,
104}