use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Role {
User,
Assistant,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub role: Role,
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatRequest {
pub model: String,
pub system: Option<String>,
pub messages: Vec<Message>,
pub max_tokens: Option<u32>,
pub temperature: Option<f32>,
pub thinking: Option<serde_json::Value>,
pub effort: Option<String>,
pub task_budget: Option<serde_json::Value>,
pub output_schema: Option<serde_json::Value>,
pub stream: bool,
#[serde(default)]
pub plugins: Vec<PluginRequest>,
#[serde(default, skip_serializing)]
pub forced_provider: Option<String>,
#[serde(default, skip_serializing)]
pub tags: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PluginRequest {
pub id: String,
#[serde(flatten)]
pub settings: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StopReason {
EndTurn,
MaxTokens,
Other,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Usage {
pub input_tokens: u32,
pub output_tokens: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatResponse {
pub id: String,
pub model: String,
pub content: String,
pub stop_reason: StopReason,
pub usage: Usage,
#[serde(default)]
pub tags: Vec<String>,
}