use crate::utils::errors::ProviderError;
use async_trait::async_trait;
use serde::{de::Deserialize, Serialize};
use std::pin::Pin;
use tokio_stream::Stream;
#[async_trait]
pub trait ProviderStrategy {
type GenerationRequest: Serialize + Send + Sync;
type StreamingRequest: Serialize + Send + Sync;
type GenerationResponse: for<'de> Deserialize<'de> + Send;
type StreamingResponse: for<'de> Deserialize<'de> + Send;
fn get_base_url(&self) -> String;
fn get_api_key(&self) -> String;
async fn generate(
&self,
request: &Self::GenerationRequest,
) -> Result<Self::GenerationResponse, ProviderError>;
async fn stream(
&self,
request: &Self::StreamingRequest,
) -> Result<
Pin<Box<dyn Stream<Item = Result<Self::StreamingResponse, ProviderError>> + Send>>,
ProviderError,
>;
}