1use std::collections::HashMap;
7
8use serde::{Deserialize, Serialize};
9use serde_json::Value;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct CreateMessageRequest {
20 pub model: String,
22
23 pub messages: Vec<InputMessage>,
25
26 pub max_tokens: u32,
28
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub metadata: Option<Metadata>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub service_tier: Option<ServiceTier>,
36
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub stop_sequences: Option<Vec<String>>,
40
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub stream: Option<bool>,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub system: Option<SystemContent>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub temperature: Option<f64>,
52
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub thinking: Option<ThinkingConfig>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub tool_choice: Option<ToolChoice>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub tools: Option<Vec<Tool>>,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub top_k: Option<u32>,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
71 pub top_p: Option<f64>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
76 pub container: Option<ContainerConfig>,
77
78 #[serde(skip_serializing_if = "Option::is_none")]
80 pub mcp_servers: Option<Vec<McpServerConfig>>,
81}
82
83impl CreateMessageRequest {
84 pub fn is_stream(&self) -> bool {
86 self.stream.unwrap_or(false)
87 }
88
89 pub fn get_model(&self) -> &str {
91 &self.model
92 }
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct Metadata {
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub user_id: Option<String>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
105#[serde(rename_all = "snake_case")]
106pub enum ServiceTier {
107 Auto,
108 StandardOnly,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
113#[serde(untagged)]
114pub enum SystemContent {
115 String(String),
116 Blocks(Vec<TextBlock>),
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct InputMessage {
122 pub role: Role,
124
125 pub content: InputContent,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
131#[serde(rename_all = "lowercase")]
132pub enum Role {
133 User,
134 Assistant,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize)]
139#[serde(untagged)]
140pub enum InputContent {
141 String(String),
142 Blocks(Vec<InputContentBlock>),
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize)]
151#[serde(tag = "type", rename_all = "snake_case")]
152pub enum InputContentBlock {
153 Text(TextBlock),
155 Image(ImageBlock),
157 Document(DocumentBlock),
159 ToolUse(ToolUseBlock),
161 ToolResult(ToolResultBlock),
163 Thinking(ThinkingBlock),
165 RedactedThinking(RedactedThinkingBlock),
167 ServerToolUse(ServerToolUseBlock),
169 SearchResult(SearchResultBlock),
171 WebSearchToolResult(WebSearchToolResultBlock),
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize)]
177pub struct TextBlock {
178 pub text: String,
180
181 #[serde(skip_serializing_if = "Option::is_none")]
183 pub cache_control: Option<CacheControl>,
184
185 #[serde(skip_serializing_if = "Option::is_none")]
187 pub citations: Option<Vec<Citation>>,
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize)]
192pub struct ImageBlock {
193 pub source: ImageSource,
195
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub cache_control: Option<CacheControl>,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize)]
203#[serde(tag = "type", rename_all = "snake_case")]
204pub enum ImageSource {
205 Base64 { media_type: String, data: String },
206 Url { url: String },
207}
208
209#[derive(Debug, Clone, Serialize, Deserialize)]
211pub struct DocumentBlock {
212 pub source: DocumentSource,
214
215 #[serde(skip_serializing_if = "Option::is_none")]
217 pub cache_control: Option<CacheControl>,
218
219 #[serde(skip_serializing_if = "Option::is_none")]
221 pub title: Option<String>,
222
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub context: Option<String>,
226
227 #[serde(skip_serializing_if = "Option::is_none")]
229 pub citations: Option<CitationsConfig>,
230}
231
232#[derive(Debug, Clone, Serialize, Deserialize)]
234#[serde(tag = "type", rename_all = "snake_case")]
235pub enum DocumentSource {
236 Base64 { media_type: String, data: String },
237 Text { data: String },
238 Url { url: String },
239 Content { content: Vec<InputContentBlock> },
240}
241
242#[derive(Debug, Clone, Serialize, Deserialize)]
244pub struct ToolUseBlock {
245 pub id: String,
247
248 pub name: String,
250
251 pub input: Value,
253
254 #[serde(skip_serializing_if = "Option::is_none")]
256 pub cache_control: Option<CacheControl>,
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize)]
261pub struct ToolResultBlock {
262 pub tool_use_id: String,
264
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub content: Option<ToolResultContent>,
268
269 #[serde(skip_serializing_if = "Option::is_none")]
271 pub is_error: Option<bool>,
272
273 #[serde(skip_serializing_if = "Option::is_none")]
275 pub cache_control: Option<CacheControl>,
276}
277
278#[derive(Debug, Clone, Serialize, Deserialize)]
280#[serde(untagged)]
281pub enum ToolResultContent {
282 String(String),
283 Blocks(Vec<ToolResultContentBlock>),
284}
285
286#[derive(Debug, Clone, Serialize, Deserialize)]
288#[serde(tag = "type", rename_all = "snake_case")]
289pub enum ToolResultContentBlock {
290 Text(TextBlock),
291 Image(ImageBlock),
292 Document(DocumentBlock),
293 SearchResult(SearchResultBlock),
294}
295
296#[derive(Debug, Clone, Serialize, Deserialize)]
298pub struct ThinkingBlock {
299 pub thinking: String,
301
302 pub signature: String,
304}
305
306#[derive(Debug, Clone, Serialize, Deserialize)]
308pub struct RedactedThinkingBlock {
309 pub data: String,
311}
312
313#[derive(Debug, Clone, Serialize, Deserialize)]
315pub struct ServerToolUseBlock {
316 pub id: String,
318
319 pub name: String,
321
322 pub input: Value,
324
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub cache_control: Option<CacheControl>,
328}
329
330#[derive(Debug, Clone, Serialize, Deserialize)]
332pub struct SearchResultBlock {
333 pub source: String,
335
336 pub title: String,
338
339 pub content: Vec<TextBlock>,
341
342 #[serde(skip_serializing_if = "Option::is_none")]
344 pub cache_control: Option<CacheControl>,
345
346 #[serde(skip_serializing_if = "Option::is_none")]
348 pub citations: Option<CitationsConfig>,
349}
350
351#[derive(Debug, Clone, Serialize, Deserialize)]
353pub struct WebSearchToolResultBlock {
354 pub tool_use_id: String,
356
357 pub content: WebSearchToolResultContent,
359
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub cache_control: Option<CacheControl>,
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize)]
367#[serde(untagged)]
368pub enum WebSearchToolResultContent {
369 Results(Vec<WebSearchResultBlock>),
370 Error(WebSearchToolResultError),
371}
372
373#[derive(Debug, Clone, Serialize, Deserialize)]
375pub struct WebSearchResultBlock {
376 pub title: String,
378
379 pub url: String,
381
382 pub encrypted_content: String,
384
385 #[serde(skip_serializing_if = "Option::is_none")]
387 pub page_age: Option<String>,
388}
389
390#[derive(Debug, Clone, Serialize, Deserialize)]
392pub struct WebSearchToolResultError {
393 #[serde(rename = "type")]
394 pub error_type: String,
395 pub error_code: WebSearchToolResultErrorCode,
396}
397
398#[derive(Debug, Clone, Serialize, Deserialize)]
400#[serde(rename_all = "snake_case")]
401pub enum WebSearchToolResultErrorCode {
402 InvalidToolInput,
403 Unavailable,
404 MaxUsesExceeded,
405 TooManyRequests,
406 QueryTooLong,
407}
408
409#[derive(Debug, Clone, Serialize, Deserialize)]
411#[serde(tag = "type", rename_all = "snake_case")]
412pub enum CacheControl {
413 Ephemeral,
414}
415
416#[derive(Debug, Clone, Serialize, Deserialize)]
418pub struct CitationsConfig {
419 #[serde(skip_serializing_if = "Option::is_none")]
420 pub enabled: Option<bool>,
421}
422
423#[derive(Debug, Clone, Serialize, Deserialize)]
425#[serde(tag = "type", rename_all = "snake_case")]
426pub enum Citation {
427 CharLocation(CharLocationCitation),
428 PageLocation(PageLocationCitation),
429 ContentBlockLocation(ContentBlockLocationCitation),
430 WebSearchResultLocation(WebSearchResultLocationCitation),
431 SearchResultLocation(SearchResultLocationCitation),
432}
433
434#[derive(Debug, Clone, Serialize, Deserialize)]
436pub struct CharLocationCitation {
437 pub cited_text: String,
438 pub document_index: u32,
439 pub document_title: Option<String>,
440 pub start_char_index: u32,
441 pub end_char_index: u32,
442 #[serde(skip_serializing_if = "Option::is_none")]
443 pub file_id: Option<String>,
444}
445
446#[derive(Debug, Clone, Serialize, Deserialize)]
448pub struct PageLocationCitation {
449 pub cited_text: String,
450 pub document_index: u32,
451 pub document_title: Option<String>,
452 pub start_page_number: u32,
453 pub end_page_number: u32,
454}
455
456#[derive(Debug, Clone, Serialize, Deserialize)]
458pub struct ContentBlockLocationCitation {
459 pub cited_text: String,
460 pub document_index: u32,
461 pub document_title: Option<String>,
462 pub start_block_index: u32,
463 pub end_block_index: u32,
464}
465
466#[derive(Debug, Clone, Serialize, Deserialize)]
468pub struct WebSearchResultLocationCitation {
469 pub cited_text: String,
470 pub url: String,
471 pub title: Option<String>,
472 pub encrypted_index: String,
473}
474
475#[derive(Debug, Clone, Serialize, Deserialize)]
477pub struct SearchResultLocationCitation {
478 pub cited_text: String,
479 pub search_result_index: u32,
480 pub source: String,
481 pub title: Option<String>,
482 pub start_block_index: u32,
483 pub end_block_index: u32,
484}
485
486#[derive(Debug, Clone, Serialize, Deserialize)]
492#[serde(untagged)]
493pub enum Tool {
494 Custom(CustomTool),
496 Bash(BashTool),
498 TextEditor(TextEditorTool),
500 WebSearch(WebSearchTool),
502}
503
504#[derive(Debug, Clone, Serialize, Deserialize)]
506pub struct CustomTool {
507 pub name: String,
509
510 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
512 pub tool_type: Option<String>,
513
514 #[serde(skip_serializing_if = "Option::is_none")]
516 pub description: Option<String>,
517
518 pub input_schema: InputSchema,
520
521 #[serde(skip_serializing_if = "Option::is_none")]
523 pub cache_control: Option<CacheControl>,
524}
525
526#[derive(Debug, Clone, Serialize, Deserialize)]
528pub struct InputSchema {
529 #[serde(rename = "type")]
530 pub schema_type: String,
531
532 #[serde(skip_serializing_if = "Option::is_none")]
533 pub properties: Option<HashMap<String, Value>>,
534
535 #[serde(skip_serializing_if = "Option::is_none")]
536 pub required: Option<Vec<String>>,
537
538 #[serde(flatten)]
540 pub additional: HashMap<String, Value>,
541}
542
543#[derive(Debug, Clone, Serialize, Deserialize)]
545pub struct BashTool {
546 #[serde(rename = "type")]
547 pub tool_type: String, pub name: String, #[serde(skip_serializing_if = "Option::is_none")]
552 pub cache_control: Option<CacheControl>,
553}
554
555#[derive(Debug, Clone, Serialize, Deserialize)]
557pub struct TextEditorTool {
558 #[serde(rename = "type")]
559 pub tool_type: String, pub name: String, #[serde(skip_serializing_if = "Option::is_none")]
564 pub cache_control: Option<CacheControl>,
565}
566
567#[derive(Debug, Clone, Serialize, Deserialize)]
569pub struct WebSearchTool {
570 #[serde(rename = "type")]
571 pub tool_type: String, pub name: String, #[serde(skip_serializing_if = "Option::is_none")]
576 pub allowed_domains: Option<Vec<String>>,
577
578 #[serde(skip_serializing_if = "Option::is_none")]
579 pub blocked_domains: Option<Vec<String>>,
580
581 #[serde(skip_serializing_if = "Option::is_none")]
582 pub max_uses: Option<u32>,
583
584 #[serde(skip_serializing_if = "Option::is_none")]
585 pub user_location: Option<UserLocation>,
586
587 #[serde(skip_serializing_if = "Option::is_none")]
588 pub cache_control: Option<CacheControl>,
589}
590
591#[derive(Debug, Clone, Serialize, Deserialize)]
593pub struct UserLocation {
594 #[serde(rename = "type")]
595 pub location_type: String, #[serde(skip_serializing_if = "Option::is_none")]
598 pub city: Option<String>,
599
600 #[serde(skip_serializing_if = "Option::is_none")]
601 pub region: Option<String>,
602
603 #[serde(skip_serializing_if = "Option::is_none")]
604 pub country: Option<String>,
605
606 #[serde(skip_serializing_if = "Option::is_none")]
607 pub timezone: Option<String>,
608}
609
610#[derive(Debug, Clone, Serialize, Deserialize)]
616#[serde(tag = "type", rename_all = "snake_case")]
617pub enum ToolChoice {
618 Auto {
620 #[serde(skip_serializing_if = "Option::is_none")]
621 disable_parallel_tool_use: Option<bool>,
622 },
623 Any {
625 #[serde(skip_serializing_if = "Option::is_none")]
626 disable_parallel_tool_use: Option<bool>,
627 },
628 Tool {
630 name: String,
631 #[serde(skip_serializing_if = "Option::is_none")]
632 disable_parallel_tool_use: Option<bool>,
633 },
634 None,
636}
637
638#[derive(Debug, Clone, Serialize, Deserialize)]
644#[serde(tag = "type", rename_all = "snake_case")]
645pub enum ThinkingConfig {
646 Enabled {
648 budget_tokens: u32,
650 },
651 Disabled,
653}
654
655#[derive(Debug, Clone, Serialize, Deserialize)]
661pub struct Message {
662 pub id: String,
664
665 #[serde(rename = "type")]
667 pub message_type: String,
668
669 pub role: String,
671
672 pub content: Vec<ContentBlock>,
674
675 pub model: String,
677
678 pub stop_reason: Option<StopReason>,
680
681 pub stop_sequence: Option<String>,
683
684 pub usage: Usage,
686}
687
688#[derive(Debug, Clone, Serialize, Deserialize)]
690#[serde(tag = "type", rename_all = "snake_case")]
691pub enum ContentBlock {
692 Text {
694 text: String,
695 #[serde(skip_serializing_if = "Option::is_none")]
696 citations: Option<Vec<Citation>>,
697 },
698 ToolUse {
700 id: String,
701 name: String,
702 input: Value,
703 },
704 Thinking { thinking: String, signature: String },
706 RedactedThinking { data: String },
708 ServerToolUse {
710 id: String,
711 name: String,
712 input: Value,
713 },
714 WebSearchToolResult {
716 tool_use_id: String,
717 content: WebSearchToolResultContent,
718 },
719}
720
721#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
723#[serde(rename_all = "snake_case")]
724pub enum StopReason {
725 EndTurn,
727 MaxTokens,
729 StopSequence,
731 ToolUse,
733 PauseTurn,
735 Refusal,
737}
738
739#[derive(Debug, Clone, Serialize, Deserialize)]
741pub struct Usage {
742 pub input_tokens: u32,
744
745 pub output_tokens: u32,
747
748 #[serde(skip_serializing_if = "Option::is_none")]
750 pub cache_creation_input_tokens: Option<u32>,
751
752 #[serde(skip_serializing_if = "Option::is_none")]
754 pub cache_read_input_tokens: Option<u32>,
755
756 #[serde(skip_serializing_if = "Option::is_none")]
758 pub cache_creation: Option<CacheCreation>,
759
760 #[serde(skip_serializing_if = "Option::is_none")]
762 pub server_tool_use: Option<ServerToolUsage>,
763
764 #[serde(skip_serializing_if = "Option::is_none")]
766 pub service_tier: Option<String>,
767}
768
769#[derive(Debug, Clone, Serialize, Deserialize)]
771pub struct CacheCreation {
772 #[serde(flatten)]
773 pub tokens_by_ttl: HashMap<String, u32>,
774}
775
776#[derive(Debug, Clone, Serialize, Deserialize)]
778pub struct ServerToolUsage {
779 pub web_search_requests: u32,
780}
781
782#[derive(Debug, Clone, Serialize, Deserialize)]
788#[serde(tag = "type", rename_all = "snake_case")]
789pub enum MessageStreamEvent {
790 MessageStart { message: Message },
792 MessageDelta {
794 delta: MessageDelta,
795 usage: MessageDeltaUsage,
796 },
797 MessageStop,
799 ContentBlockStart {
801 index: u32,
802 content_block: ContentBlock,
803 },
804 ContentBlockDelta {
806 index: u32,
807 delta: ContentBlockDelta,
808 },
809 ContentBlockStop { index: u32 },
811 Ping,
813 Error { error: ErrorResponse },
815}
816
817#[derive(Debug, Clone, Serialize, Deserialize)]
819pub struct MessageDelta {
820 #[serde(skip_serializing_if = "Option::is_none")]
821 pub stop_reason: Option<StopReason>,
822
823 #[serde(skip_serializing_if = "Option::is_none")]
824 pub stop_sequence: Option<String>,
825}
826
827#[derive(Debug, Clone, Serialize, Deserialize)]
829pub struct MessageDeltaUsage {
830 pub output_tokens: u32,
831
832 #[serde(skip_serializing_if = "Option::is_none")]
833 pub input_tokens: Option<u32>,
834
835 #[serde(skip_serializing_if = "Option::is_none")]
836 pub cache_creation_input_tokens: Option<u32>,
837
838 #[serde(skip_serializing_if = "Option::is_none")]
839 pub cache_read_input_tokens: Option<u32>,
840
841 #[serde(skip_serializing_if = "Option::is_none")]
842 pub server_tool_use: Option<ServerToolUsage>,
843}
844
845#[derive(Debug, Clone, Serialize, Deserialize)]
847#[serde(tag = "type", rename_all = "snake_case")]
848pub enum ContentBlockDelta {
849 TextDelta { text: String },
851 InputJsonDelta { partial_json: String },
853 ThinkingDelta { thinking: String },
855 SignatureDelta { signature: String },
857 CitationsDelta { citation: Citation },
859}
860
861#[derive(Debug, Clone, Serialize, Deserialize)]
867pub struct ErrorResponse {
868 #[serde(rename = "type")]
869 pub error_type: String,
870
871 pub message: String,
872}
873
874#[derive(Debug, Clone, Serialize, Deserialize)]
876#[serde(tag = "type", rename_all = "snake_case")]
877pub enum ApiError {
878 InvalidRequestError { message: String },
879 AuthenticationError { message: String },
880 BillingError { message: String },
881 PermissionError { message: String },
882 NotFoundError { message: String },
883 RateLimitError { message: String },
884 TimeoutError { message: String },
885 ApiError { message: String },
886 OverloadedError { message: String },
887}
888
889#[derive(Debug, Clone, Serialize, Deserialize)]
895pub struct CountMessageTokensRequest {
896 pub model: String,
898
899 pub messages: Vec<InputMessage>,
901
902 #[serde(skip_serializing_if = "Option::is_none")]
904 pub system: Option<SystemContent>,
905
906 #[serde(skip_serializing_if = "Option::is_none")]
908 pub thinking: Option<ThinkingConfig>,
909
910 #[serde(skip_serializing_if = "Option::is_none")]
912 pub tool_choice: Option<ToolChoice>,
913
914 #[serde(skip_serializing_if = "Option::is_none")]
916 pub tools: Option<Vec<Tool>>,
917}
918
919#[derive(Debug, Clone, Serialize, Deserialize)]
921pub struct CountMessageTokensResponse {
922 pub input_tokens: u32,
923}
924
925#[derive(Debug, Clone, Serialize, Deserialize)]
931pub struct ModelInfo {
932 #[serde(rename = "type")]
934 pub model_type: String,
935
936 pub id: String,
938
939 pub display_name: String,
941
942 pub created_at: String,
944}
945
946#[derive(Debug, Clone, Serialize, Deserialize)]
948pub struct ListModelsResponse {
949 pub data: Vec<ModelInfo>,
950 pub has_more: bool,
951 pub first_id: Option<String>,
952 pub last_id: Option<String>,
953}
954
955#[derive(Debug, Clone, Serialize, Deserialize)]
961pub struct ContainerConfig {
962 #[serde(skip_serializing_if = "Option::is_none")]
964 pub id: Option<String>,
965
966 #[serde(skip_serializing_if = "Option::is_none")]
968 pub skills: Option<Vec<String>>,
969}
970
971#[derive(Debug, Clone, Serialize, Deserialize)]
973pub struct McpServerConfig {
974 pub name: String,
976
977 pub url: String,
979
980 #[serde(skip_serializing_if = "Option::is_none")]
982 pub authorization_token: Option<String>,
983
984 #[serde(skip_serializing_if = "Option::is_none")]
986 pub tool_configuration: Option<McpToolConfiguration>,
987}
988
989#[derive(Debug, Clone, Serialize, Deserialize)]
991pub struct McpToolConfiguration {
992 #[serde(skip_serializing_if = "Option::is_none")]
994 pub enabled: Option<bool>,
995
996 #[serde(skip_serializing_if = "Option::is_none")]
998 pub allowed_tools: Option<Vec<String>>,
999}
1000
1001#[derive(Debug, Clone, Serialize, Deserialize)]
1007pub struct McpToolUseBlock {
1008 pub id: String,
1010
1011 pub name: String,
1013
1014 pub server_name: String,
1016
1017 pub input: Value,
1019
1020 #[serde(skip_serializing_if = "Option::is_none")]
1022 pub cache_control: Option<CacheControl>,
1023}
1024
1025#[derive(Debug, Clone, Serialize, Deserialize)]
1027pub struct McpToolResultBlock {
1028 pub tool_use_id: String,
1030
1031 #[serde(skip_serializing_if = "Option::is_none")]
1033 pub content: Option<ToolResultContent>,
1034
1035 #[serde(skip_serializing_if = "Option::is_none")]
1037 pub is_error: Option<bool>,
1038
1039 #[serde(skip_serializing_if = "Option::is_none")]
1041 pub cache_control: Option<CacheControl>,
1042}
1043
1044#[derive(Debug, Clone, Serialize, Deserialize)]
1046pub struct McpToolset {
1047 #[serde(rename = "type")]
1048 pub toolset_type: String, pub mcp_server_name: String,
1052
1053 #[serde(skip_serializing_if = "Option::is_none")]
1055 pub default_config: Option<McpToolDefaultConfig>,
1056
1057 #[serde(skip_serializing_if = "Option::is_none")]
1059 pub configs: Option<HashMap<String, McpToolConfig>>,
1060
1061 #[serde(skip_serializing_if = "Option::is_none")]
1063 pub cache_control: Option<CacheControl>,
1064}
1065
1066#[derive(Debug, Clone, Serialize, Deserialize)]
1068pub struct McpToolDefaultConfig {
1069 #[serde(skip_serializing_if = "Option::is_none")]
1071 pub enabled: Option<bool>,
1072
1073 #[serde(skip_serializing_if = "Option::is_none")]
1075 pub defer_loading: Option<bool>,
1076}
1077
1078#[derive(Debug, Clone, Serialize, Deserialize)]
1080pub struct McpToolConfig {
1081 #[serde(skip_serializing_if = "Option::is_none")]
1083 pub enabled: Option<bool>,
1084
1085 #[serde(skip_serializing_if = "Option::is_none")]
1087 pub defer_loading: Option<bool>,
1088}
1089
1090#[derive(Debug, Clone, Serialize, Deserialize)]
1096pub struct CodeExecutionTool {
1097 #[serde(rename = "type")]
1098 pub tool_type: String, pub name: String, #[serde(skip_serializing_if = "Option::is_none")]
1104 pub allowed_callers: Option<Vec<String>>,
1105
1106 #[serde(skip_serializing_if = "Option::is_none")]
1108 pub defer_loading: Option<bool>,
1109
1110 #[serde(skip_serializing_if = "Option::is_none")]
1112 pub strict: Option<bool>,
1113
1114 #[serde(skip_serializing_if = "Option::is_none")]
1116 pub cache_control: Option<CacheControl>,
1117}
1118
1119#[derive(Debug, Clone, Serialize, Deserialize)]
1121pub struct CodeExecutionResultBlock {
1122 pub stdout: String,
1124
1125 pub stderr: String,
1127
1128 pub return_code: i32,
1130
1131 pub content: Vec<CodeExecutionOutputBlock>,
1133}
1134
1135#[derive(Debug, Clone, Serialize, Deserialize)]
1137pub struct CodeExecutionOutputBlock {
1138 #[serde(rename = "type")]
1139 pub block_type: String, pub file_id: String,
1143}
1144
1145#[derive(Debug, Clone, Serialize, Deserialize)]
1147pub struct CodeExecutionToolResultBlock {
1148 pub tool_use_id: String,
1150
1151 pub content: CodeExecutionToolResultContent,
1153
1154 #[serde(skip_serializing_if = "Option::is_none")]
1156 pub cache_control: Option<CacheControl>,
1157}
1158
1159#[derive(Debug, Clone, Serialize, Deserialize)]
1161#[serde(untagged)]
1162pub enum CodeExecutionToolResultContent {
1163 Success(CodeExecutionResultBlock),
1164 Error(CodeExecutionToolResultError),
1165}
1166
1167#[derive(Debug, Clone, Serialize, Deserialize)]
1169pub struct CodeExecutionToolResultError {
1170 #[serde(rename = "type")]
1171 pub error_type: String, pub error_code: CodeExecutionToolResultErrorCode,
1174}
1175
1176#[derive(Debug, Clone, Serialize, Deserialize)]
1178#[serde(rename_all = "snake_case")]
1179pub enum CodeExecutionToolResultErrorCode {
1180 Unavailable,
1181 CodeExecutionExceededTimeout,
1182 ContainerExpired,
1183 InvalidToolInput,
1184}
1185
1186#[derive(Debug, Clone, Serialize, Deserialize)]
1188pub struct BashCodeExecutionResultBlock {
1189 pub stdout: String,
1191
1192 pub stderr: String,
1194
1195 pub return_code: i32,
1197
1198 pub content: Vec<BashCodeExecutionOutputBlock>,
1200}
1201
1202#[derive(Debug, Clone, Serialize, Deserialize)]
1204pub struct BashCodeExecutionOutputBlock {
1205 #[serde(rename = "type")]
1206 pub block_type: String, pub file_id: String,
1210}
1211
1212#[derive(Debug, Clone, Serialize, Deserialize)]
1214pub struct BashCodeExecutionToolResultBlock {
1215 pub tool_use_id: String,
1217
1218 pub content: BashCodeExecutionToolResultContent,
1220
1221 #[serde(skip_serializing_if = "Option::is_none")]
1223 pub cache_control: Option<CacheControl>,
1224}
1225
1226#[derive(Debug, Clone, Serialize, Deserialize)]
1228#[serde(untagged)]
1229pub enum BashCodeExecutionToolResultContent {
1230 Success(BashCodeExecutionResultBlock),
1231 Error(BashCodeExecutionToolResultError),
1232}
1233
1234#[derive(Debug, Clone, Serialize, Deserialize)]
1236pub struct BashCodeExecutionToolResultError {
1237 #[serde(rename = "type")]
1238 pub error_type: String, pub error_code: BashCodeExecutionToolResultErrorCode,
1241}
1242
1243#[derive(Debug, Clone, Serialize, Deserialize)]
1245#[serde(rename_all = "snake_case")]
1246pub enum BashCodeExecutionToolResultErrorCode {
1247 Unavailable,
1248 CodeExecutionExceededTimeout,
1249 ContainerExpired,
1250 InvalidToolInput,
1251}
1252
1253#[derive(Debug, Clone, Serialize, Deserialize)]
1255pub struct TextEditorCodeExecutionToolResultBlock {
1256 pub tool_use_id: String,
1258
1259 pub content: TextEditorCodeExecutionToolResultContent,
1261
1262 #[serde(skip_serializing_if = "Option::is_none")]
1264 pub cache_control: Option<CacheControl>,
1265}
1266
1267#[derive(Debug, Clone, Serialize, Deserialize)]
1269#[serde(untagged)]
1270pub enum TextEditorCodeExecutionToolResultContent {
1271 CreateResult(TextEditorCodeExecutionCreateResultBlock),
1272 StrReplaceResult(TextEditorCodeExecutionStrReplaceResultBlock),
1273 ViewResult(TextEditorCodeExecutionViewResultBlock),
1274 Error(TextEditorCodeExecutionToolResultError),
1275}
1276
1277#[derive(Debug, Clone, Serialize, Deserialize)]
1279pub struct TextEditorCodeExecutionCreateResultBlock {
1280 #[serde(rename = "type")]
1281 pub block_type: String, }
1283
1284#[derive(Debug, Clone, Serialize, Deserialize)]
1286pub struct TextEditorCodeExecutionStrReplaceResultBlock {
1287 #[serde(rename = "type")]
1288 pub block_type: String, #[serde(skip_serializing_if = "Option::is_none")]
1292 pub snippet: Option<String>,
1293}
1294
1295#[derive(Debug, Clone, Serialize, Deserialize)]
1297pub struct TextEditorCodeExecutionViewResultBlock {
1298 #[serde(rename = "type")]
1299 pub block_type: String, pub content: String,
1303}
1304
1305#[derive(Debug, Clone, Serialize, Deserialize)]
1307pub struct TextEditorCodeExecutionToolResultError {
1308 #[serde(rename = "type")]
1309 pub error_type: String,
1310
1311 pub error_code: TextEditorCodeExecutionToolResultErrorCode,
1312}
1313
1314#[derive(Debug, Clone, Serialize, Deserialize)]
1316#[serde(rename_all = "snake_case")]
1317pub enum TextEditorCodeExecutionToolResultErrorCode {
1318 Unavailable,
1319 InvalidToolInput,
1320 FileNotFound,
1321 ContainerExpired,
1322}
1323
1324#[derive(Debug, Clone, Serialize, Deserialize)]
1330pub struct WebFetchTool {
1331 #[serde(rename = "type")]
1332 pub tool_type: String, pub name: String, #[serde(skip_serializing_if = "Option::is_none")]
1338 pub allowed_callers: Option<Vec<String>>,
1339
1340 #[serde(skip_serializing_if = "Option::is_none")]
1342 pub max_uses: Option<u32>,
1343
1344 #[serde(skip_serializing_if = "Option::is_none")]
1346 pub cache_control: Option<CacheControl>,
1347}
1348
1349#[derive(Debug, Clone, Serialize, Deserialize)]
1351pub struct WebFetchResultBlock {
1352 #[serde(rename = "type")]
1353 pub block_type: String, pub url: String,
1357
1358 pub content: DocumentBlock,
1360
1361 #[serde(skip_serializing_if = "Option::is_none")]
1363 pub retrieved_at: Option<String>,
1364}
1365
1366#[derive(Debug, Clone, Serialize, Deserialize)]
1368pub struct WebFetchToolResultBlock {
1369 pub tool_use_id: String,
1371
1372 pub content: WebFetchToolResultContent,
1374
1375 #[serde(skip_serializing_if = "Option::is_none")]
1377 pub cache_control: Option<CacheControl>,
1378}
1379
1380#[derive(Debug, Clone, Serialize, Deserialize)]
1382#[serde(untagged)]
1383pub enum WebFetchToolResultContent {
1384 Success(WebFetchResultBlock),
1385 Error(WebFetchToolResultError),
1386}
1387
1388#[derive(Debug, Clone, Serialize, Deserialize)]
1390pub struct WebFetchToolResultError {
1391 #[serde(rename = "type")]
1392 pub error_type: String, pub error_code: WebFetchToolResultErrorCode,
1395}
1396
1397#[derive(Debug, Clone, Serialize, Deserialize)]
1399#[serde(rename_all = "snake_case")]
1400pub enum WebFetchToolResultErrorCode {
1401 InvalidToolInput,
1402 Unavailable,
1403 MaxUsesExceeded,
1404 TooManyRequests,
1405 UrlNotAllowed,
1406 FetchFailed,
1407 ContentTooLarge,
1408}
1409
1410#[derive(Debug, Clone, Serialize, Deserialize)]
1416pub struct ToolSearchTool {
1417 #[serde(rename = "type")]
1418 pub tool_type: String, pub name: String,
1421
1422 #[serde(skip_serializing_if = "Option::is_none")]
1424 pub allowed_callers: Option<Vec<String>>,
1425
1426 #[serde(skip_serializing_if = "Option::is_none")]
1428 pub cache_control: Option<CacheControl>,
1429}
1430
1431#[derive(Debug, Clone, Serialize, Deserialize)]
1433pub struct ToolReferenceBlock {
1434 #[serde(rename = "type")]
1435 pub block_type: String, pub tool_name: String,
1439
1440 #[serde(skip_serializing_if = "Option::is_none")]
1442 pub description: Option<String>,
1443}
1444
1445#[derive(Debug, Clone, Serialize, Deserialize)]
1447pub struct ToolSearchResultBlock {
1448 #[serde(rename = "type")]
1449 pub block_type: String, pub tool_name: String,
1453
1454 #[serde(skip_serializing_if = "Option::is_none")]
1456 pub score: Option<f64>,
1457}
1458
1459#[derive(Debug, Clone, Serialize, Deserialize)]
1461pub struct ToolSearchToolResultBlock {
1462 pub tool_use_id: String,
1464
1465 pub content: Vec<ToolSearchResultBlock>,
1467
1468 #[serde(skip_serializing_if = "Option::is_none")]
1470 pub cache_control: Option<CacheControl>,
1471}
1472
1473#[derive(Debug, Clone, Serialize, Deserialize)]
1479pub struct ContainerUploadBlock {
1480 #[serde(rename = "type")]
1481 pub block_type: String, pub file_id: String,
1485
1486 pub file_name: String,
1488
1489 #[serde(skip_serializing_if = "Option::is_none")]
1491 pub file_path: Option<String>,
1492}
1493
1494#[derive(Debug, Clone, Serialize, Deserialize)]
1500pub struct MemoryTool {
1501 #[serde(rename = "type")]
1502 pub tool_type: String, pub name: String, #[serde(skip_serializing_if = "Option::is_none")]
1508 pub allowed_callers: Option<Vec<String>>,
1509
1510 #[serde(skip_serializing_if = "Option::is_none")]
1512 pub defer_loading: Option<bool>,
1513
1514 #[serde(skip_serializing_if = "Option::is_none")]
1516 pub strict: Option<bool>,
1517
1518 #[serde(skip_serializing_if = "Option::is_none")]
1520 pub input_examples: Option<Vec<Value>>,
1521
1522 #[serde(skip_serializing_if = "Option::is_none")]
1524 pub cache_control: Option<CacheControl>,
1525}
1526
1527#[derive(Debug, Clone, Serialize, Deserialize)]
1533pub struct ComputerUseTool {
1534 #[serde(rename = "type")]
1535 pub tool_type: String, pub name: String, pub display_width_px: u32,
1541
1542 pub display_height_px: u32,
1544
1545 #[serde(skip_serializing_if = "Option::is_none")]
1547 pub display_number: Option<u32>,
1548
1549 #[serde(skip_serializing_if = "Option::is_none")]
1551 pub allowed_callers: Option<Vec<String>>,
1552
1553 #[serde(skip_serializing_if = "Option::is_none")]
1555 pub cache_control: Option<CacheControl>,
1556}
1557
1558#[derive(Debug, Clone, Serialize, Deserialize)]
1564#[serde(tag = "type", rename_all = "snake_case")]
1565pub enum BetaInputContentBlock {
1566 Text(TextBlock),
1568 Image(ImageBlock),
1569 Document(DocumentBlock),
1570 ToolUse(ToolUseBlock),
1571 ToolResult(ToolResultBlock),
1572 Thinking(ThinkingBlock),
1573 RedactedThinking(RedactedThinkingBlock),
1574 ServerToolUse(ServerToolUseBlock),
1575 SearchResult(SearchResultBlock),
1576 WebSearchToolResult(WebSearchToolResultBlock),
1577
1578 McpToolUse(McpToolUseBlock),
1580 McpToolResult(McpToolResultBlock),
1581
1582 CodeExecutionToolResult(CodeExecutionToolResultBlock),
1584 BashCodeExecutionToolResult(BashCodeExecutionToolResultBlock),
1585 TextEditorCodeExecutionToolResult(TextEditorCodeExecutionToolResultBlock),
1586
1587 WebFetchToolResult(WebFetchToolResultBlock),
1589
1590 ToolSearchToolResult(ToolSearchToolResultBlock),
1592 ToolReference(ToolReferenceBlock),
1593
1594 ContainerUpload(ContainerUploadBlock),
1596}
1597
1598#[derive(Debug, Clone, Serialize, Deserialize)]
1600#[serde(tag = "type", rename_all = "snake_case")]
1601pub enum BetaContentBlock {
1602 Text {
1604 text: String,
1605 #[serde(skip_serializing_if = "Option::is_none")]
1606 citations: Option<Vec<Citation>>,
1607 },
1608 ToolUse {
1609 id: String,
1610 name: String,
1611 input: Value,
1612 },
1613 Thinking {
1614 thinking: String,
1615 signature: String,
1616 },
1617 RedactedThinking {
1618 data: String,
1619 },
1620 ServerToolUse {
1621 id: String,
1622 name: String,
1623 input: Value,
1624 },
1625 WebSearchToolResult {
1626 tool_use_id: String,
1627 content: WebSearchToolResultContent,
1628 },
1629
1630 McpToolUse {
1632 id: String,
1633 name: String,
1634 server_name: String,
1635 input: Value,
1636 },
1637 McpToolResult {
1638 tool_use_id: String,
1639 #[serde(skip_serializing_if = "Option::is_none")]
1640 content: Option<ToolResultContent>,
1641 #[serde(skip_serializing_if = "Option::is_none")]
1642 is_error: Option<bool>,
1643 },
1644
1645 CodeExecutionToolResult {
1647 tool_use_id: String,
1648 content: CodeExecutionToolResultContent,
1649 },
1650 BashCodeExecutionToolResult {
1651 tool_use_id: String,
1652 content: BashCodeExecutionToolResultContent,
1653 },
1654 TextEditorCodeExecutionToolResult {
1655 tool_use_id: String,
1656 content: TextEditorCodeExecutionToolResultContent,
1657 },
1658
1659 WebFetchToolResult {
1661 tool_use_id: String,
1662 content: WebFetchToolResultContent,
1663 },
1664
1665 ToolSearchToolResult {
1667 tool_use_id: String,
1668 content: Vec<ToolSearchResultBlock>,
1669 },
1670 ToolReference {
1671 tool_name: String,
1672 #[serde(skip_serializing_if = "Option::is_none")]
1673 description: Option<String>,
1674 },
1675
1676 ContainerUpload {
1678 file_id: String,
1679 file_name: String,
1680 #[serde(skip_serializing_if = "Option::is_none")]
1681 file_path: Option<String>,
1682 },
1683}
1684
1685#[derive(Debug, Clone, Serialize, Deserialize)]
1687#[serde(untagged)]
1688pub enum BetaTool {
1689 Custom(CustomTool),
1691 Bash(BashTool),
1692 TextEditor(TextEditorTool),
1693 WebSearch(WebSearchTool),
1694
1695 CodeExecution(CodeExecutionTool),
1697 McpToolset(McpToolset),
1698 WebFetch(WebFetchTool),
1699 ToolSearch(ToolSearchTool),
1700 Memory(MemoryTool),
1701 ComputerUse(ComputerUseTool),
1702}
1703
1704#[derive(Debug, Clone, Serialize, Deserialize)]
1706#[serde(rename_all = "snake_case")]
1707pub enum BetaServerToolName {
1708 WebSearch,
1709 WebFetch,
1710 CodeExecution,
1711 BashCodeExecution,
1712 TextEditorCodeExecution,
1713 ToolSearchToolRegex,
1714 ToolSearchToolBm25,
1715}
1716
1717#[derive(Debug, Clone, Serialize, Deserialize)]
1719#[serde(tag = "type", rename_all = "snake_case")]
1720pub enum ServerToolCaller {
1721 Direct,
1723 #[serde(rename = "code_execution_20250825")]
1725 CodeExecution20250825,
1726}