use async_trait::async_trait;
use crate::error::{AgentError, Result};
use crate::types::{File, GenerationChunk, GenerationResponse, Message};
use futures::stream::BoxStream;
#[async_trait]
pub trait LLM: Send + Sync {
async fn generate(
&self,
messages: Vec<Message>,
files: Option<Vec<File>>,
) -> Result<GenerationResponse>;
async fn stream_generate(
&self,
_messages: Vec<Message>,
_files: Option<Vec<File>>,
) -> Result<BoxStream<'static, Result<GenerationChunk>>> {
Err(AgentError::ModelError("Streaming not implemented for this provider".into()))
}
fn model_name(&self) -> &str;
}
#[cfg(feature = "gemini")]
pub mod gemini;
#[cfg(feature = "ollama")]
pub mod ollama;
#[cfg(feature = "anthropic")]
pub mod anthropic;
#[cfg(feature = "openai")]
pub mod openai;
#[cfg(feature = "gemini")]
pub use gemini::GeminiLLM;
#[cfg(feature = "ollama")]
pub use ollama::OllamaLLM;
#[cfg(feature = "anthropic")]
pub use anthropic::AnthropicLLM;
#[cfg(feature = "openai")]
pub use openai::OpenAILLM;