use serde::{Deserialize, Serialize};
#[derive(Serialize)]
pub(super) struct ChatRequest<'a> {
pub(super) model: &'a str,
pub(super) messages: Vec<ChatMessage<'a>>,
pub(super) response_format: ResponseFormat,
pub(super) provider: ProviderPrefs,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) reasoning: Option<ReasoningPrefs>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) max_tokens: Option<u32>,
}
#[derive(Serialize)]
pub(super) struct ChatMessage<'a> {
pub(super) role: &'a str,
pub(super) content: String,
}
#[derive(Serialize)]
pub(super) struct ResponseFormat {
#[serde(rename = "type")]
pub(super) format_type: &'static str,
pub(super) json_schema: JsonSchemaSpec,
}
#[derive(Serialize)]
pub(super) struct JsonSchemaSpec {
pub(super) name: &'static str,
pub(super) strict: bool,
pub(super) schema: serde_json::Value,
}
#[derive(Serialize)]
pub(super) struct ProviderPrefs {
pub(super) require_parameters: bool,
}
#[derive(Serialize)]
pub(super) struct ReasoningPrefs {
pub(super) enabled: bool,
}
#[derive(Deserialize)]
pub(super) struct ChatResponse {
#[serde(default)]
pub(super) choices: Vec<Choice>,
#[serde(default)]
pub(super) usage: Option<Usage>,
#[serde(default)]
pub(super) error: Option<crate::openrouter_http::ApiError>,
}
#[derive(Deserialize)]
pub(super) struct Choice {
pub(super) message: RespMessage,
#[serde(default)]
pub(super) finish_reason: Option<String>,
}
#[derive(Deserialize)]
pub(super) struct RespMessage {
#[serde(default)]
pub(super) content: Option<String>,
}
#[derive(Deserialize)]
pub(super) struct Usage {
#[serde(default)]
pub(super) cost: Option<f64>,
#[serde(default)]
pub(super) prompt_tokens: Option<u32>,
#[serde(default)]
pub(super) completion_tokens: Option<u32>,
}