use crate::BoxFuture;
use crate::BoxStream;
use crate::error::SynwireError;
use crate::language_models::types::{ChatChunk, ChatResult};
use crate::messages::Message;
use crate::runnables::RunnableConfig;
use crate::tools::ToolSchema;
pub trait BaseChatModel: Send + Sync {
fn invoke<'a>(
&'a self,
messages: &'a [Message],
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<ChatResult, SynwireError>>;
fn batch<'a>(
&'a self,
inputs: &'a [Vec<Message>],
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<Vec<ChatResult>, SynwireError>> {
Box::pin(async move {
let mut results = Vec::with_capacity(inputs.len());
for messages in inputs {
results.push(self.invoke(messages, config).await?);
}
Ok(results)
})
}
fn stream<'a>(
&'a self,
messages: &'a [Message],
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<BoxStream<'a, Result<ChatChunk, SynwireError>>, SynwireError>>;
fn model_type(&self) -> &str;
fn bind_tools(&self, _tools: &[ToolSchema]) -> Result<Box<dyn BaseChatModel>, SynwireError> {
Err(SynwireError::Prompt {
message: "bind_tools not supported by this model".into(),
})
}
}
pub trait BaseLLM: Send + Sync {
fn invoke<'a>(
&'a self,
prompt: &'a str,
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<String, SynwireError>>;
fn batch<'a>(
&'a self,
prompts: &'a [String],
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<Vec<String>, SynwireError>> {
Box::pin(async move {
let mut results = Vec::with_capacity(prompts.len());
for prompt in prompts {
results.push(self.invoke(prompt, config).await?);
}
Ok(results)
})
}
fn stream<'a>(
&'a self,
prompt: &'a str,
config: Option<&'a RunnableConfig>,
) -> BoxFuture<'a, Result<BoxStream<'a, Result<String, SynwireError>>, SynwireError>>;
fn model_type(&self) -> &str;
}