1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//! Embedder trait for text-to-vector conversion.
//!
//! This module defines the [`Embedder`] trait for generating text embeddings.
//! Vector-based memory backends (like Qdrant) require an embedder to convert
//! text into dense vectors for semantic similarity search.
//!
//! # Built-in Embedders
//!
//! - `OpenAIEmbedder`: Uses `OpenAI`'s embedding API (requires `memory-qdrant` feature)
//!
//! # Custom Embedders
//!
//! You can implement the `Embedder` trait for any embedding provider:
//!
//! ```ignore
//! use radkit::runtime::memory::Embedder;
//! use radkit::errors::AgentResult;
//!
//! pub struct LocalEmbedder {
//! model: SomeLocalModel,
//! }
//!
//! #[async_trait::async_trait]
//! impl Embedder for LocalEmbedder {
//! async fn embed(&self, text: &str) -> AgentResult<Vec<f32>> {
//! Ok(self.model.encode(text))
//! }
//!
//! fn dimension(&self) -> usize {
//! 384 // e.g., all-MiniLM-L6-v2
//! }
//!
//! fn model_id(&self) -> &str {
//! "local:all-MiniLM-L6-v2"
//! }
//! }
//! ```
use crate;
use crateAgentResult;
/// Trait for generating text embeddings.
///
/// Embedders convert text into dense vectors that capture semantic meaning.
/// These vectors can then be used for similarity search in vector databases.
///
/// # Thread Safety
///
/// Implementations must be `Send + Sync` (via `MaybeSend + MaybeSync`) to
/// support concurrent access across async tasks.