use crate::agent::AgentBuilder;
use crate::client::FinalCompletionResponse;
#[allow(deprecated)]
use crate::completion::CompletionModelDyn;
use crate::completion::{
CompletionError, CompletionModel, CompletionRequest, CompletionResponse, GetTokenUsage,
};
use crate::extractor::ExtractorBuilder;
use crate::streaming::StreamingCompletionResponse;
use crate::wasm_compat::WasmCompatSend;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::future::Future;
use std::sync::Arc;
pub trait CompletionClient {
type CompletionModel: CompletionModel<Client = Self>;
fn completion_model(&self, model: impl Into<String>) -> Self::CompletionModel {
Self::CompletionModel::make(self, model)
}
fn agent(&self, model: impl Into<String>) -> AgentBuilder<Self::CompletionModel> {
AgentBuilder::new(self.completion_model(model))
}
fn extractor<T>(&self, model: impl Into<String>) -> ExtractorBuilder<Self::CompletionModel, T>
where
T: JsonSchema + for<'a> Deserialize<'a> + Serialize + Send + Sync,
{
ExtractorBuilder::new(self.completion_model(model))
}
}
#[allow(deprecated)]
#[deprecated(
since = "0.25.0",
note = "`DynClientBuilder` and related features have been deprecated and will be removed in a future release."
)]
#[derive(Clone)]
pub struct CompletionModelHandle<'a>(Arc<dyn CompletionModelDyn + 'a>);
#[allow(deprecated)]
impl<'a> CompletionModelHandle<'a> {
pub fn new(handle: Arc<dyn CompletionModelDyn + 'a>) -> Self {
Self(handle)
}
}
#[allow(deprecated)]
impl CompletionModel for CompletionModelHandle<'_> {
type Response = ();
type StreamingResponse = FinalCompletionResponse;
type Client = ();
fn make(_: &Self::Client, _: impl Into<String>) -> Self {
panic!("Cannot create a completion model handle from a client")
}
fn completion(
&self,
request: CompletionRequest,
) -> impl Future<Output = Result<CompletionResponse<Self::Response>, CompletionError>> + WasmCompatSend
{
self.0.completion(request)
}
fn stream(
&self,
request: CompletionRequest,
) -> impl Future<
Output = Result<StreamingCompletionResponse<Self::StreamingResponse>, CompletionError>,
> + WasmCompatSend {
self.0.stream(request)
}
}
#[allow(deprecated)]
#[deprecated(
since = "0.25.0",
note = "`DynClientBuilder` and related features have been deprecated and will be removed in a future release. In this case, use `CompletionClient` instead."
)]
pub trait CompletionClientDyn {
fn completion_model<'a>(&self, model: &str) -> Box<dyn CompletionModelDyn + 'a>;
fn agent<'a>(&self, model: &str) -> AgentBuilder<CompletionModelHandle<'a>>;
}
#[allow(deprecated)]
impl<T, M, R> CompletionClientDyn for T
where
T: CompletionClient<CompletionModel = M>,
M: CompletionModel<StreamingResponse = R> + 'static,
R: Clone + Unpin + GetTokenUsage + 'static,
{
fn completion_model<'a>(&self, model: &str) -> Box<dyn CompletionModelDyn + 'a> {
Box::new(self.completion_model(model))
}
fn agent<'a>(&self, model: &str) -> AgentBuilder<CompletionModelHandle<'a>> {
AgentBuilder::new(CompletionModelHandle(Arc::new(
self.completion_model(model),
)))
}
}