use anyhow::Result;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use super::types::{
CompletionRequest, CompletionResponse, EmbeddingRequest, EmbeddingResponse, StreamChunk,
};
#[async_trait]
pub trait Provider: Send + Sync {
fn name(&self) -> &str;
async fn list_models(&self) -> Result<Vec<ModelInfo>>;
async fn complete(&self, request: CompletionRequest) -> Result<CompletionResponse>;
async fn complete_stream(
&self,
request: CompletionRequest,
) -> Result<futures::stream::BoxStream<'static, StreamChunk>>;
async fn embed(&self, _request: EmbeddingRequest) -> Result<EmbeddingResponse> {
anyhow::bail!("Provider '{}' does not support embeddings", self.name())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelInfo {
pub id: String,
pub name: String,
pub provider: String,
pub context_window: usize,
pub max_output_tokens: Option<usize>,
pub supports_vision: bool,
pub supports_tools: bool,
pub supports_streaming: bool,
pub input_cost_per_million: Option<f64>,
pub output_cost_per_million: Option<f64>,
}