Skip to main content

locus_sdk/infrastructure/sttp_native/
embedding_provider_adapter.rs

1use std::sync::Arc;
2
3use anyhow::{Result, anyhow};
4use async_trait::async_trait;
5use locus_core_rs::domain::contracts::EmbeddingProvider;
6use locus_core_rs::domain::models::AvecState;
7
8use crate::domain::ai::{AiCapability, AiProvider, EmbedRequest, ScoreAvecRequest};
9
10pub struct SttpEmbeddingProviderAdapter {
11    provider_id: String,
12    embedding: Arc<dyn EmbeddingProvider>,
13}
14
15impl SttpEmbeddingProviderAdapter {
16    pub fn new(provider_id: impl Into<String>, embedding: Arc<dyn EmbeddingProvider>) -> Self {
17        Self {
18            provider_id: provider_id.into(),
19            embedding,
20        }
21    }
22}
23
24#[async_trait]
25impl AiProvider for SttpEmbeddingProviderAdapter {
26    fn provider_id(&self) -> &str {
27        &self.provider_id
28    }
29
30    fn capabilities(&self) -> &'static [AiCapability] {
31        &[AiCapability::SemanticEmbedding, AiCapability::AvecEmbedding]
32    }
33
34    async fn embed_semantic(&self, request: &EmbedRequest) -> Result<Vec<f32>> {
35        self.embedding.embed_async(&request.text).await
36    }
37
38    async fn embed_avec(&self, request: &EmbedRequest) -> Result<Vec<f32>> {
39        self.embedding.embed_async(&request.text).await
40    }
41
42    async fn score_avec(&self, _request: &ScoreAvecRequest) -> Result<AvecState> {
43        Err(anyhow!("sttp embedding adapter does not implement AVEC scoring"))
44    }
45}