use serde::{Deserialize, Serialize};
use crate::providers::openai_compatible::types::CompatibleChatRequest;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct OpenRouterUsage {
#[serde(rename = "include")]
pub include: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct CacheControl {
#[serde(rename = "type")]
pub cache_type: String,
}
impl CacheControl {
pub fn ephemeral() -> Self {
Self { cache_type: "ephemeral".to_string() }
}
}
#[derive(Debug, Clone, Serialize)]
pub(crate) struct OpenRouterChatRequest {
#[serde(flatten)]
request: CompatibleChatRequest,
usage: OpenRouterUsage,
cache_control: CacheControl,
#[serde(skip_serializing_if = "Option::is_none")]
session_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
reasoning: Option<serde_json::Value>,
}
impl OpenRouterChatRequest {
pub(crate) fn from_compatible(mut request: CompatibleChatRequest, session_id: Option<&str>) -> Self {
let reasoning = if request.reasoning_effort == Some("none") {
request.reasoning_effort = None;
Some(serde_json::json!({"effort": "none"}))
} else {
None
};
Self {
reasoning,
request,
usage: OpenRouterUsage { include: true },
cache_control: CacheControl::ephemeral(),
session_id: session_id.map(String::from),
}
}
}