vtcode_core/llm/
client.rs

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