synwire_core/language_models/
traits.rs1use crate::BoxFuture;
4use crate::BoxStream;
5use crate::error::SynwireError;
6use crate::language_models::types::{ChatChunk, ChatResult};
7use crate::messages::Message;
8use crate::runnables::RunnableConfig;
9use crate::tools::ToolSchema;
10
11pub trait BaseChatModel: Send + Sync {
26 fn invoke<'a>(
28 &'a self,
29 messages: &'a [Message],
30 config: Option<&'a RunnableConfig>,
31 ) -> BoxFuture<'a, Result<ChatResult, SynwireError>>;
32
33 fn batch<'a>(
35 &'a self,
36 inputs: &'a [Vec<Message>],
37 config: Option<&'a RunnableConfig>,
38 ) -> BoxFuture<'a, Result<Vec<ChatResult>, SynwireError>> {
39 Box::pin(async move {
40 let mut results = Vec::with_capacity(inputs.len());
41 for messages in inputs {
42 results.push(self.invoke(messages, config).await?);
43 }
44 Ok(results)
45 })
46 }
47
48 fn stream<'a>(
50 &'a self,
51 messages: &'a [Message],
52 config: Option<&'a RunnableConfig>,
53 ) -> BoxFuture<'a, Result<BoxStream<'a, Result<ChatChunk, SynwireError>>, SynwireError>>;
54
55 fn model_type(&self) -> &str;
57
58 fn bind_tools(&self, _tools: &[ToolSchema]) -> Result<Box<dyn BaseChatModel>, SynwireError> {
60 Err(SynwireError::Prompt {
61 message: "bind_tools not supported by this model".into(),
62 })
63 }
64}
65
66pub trait BaseLLM: Send + Sync {
70 fn invoke<'a>(
72 &'a self,
73 prompt: &'a str,
74 config: Option<&'a RunnableConfig>,
75 ) -> BoxFuture<'a, Result<String, SynwireError>>;
76
77 fn batch<'a>(
79 &'a self,
80 prompts: &'a [String],
81 config: Option<&'a RunnableConfig>,
82 ) -> BoxFuture<'a, Result<Vec<String>, SynwireError>> {
83 Box::pin(async move {
84 let mut results = Vec::with_capacity(prompts.len());
85 for prompt in prompts {
86 results.push(self.invoke(prompt, config).await?);
87 }
88 Ok(results)
89 })
90 }
91
92 fn stream<'a>(
94 &'a self,
95 prompt: &'a str,
96 config: Option<&'a RunnableConfig>,
97 ) -> BoxFuture<'a, Result<BoxStream<'a, Result<String, SynwireError>>, SynwireError>>;
98
99 fn model_type(&self) -> &str;
101}