An AI agent built to do Ralph loops - plan mode for planning and ralph mode for implementing.
1use crate::config::{Config, LlmConfig, LlmProvider};
2use crate::llm::LlmClient;
3use crate::llm::anthropic::AnthropicClient;
4use crate::llm::ollama::OllamaClient;
5use crate::llm::openai::OpenAiClient;
6use anyhow::Result;
7use std::sync::Arc;
8
9pub fn create_client(config: &Config, llm_config: &LlmConfig) -> Result<Arc<dyn LlmClient>> {
10 match llm_config.provider {
11 LlmProvider::Anthropic => {
12 let anthropic_config = config.anthropic.as_ref().ok_or_else(|| {
13 anyhow::anyhow!("Anthropic provider selected but [anthropic] config missing")
14 })?;
15
16 Ok(Arc::new(AnthropicClient::new(
17 anthropic_config.api_key.clone(),
18 llm_config.model.clone(),
19 llm_config.max_tokens,
20 )))
21 }
22 LlmProvider::OpenAi => {
23 let openai_config = config.openai.as_ref().ok_or_else(|| {
24 anyhow::anyhow!("OpenAI provider selected but [openai] config missing")
25 })?;
26
27 Ok(Arc::new(OpenAiClient::new(
28 openai_config.api_key.clone(),
29 llm_config.model.clone(),
30 llm_config.max_tokens,
31 )))
32 }
33 LlmProvider::Ollama => {
34 let ollama_config = config.ollama.as_ref().ok_or_else(|| {
35 anyhow::anyhow!("Ollama provider selected but [ollama] config missing")
36 })?;
37
38 Ok(Arc::new(OllamaClient::new(
39 ollama_config.base_url.clone(),
40 llm_config.model.clone(),
41 )))
42 }
43 }
44}