Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,8 @@
"pages": [
"v3/integrations/openai-sdk-python",
"v3/integrations/openai-sdk-typescript",
"v3/integrations/langchain"
"v3/integrations/langchain",
"v3/integrations/pydantic-ai"
]
},
{
Expand Down
3 changes: 3 additions & 0 deletions integration-logo/pydantic-ai-icondoc.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
47 changes: 46 additions & 1 deletion v3/integrations/hermes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
proficiencyLevel="Intermediate"
keywords={["Eden AI", "AI API", "Hermes Agent", "Nous Research"]}
datePublished="2026-06-19T00:00:00Z"
dateModified="2026-06-19T00:00:00Z"
dateModified="2026-07-16T00:00:00Z"
/>

Connect [Hermes Agent](https://hermes-agent.nousresearch.com) to Eden AI and run the self-hosted, persistent agent on 500+ models with automatic fallbacks and a single API key.
Expand Down Expand Up @@ -66,7 +66,7 @@
```yaml config.yaml
model:
provider: custom
base_url: https://api.edenai.run/v3

Check warning on line 69 in v3/integrations/hermes.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/hermes.mdx#L69

Did you really mean 'base_url'?
default: anthropic/claude-sonnet-4-5
```
</CodeGroup>
Expand Down Expand Up @@ -111,7 +111,7 @@
| `anthropic/claude-opus-4-8` | Maximum capability |
| `anthropic/claude-haiku-4-5` | Fast and cheap |
| `openai/gpt-5` | OpenAI's frontier model |
| `google/gemini-2.5-pro` | Long context, multimodal |

Check warning on line 114 in v3/integrations/hermes.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/hermes.mdx#L114

Did you really mean 'multimodal'?

Browse the full catalog at [app.edenai.run/models](https://app.edenai.run/models).

Expand All @@ -123,6 +123,51 @@
hermes fallback add
```

## First-class provider plugin (optional)

The setup above uses Hermes' generic `custom` provider, which is the fastest way to get running. For a **native `--provider eden-ai` experience** — so Eden AI shows up in `hermes model`, `hermes doctor`, and the setup wizard — install Eden AI as a **standalone model-provider plugin**. Drop a directory under `$HERMES_HOME/plugins/model-providers/eden-ai/`, with no changes to the Hermes repo:

<CodeGroup>
{/* skip-test */}
```python __init__.py
from providers import register_provider
from providers.base import ProviderProfile

eden_ai = ProviderProfile(
name="eden-ai",
aliases=("edenai",),
display_name="Eden AI",
description="Eden AI — 500+ models via one OpenAI-compatible API (EU/GDPR)",
signup_url="https://app.edenai.run",
env_vars=("EDENAI_API_KEY",),
base_url="https://api.edenai.run/v3",
auth_type="api_key",
default_aux_model="mistral/mistral-small-latest",
fallback_models=(
"anthropic/claude-sonnet-4-5",
"openai/gpt-4o",
"mistral/mistral-small-latest",
),
)

register_provider(eden_ai)
```

```yaml plugin.yaml
name: eden-ai
kind: model-provider
version: 1.0.0
description: Eden AI — 500+ models via one OpenAI-compatible API (EU/GDPR)
author: Eden AI
```
</CodeGroup>

Hermes then auto-wires credential resolution, the `--provider eden-ai` flag, the `hermes model` picker (models fetched from `{base_url}/models`), and the `hermes doctor` health check. Select it with:

```bash
hermes chat --provider eden-ai
```

## Troubleshooting

### `401` / `Custom token not found`
Expand Down
206 changes: 206 additions & 0 deletions v3/integrations/pydantic-ai.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
---
title: "Pydantic AI"
icon: "/integration-logo/pydantic-ai-icondoc.svg"
description: "Use Pydantic AI with Eden AI to build type-safe agents on 500+ AI models through one API."

Check warning on line 4 in v3/integrations/pydantic-ai.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/pydantic-ai.mdx#L4

Did you really mean 'Pydantic'?
---

import { TechArticleSchema } from "/snippets/TechArticleSchema.mdx";

<TechArticleSchema
title={"Pydantic AI"}
description={"Use Pydantic AI with Eden AI to build type-safe agents on 500+ AI models through one API."}

Check warning on line 11 in v3/integrations/pydantic-ai.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/pydantic-ai.mdx#L11

Did you really mean 'Pydantic'?
path="v3/integrations/pydantic-ai"
articleSection="AI Frameworks"
about={"LLM Framework Integration"}
proficiencyLevel="Intermediate"
keywords={["Eden AI", "AI API", "Pydantic AI", "Python", "Agents"]}
datePublished="2026-07-16T00:00:00Z"
dateModified="2026-07-16T00:00:00Z"
/>

Use Pydantic AI with Eden AI to build type-safe agents on 500+ AI models through one API.

## Overview

Pydantic AI is a type-safe, structured-output agent framework for Python. It works with any OpenAI-compatible endpoint through `OpenAIChatModel` + `OpenAIProvider`, so you can point it at Eden AI's V3 API and access models from OpenAI, Anthropic, Google, Cohere, Meta, and more — behind one key, with EU-based, GDPR-aligned inference.

Check warning on line 25 in v3/integrations/pydantic-ai.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/pydantic-ai.mdx#L25

Did you really mean 'Pydantic'?

## Installation

<CodeGroup>
```bash pip
pip install pydantic-ai
```

```bash poetry
poetry add pydantic-ai
```

</CodeGroup>

## Quick Start

Point Pydantic AI's OpenAI model at Eden AI:

Check warning on line 42 in v3/integrations/pydantic-ai.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/pydantic-ai.mdx#L42

Did you really mean 'Pydantic'?

<CodeGroup>
{/* skip-test */}
```python Python
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.openai import OpenAIProvider

model = OpenAIChatModel(
"openai/gpt-4o",
provider=OpenAIProvider(
api_key="YOUR_EDEN_AI_API_KEY", # Get from https://app.edenai.run
base_url="https://api.edenai.run/v3",
),
)
Comment on lines +46 to +57

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

"OpenAIModel" OR "OpenAIChatModel" site:ai.pydantic.dev

💡 Result:

In the context of the PydanticAI framework, OpenAIChatModel is a class designed to facilitate interaction with OpenAI's API [1]. It serves as a model implementation that utilizes the official OpenAI Python client internally to manage API requests [1]. While the search results specifically identify and document OpenAIChatModel as part of the pydantic_ai.models.openai module [1], there is no distinct, documented class named OpenAIModel currently identified in the standard PydanticAI library structure; it is likely a misidentification or a conceptual reference to the base model interface or the broader family of OpenAI-compatible models [1][2]. Key characteristics of OpenAIChatModel include: - Functionality: It acts as a bridge between PydanticAI agents and OpenAI's chat-based language models [1]. - Initialization: It requires a model name (e.g., 'gpt-4o') and accepts optional parameters such as providers, model profiles, and default settings [1]. - Integration: It inherits from the base Model class [1], allowing it to be used seamlessly within PydanticAI Agents to process tasks, manage tool usage, and handle structured output [1][3][4]. If you encountered the term OpenAIModel, it may refer to the generic Model base class or a custom implementation in a specific codebase, as OpenAIChatModel is the explicit, provided implementation for OpenAI chat interfaces within the framework [1][2].

Citations:


🌐 Web query:

"OpenAIProvider" site:ai.pydantic.dev pydantic_ai.providers.openai

💡 Result:

In the Pydantic AI library, OpenAI support is provided through the pydantic_ai.models.openai module, which defines model classes for interacting with OpenAI APIs [1]. Specifically, there is no top-level class named OpenAIProvider; instead, models are initialized using model strings (e.g., 'openai:gpt-4o') or by instantiating OpenAIChatModel or OpenAIResponsesModel [1]. Key points regarding OpenAI integration in Pydantic AI: 1. Model Initialization: When defining an Agent, you specify the model using a string identifier [2]. For example, Agent('openai:gpt-4o') automatically configures the agent to use the OpenAI provider [3][2]. 2. Provider Classes: - OpenAIChatModel: A model that uses the standard OpenAI Chat API [1]. - OpenAIResponsesModel: A model designed for the OpenAI Responses API [1]. 3. Provider Configuration: Both model classes accept a provider argument during initialization, which defaults to 'openai' [1]. This argument allows for specifying alternative compatible providers or custom AsyncOpenAI client configurations [1]. 4. Documentation Reference: Technical details and configuration options, such as OpenAIChatModelSettings, can be found in the pydantic_ai.models.openai API documentation [1].

Citations:


🌐 Web query:

site:ai.pydantic.dev pydantic_ai.models.openai OpenAIChatModel provider api_key base_url

💡 Result:

In Pydantic AI, the OpenAIChatModel is designed to interface with the OpenAI API (or compatible services) [1]. Configuration of the api_key and base_url for OpenAIChatModel is typically handled through the underlying provider rather than directly in the OpenAIChatModel constructor [1]. 1. Provider Configuration: The OpenAIChatModel constructor accepts a provider argument [1]. By default, this is set to 'openai' [1]. To customize parameters like api_key or base_url, you should instantiate a specific provider object (e.g., OpenAIProvider or a similar provider class) and pass it to the provider argument of the OpenAIChatModel [1]. 2. Environment Variables: For standard OpenAI usage, Pydantic AI typically retrieves the API key from environment variables (e.g., OPENAI_API_KEY) automatically when using the default provider [1]. 3. General Pattern for Custom Providers: While documentation for specific OpenAIChatModel provider configuration options can vary by version, the general pattern for custom configurations in Pydantic AI involves [2][3]: - Instantiating the provider class (e.g., provider = OpenAIProvider(api_key='...', base_url='...')). - Passing this instance to the model (e.g., model = OpenAIChatModel(..., provider=provider)). If you are using a self-hosted or compatible OpenAI-like API, ensure the provider instance is configured with the correct base_url and api_key before initializing the OpenAIChatModel [1]. Check your specific version's API documentation for the exact provider class exported by pydantic_ai.providers [1][2].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the relevant file and any nearby Pydantic AI usage in docs.
git ls-files 'v3/integrations/pydantic-ai.mdx' 'v3/**/*.mdx' | sed -n '1,80p'
echo
wc -l v3/integrations/pydantic-ai.mdx
echo
cat -n v3/integrations/pydantic-ai.mdx | sed -n '35,70p'
echo
rg -n "OpenAIChatModel|OpenAIProvider|OpenAIResponsesModel|Agent\\('openai:|pydantic_ai" v3 -g '*.mdx'

Repository: edenai/docs

Length of output: 6263


🌐 Web query:

site:ai.pydantic.dev "pydantic_ai.providers.openai" OR "OpenAIProvider" OR "class OpenAIProvider"

💡 Result:

PydanticAI does not have a class named OpenAIProvider within the pydantic_ai.providers namespace. In PydanticAI, OpenAI integration is primarily handled through the pydantic_ai.models.openai module [1]. The core class for using OpenAI models is OpenAIChatModel (or OpenAIResponsesModel for the Responses API) [1]. When configuring an agent, you typically specify the model name (e.g., 'openai:gpt-5.2') directly in the Agent constructor [2][3]. Internally, the framework uses these model classes to interact with the OpenAI API. While there is a concept of a provider within the OpenAIChatModel configuration—often defaulting to 'openai' or 'gateway'—it is managed via string identifiers or specific provider objects rather than a top-level class named OpenAIProvider [1]. If you are looking to define a custom provider or configure the underlying connection, you would interact with the model settings or the specific model class constructors [1].

Citations:


Replace OpenAIProvider with the supported PydanticAI OpenAI configuration
OpenAIChatModel is valid, but pydantic_ai.providers.openai.OpenAIProvider is not exposed in PydanticAI, so this snippet will fail on import. Use the documented model/provider setup for the installed version instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@v3/integrations/pydantic-ai.mdx` around lines 46 - 57, Update the PydanticAI
example’s OpenAI configuration around OpenAIChatModel to use the supported
model/provider setup for the installed PydanticAI version, removing the
unavailable OpenAIProvider import and usage. Preserve the Eden AI API key and
base_url configuration.


agent = Agent(model)
result = agent.run_sync("Hello! How are you?")
print(result.output)
```
</CodeGroup>

## Available Models

Access models from multiple providers using the `provider/model` format:

**OpenAI**
- `openai/gpt-4o`
- `openai/gpt-4o-mini`
- `openai/gpt-4-turbo`

**Anthropic**
- `anthropic/claude-sonnet-4-5`
- `anthropic/claude-opus-4-5`
- `anthropic/claude-haiku-4-5`

**Google**
- `google/gemini-2.5-pro`
- `google/gemini-2.5-flash`

**Mistral**
- `mistral/mistral-large-latest`
- `mistral/mistral-small-latest`

## Structured Output

Pydantic AI's signature feature works unchanged — define a Pydantic `output_type` and the agent returns a validated object, whichever Eden AI model you choose:

Check warning on line 89 in v3/integrations/pydantic-ai.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/pydantic-ai.mdx#L89

Did you really mean 'Pydantic'?

<CodeGroup>
{/* skip-test */}
```python Python
from pydantic import BaseModel

Check warning on line 94 in v3/integrations/pydantic-ai.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/pydantic-ai.mdx#L94

Did you really mean 'pydantic'?
from pydantic_ai import Agent

Check warning on line 95 in v3/integrations/pydantic-ai.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/pydantic-ai.mdx#L95

Did you really mean 'pydantic_ai'?
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.openai import OpenAIProvider

class City(BaseModel):
name: str
country: str
population: int

model = OpenAIChatModel(
"anthropic/claude-sonnet-4-5",
provider=OpenAIProvider(
api_key="YOUR_EDEN_AI_API_KEY",
base_url="https://api.edenai.run/v3",
),
)

agent = Agent(model, output_type=City)
result = agent.run_sync("Tell me about the capital of France.")
print(result.output) # City(name='Paris', country='France', population=...)
```
</CodeGroup>

## Multi-Turn Conversations

Keep conversation history across runs with `message_history`:

<CodeGroup>
{/* skip-test */}
```python Python
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.openai import OpenAIProvider

model = OpenAIChatModel(
"anthropic/claude-sonnet-4-5",
provider=OpenAIProvider(
api_key="YOUR_EDEN_AI_API_KEY",
base_url="https://api.edenai.run/v3",
),
)
agent = Agent(model, system_prompt="You are a helpful assistant.")

result = agent.run_sync("What is the capital of France?")
print(result.output)

# Continue the conversation with prior context
result = agent.run_sync(
"What's its population?",
message_history=result.all_messages(),
)
print(result.output)
```
</CodeGroup>

## Error Handling

<CodeGroup>
{/* skip-test */}
```python Python
from pydantic_ai import Agent

Check warning on line 155 in v3/integrations/pydantic-ai.mdx

View check run for this annotation

Mintlify / Mintlify Validation (edenai) - vale-spellcheck

v3/integrations/pydantic-ai.mdx#L155

Did you really mean 'pydantic_ai'?
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.openai import OpenAIProvider
from pydantic_ai.exceptions import ModelHTTPError, UnexpectedModelBehavior

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

"ModelHTTPError" site:ai.pydantic.dev

💡 Result:

ModelHTTPError is not a standard error class in the Pydantic AI framework or general Python programming. Based on the provided technical documentation for Pydantic AI, the library primarily uses UserError for configuration or usage issues [1], ModelRetry for validation failures during agent runs [2], and NotImplementedError for base model methods that have not been implemented by specific providers [1]. If you are encountering an error related to HTTP requests in Pydantic AI, it typically relates to the underlying HTTP client used by the model provider (e.g., OpenAI, Anthropic, or Groq) [3][4][5]. These are usually handled by the provider's official SDK or standard HTTP exception classes rather than a specific library-wide ModelHTTPError. If you are seeing this name, it may be a custom exception defined within your specific codebase or a third-party library not covered by the official Pydantic AI documentation.

Citations:


🌐 Web query:

site:ai.pydantic.dev "class ModelHTTPError" OR "ModelHTTPError" "pydantic_ai.exceptions"

💡 Result:

Based on the provided documentation for Pydantic AI, there is no public class named ModelHTTPError defined within the pydantic_ai.exceptions module or the broader library. Pydantic AI uses standard exception handling mechanisms, and model-related errors typically surface through specific exceptions related to request failures or configuration issues, such as UserError or general HTTP/network exceptions depending on the underlying provider client (e.g., httpx for OpenAI or Anthropic). [1][2]

Citations:


Drop ModelHTTPError from the import. pydantic_ai.exceptions doesn’t expose that symbol, so this snippet won’t run as written.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@v3/integrations/pydantic-ai.mdx` at line 158, Update the import in the
pydantic-ai example to remove ModelHTTPError and retain only the valid
UnexpectedModelBehavior symbol from pydantic_ai.exceptions.


model = OpenAIChatModel(
"openai/gpt-4o",
provider=OpenAIProvider(
api_key="YOUR_EDEN_AI_API_KEY",
base_url="https://api.edenai.run/v3",
),
)
agent = Agent(model)

try:
result = agent.run_sync("Hello!")
print(result.output)
except ModelHTTPError as e:
print(f"Model HTTP error (auth, rate limit, bad request): {e}")
except UnexpectedModelBehavior as e:
print(f"Unexpected model behavior: {e}")
```
</CodeGroup>

## Environment Variables

<CodeGroup>
```bash .env
EDEN_AI_API_KEY=your_api_key_here
```

{/* skip-test */}
```python Python
import os
from pydantic_ai.models.openai import OpenAIChatModel
from pydantic_ai.providers.openai import OpenAIProvider

model = OpenAIChatModel(
"openai/gpt-4o",
provider=OpenAIProvider(
api_key=os.getenv("EDEN_AI_API_KEY"),
base_url="https://api.edenai.run/v3",
),
)
```
</CodeGroup>

## Next Steps

- [Chat Completions](/v3/llms/chat-completions) - Core LLM endpoint
- [List LLM Models](/v3/llms/listing-models) - Browse available providers and models
- [OpenAI SDK (Python)](/v3/integrations/openai-sdk-python) - Direct SDK usage
Loading