Skip to main content

relay_knowledge/adapters/
embedding.rs

1//! Remote embedding transport assembled from network capabilities.
2
3use crate::{
4    net::{NetworkRuntime, http},
5    ports::embedding::{
6        EmbeddingFuture, EmbeddingProvider, EmbeddingProviderError, EmbeddingRequest,
7        EmbeddingVector, ProviderRetryClass,
8    },
9    retrieval::{RemoteEmbeddingConfig, provider::embedding_provider_with_qos},
10};
11
12/// Lazy provider adapter that builds its HTTP client at request time.
13pub struct NetworkEmbeddingProvider {
14    config: RemoteEmbeddingConfig,
15    network: NetworkRuntime,
16}
17
18impl NetworkEmbeddingProvider {
19    pub fn new(config: RemoteEmbeddingConfig, network: NetworkRuntime) -> Self {
20        Self { config, network }
21    }
22}
23
24impl EmbeddingProvider for NetworkEmbeddingProvider {
25    fn embed(&self, request: EmbeddingRequest) -> EmbeddingFuture<'_, Vec<EmbeddingVector>> {
26        Box::pin(async move {
27            let network = self.network.current();
28            let client = http::outbound_json_client(&network.http).map_err(|error| {
29                EmbeddingProviderError {
30                    retry: ProviderRetryClass::Permanent,
31                    status_code: None,
32                    code: "client_build_failed".to_owned(),
33                    message: error.to_string(),
34                }
35            })?;
36            embedding_provider_with_qos(
37                self.config.clone(),
38                client,
39                self.network.qos_runtime(),
40                network.qos,
41            )
42            .embed(request)
43            .await
44        })
45    }
46}