use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum CachingStrategy {
Native,
Gateway,
Disabled,
Redis,
RedisOrMemory,
Memory,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ResponseCacheStrategy {
Redis,
RedisOrMemory,
Memory,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum CacheHitTier {
L1,
L2,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ResponseCacheStats {
pub l1_size: usize,
pub l1_max: usize,
pub l2_enabled: bool,
pub l2_healthy: bool,
pub strategy: ResponseCacheStrategy,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct LlmUsage {
pub input_tokens: u32,
pub output_tokens: u32,
pub total_tokens: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProviderResult {
pub content: String,
pub model: String,
pub usage: LlmUsage,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub headers: Option<HashMap<String, String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<Value>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DispatchContext {
pub provider: String,
pub model: String,
pub api_key: String,
pub messages: Vec<Value>,
pub kwargs: Map<String, Value>,
pub config: Value,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CallInput {
pub config: Value,
pub messages: Vec<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub singleflight_key: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CallResponse {
pub content: String,
pub model: String,
pub provider: String,
pub usage: LlmUsage,
pub success: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thinking_content: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cache_hit: Option<CacheHitTier>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<Value>>,
}