use std::pin::Pin;
use async_trait::async_trait;
use futures::Stream;
use crate::{FunctionDefinition, GenerateResult, LlmError, Message, StreamData, ToolChoice};
#[async_trait]
pub trait Llm: Sync + Send {
async fn generate(&self, messages: &[Message]) -> Result<GenerateResult, LlmError>;
async fn generate_with_tools(
&self,
_messages: &[Message],
_tools: &[FunctionDefinition],
_tool_choice: Option<ToolChoice>,
) -> Result<GenerateResult, LlmError> {
Err(LlmError::ToolUseNotSupported(
"this provider does not support native function calling".into(),
))
}
async fn stream(
&self,
_messages: &[Message],
) -> Result<Pin<Box<dyn Stream<Item = Result<StreamData, LlmError>> + Send>>, LlmError> {
Err(LlmError::Other(
"streaming is not supported by this LLM provider".into(),
))
}
}