Agent Embeddings — Client Developer Documentation
Introduction
The Agents Embeddings SDK (agents_embeddings) provides one interface for generating embeddings from different backends, and a manager for registering several generators by name.
It provides:
- Pluggable backends:
- AIOS — embedding models served as AIOS blocks, called over REST (
AIOSEmbeddingsAPI). - OpenAI — the OpenAI Embeddings API (
OpenAIEmbeddingsGenerator). - Custom — your own subclass of
BaseEmbeddingsGenerator.
- AIOS — embedding models served as AIOS blocks, called over REST (
- Single and batched embedding of texts.
- Object embedding: embed any object exposing a text representation, keyed by its ID.
- A registry (
AgentEmbeddingsManager) for addressing generators by name.
A typical workflow is:
- Declare a ModelItem in the Subject Specification (optional) to record which embeddings model the agent uses.
- Create a generator — AIOS-backed or OpenAI/custom.
- Register it in
AgentEmbeddingsManager. - Generate embeddings for texts or objects.
Installation
The SDK lives in libs/embeddings-sdk and depends on openai and requests.
pip install ./libs/embeddings-sdk
Registering Embeddings in Subject Specification
Embedding models can be recorded in the subject's integrations.models list using a ModelItem.
Data Class Reference
from dataclasses import dataclass, field
from typing import Dict, Any
@dataclass
class ModelItem:
llm_type: str
llm_block_id: str
llm_selection_query: Dict[str, Any] = field(default_factory=dict)
llm_parameters: Dict[str, Any] = field(default_factory=dict)
Example Configuration
{
"llm_type": "embeddings",
"llm_block_id": "bge-large-embeddings-block",
"llm_selection_query": {},
"llm_parameters": {
"inference_server_id": "inference-server-1",
"batch_size": 64
}
}
Field Descriptions
| Field | Type | Description |
|---|---|---|
| llm_type | str |
Model kind, e.g. "embeddings". |
| llm_block_id | str |
ID of the AIOS block (or provider model name) to use. |
| llm_selection_query | dict |
Optional selector for picking a deployment. |
| llm_parameters | dict |
Backend settings, e.g. inference_server_id, batch_size. |
The agents SDK does not build generators from
ModelItementries automatically. Read the entry fromself.subject.integrations.modelsand pass its values toregister_new_generator(see below).
Import and Setup
from agents_embeddings.embeddings import AgentEmbeddingsManager
from agents_embeddings.aios import AIOSEmbeddingsAPI
from agents_embeddings.custom import BaseEmbeddingsGenerator, OpenAIEmbeddingsGenerator
AgentEmbeddingsManager
AgentEmbeddingsManager is a registry of named embeddings generators.
mgr = AgentEmbeddingsManager()
Register an AIOS-backed generator
mgr.register_new_generator(
name="bge",
model="bge-large-embeddings-block", # block ID of the embedding model
inference_server_id="inference-server-1", # or a direct URL: "http://10.0.0.5:8000"
aios_url_map={
"inference_server_url": "http://<inference-server-registry>",
"blocks_db_url": "http://<blocks-db>",
},
default_mode="embedding",
)
| Argument | Default | Description |
|---|---|---|
name |
— (required) | Registry name of the generator |
model |
— (required) | Block ID of the embedding model |
inference_server_id |
— (required) | Inference server ID, looked up in the registry; or an http(s):// URL used directly |
aios_url_map |
— (required) | inference_server_url (inference server registry) and, optionally, blocks_db_url (blocks DB, used to verify the model exists) |
session_id |
auto | Session ID sent with each request (embed-<uuid>) |
overwrite |
False |
Replace an existing generator with the same name (otherwise ValueError) |
default_mode |
"embedding" |
mode value sent to the inference server |
Each request is sent to POST <inference-server>/v1/infer:
{
"model": "bge-large-embeddings-block",
"session_id": "embed-...",
"seq_no": 1735689600123,
"data": { "mode": "embedding", "gen_params": {}, "texts": ["text one", "text two"] },
"graph": {},
"selection_query": {}
}
A single text is sent as "message" instead of "texts". The response may carry the vectors in any of data.embeddings, data.embedding (single input), data.data[].embedding or data.reply.embeddings.
Register a custom (e.g. OpenAI) generator
from openai import OpenAI
openai_gen = OpenAIEmbeddingsGenerator(
model="text-embedding-3-small", # default: "text-embedding-3-large"
client=OpenAI(), # optional; created from OPENAI_API_KEY if omitted
)
mgr.register_custom_generator(name="openai", generator=openai_gen, overwrite=True)
register_custom_generator only accepts instances of BaseEmbeddingsGenerator.
Manage generators
mgr.list_generators() # ['bge', 'openai']
mgr.has_generator("bge") # True
gen = mgr.get_generator("bge") # KeyError if missing
mgr.unregister_generator("bge")
mgr.clear_generators()
Generating Embeddings
Texts
vectors = mgr.embed_texts(
name="openai",
texts=["AI is transforming industries.", "Vector databases store embeddings."],
batch_size=0, # 0 = one request; > 0 = split into requests of this size
)
# -> List[List[float]], in input order
For AIOS generators you can also pass seq_no, extra_headers, mode and any extra keyword arguments. Extra arguments are sent as gen_params.
Objects
Any object with an ID attribute and a method returning its text can be embedded:
class Doc:
def __init__(self, doc_id, title, body):
self.id, self.title, self.body = doc_id, title, body
def get_searchable_representation(self) -> str:
return f"{self.title}\n{self.body}"
doc_vectors = mgr.embed_objects(
name="openai",
objects=[Doc("d1", "Intro LLMs", "Basics of LLMs."), Doc("d2", "Advanced RAG", "Retrieval.")],
id_attr="id",
rep_method="get_searchable_representation",
)
# -> {"d1": [...], "d2": [...]}
Generators can also be used directly: gen.embed_texts([...]) and gen.embed_objects([...]).
Errors (failed requests, unexpected response shapes, count mismatches) raise EmbeddingsError.
Writing a Custom Generator
Subclass BaseEmbeddingsGenerator and implement embed_texts. embed_objects is inherited.
from typing import Any, List, Sequence
from agents_embeddings.custom import BaseEmbeddingsGenerator
class HashEmbeddings(BaseEmbeddingsGenerator):
def __init__(self, dims: int = 8, **kwargs: Any):
super().__init__(model="hash", **kwargs)
self.dims = dims
def embed_texts(self, texts: Sequence[str], *, batch_size: int = 0, **kwargs: Any) -> List[List[float]]:
return [[float((hash(t) >> i) & 1) for i in range(self.dims)] for t in texts]
mgr.register_custom_generator(name="hash", generator=HashEmbeddings(dims=16))
BaseEmbeddingsGenerator.__init__ takes keyword-only model, session_id and logger.
Using Embeddings with a Vector Database
Generators plug directly into the vector database add-on (agent_addons.embeddings_store.EmbeddingsSDK) as the embedder:
from agent_addons.embeddings_store import EmbeddingsSDK
vdb = EmbeddingsSDK(provider="weaviate", weaviate_url="http://localhost:8080")
vdb.insert_texts("KnowledgeBase", ["hello world"], embedder=mgr.get_generator("openai"))