Overview
Embeddings are numerical representations of text that capture semantic meaning in a high-dimensional vector space. They are a foundational building block for many LLM-powered applications, enabling machines to understand relationships between words, phrases, and documents.
Polyglot's Embeddings class provides a unified interface for generating vector embeddings across multiple providers. You write your code once, and switch between OpenAI, Cohere, Gemini, Jina, Mistral, or any other supported provider by changing a single preset name.
Understanding Embeddings¶
Before diving into the API, it helps to understand the core concepts:
- Vectors -- Embeddings represent text as arrays of floating-point numbers in a high-dimensional space (typically 256 to 3072 dimensions).
- Semantic similarity -- Texts with similar meaning produce vectors that are closer together, measurable through cosine similarity, Euclidean distance, or dot product.
- Provider models -- Different providers offer models with varying dimension counts, language support, and performance characteristics.
Common use cases for embeddings include:
- Semantic search -- Find documents similar to a query based on meaning, not just keywords.
- Clustering -- Group related documents together automatically.
- Classification -- Assign categories to text based on content.
- Recommendations -- Suggest related items based on vector proximity.
- RAG (Retrieval-Augmented Generation) -- Retrieve relevant context for LLM prompts.
The Embeddings Class¶
The Embeddings class is a facade that combines provider configuration, request building, and result handling into a fluent, immutable API. Every method that modifies state returns a new instance, making the class safe to reuse and compose.
Architecture Overview¶
The class is built from several focused components:
| Component | Responsibility |
|---|---|
Embeddings |
Facade with fluent API and static factory methods |
EmbeddingsRuntime |
Orchestrates driver creation, HTTP clients, and event dispatching |
EmbeddingsProvider |
Resolves configuration and optional explicit drivers |
PendingEmbeddings |
Executes the request with retry logic and returns the response |
EmbeddingsDriverRegistry |
Maps driver names to concrete driver implementations |
Entry Points¶
You can create an Embeddings instance in several ways, depending on how much control you need:
<?php
use Cognesy\Polyglot\Embeddings\Embeddings;
use Cognesy\Polyglot\Embeddings\Config\EmbeddingsConfig;
// From a named preset (most common)
$embeddings = Embeddings::using('openai');
// From a configuration object
$config = new EmbeddingsConfig(
apiUrl: 'https://api.openai.com/v1',
apiKey: getenv('OPENAI_API_KEY'),
endpoint: '/embeddings',
model: 'text-embedding-3-small',
dimensions: 1536,
maxInputs: 2048,
driver: 'openai',
);
$embeddings = Embeddings::fromConfig($config);
// From a provider instance (for advanced composition)
$embeddings = Embeddings::fromProvider($provider);
// From a custom runtime (full control over driver and events)
$embeddings = Embeddings::fromRuntime($runtime);
Request Methods¶
Configure what to embed before executing the request:
| Method | Description |
|---|---|
withInputs(string\|array $input) |
Set one or more texts to embed |
withModel(string $model) |
Override the model from the preset |
withOptions(array $options) |
Pass provider-specific options |
withRetryPolicy(EmbeddingsRetryPolicy $policy) |
Configure retry behavior |
withRequest(EmbeddingsRequest $request) |
Replace the entire request object |
with($input, $options, $model) |
Shorthand combining inputs, options, and model |
Execution Methods¶
Three convenience methods execute the request and return results at different levels of detail:
| Method | Returns | Description |
|---|---|---|
get() |
EmbeddingsResponse |
Full response with vectors, usage, and metadata |
vectors() |
Vector[] |
Array of all embedding vectors |
first() |
?Vector |
The first vector, or null if empty |
For advanced use cases, create() returns a PendingEmbeddings instance that you can inspect or execute manually.
Supported Providers¶
Polyglot ships with presets for the following providers:
| Preset | Driver | Default Model | Dimensions |
|---|---|---|---|
openai |
OpenAI | text-embedding-3-small |
1536 |
azure |
Azure OpenAI | (configured per deployment) | (varies) |
cohere |
Cohere | embed-multilingual-v3.0 |
1024 |
gemini |
Gemini | (configured per preset) | (varies) |
jina |
Jina | (configured per preset) | (varies) |
mistral |
OpenAI-compatible | (configured per preset) | (varies) |
ollama |
OpenAI-compatible | (configured per preset) | (varies) |
Note: Mistral and Ollama use the OpenAI-compatible driver, since their APIs follow the same format.
Custom Driver Registration¶
You can register your own driver for providers not bundled with Polyglot by creating a custom EmbeddingsDriverRegistry:
<?php
use Cognesy\Polyglot\Embeddings\Embeddings;
use Cognesy\Polyglot\Embeddings\Creation\BundledEmbeddingsDrivers;
// Start from the bundled registry and add your driver (by class name or factory callable)
$registry = BundledEmbeddingsDrivers::registry()
->withDriver('custom-provider', CustomEmbeddingsDriver::class);
// Or register with a factory callable
$registry = BundledEmbeddingsDrivers::registry()
->withDriver('custom-provider', function ($config, $httpClient, $events) {
return new CustomEmbeddingsDriver($config, $httpClient, $events);
});
Your custom driver must implement the CanHandleVectorization contract.
Events¶
The embeddings system dispatches events at key points during execution, which you can listen to through the runtime:
| Event | When |
|---|---|
EmbeddingsDriverBuilt |
After the driver is created from configuration |
EmbeddingsRequested |
When an embeddings request is initiated |
EmbeddingsResponseReceived |
After a successful response is received |
EmbeddingsFailed |
When the request fails after all retry attempts |