semantic_query/clients/claude/
mod.rs1pub 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}