1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4pub struct Message {
5 pub role: Role,
6 #[serde(default, skip_serializing_if = "Option::is_none")]
7 pub content: Option<String>,
8 #[serde(skip_serializing_if = "Option::is_none")]
9 pub name: Option<String>,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub tool_calls: Option<Vec<ToolCall>>,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct ToolCall {
16 pub id: String,
17 #[serde(rename = "type")]
18 pub call_type: String,
19 pub function: FunctionCall,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct FunctionCall {
24 pub name: String,
25 pub arguments: String,
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
29#[serde(rename_all = "lowercase")]
30pub enum Role {
31 System,
32 User,
33 Assistant,
34 Tool,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct Function {
39 pub name: String,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub description: Option<String>,
42 pub parameters: serde_json::Value,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct Tool {
47 #[serde(rename = "type")]
48 pub tool_type: String,
49 pub function: Function,
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(untagged)]
54pub enum ToolChoice {
55 String(String),
56 Object {
57 tool_type: String,
58 function: ToolChoiceFunction,
59 },
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct ToolChoiceFunction {
64 pub name: String,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct ResponseFormat {
69 #[serde(rename = "type")]
70 pub response_type: String,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub json_schema: Option<serde_json::Value>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct Usage {
77 pub prompt_tokens: u32,
78 pub completion_tokens: u32,
79 pub total_tokens: u32,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub prompt_tokens_details: Option<PromptTokensDetails>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub completion_tokens_details: Option<CompletionTokensDetails>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub cost: Option<f64>,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct PromptTokensDetails {
90 pub cached_tokens: u32,
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub audio_tokens: Option<u32>,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct CompletionTokensDetails {
97 #[serde(skip_serializing_if = "Option::is_none")]
98 pub reasoning_tokens: Option<u32>,
99 #[serde(skip_serializing_if = "Option::is_none")]
100 pub audio_tokens: Option<u32>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
104pub struct ProviderPreferences {
105 #[serde(skip_serializing_if = "Option::is_none")]
106 pub allow_fallbacks: Option<bool>,
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub require_parameters: Option<bool>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub data_collection: Option<String>,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub order: Option<Vec<String>>,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub ignore: Option<Vec<String>>,
115 #[serde(skip_serializing_if = "Option::is_none")]
116 pub quantizations: Option<Vec<String>>,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub sort: Option<String>,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct Plugin {
123 pub id: String,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub enabled: Option<bool>,
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub max_results: Option<u32>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub search_prompt: Option<String>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub engine: Option<String>,
132}