semantic_query/clients/claude/
mod.rs

1pub mod providers;
2pub mod models;
3pub mod config;
4
5pub use providers::*;
6pub use models::*;
7pub use config::*;
8
9use crate::core::LowLevelClient;
10use crate::error::AIError;
11use crate::config::KeyFromEnv;
12use async_trait::async_trait;
13
14#[derive(Clone, Debug)]
15pub enum ClaudeClientProvider {
16    Anthropic(AnthropicProvider),
17    Bedrock(BedrockProvider),
18    Vertex(VertexProvider),
19}
20
21impl ClaudeClientProvider {
22    async fn call_api(&self, request: &ClaudeRequest) -> Result<String, AIError> {
23        match self {
24            Self::Anthropic(provider) => provider.call_api(request).await,
25            Self::Bedrock(provider) => provider.call_api(request).await,
26            Self::Vertex(provider) => provider.call_api(request).await,
27        }
28    }
29}
30
31#[derive(Clone, Debug)]
32pub struct ClaudeClient {
33    provider: ClaudeClientProvider,
34    config: ClaudeConfig,
35}
36
37impl KeyFromEnv for ClaudeConfig {
38    const KEY_NAME: &'static str = "ANTHROPIC_API_KEY";
39}
40
41impl Default for ClaudeClient {
42    fn default() -> Self {
43        let config = ClaudeConfig::anthropic(ClaudeConfig::find_key().unwrap_or(String::new()), ClaudeModel::Haiku35);
44        Self::new(config)
45    }
46}
47
48impl ClaudeClient {
49    pub fn new(config: ClaudeConfig) -> Self {
50        let provider = match config.provider {
51            Provider::Anthropic => ClaudeClientProvider::Anthropic(AnthropicProvider::new(config.clone())),
52            Provider::AwsBedrock => ClaudeClientProvider::Bedrock(BedrockProvider::new(config.clone())),
53            Provider::GcpVertex => ClaudeClientProvider::Vertex(VertexProvider::new(config.clone())),
54        };
55
56        Self { provider, config }
57    }
58}
59
60#[async_trait]
61impl LowLevelClient for ClaudeClient {
62    async fn ask_raw(&self, prompt: String) -> Result<String, AIError> {
63        let request = ClaudeRequest::new(prompt, &self.config);
64        self.provider.call_api(&request).await
65    }
66
67    fn clone_box(&self) -> Box<dyn LowLevelClient> {
68        Box::new(self.clone())
69    }
70}