use crate::{
AudioSpeechRequest, ChatCompletionChunk, ChatCompletionRequest, ChatCompletionResponse,
EmbeddingRequest, EmbeddingResponse, Error, ImageRequest, MultipartField,
};
use bytes::Bytes;
use futures_core::Stream;
use std::{future::Future, pin::Pin};
pub type BoxStream<'a, T> = Pin<Box<dyn Stream<Item = T> + Send + 'a>>;
pub trait Provider: Send + Sync {
fn chat_completion(
&self,
request: &ChatCompletionRequest,
) -> impl Future<Output = Result<ChatCompletionResponse, Error>> + Send;
fn chat_completion_stream(
&self,
request: &ChatCompletionRequest,
) -> impl Future<Output = Result<BoxStream<'static, Result<ChatCompletionChunk, Error>>, Error>> + Send;
fn embedding(
&self,
_request: &EmbeddingRequest,
) -> impl Future<Output = Result<EmbeddingResponse, Error>> + Send {
async { Err(Error::not_implemented("embedding")) }
}
fn image_generation(
&self,
_request: &ImageRequest,
) -> impl Future<Output = Result<(Bytes, String), Error>> + Send {
async { Err(Error::not_implemented("image_generation")) }
}
fn audio_speech(
&self,
_request: &AudioSpeechRequest,
) -> impl Future<Output = Result<(Bytes, String), Error>> + Send {
async { Err(Error::not_implemented("audio_speech")) }
}
fn audio_transcription(
&self,
_model: &str,
_fields: &[MultipartField],
) -> impl Future<Output = Result<(Bytes, String), Error>> + Send {
async { Err(Error::not_implemented("audio_transcription")) }
}
}