#[cfg(feature = "stream")]
use crate::error::ChatError;
#[cfg(feature = "stream")]
use crate::types::response::StreamEvent;
use crate::{
error::ChatFailure,
types::{
messages::Messages,
options::ChatOptions,
provider_meta::ProviderMeta,
response::{ChatResponse, EmbeddingsResponse},
tools::ToolDeclarations,
},
};
use async_trait::async_trait;
#[cfg(feature = "stream")]
use futures::stream::BoxStream;
#[async_trait]
pub trait CompletionProvider: Send + Sync {
async fn complete(
&mut self,
messages: &mut Messages,
tool_declarations: Option<&dyn ToolDeclarations>,
options: Option<&ChatOptions>,
structured_output: Option<&schemars::Schema>,
) -> Result<ChatResponse, ChatFailure>;
fn metadata(&self) -> Option<&ProviderMeta> {
None
}
}
#[cfg(feature = "stream")]
#[async_trait]
pub trait StreamProvider: Send + Sync {
async fn stream(
&mut self,
messages: &mut Messages,
tool_declarations: Option<&dyn ToolDeclarations>,
options: Option<&ChatOptions>,
) -> Result<BoxStream<'static, Result<StreamEvent, ChatError>>, ChatError>;
fn on_stream_done(&mut self, _response: &ChatResponse) {}
}
#[cfg(feature = "stream")]
pub trait ChatProvider: CompletionProvider + StreamProvider {}
#[cfg(feature = "stream")]
impl<T: CompletionProvider + StreamProvider> ChatProvider for T {}
#[async_trait]
pub trait EmbeddingsProvider: Send + Sync {
async fn embed(&self, messages: &mut Messages) -> Result<EmbeddingsResponse, ChatFailure>;
}