Skip to main content

eth_id/verifier/
mod.rs

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}