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")]
41 provider_metadata: Option<ProviderMetadata>,
42 },
43 Source {
45 id: String,
46 source_type: String,
47 url: Option<String>,
48 title: Option<String>,
49 #[serde(default, skip_serializing_if = "Option::is_none")]
50 provider_metadata: Option<ProviderMetadata>,
51 },
52 Reasoning {
58 text: String,
59 provider_metadata: Option<ProviderMetadata>,
60 },
61 File {
66 data: FileData,
67 media_type: String,
68 #[serde(default, skip_serializing_if = "Option::is_none")]
69 provider_metadata: Option<ProviderMetadata>,
70 },
71 ToolResult {
75 tool_call_id: String,
76 tool_name: String,
77 result: Value,
78 #[serde(default, skip_serializing_if = "Option::is_none")]
80 is_error: Option<bool>,
81 #[serde(default, skip_serializing_if = "Option::is_none")]
83 preliminary: Option<bool>,
84 #[serde(default, skip_serializing_if = "Option::is_none")]
86 dynamic: Option<bool>,
87 #[serde(default, skip_serializing_if = "Option::is_none")]
89 provider_metadata: Option<ProviderMetadata>,
90 },
91}
92
93#[derive(Debug, Serialize, Deserialize, TS)]
95#[ts(export)]
96pub struct GenerateResult {
97 pub content: Vec<GenerateContent>,
99 pub finish_reason: FinishReason,
101 pub usage: Usage,
103 pub warnings: Vec<Warning>,
105 pub provider_metadata: Option<ProviderMetadata>,
107 pub response: ResponseMetadata,
109 pub request_body: Option<serde_json::Value>,
111 pub response_headers: Option<HashMap<String, String>>,
113}
114
115pub struct StreamResult {
117 pub stream: Pin<Box<dyn Stream<Item = Result<StreamPart, AiMuxError>> + Send>>,
119 pub request_body: Option<serde_json::Value>,
121 pub response_headers: Option<HashMap<String, String>>,
123}
124
125impl std::fmt::Debug for StreamResult {
126 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
127 f.debug_struct("StreamResult")
128 .field("request_body", &self.request_body)
129 .field("response_headers", &self.response_headers)
130 .field("stream", &"<stream>")
131 .finish()
132 }
133}