turbomcp_protocol/types/
sampling.rs1use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9use super::{content::Content, core::Role};
10
11#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
13#[serde(rename_all = "camelCase")]
14pub enum IncludeContext {
15    None,
17    ThisServer,
19    AllServers,
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct SamplingMessage {
26    pub role: Role,
28    pub content: Content,
30    #[serde(skip_serializing_if = "Option::is_none")]
32    pub metadata: Option<HashMap<String, serde_json::Value>>,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct CreateMessageRequest {
38    pub messages: Vec<SamplingMessage>,
40    #[serde(skip_serializing_if = "Option::is_none")]
42    pub model_preferences: Option<ModelPreferences>,
43    #[serde(rename = "systemPrompt", skip_serializing_if = "Option::is_none")]
45    pub system_prompt: Option<String>,
46    #[serde(rename = "includeContext", skip_serializing_if = "Option::is_none")]
48    pub include_context: Option<IncludeContext>,
49    #[serde(skip_serializing_if = "Option::is_none")]
51    pub temperature: Option<f64>,
52    #[serde(rename = "maxTokens")]
54    pub max_tokens: u32,
55    #[serde(rename = "stopSequences", skip_serializing_if = "Option::is_none")]
57    pub stop_sequences: Option<Vec<String>>,
58    #[serde(skip_serializing_if = "Option::is_none")]
60    pub _meta: Option<serde_json::Value>,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
65pub struct ModelHint {
66    #[serde(skip_serializing_if = "Option::is_none")]
69    pub name: Option<String>,
70}
71
72impl ModelHint {
73    pub fn new(name: impl Into<String>) -> Self {
75        Self {
76            name: Some(name.into()),
77        }
78    }
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct ModelPreferences {
87    #[serde(skip_serializing_if = "Option::is_none")]
89    pub hints: Option<Vec<ModelHint>>,
90
91    #[serde(rename = "costPriority", skip_serializing_if = "Option::is_none")]
93    pub cost_priority: Option<f64>,
94
95    #[serde(rename = "speedPriority", skip_serializing_if = "Option::is_none")]
97    pub speed_priority: Option<f64>,
98
99    #[serde(
101        rename = "intelligencePriority",
102        skip_serializing_if = "Option::is_none"
103    )]
104    pub intelligence_priority: Option<f64>,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct CreateMessageResult {
110    pub role: super::core::Role,
112    pub content: Content,
114    pub model: String,
116    #[serde(rename = "stopReason", skip_serializing_if = "Option::is_none")]
120    pub stop_reason: Option<StopReason>,
121    #[serde(skip_serializing_if = "Option::is_none")]
123    pub _meta: Option<serde_json::Value>,
124}
125
126#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
130#[serde(rename_all = "camelCase")]
131pub enum StopReason {
132    EndTurn,
134    MaxTokens,
136    StopSequence,
138    ContentFilter,
140    ToolUse,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize)]
146pub struct UsageStats {
147    #[serde(rename = "inputTokens", skip_serializing_if = "Option::is_none")]
149    pub input_tokens: Option<u32>,
150    #[serde(rename = "outputTokens", skip_serializing_if = "Option::is_none")]
152    pub output_tokens: Option<u32>,
153    #[serde(rename = "totalTokens", skip_serializing_if = "Option::is_none")]
155    pub total_tokens: Option<u32>,
156}