use async_trait::async_trait;
use tokio::sync::mpsc;
use super::types::{
ModelChatRequest, ModelChatResponse, ModelEmbeddingRequest, ModelEmbeddingResponse, ModelError,
ModelInfo, ModelStreamChunk,
};
#[async_trait]
pub trait ModelProvider: Send + Sync {
fn provider_id(&self) -> String;
fn cache_namespace(&self) -> String {
self.provider_id()
}
async fn list_models(&self) -> Result<Vec<ModelInfo>, ModelError>;
async fn chat(&self, req: ModelChatRequest) -> Result<ModelChatResponse, ModelError>;
async fn stream_chat(
&self,
req: ModelChatRequest,
tx: mpsc::Sender<ModelStreamChunk>,
) -> Result<(), ModelError>;
async fn embedding(
&self,
req: ModelEmbeddingRequest,
) -> Result<ModelEmbeddingResponse, ModelError>;
async fn is_available(&self) -> bool {
true
}
}