1mod claude;
2mod openai;
3mod ollama;
4
5use crate::error::{Result, EthIdError};
6use crate::claims::ClaimQuery;
7use crate::privacy::FilteredData;
8use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct VerificationResult {
12 pub answer: bool,
13 pub confidence: f32,
14 pub reasoning: Option<String>,
15 pub proof: Option<String>,
16}
17
18pub enum LlmProvider {
19 Claude,
20 OpenAI,
21 Ollama,
22}
23
24impl LlmProvider {
25 pub fn from_str(s: &str) -> Result<Self> {
26 match s.to_lowercase().as_str() {
27 "claude" => Ok(LlmProvider::Claude),
28 "openai" => Ok(LlmProvider::OpenAI),
29 "ollama" => Ok(LlmProvider::Ollama),
30 _ => Err(EthIdError::Config(format!("Unknown provider: {}", s))),
31 }
32 }
33}
34
35pub struct VerifierEngine {
36 provider: LlmProvider,
37}
38
39impl VerifierEngine {
40 pub fn new(provider_name: &str) -> Result<Self> {
41 let provider = LlmProvider::from_str(provider_name)?;
42 Ok(Self { provider })
43 }
44
45 pub async fn verify(
46 &self,
47 claim_query: &ClaimQuery,
48 filtered_data: &FilteredData,
49 ) -> Result<VerificationResult> {
50 tracing::debug!("Verifying with LLM provider: {:?}",
51 match self.provider {
52 LlmProvider::Claude => "Claude",
53 LlmProvider::OpenAI => "OpenAI",
54 LlmProvider::Ollama => "Ollama",
55 }
56 );
57
58 match &self.provider {
59 LlmProvider::Claude => claude::verify(claim_query, filtered_data).await,
60 LlmProvider::OpenAI => openai::verify(claim_query, filtered_data).await,
61 LlmProvider::Ollama => ollama::verify(claim_query, filtered_data).await,
62 }
63 }
64}