ferrin_spec/
embedding_model.rs1use std::future::Future;
4
5use serde::Deserialize;
6use serde::Serialize;
7use tokio_util::sync::CancellationToken;
8
9use crate::error::ProviderError;
10use crate::language_model::ResponseMetadata;
11use crate::shared::Headers;
12use crate::shared::ModelId;
13use crate::shared::ProviderId;
14use crate::shared::ProviderMetadata;
15use crate::shared::ProviderOptions;
16use crate::shared::Warning;
17
18pub type Embedding = Vec<f64>;
20
21pub trait EmbeddingModel: Send + Sync + 'static {
28 fn provider(&self) -> &ProviderId;
30
31 fn model_id(&self) -> &ModelId;
33
34 fn max_embeddings_per_call(&self) -> Option<usize>;
36
37 fn max_input_bytes_per_call(&self) -> Option<usize> {
40 None
41 }
42
43 fn supports_parallel_calls(&self) -> bool;
45
46 fn do_embed(
48 &self,
49 options: EmbedOptions,
50 ) -> impl Future<Output = Result<EmbedResult, ProviderError>> + Send;
51}
52
53#[derive(Debug, Clone, Default)]
55pub struct EmbedOptions {
56 pub values: Vec<String>,
58 pub headers: Headers,
60 pub provider_options: ProviderOptions,
62 pub cancellation: CancellationToken,
64}
65
66impl EmbedOptions {
67 #[must_use]
69 pub fn new(values: Vec<String>) -> Self {
70 Self {
71 values,
72 ..Self::default()
73 }
74 }
75}
76
77#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
79pub struct EmbeddingUsage {
80 pub tokens: u64,
82}
83
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
86pub struct EmbedResult {
87 pub embeddings: Vec<Embedding>,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub usage: Option<EmbeddingUsage>,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub provider_metadata: Option<ProviderMetadata>,
95 #[serde(default)]
97 pub response: ResponseMetadata,
98 #[serde(default)]
100 pub warnings: Vec<Warning>,
101}