pub mod openai;
pub mod anthropic;
pub mod openai_compatible;
pub mod azure;
pub mod vertex;
pub mod openrouter;
pub mod xai;
pub mod gemini;
pub mod local;
use async_trait::async_trait;
use tokio::sync::mpsc;
use crate::core::error::ProviderError;
use crate::core::TokenUsage;
use crate::llm::{Provider, ProviderEvent, ProviderResponse, Model};
pub use openai::OpenAIProvider;
pub use anthropic::AnthropicProvider;
pub use openai_compatible::{OpenAICompatibleProvider, CompatibleProviderConfig};
pub use gemini::GeminiProvider;
pub use azure::AzureProvider;
pub use vertex::VertexProvider;
pub use openrouter::OpenRouterProvider;
pub use xai::XaiProvider;
pub use local::LocalProvider;
use crate::storage::Message;
use crate::tools::Tool;
pub struct MockProvider {
model: Model,
}
impl MockProvider {
pub fn new() -> Self {
Self {
model: Model {
id: "mock-model".to_string(),
name: "Mock Model".to_string(),
provider: "mock".to_string(),
context_length: 4000,
max_output_tokens: 1000,
supports_tools: true,
supports_streaming: true,
supports_vision: false,
cost_per_input_token: 0.0,
cost_per_output_token: 0.0,
capabilities: crate::llm::ModelCapabilities::default(),
},
}
}
}
#[async_trait]
impl Provider for MockProvider {
async fn send_messages(
&self,
_messages: Vec<Message>,
_tools: Vec<Box<dyn Tool>>,
) -> Result<ProviderResponse, ProviderError> {
Ok(ProviderResponse {
content: "This is a mock response from the mock provider.".to_string(),
tool_calls: Vec::new(),
token_usage: Some(TokenUsage {
input_tokens: 10,
output_tokens: 15,
total_tokens: 25,
cache_creation_tokens: 0,
cache_read_tokens: 0,
}),
metadata: serde_json::Value::Null,
})
}
async fn stream_response(
&self,
_messages: Vec<Message>,
_tools: Vec<Box<dyn Tool>>,
) -> Result<mpsc::Receiver<Result<ProviderEvent, ProviderError>>, ProviderError> {
let (tx, rx) = mpsc::channel(10);
tokio::spawn(async move {
let _ = tx.send(Ok(ProviderEvent::ContentChunk {
content: "This is a ".to_string(),
})).await;
let _ = tx.send(Ok(ProviderEvent::ContentChunk {
content: "mock streaming ".to_string(),
})).await;
let _ = tx.send(Ok(ProviderEvent::ContentChunk {
content: "response.".to_string(),
})).await;
let _ = tx.send(Ok(ProviderEvent::Complete {
token_usage: Some(TokenUsage {
input_tokens: 10,
output_tokens: 15,
total_tokens: 25,
cache_creation_tokens: 0,
cache_read_tokens: 0,
}),
})).await;
});
Ok(rx)
}
fn model(&self) -> &Model {
&self.model
}
fn name(&self) -> &str {
"mock"
}
async fn is_available(&self) -> bool {
true
}
}