use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone)]
pub struct LlmRequest {
pub prompt: String,
pub system_prompt: Option<String>,
pub model: Option<String>,
pub output_format: OutputFormat,
pub max_tokens: Option<u32>,
pub session_id: Option<String>,
pub temp_dir: Option<PathBuf>,
pub fallback_model: Option<String>,
pub timeout_seconds: Option<u64>,
}
#[derive(Debug, Clone)]
pub enum OutputFormat {
Text,
Json,
}
#[derive(Debug, Clone, Serialize)]
pub struct LlmResponse {
pub content: String,
pub primary_model: String,
pub all_models_used: Vec<String>,
pub provider: String,
pub tokens: Option<TokenUsage>,
pub duration_ms: u64,
pub cost_usd: Option<f64>,
pub model_breakdown: Option<Vec<ModelBreakdown>>,
pub metadata: LlmResponseMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenUsage {
pub input: u32,
pub output: u32,
pub total: u32,
pub cache_creation: u32,
pub cache_read: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub extended_thinking: Option<u32>,
}
#[derive(Debug, Clone, Serialize)]
pub struct ModelBreakdown {
pub model: String,
pub input_tokens: u32,
pub output_tokens: u32,
pub cache_read_tokens: u32,
pub cache_creation_tokens: u32,
pub cost_usd: f64,
pub context_window: u32,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct LlmResponseMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub session_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uuid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub num_turns: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub api_errors: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<u32>,
}