use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize)]
pub(super) struct ChatRequest {
pub model: String,
pub messages: Vec<ChatMessage>,
pub stream: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tools: Vec<ToolDecl>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream_options: Option<StreamOptions>,
}
#[derive(Debug, Clone, Serialize)]
pub(super) struct StreamOptions {
pub include_usage: bool,
}
#[derive(Debug, Clone, Serialize)]
pub(super) struct ChatMessage {
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tool_calls: Vec<ToolCallReplay>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub(super) struct ToolCallReplay {
pub id: String,
#[serde(rename = "type")]
pub kind: String,
pub function: ToolCallFunction,
}
#[derive(Debug, Clone, Serialize)]
pub(super) struct ToolCallFunction {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Serialize)]
pub(super) struct ToolDecl {
#[serde(rename = "type")]
pub kind: String,
pub function: ToolDeclFunction,
}
#[derive(Debug, Clone, Serialize)]
pub(super) struct ToolDeclFunction {
pub name: String,
pub description: String,
pub parameters: Value,
}
#[derive(Debug, Clone, Deserialize)]
pub(super) struct ChatChunk {
#[serde(default)]
pub choices: Vec<ChunkChoice>,
#[serde(default)]
pub usage: Option<ChunkUsage>,
}
#[derive(Debug, Clone, Deserialize)]
pub(super) struct ChunkChoice {
#[serde(default)]
pub delta: ChunkDelta,
#[serde(default)]
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
pub(super) struct ChunkDelta {
#[serde(default)]
pub content: Option<String>,
#[serde(default)]
pub tool_calls: Vec<ChunkToolCallDelta>,
}
#[derive(Debug, Clone, Deserialize)]
pub(super) struct ChunkToolCallDelta {
pub index: usize,
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub function: Option<ChunkToolCallFunctionDelta>,
}
#[derive(Debug, Clone, Default, Deserialize)]
pub(super) struct ChunkToolCallFunctionDelta {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub arguments: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub(super) struct ChunkUsage {
#[serde(default)]
pub prompt_tokens: u32,
#[serde(default)]
pub completion_tokens: u32,
}