use crate::event_stream::AssistantMessageEventStream;
use crate::model::Model;
use crate::types::{Context, ThinkingBudgets, ThinkingLevel};
use std::collections::BTreeMap;
use std::time::Duration;
use tokio_util::sync::CancellationToken;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CacheRetention {
None,
#[default]
Short,
Long,
}
#[derive(Debug, Clone)]
pub struct SimpleStreamOptions {
pub api_key: Option<String>,
pub timeout: Option<Duration>,
pub max_retries: Option<u32>,
pub max_retry_delay: Option<Duration>,
pub headers: Option<BTreeMap<String, String>>,
pub metadata: Option<BTreeMap<String, String>>,
pub cache_retention: CacheRetention,
pub session_id: Option<String>,
pub signal: CancellationToken,
pub reasoning: Option<ThinkingLevel>,
pub max_tokens: Option<u64>,
pub temperature: Option<f64>,
pub thinking_budgets: Option<ThinkingBudgets>,
}
impl Default for SimpleStreamOptions {
fn default() -> Self {
Self {
api_key: None,
timeout: None,
max_retries: None,
max_retry_delay: None,
headers: None,
metadata: None,
cache_retention: CacheRetention::default(),
session_id: None,
signal: CancellationToken::new(),
reasoning: None,
max_tokens: None,
temperature: None,
thinking_budgets: None,
}
}
}
impl SimpleStreamOptions {
pub fn new() -> Self {
Self::default()
}
pub fn with_api_key(mut self, key: impl Into<String>) -> Self {
self.api_key = Some(key.into());
self
}
pub fn with_signal(mut self, signal: CancellationToken) -> Self {
self.signal = signal;
self
}
pub fn reasoning_level(&self) -> ThinkingLevel {
self.reasoning.unwrap_or(ThinkingLevel::Off)
}
}
#[async_trait::async_trait]
pub trait Provider: Send + Sync {
fn id(&self) -> &str;
fn models(&self) -> &[Model];
async fn stream_simple(
&self,
model: &Model,
ctx: &Context,
opts: &SimpleStreamOptions,
) -> AssistantMessageEventStream;
}