use super::{
error::{CompletionError, CompletionResult},
functions::Function,
streaming::ProviderStreamHandler,
ModelParameters,
};
use crate::agents::memory::MessageStack;
use futures::Future;
use reqwest::{header::HeaderMap, Response};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::{fmt::Debug, pin::Pin};
#[allow(unused)]
pub(crate) trait CompletionRequestBuilder: Debug + Sync + Send + 'static {
fn model_str(&self) -> &str;
fn url_str(&self) -> &str;
fn serialize_messages(&self, stack: &MessageStack) -> Value;
fn headers(&self, api_key: &str) -> HeaderMap;
fn into_io_req(
&self,
stack: &MessageStack,
params: &ModelParameters,
) -> CompletionResult<Box<dyn CompletionRequest>> {
Err(CompletionError::FunctionNotImplemented)
}
fn into_stream_req(
&self,
stack: &MessageStack,
params: &ModelParameters,
) -> CompletionResult<Box<dyn CompletionRequest>> {
Err(CompletionError::FunctionNotImplemented)
}
fn serialize_function(
&self,
stack: &MessageStack,
function: Function,
) -> CompletionResult<Value> {
Err(CompletionError::FunctionNotImplemented)
}
fn process_function_response(&self, response_json: Value) -> CompletionResult<Value> {
Err(CompletionError::FunctionNotImplemented)
}
}
pub type ProcessResponseReturn<'r> =
Pin<Box<dyn Future<Output = CompletionResult<CompletionResponse>> + Send + Sync + 'r>>;
pub trait CompletionRequest: Debug + Sync + Send + 'static {
fn as_json(&self) -> CompletionResult<Value>;
fn process_response<'r>(&'r self, response: Response) -> ProcessResponseReturn;
}
#[derive(Debug, Serialize, Deserialize)]
pub enum CompletionResponse {
Io(String),
#[serde(skip)]
Stream(ProviderStreamHandler),
Function(Value),
}
impl From<String> for CompletionResponse {
fn from(value: String) -> Self {
Self::Io(value)
}
}
impl From<ProviderStreamHandler> for CompletionResponse {
fn from(value: ProviderStreamHandler) -> Self {
Self::Stream(value)
}
}
impl From<Value> for CompletionResponse {
fn from(value: Value) -> Self {
Self::Function(value)
}
}
impl TryInto<String> for CompletionResponse {
type Error = CompletionError;
fn try_into(self) -> Result<String, Self::Error> {
if let Self::Io(s) = self {
return Ok(s);
}
Err(CompletionError::CouldNotCoerce)
}
}
impl TryInto<ProviderStreamHandler> for CompletionResponse {
type Error = CompletionError;
fn try_into(self) -> Result<ProviderStreamHandler, Self::Error> {
if let Self::Stream(s) = self {
return Ok(s);
}
Err(CompletionError::CouldNotCoerce)
}
}
impl TryInto<Value> for CompletionResponse {
type Error = CompletionError;
fn try_into(self) -> Result<Value, Self::Error> {
if let Self::Function(s) = self {
return Ok(s);
}
Err(CompletionError::CouldNotCoerce)
}
}