Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
29d7e7a
feat: Add first cut bedrock embedding model implementation
bitnahian Jan 15, 2026
8c95b1b
test: Adding vcrpy tests for reasonable bedrock models
bitnahian Jan 15, 2026
de195de
fix: failing CI tests
bitnahian Jan 15, 2026
d577dc3
docs: Add Bedrock embedding model section to documentation
bitnahian Jan 15, 2026
4b1ffe2
refactor: Make API simpler and better override implementation
bitnahian Jan 15, 2026
cb45092
docs: Update BedrockProvider example fix E402
bitnahian Jan 15, 2026
4c580c9
Merge branch 'main' into bitnahian-bedrock-embeddings
bitnahian Jan 15, 2026
90679f2
refactor: Simplify Bedrock embedding model handling and improve test …
bitnahian Jan 15, 2026
a5acd31
docs: Add regional prefixes section and note on token counting for Be…
bitnahian Jan 15, 2026
fac0841
refactor: Update Bedrock model inference to use infer_embedding_model…
bitnahian Jan 16, 2026
4661cb9
refactor: Update TestBedrock to use bedrock_provider in infer_embeddi…
bitnahian Jan 16, 2026
a45cfb1
refactor: Try to fix infer_model coverage
bitnahian Jan 16, 2026
b15b0aa
refactor: Update TestBedrock to set environment variables for infer_m…
bitnahian Jan 16, 2026
3772a1e
docs: Clarify note on token counting for Bedrock embedding models
bitnahian Jan 16, 2026
8a30649
refactor: Improve imports and update assertions for text input
bitnahian Jan 17, 2026
bc6f75c
refactor: Update Bedrock embedding settings for consistency in naming…
bitnahian Jan 17, 2026
22cfc23
refactor: Remove extra body overrides to make each handler more opini…
bitnahian Jan 18, 2026
5a76cf0
refactor: Simplify parse_response method signatures and update relate…
bitnahian Jan 18, 2026
5c4ebae
refactor: Make geo prefix removal logic a common function and update …
bitnahian Jan 18, 2026
22d1141
refactor: Update AWS Bedrock authentication documentation and improve…
bitnahian Jan 18, 2026
cdfdd88
refactor: Enhance truncation settings documentation and logic for Bed…
bitnahian Jan 18, 2026
7af0a7d
refactor: Update Bedrock Nova documentation to include S3 URI support…
bitnahian Jan 18, 2026
0a01e50
refactor: Update Bedrock embedding settings documentation to clarify …
bitnahian Jan 18, 2026
9c3cf95
refactor: Update vcrpy tests
bitnahian Jan 18, 2026
5b4f3c3
Merge branch 'main' into bitnahian-bedrock-embeddings
bitnahian Jan 18, 2026
3d1f2fb
Refactor test fixtures and update embedding tests
bitnahian Jan 18, 2026
564752c
refactor: Add s3 vcrpy cassette for nova
bitnahian Jan 18, 2026
d90a5c0
refactor: Update Bedrock embedding example to use test bucket and ski…
bitnahian Jan 18, 2026
dd7736c
tests: Fix coverage with missed tests for cohere
bitnahian Jan 18, 2026
0d29e6e
docs: Update documentation to clarify that the embedding client only …
bitnahian Jan 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/api/embeddings.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

::: pydantic_ai.embeddings.google

::: pydantic_ai.embeddings.bedrock

::: pydantic_ai.embeddings.sentence_transformers

::: pydantic_ai.embeddings.test
Expand Down
150 changes: 150 additions & 0 deletions docs/embeddings.md
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,156 @@ embedder = Embedder(
)
```

### Bedrock

[`BedrockEmbeddingModel`][pydantic_ai.embeddings.bedrock.BedrockEmbeddingModel] provides access to embedding models through AWS Bedrock, including Amazon Titan, Cohere, and Amazon Nova models.

#### Install

To use Bedrock embedding models, you need to either install `pydantic-ai`, or install `pydantic-ai-slim` with the `bedrock` optional group:

```bash
pip/uv-add "pydantic-ai-slim[bedrock]"
```

#### Configuration

Authentication with AWS Bedrock uses standard AWS credentials. See the [Bedrock provider documentation](models/bedrock.md#environment-variables) for details on configuring credentials via environment variables, AWS credentials file, or IAM roles.

Ensure your AWS account has access to the Bedrock embedding models you want to use. See [AWS Bedrock model access](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) for details.

#### Basic Usage

```python {title="bedrock_embeddings.py" test="skip"}
from pydantic_ai import Embedder

# Using Amazon Titan
embedder = Embedder('bedrock:amazon.titan-embed-text-v2:0')


async def main():
result = await embedder.embed_query('Hello world')
print(len(result.embeddings[0]))
#> 1024
```

_(This example requires AWS credentials configured)_

#### Supported Models

Bedrock supports three families of embedding models via [`BedrockEmbeddingSettings`][pydantic_ai.embeddings.bedrock.BedrockEmbeddingSettings]. See the [AWS Bedrock documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html) for the full list of available models.

##### Amazon Titan

- `amazon.titan-embed-text-v1` — 1536 dimensions, 8K tokens
- `amazon.titan-embed-text-v2:0` — 256/384/1024 dimensions (configurable), 8K tokens

**Titan-specific settings:**

- `bedrock_titan_normalize` — Normalize embedding vectors for direct similarity calculations.

```python {title="bedrock_titan.py"}
from pydantic_ai import Embedder
from pydantic_ai.embeddings.bedrock import BedrockEmbeddingSettings

embedder = Embedder(
'bedrock:amazon.titan-embed-text-v2:0',
settings=BedrockEmbeddingSettings(
bedrock_titan_normalize=True,
),
)
```

##### Cohere Embed

- `cohere.embed-english-v3` — English-only, 512 tokens
- `cohere.embed-multilingual-v3` — Multilingual, 512 tokens
- `cohere.embed-v4:0` — Latest Cohere model, 128K tokens

**Cohere-specific settings:**

- `bedrock_cohere_max_tokens` — Maximum number of tokens to embed.
- `bedrock_cohere_input_type` — Input type: `'search_query'`, `'search_document'`, `'classification'`, or `'clustering'`. Defaults to `'search_query'` for `embed_query()` and `'search_document'` for `embed_documents()`.
- `bedrock_cohere_truncate` — Truncation strategy: `'NONE'` (default, raises error if input exceeds max tokens), `'START'`, or `'END'`. Overrides the base `truncate` setting if provided.

```python {title="bedrock_cohere.py"}
from pydantic_ai import Embedder
from pydantic_ai.embeddings.bedrock import BedrockEmbeddingSettings

embedder = Embedder(
'bedrock:cohere.embed-english-v3',
settings=BedrockEmbeddingSettings(
bedrock_cohere_truncate='END',
),
)
```

##### Amazon Nova

- `amazon.nova-2-multimodal-embeddings-v1:0` — Multimodal embeddings, 8K tokens

**Nova-specific settings:**

- `bedrock_nova_truncate` — Truncation strategy: `'NONE'` (default, raises error if input exceeds max tokens), `'START'`, or `'END'`. Overrides the base `truncate` setting if provided.
- `bedrock_nova_embedding_purpose` — Embedding purpose. Defaults to `'GENERIC_RETRIEVAL'` for `embed_query()` and `'GENERIC_INDEX'` for `embed_documents()`. Other options: `'TEXT_RETRIEVAL'`, `'CLASSIFICATION'`, `'CLUSTERING'`.

```python {title="bedrock_nova.py"}
from pydantic_ai import Embedder
from pydantic_ai.embeddings.bedrock import BedrockEmbeddingSettings

embedder = Embedder(
'bedrock:amazon.nova-2-multimodal-embeddings-v1:0',
settings=BedrockEmbeddingSettings(
bedrock_nova_embedding_purpose='TEXT_RETRIEVAL',
),
)
```

Nova also supports S3 URIs as input for embedding files stored in S3:

```python {title="bedrock_nova_s3.py" test="skip"}
from pydantic_ai import Embedder

embedder = Embedder('bedrock:amazon.nova-2-multimodal-embeddings-v1:0')


async def main():
result = await embedder.embed_query('s3://pydantic-ai-test-bucket/hello-world.txt')
print(len(result.embeddings[0]))
```

#### Regional Prefixes (Cross-Region Inference)

Bedrock supports cross-region inference using geographic prefixes like `us.`, `eu.`, or `apac.`:

```python {title="bedrock_regional.py"}
from pydantic_ai import Embedder

embedder = Embedder('bedrock:us.amazon.titan-embed-text-v2:0')
```

!!! note "Token Counting"
Bedrock embedding models do not support the `count_tokens()` method because AWS Bedrock's token counting API only works with text generation models (Claude, Llama, etc.), not embedding models. Calling `count_tokens()` will raise `NotImplementedError`.

#### Using a Custom Provider

For advanced configuration like explicit credentials or a custom boto3 client, you can create a [`BedrockProvider`][pydantic_ai.providers.bedrock.BedrockProvider] directly. See the [Bedrock provider documentation](models/bedrock.md#provider-argument) for more details.

```python {title="bedrock_provider.py"}
from pydantic_ai import Embedder
from pydantic_ai.embeddings.bedrock import BedrockEmbeddingModel
from pydantic_ai.providers.bedrock import BedrockProvider

provider = BedrockProvider(
region_name='us-west-2',
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key',
)

model = BedrockEmbeddingModel('amazon.titan-embed-text-v2:0', provider=provider)
embedder = Embedder(model)
```

### Sentence Transformers (Local)

[`SentenceTransformerEmbeddingModel`][pydantic_ai.embeddings.sentence_transformers.SentenceTransformerEmbeddingModel] runs embeddings locally using the [sentence-transformers](https://www.sbert.net/) library. This is ideal for:
Expand Down
4 changes: 4 additions & 0 deletions pydantic_ai_slim/pydantic_ai/embeddings/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ def infer_embedding_model(
from .cohere import CohereEmbeddingModel

return CohereEmbeddingModel(model_name, provider=provider)
elif model_kind == 'bedrock':
from .bedrock import BedrockEmbeddingModel

return BedrockEmbeddingModel(model_name, provider=provider)
elif model_kind in ('google-gla', 'google-vertex'):
from .google import GoogleEmbeddingModel

Expand Down
1 change: 1 addition & 0 deletions pydantic_ai_slim/pydantic_ai/embeddings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class EmbeddingModel(ABC):
- [`OpenAIEmbeddingModel`][pydantic_ai.embeddings.openai.OpenAIEmbeddingModel]
- [`CohereEmbeddingModel`][pydantic_ai.embeddings.cohere.CohereEmbeddingModel]
- [`GoogleEmbeddingModel`][pydantic_ai.embeddings.google.GoogleEmbeddingModel]
- [`BedrockEmbeddingModel`][pydantic_ai.embeddings.bedrock.BedrockEmbeddingModel]
- [`SentenceTransformerEmbeddingModel`][pydantic_ai.embeddings.sentence_transformers.SentenceTransformerEmbeddingModel]
"""

Expand Down
Loading