locus_sdk/infrastructure/sttp_native/
embedding_provider_adapter.rs1use 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}