use std::collections::HashMap;
use secrecy::SecretString;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Role {
System,
User,
Assistant,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub role: Role,
pub content: String,
}
#[derive(Clone)]
pub enum ApiKey {
UserSupplied(SecretString),
IntentryOwned,
}
impl std::fmt::Debug for ApiKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ApiKey::UserSupplied(_) => write!(f, "ApiKey::UserSupplied([REDACTED])"),
ApiKey::IntentryOwned => write!(f, "ApiKey::IntentryOwned"),
}
}
}
#[derive(Debug, Clone)]
pub struct GenerateRequest {
pub model: String,
pub messages: Vec<Message>,
pub temperature: Option<f32>,
pub max_tokens: Option<u32>,
pub json_mode: bool,
pub extra: HashMap<String, serde_json::Value>,
pub api_key: ApiKey,
pub timeout_ms: u32,
}
impl Default for GenerateRequest {
fn default() -> Self {
Self {
model: String::new(),
messages: Vec::new(),
temperature: None,
max_tokens: None,
json_mode: false,
extra: HashMap::new(),
api_key: ApiKey::IntentryOwned,
timeout_ms: 30_000,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FinishReason {
Stop,
MaxTokens,
ContentFilter,
Other(String),
}
#[derive(Debug, Clone)]
pub struct GenerateResponse {
pub text: String,
pub finish_reason: FinishReason,
pub tokens_in: u32,
pub tokens_out: u32,
pub model_used: String,
pub latency_ms: u32,
pub raw_response: serde_json::Value,
}