1use std::collections::HashMap;
4
5use futures::Stream;
6use serde::{Deserialize, Serialize};
7use std::pin::Pin;
8use ts_rs::TS;
9
10use crate::error::AiMuxError;
11use crate::shared::FileData;
12use crate::stream_part::StreamPart;
13use crate::types::{FinishReason, ProviderMetadata, ResponseMetadata, Usage, Warning};
14
15use serde_json::Value;
16
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
19#[ts(export)]
20pub enum GenerateContent {
21 Text {
23 text: String,
24 #[serde(default, skip_serializing_if = "Option::is_none")]
25 provider_metadata: Option<ProviderMetadata>,
26 },
27 ToolCall {
29 tool_call_id: String,
30 tool_name: String,
31 input: serde_json::Value,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
35 provider_executed: Option<bool>,
36 #[serde(default, skip_serializing_if = "Option::is_none")]
38 dynamic: Option<bool>,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
43 thought_signature: Option<String>,
44 #[serde(default, skip_serializing_if = "Option::is_none")]
46 provider_metadata: Option<ProviderMetadata>,
47 },
48 Source {
50 id: String,
51 source_type: String,
52 url: Option<String>,
53 title: Option<String>,
54 #[serde(default, skip_serializing_if = "Option::is_none")]
55 provider_metadata: Option<ProviderMetadata>,
56 },
57 Reasoning {
63 text: String,
64 provider_metadata: Option<ProviderMetadata>,
65 },
66 File {
71 data: FileData,
72 media_type: String,
73 #[serde(default, skip_serializing_if = "Option::is_none")]
74 provider_metadata: Option<ProviderMetadata>,
75 },
76 ToolResult {
80 tool_call_id: String,
81 tool_name: String,
82 result: Value,
83 #[serde(default, skip_serializing_if = "Option::is_none")]
85 is_error: Option<bool>,
86 #[serde(default, skip_serializing_if = "Option::is_none")]
88 preliminary: Option<bool>,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
91 dynamic: Option<bool>,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
94 provider_metadata: Option<ProviderMetadata>,
95 },
96}
97
98#[derive(Debug, Serialize, Deserialize, TS)]
100#[ts(export)]
101pub struct GenerateResult {
102 pub content: Vec<GenerateContent>,
104 pub finish_reason: FinishReason,
106 pub usage: Usage,
108 pub warnings: Vec<Warning>,
110 pub provider_metadata: Option<ProviderMetadata>,
112 pub response: ResponseMetadata,
114 pub request_body: Option<serde_json::Value>,
116 pub response_headers: Option<HashMap<String, String>>,
118}
119
120pub struct StreamResult {
122 pub stream: Pin<Box<dyn Stream<Item = Result<StreamPart, AiMuxError>> + Send>>,
124 pub request_body: Option<serde_json::Value>,
126 pub response_headers: Option<HashMap<String, String>>,
128}
129
130impl std::fmt::Debug for StreamResult {
131 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
132 f.debug_struct("StreamResult")
133 .field("request_body", &self.request_body)
134 .field("response_headers", &self.response_headers)
135 .field("stream", &"<stream>")
136 .finish()
137 }
138}