vtcode_core/llm/
client.rs

1use super::provider::LLMError;
2use super::providers::{AnthropicProvider, GeminiProvider, OpenAIProvider, OpenRouterProvider};
3use super::types::{BackendKind, LLMResponse};
4use crate::config::models::{ModelId, Provider};
5use async_trait::async_trait;
6
7/// Unified LLM client trait
8#[async_trait]
9pub trait LLMClient: Send + Sync {
10    async fn generate(&mut self, prompt: &str) -> Result<LLMResponse, LLMError>;
11    fn backend_kind(&self) -> BackendKind;
12    fn model_id(&self) -> &str;
13}
14
15/// Type-erased LLM client
16pub type AnyClient = Box<dyn LLMClient>;
17
18/// Create a client based on the model ID
19pub fn make_client(api_key: String, model: ModelId) -> AnyClient {
20    match model.provider() {
21        Provider::Gemini => Box::new(GeminiProvider::with_model(
22            api_key,
23            model.as_str().to_string(),
24        )),
25        Provider::OpenAI => Box::new(OpenAIProvider::with_model(
26            api_key,
27            model.as_str().to_string(),
28        )),
29        Provider::Anthropic => Box::new(AnthropicProvider::new(api_key)),
30        Provider::OpenRouter => Box::new(OpenRouterProvider::with_model(
31            api_key,
32            model.as_str().to_string(),
33        )),
34    }
35}