ic_rig/embeddings/mod.rs
1//! Embedding API — generate vector representations of text.
2//!
3//! # Three-layer structure
4//!
5//! ```text
6//! Embed trait ← your domain types declare what text to embed
7//! ↓
8//! EmbeddingsBuilder ← batches texts, calls the model, reassembles results
9//! ↓
10//! EmbeddingModel trait ← providers implement this (OpenAI, Gemini, …)
11//! ```
12//!
13//! # Quick start
14//!
15//! ```rust,ignore
16//! use irig::embeddings::{Embed, EmbeddingsBuilder, TextEmbedder, EmbedError};
17//! use irig::providers::openai;
18//!
19//! struct Article { title: String, body: String }
20//!
21//! impl Embed for Article {
22//! fn embed(&self, e: &mut TextEmbedder) -> Result<(), EmbedError> {
23//! e.embed(self.title.clone());
24//! e.embed(self.body.clone());
25//! Ok(())
26//! }
27//! }
28//!
29//! let model = openai::Client::new(http, api_key).embedding_model(openai::TEXT_EMBEDDING_3_SMALL);
30//!
31//! let results = EmbeddingsBuilder::new(model)
32//! .documents(articles)?
33//! .build()
34//! .await?;
35//!
36//! // results: Vec<(Article, Vec<Embedding>)>
37//! // Each Article gets two Embeddings: one for title, one for body.
38//! ```
39
40pub mod builder;
41pub mod distance;
42pub mod embed;
43pub mod embedding;
44
45pub use builder::EmbeddingsBuilder;
46pub use distance::{DistanceMetric, VectorDistance};
47pub use embed::{Embed, EmbedError, TextEmbedder, to_texts};
48pub use embedding::{Embedding, EmbeddingError, EmbeddingModel};