#![allow(dead_code)]
use serde::Deserialize;
use zenwave::sse::Event;
#[allow(dead_code)]
#[derive(Debug, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponsesStreamEvent {
#[serde(rename = "response.created")]
ResponseCreated {
#[serde(default)]
response: Option<ResponsesStreamResponse>,
},
#[serde(rename = "response.in_progress")]
ResponseInProgress,
#[serde(rename = "response.completed")]
ResponseCompleted { response: ResponsesStreamResponse },
#[serde(rename = "response.failed")]
ResponseFailed {
#[serde(default)]
error: Option<ResponsesError>,
},
#[serde(rename = "response.output_item.added")]
OutputItemAdded {
item: ResponsesOutputItem,
#[serde(default)]
item_id: Option<String>,
#[serde(default)]
output_index: usize,
},
#[serde(rename = "response.output_item.done")]
OutputItemDone {
item: ResponsesOutputItem,
#[serde(default)]
item_id: Option<String>,
#[serde(default)]
output_index: usize,
},
#[serde(rename = "response.content_part.added")]
ContentPartAdded,
#[serde(rename = "response.content_part.done")]
ContentPartDone,
#[serde(rename = "response.output_text.delta")]
OutputTextDelta {
delta: String,
#[serde(default)]
item_id: Option<String>,
#[serde(default)]
output_index: usize,
#[serde(default)]
content_index: usize,
},
#[serde(rename = "response.output_text.done")]
OutputTextDone {
#[serde(default)]
text: String,
},
#[serde(rename = "response.reasoning_text.delta")]
ReasoningTextDelta {
delta: String,
#[serde(default)]
item_id: Option<String>,
},
#[serde(rename = "response.reasoning_text.done")]
ReasoningTextDone,
#[serde(rename = "response.reasoning_summary_text.delta")]
ReasoningSummaryTextDelta { delta: String },
#[serde(rename = "response.reasoning_summary_text.done")]
ReasoningSummaryTextDone,
#[serde(rename = "response.function_call_arguments.delta")]
FunctionCallArgumentsDelta {
delta: String,
item_id: String,
#[serde(default)]
output_index: usize,
},
#[serde(rename = "response.function_call_arguments.done")]
FunctionCallArgumentsDone {
arguments: String,
item_id: String,
#[serde(default)]
output_index: usize,
},
#[serde(rename = "error")]
Error {
#[serde(default)]
message: Option<String>,
#[serde(default)]
code: Option<String>,
},
#[serde(other)]
Unknown,
}
#[derive(Debug, Deserialize, Default)]
pub struct ResponsesStreamResponse {
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub output: Vec<ResponsesOutputItem>,
#[serde(default)]
pub usage: Option<ResponsesUsage>,
}
#[derive(Debug, Deserialize, Clone, Default)]
pub struct ResponsesUsage {
#[serde(default)]
pub input_tokens: Option<u32>,
#[serde(default)]
pub output_tokens: Option<u32>,
#[serde(default)]
pub total_tokens: Option<u32>,
#[serde(default)]
pub input_token_details: Option<ResponsesInputTokenDetails>,
#[serde(default)]
pub output_token_details: Option<ResponsesOutputTokenDetails>,
}
#[derive(Debug, Deserialize, Clone, Default)]
pub struct ResponsesInputTokenDetails {
#[serde(default)]
pub cached_tokens: Option<u32>,
}
#[derive(Debug, Deserialize, Clone, Default)]
pub struct ResponsesOutputTokenDetails {
#[serde(default)]
pub reasoning_tokens: Option<u32>,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponsesOutputItem {
Message {
#[serde(default)]
id: Option<String>,
#[serde(default)]
role: Option<String>,
#[serde(default)]
content: Vec<ResponsesContentPart>,
},
FunctionCall {
id: String,
#[serde(default)]
call_id: Option<String>,
name: String,
arguments: String,
},
Reasoning {
#[serde(default)]
id: Option<String>,
#[serde(default)]
summary: Vec<ResponsesReasoningSummary>,
#[serde(default)]
encrypted_content: Option<String>,
},
#[serde(other)]
Other,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponsesContentPart {
OutputText {
#[serde(default)]
text: String,
},
#[serde(other)]
Other,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponsesReasoningSummary {
SummaryText {
#[serde(default)]
text: String,
},
#[serde(other)]
Other,
}
#[derive(Debug, Deserialize, Default)]
pub struct ResponsesError {
#[serde(default)]
pub message: Option<String>,
#[serde(default)]
pub code: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct ChatCompletionChunk {
#[serde(default)]
pub usage: Option<ChatCompletionUsage>,
pub choices: Vec<ChunkChoice>,
}
#[derive(Debug, Deserialize, Clone, Default)]
pub struct ChatCompletionUsage {
#[serde(default)]
pub prompt_tokens: Option<u32>,
#[serde(default)]
pub completion_tokens: Option<u32>,
#[serde(default)]
pub total_tokens: Option<u32>,
#[serde(default)]
pub prompt_tokens_details: Option<ChatPromptTokensDetails>,
#[serde(default)]
pub completion_tokens_details: Option<ChatCompletionTokensDetails>,
}
#[derive(Debug, Deserialize, Clone, Default)]
pub struct ChatPromptTokensDetails {
#[serde(default)]
pub cached_tokens: Option<u32>,
}
#[derive(Debug, Deserialize, Clone, Default)]
pub struct ChatCompletionTokensDetails {
#[serde(default)]
pub reasoning_tokens: Option<u32>,
}
#[derive(Debug, Deserialize)]
pub struct ChunkChoice {
pub delta: DeltaMessage,
#[serde(default)]
pub finish_reason: Option<String>,
}
#[derive(Debug, Deserialize, Default)]
pub struct DeltaMessage {
#[serde(default)]
pub content: Option<String>,
#[serde(
default,
alias = "reasoning",
alias = "reasoning_content",
alias = "reasoningContent",
alias = "thinking",
alias = "thinking_content",
alias = "thinkingContent"
)]
pub reasoning_content: Option<String>,
#[serde(default)]
pub tool_calls: Option<Vec<DeltaToolCall>>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct DeltaToolCall {
pub index: Option<usize>,
pub id: Option<String>,
pub function: Option<DeltaToolFunction>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct DeltaToolFunction {
pub name: Option<String>,
pub arguments: Option<String>,
}
pub fn should_skip_event(event: &Event) -> bool {
let text = event.text_data();
text.is_empty() || text.eq_ignore_ascii_case(": ping")
}
#[derive(Debug, Deserialize)]
pub struct ModelsListResponse {
pub data: Vec<ModelInfo>,
}
#[derive(Debug, Deserialize)]
pub struct ModelInfo {
pub id: String,
#[serde(default)]
pub context_length: Option<u32>,
#[serde(default)]
pub max_tokens: Option<u32>,
}