LLM providers, models and tasks¶
AIHub routes language-model work through semantic profiles. Business workflows
always ask for a capability such as default, tiny, mini, large or
reasoning; tenant and provider configuration select the concrete model. Some
workflows require a particular provider API, but their model still comes from
that provider's configured semantic profile.
This page covers generation and reasoning, embeddings, and Realtime and speech. These model families have independent selectors; see configuration for the complete tenant configuration.
How AIHub selects a model¶
The effective provider and model are resolved in this order:
- A provider requirement made by the workflow, when its API is required.
- The tenant's selected provider, if it exists in the database catalogue and supports the requested model family.
- The database default provider, then the built-in provider if that default is absent or invalid. The built-in providers are OpenAI for LLMs and Azure for embeddings. Empty MongoDB and PostgreSQL catalogues follow the same rule.
- A valid tenant model/profile reference within the selected provider's catalogue, then that provider's database profile/default model.
- The centralized model fallback for the selected provider and model family.
Omitted, empty and unknown provider identifiers follow the same default chain. Model aliases, concrete names and inline model configurations must reference a model declared in the selected provider catalogue. Valid model settings and reasoning overrides are preserved. If one profile is missing, only unresolved profiles use code defaults; other valid database profiles remain active. Database connection failures propagate and do not trigger a provider switch.
When switching providers, AIHub uses the selected provider catalogue and never
reuses the original provider's tenant model overrides. Model identifiers belong
in configuration, centralized defaults, pricing and capability metadata;
business calls cannot override them. AGENTS.md enforces this development rule.
The provider configuration is therefore authoritative during normal operation. The fallback model table below is a runtime safety net, not a fixed production contract. To change a tenant model without changing application code, update the provider catalogue or the tenant's sparse profile overrides as described in Tenant AI configuration.
Supported LLM providers¶
| Provider | Integration | Functional use |
|---|---|---|
| OpenAI | Native OpenAI connector | Default provider when no valid provider is configured; also selectable per tenant or workflow. |
| Azure OpenAI | Azure OpenAI v1 Chat Completions | Selectable per tenant with azure; semantic profiles resolve to deployment names in the configured Azure resource. |
| Anthropic | Native Anthropic Messages API | Selectable per tenant and explicitly used by some Talent Intelligence and Lexi workflows. Supports normal streaming calls and Message Batches. |
| OVH | Shared OpenAI-compatible API | Selectable per tenant with ovh; semantic profiles resolve to explicit model IDs. |
All four providers use the shared AIHub call boundary for task naming, token policies, structured-output handling, usage normalization and observability. Provider-side prompt caching is currently activated only for eligible OpenAI and Anthropic calls. See LLM runtime, caching and observability for the technical policy.
Anthropic API compatibility¶
The pinned Anthropic SDK uses API version 2026-10-21. Keep using
ANTHROPIC_API_KEY; the SDK sends the key as a Bearer credential. AIHub's
Messages, streaming, token-counting and Message Batch integrations use this
version without an override to the earlier API.
AIHub does not send temperature, top_p or top_k to Anthropic; the current
API rejects those parameters. Input documents belong in user messages, and
non-empty text citations belong in assistant messages. Native assistant content
returned for tool continuations must still be preserved. See Anthropic's
API migration guide
for the upstream contract changes.
Live configuration from the database¶
Live provider configuration
Shared providers, models and profiles load automatically from this AIHub instance. Database mappings take precedence over code fallbacks, which are shown separately. No API key or Client-ID is needed; client-specific settings are not included.
Loading shared configuration… Static tables below describe code fallbacks.
The live view automatically calls public GET /genai/api/v1/catalogue on this
instance. MongoDB reads common_data.AIProviders; PostgreSQL reads
aihub_ai_providers in the deployment schema. The existing configuration resolver
applies shared provider mappings and profile inheritance, without reading tenant
or application configuration overrides. Database changes appear on the next
refresh; no documentation rebuild or application restart is needed.
The Source column identifies the winning layer, even when a database mapping happens to have the same model name as the code fallback. Inherited profiles also name their immediate parent. The fallback columns come directly from the current code and do not replace a successfully resolved database mapping. Profile reasoning is reported before workflow policies and explicit request overrides; Unspecified does not mean reasoning is disabled.
The model list reports configured generation models and the capabilities exposed by GenAI. GenAI profile available additionally requires the resolved model to be declared in the provider catalogue. A shared-connector fallback can therefore be shown while remaining unavailable through GenAI. Neither listing probes remote provider credentials or model access. Embedding, speech and Realtime selectors remain documented separately below and are not part of this generation catalogue.
No API key or Client-ID is requested or sent by this view. Refresh configuration
reloads shared provider values. Failed loads show an unavailable state rather than
presenting static fallbacks as live data. Generation and tenant-aware /models
remain authenticated. The static tables remain available without JavaScript or a
running API. No database configuration is embedded in the generated documentation.
The public read reuses the existing small provider-catalogue scans and safe model/profile projection. It creates no database indexes, performs no LLM calls and returns no credentials, connection settings or tenant configuration.
Provider retries¶
OpenAI, Azure OpenAI, Anthropic and OVH share a maximum of three physical
attempts per provider request: the initial request plus two SDK retries.
The policy lives in src/common/connectors/ai_providers/retry_policy.py and
also applies to GenAI, native Decisions, document parsing, embeddings, speech,
Anthropic token counting and batch API requests. Application retry decorators
must not wrap these SDK retries.
The SDKs retry transient connection/timeouts and HTTP 408, 409, 429 and 5xx
responses, subject to provider retry-control headers. Backoff is exponential
(normally 0.5 then 1 second, with jitter); supported Retry-After hints take
precedence. Authentication, permission and invalid-input errors normally fail
immediately. Existing operation deadlines and cancellation still take precedence:
three is an upper bound, not a guarantee that every attempt can run.
Retries repeat only the failed provider request. An embedding chunk or batch status query does not restart the entire embedding job or submit a new batch. Batch creation is a separate request; if the provider accepts it but its response is lost, retries cannot guarantee that the remote job was created only once.
Streaming retries cover request opening, not replay after a stream has been returned. Live has the same three-attempt limit for its initial WebSocket handshake within one opening deadline. The pinned SDK does not retry that initial handshake, so AIHub owns that small loop. Session reconnection, audio replay and re-execution of delegated business actions remain disabled.
The evaluation meter permits the same SDK retries, reserves budget before each physical attempt and preserves failed-attempt diagnostics and uncertain costs. See AI evaluations for accounting and observation limits.
Semantic profiles and last-resort models¶
The static table shows the code fallback, with the ordinary shared-connector reasoning policy where applicable. It is not the effective database configuration; use the live view above for this instance.
| Provider | Profiles | Fallback model | Reasoning sent by AIHub |
|---|---|---|---|
| OpenAI | large |
gpt-6.1-terra |
medium (profile) |
| OpenAI | default, mini |
gpt-6-luna |
low (profile) |
| OpenAI | tiny |
gpt-6-luna |
none (profile) |
| OpenAI | reasoning |
gpt-6.1-sol |
medium (profile) |
| Azure | large |
gpt-5.4-mini |
medium (profile) |
| Azure | tiny |
gpt-4.1-nano |
Not supported; parameter omitted |
| Azure | default, mini |
gpt-5.4-mini |
low (profile) |
| Azure | reasoning |
gpt-5.2 |
medium (profile) |
| Anthropic | large |
claude-sonnet-5-5 |
medium via output_config.effort (profile) |
| Anthropic | default, mini |
claude-haiku-5-5 |
low via output_config.effort (profile) |
| Anthropic | tiny |
claude-haiku-5-5 |
none maps to thinking.type=disabled |
| Anthropic | reasoning |
claude-opus-5-5 |
medium via output_config.effort (profile) |
| OVH | large |
Meta-Llama-3_3-70B-Instruct |
Not supported; parameter omitted |
| OVH | default, mini |
Qwen3.5-9B |
low (profile) |
| OVH | tiny |
Qwen3.5-9B |
none (profile) |
| OVH | reasoning |
gpt-oss-120b |
medium (profile) |
default handles general generation, tiny minimal transformations, mini
short classification or normalization, large complex generation and specialist
agents, and reasoning deliberate analysis.
Reasoning precedence: an explicit external GenAI request takes priority, then
an explicit tenant profile setting, then the same profile in AIProviders, then
the centralized semantic default. The defaults are tiny=none,
mini=low, default=low, large=medium and reasoning=medium; they do not
replace explicitly configured database values. Model and reasoning settings are
resolved separately: changing only the tenant's model retains a configured
provider effort, and a tenant can override only the effort.
Workflows select a profile instead of supplying their own reasoning level.
Summaries use mini and its effort; language detection and translation use
tiny. Lexi keeps its own output limits, while its reasoning comes from its
selected profile. PDF and DOCX image extraction use OpenAI large, and CV
parsing uses mini. No connector injects an unrelated low or high default.
On the current tiny models, none disables the dedicated thinking phase;
Azure GPT-4.1 nano has no reasoning control, so AIHub omits it. OVH's current
large Llama model also receives no reasoning control. This does not remove
the model's ability to understand or classify an input. low allows limited
reasoning, with potentially more tokens and latency; it is not a fixed token
budget or a guarantee of better answers. Model capabilities still apply to
configured overrides. AIHub does not lower the effort to make tools work.
Native OpenAI Decisions requests do not send reasoning_effort. These profile
settings affect generation and the structured decision path, not native Decisions.
GenAI Chat Completions retains its model-specific tool restrictions: when tools
require none, explicitly supply that override instead of inheriting mini=low.
See GenAI capability limits.
Anthropic uses output_config.effort for supported models, including Opus in
normal, streaming and batch requests. Profile-based calls receive the resolved
semantic effort even when the database omits it. GenAI callers selecting a
concrete model without a profile or an explicit effort keep the provider's API
default instead: Sonnet 5.5 defaults to high, and Haiku 5.5 to medium.
For Sonnet 5.5, none maps to thinking.type=between_tools, disabling up-front
thinking while allowing thinking between tools. For Haiku 5.5, it maps to
thinking.type=disabled. Opus 5.5 does not support disabled thinking; its
reasoning profile uses medium by default. Other supported efforts are
forwarded unchanged. GenAI always gives explicit request controls priority over
profile defaults.
The PostgreSQL seed matches these fallback models and profile reasoning settings
for all four providers. Anthropic uses Sonnet 5.5 for large, Haiku 5.5 for
default/tiny/mini, and Opus 5.5 for reasoning. Seed changes apply to new provider rows;
existing provider configurations and tenant overrides are not rewritten.
If a tenant or provider profile resolves successfully, its model replaces the
corresponding fallback in this table. An unspecified tenant profile inherits the
provider mapping. If the provider document itself has no tiny mapping, AIHub
injects the provider-specific tiny fallback above rather than inheriting a
larger profile. Missing model mappings for mini and large inherit default,
while reasoning inherits large. Their effort still follows the requested
semantic profile, not the inherited model's original profile.
Align existing provider defaults with mini¶
New provider seeds and centralized fallbacks use the same model and settings for
default and mini. Existing database configurations remain authoritative until
explicitly migrated. Preview the migration for the backend in use:
.venv/bin/python -m scripts.migrate_default_llm_profiles --backend mongodb
.venv/bin/python -m scripts.migrate_default_llm_profiles --backend postgres
After reviewing the preview, rerun the selected command with --apply to persist
it. The tool copies each registered OpenAI, Azure, Anthropic and OVH provider's
configured mini value into default, including reasoning and other settings.
This deliberately replaces custom provider defaults. Tenant overrides, other
profiles, model catalogues, embedding and audio configuration are preserved.
No inference requests are made. Missing or invalid mini mappings abort validation
before any writes; already aligned providers are unchanged.
PostgreSQL applies updates in one transaction with row locks. MongoDB guards each update against concurrent changes, but the full multi-provider operation is not atomic: a conflict can leave earlier providers updated. Resolve the conflict and rerun the idempotent migration.
GPT-6 defaults and compatibility¶
The OpenAI fallback profiles and PostgreSQL AI-provider seed use GPT-6.1 Terra
for large, GPT-6.1 Sol for reasoning, and Luna for default/tiny/mini. The seed
inserts missing providers only; it does not update existing provider rows or
tenant overrides. Update those explicit selections separately when rolling out
these defaults to an existing database.
Reasoning settings remain explicit: OpenAI calls and LangGraph agents use the
shared low default when the selected profile does not configure an effort,
the large and reasoning profiles use medium, and language detection, translation
and conversation summaries retain none. GPT-6.1 Sol and Astra do not accept none; an
explicit incompatible override is rejected instead of silently remapped. Terra
supports none, but its tool calls require Responses even at that effort.
OpenAI GPT-5.4, GPT-5.5, GPT-5.6 and GPT-6 tool calls and conversations
containing tool results use the Responses
API, preserving reasoning effort. Requests use store=False; LangGraph retains
ordered output items, including encrypted reasoning, for subsequent calls to
the same model. Function schemas keep their existing strictness, tool results
keep their call IDs, and streaming responses retain normalized usage and costs.
Calls without tools or tool history continue to use Chat Completions. Earlier
GPT-5 models also retain Chat Completions for tools, with their configured effort
unchanged; AIHub never replaces it with none. No temperature is sent for these
reasoning models. Continuation provenance records the requested model separately
from the returned snapshot so a dated response keeps its opaque context when the
configured alias is unchanged. Explicit cache options are sent only to supported
GPT-5.6/GPT-6 models; GPT-5.4/GPT-5.5 retain automatic caching.
Configured o1/o3/o4 names, including dated snapshots, are also recognized as reasoning models. OpenAI and Azure preserve their requested reasoning effort and omit temperature. Recognition does not change profile mappings or enable models that are absent from the configured catalogue; provider-specific effort limits still apply.
Standard USD list prices per million tokens:
| Model | Input | Cache read | Cache write | Output |
|---|---|---|---|---|
gpt-6.1-terra |
1 | 0.05 | 1.25 | 5 |
gpt-6.1-sol |
2 | 0.10 | 2.50 | 10 |
gpt-6-luna |
0.10 | 0.01 | 0.125 | 0.50 |
gpt-6-astra |
10 | 1 | 12.50 | 50 |
Cache-write prices replace the uncached input price for those tokens. Above 272,000 input tokens, the entire request uses twice the input/cache rates and 1.5 times the output rate. Reasoning tokens are included in output usage. Batch pricing halves all categories; AIHub's existing batch execution path remains Anthropic-only. Configured prices and provider-reported costs retain their precedence. Azure uses its own deployment profiles; direct Azure calls use the centralized Azure fallback when no configuration is supplied. The prompt engine resolves the selected provider's configured profile.
Sources: GPT-6.1 Terra, GPT-6.1 Sol, GPT-6 migration, pricing, and Responses migration.
Migrate existing OpenAI large profiles¶
The new code fallback, PostgreSQL seed and supplied evaluation configurations
select gpt-6.1-terra with reasoning_effort: medium for OpenAI large.
Existing database mappings remain authoritative. Preview the targeted update for
the backend in use:
.venv/bin/python -m scripts.migrate_openai_large_profile --backend mongodb
# Or:
.venv/bin/python -m scripts.migrate_openai_large_profile --backend postgres
After reviewing the preview, add --apply. The script changes only a shared
OpenAI large profile explicitly resolving to GPT-6.1 Sol or Terra (including
snapshots), selects gpt_6_1_terra, and sets effort to medium. Terra profiles
already explicitly using medium are unchanged. Other model selections and
missing large mappings are left alone. It preserves other profile options, the
reasoning profile, model catalogue entries, tenant overrides, embeddings and
audio configuration. Source-model prices are not copied to Terra. Invalid
configuration or a conflicting target alias aborts before writing.
PostgreSQL locks and updates the provider row in one transaction using its
existing provider primary key. MongoDB requires exactly one shared OpenAI
provider and guards the _id update against concurrent catalogue/profile edits;
a conflict requires a new preview. This small, one-time catalogue scan needs no
additional index. No inference calls are made. Restart application workers after
applying the migration to refresh their cached provider configuration.
Migrate existing OpenAI reasoning profiles¶
The code fallback and seed do not replace provider rows already stored in a database. Preview the targeted migration for the backend in use:
.venv/bin/python -m scripts.migrate_openai_reasoning_profile --backend mongodb
# Or:
.venv/bin/python -m scripts.migrate_openai_reasoning_profile --backend postgres
After reviewing the preview, add --apply. The script changes only an OpenAI
provider reasoning profile explicitly resolving to GPT-6 Astra (including
snapshots). It adds gpt_6_1_sol to the catalogue and preserves other profiles,
existing models, tenant overrides, embedding and audio configuration. It retains
supported reasoning settings, or supplies medium when none was configured.
Custom models and already migrated profiles are unchanged. Invalid settings or
an alias collision abort instead of overwriting configuration.
PostgreSQL locks and updates the provider row in one transaction. MongoDB checks
that exactly one OpenAI provider exists and guards the update against concurrent
catalogue/profile edits. A conflict aborts and requires a new preview. No schema
or index changes are needed: PostgreSQL selects its provider primary key; this
bounded, one-time MongoDB catalogue lookup needs no additional index and its
write selects the existing _id index. No inference requests are made.
Restart application workers after applying the migration so cached provider
configuration is refreshed.
Anthropic image inputs¶
The shared message adapter translates OpenAI-style image_url user blocks into
native Anthropic image blocks, preserving their order alongside text. It accepts
Base64 PNG, JPEG, GIF and WebP data URLs, as well as HTTPS image URLs. Malformed
encodings and unsupported blocks in an image-bearing message are rejected before
the provider call with stable errors that do not expose the image data.
This applies to CV parsing and Chatbot image extraction; the GenAI HTTP surface
retains its existing supported input types.
Claude Haiku 5.5¶
Anthropic's active model claude-haiku-5-5, released on October 7, 2026, owns
AIHub's default, tiny and mini Anthropic profiles. It supports JSON Schema,
function tools (including forced choices), and efforts low, medium, high,
xhigh and max. AIHub additionally accepts none to disable thinking.
Sampling parameters are omitted. Assistant prefill is not supported by the model.
The API enables adaptive thinking at medium by default. Thinking consumes the
existing output-token budget; AIHub does not silently enlarge workflow limits.
The current tokenizer counts approximately 30% more tokens for the same text than
previous Haiku tokenizers. Review task budgets using the resolved model's token
counts when migrating a configured workflow.
For tool continuations, preserve the returned anthropic_content blocks exactly.
The shared connector rejects direct document blocks in native assistant
content before creating an SDK client, including for streaming and batches.
The same validation runs at the GenAI boundary and returns a sanitized HTTP 422.
Documents nested inside native tool results remain unchanged and accepted.
AIHub carries them through LangGraph only for the originating provider and model.
Replay them through the same Anthropic account and keep earlier instructions,
tools and conversation turns unchanged. Summaries of reasoning are not generated
or displayed by this extension.
USD prices per million tokens:
| Prompt length | Input | Output | Cache read | 5-minute cache write | 1-hour cache write |
|---|---|---|---|---|---|
| Up to 100,000 tokens | $0.10 | $0.50 | $0.01 | $0.125 | $0.20 |
| Over 100,000 tokens | $0.50 | $2.50 | $0.05 | $0.625 | $1.00 |
The threshold includes cached input tokens. Batch pricing applies a 50% discount. Configured prices and provider-reported costs retain their existing precedence.
New PostgreSQL installations use the current seed. Existing MongoDB/PostgreSQL
catalogues require an explicit migration. Supply the exact source model and alias
from the existing catalogue as SOURCE_MODEL and SOURCE_ALIAS, then preview:
.venv/bin/python -m scripts.migrate_anthropic_haiku55 --backend mongodb \
--source-model "$SOURCE_MODEL" --source-alias "$SOURCE_ALIAS"
# Use --backend postgres for the configured PostgreSQL schema.
Add --apply to write the reviewed changes. The command replaces only exact source
identifiers with claude-haiku-5-5 / claude_haiku_5_5, updates matching provider
profiles and registered tenant selectors, preserves unrelated customizations and
reasoning settings, and rejects conflicting aliases. MongoDB writes use guarded
_id updates; PostgreSQL uses a transaction and existing primary keys. Provider
and tenant configuration collections are small; no additional index is needed.
Restart workers after application to refresh cached configuration. The command
never makes inference requests.
Sources: model specifications, migration requirements, and pricing.
Azure OpenAI deployments¶
Azure OpenAI runs profile-driven generation against deployments in the Azure
resource configured for the AIHub process. Select it with
ai_configuration.llm_provider = "azure" in the tenant configuration. Workflows
that explicitly require OpenAI or Anthropic retain that provider requirement.
Set the connection variables as follows:
AZURE_OPENAI_URL=https://example-resource.openai.azure.com
AZURE_OPENAI_API_KEY=<azure-resource-api-key>
AZURE_OPENAI_URL is the resource root without a trailing slash. AIHub appends
/openai/v1/ and uses the asynchronous OpenAI client for Chat Completions. The
current generation connector does not read a per-model api_version field.
In the Azure provider catalogue, each model's llm_name is the deployment
name sent to Azure. The catalogue alias used by llm_profiles is an AIHub
configuration key; it does not have to match the deployment name. For example,
the seeded configuration uses these exact deployment names:
{
"provider": "azure",
"llm_models": {
"gpt_5_4_mini": {"llm_name": "gpt-5.4-mini"},
"gpt_5_2": {"llm_name": "gpt-5.2"},
"gpt_4_1_nano": {"llm_name": "gpt-4.1-nano"}
},
"llm_profiles": {
"default": {"model": "gpt_5_4_mini", "reasoning_effort": "low"},
"tiny": "gpt_4_1_nano",
"mini": {"model": "gpt_5_4_mini", "reasoning_effort": "low"},
"large": {"model": "gpt_5_4_mini", "reasoning_effort": "medium"},
"reasoning": {"model": "gpt_5_2", "reasoning_effort": "medium"}
}
}
All three names were present as successful deployments in the configured resource
when checked on 2026-09-24. Deployment names can differ from the underlying
model: the deployed model must be checked as well as the name. An entry in
/openai/v1/models is a catalogue entry, not proof that a deployment exists.
These deployments must already exist in the configured resource. AIHub does not provision them. Without a resolved catalogue, the fallback names in the table above are sent as deployment names, so they must exist under those exact names. The OpenAI GPT-6 defaults do not change Azure's mappings.
The connector forwards tool definitions, tool choice, JSON mode and explicit JSON-schema response formats. Supported combinations depend on the deployed model and its API. Shared parameter handling recognizes GPT-5 and later and o1/o3/o4 from the deployment-name prefix; retain that prefix when naming those deployments so AIHub can omit temperature and forward reasoning effort. GPT-4.1 nano receives temperature without a reasoning parameter.
Migrating existing Azure configuration¶
The initialization seed inserts missing providers only. Updating source defaults does not replace existing database profiles. Preview the dedicated migration for the configured backend, then apply the reviewed update:
.venv/bin/python -m scripts.migrate_azure_provider --backend postgres
.venv/bin/python -m scripts.migrate_azure_provider --backend postgres --apply
# For MongoDB, use --backend mongodb instead.
The script adds the required catalogue entries and migrates the old standard GPT-4.1 mini / GPT-4.1 / o3-mini profile mappings to the configuration above. It fills missing profiles and preserves custom model mappings, deployment names, catalogue metadata and explicit reasoning settings. An existing target alias bound to a different deployment, or a standard profile with a missing alias, requires manual review before any write. Existing catalogue choices are retained.
The migration updates the Azure provider only. Review tenant llm_profiles
overrides separately; they remain authoritative. PostgreSQL changes use one
transaction and a provider row lock; MongoDB writes require the inspected fields
to remain unchanged. Restart AIHub after migration to refresh cached configuration.
Embedding models, dimensions, indexes and stored vectors remain unchanged.
Azure generation currently uses non-streaming Chat Completions. AIHub does not route Azure calls through its OpenAI Responses adapter or Anthropic Message Batches path, and does not send explicit prompt-cache directives to Azure. Available usage, reasoning and cached-token counts are still normalized for observability.
Configure the model's optional pricing block with the applicable Azure rates
for cost estimates. Provider-reported costs take priority; without configured
rates, recognized model names can use the shared OpenAI list-price table. That
fallback is not an Azure billing quote, and an unrecognized deployment name may
have no built-in estimate.
Sources: Azure OpenAI v1 lifecycle, Azure model availability, GPT-5.4 mini capabilities, GPT-5.2 capabilities, and GPT-4.1 nano capabilities. Model capability references do not guarantee deployment availability or Azure pricing.
OVH AI Endpoints¶
OVH uses the shared OpenAI-compatible API at
https://oai.endpoints.kepler.ai.cloud.ovh.net/v1 for both Chat Completions and
embeddings. Set OVH_API_KEY in the AIHub environment and select
ai_configuration.llm_provider = "ovh" and/or embedding_provider = "ovh".
The catalogue fields llm_name and embedding_name contain model IDs, not
endpoint URLs. The connector uses a fixed OVH host and rejects legacy URL values.
Generation profiles¶
The provider seed and centralized fallbacks use the following mapping, checked
against the official catalogue and public /v1/models API on 2026-09-24:
| Profile | Model ID | Reasoning setting |
|---|---|---|
default |
Qwen3.5-9B |
low |
tiny |
Qwen3.5-9B |
none |
mini |
Qwen3.5-9B |
low |
large |
Meta-Llama-3_3-70B-Instruct |
Not supported by this model |
reasoning |
gpt-oss-120b |
medium |
{
"provider": "ovh",
"llm_models": {
"llama_3_3_70b": {"llm_name": "Meta-Llama-3_3-70B-Instruct"},
"qwen_3_5_9b": {"llm_name": "Qwen3.5-9B"},
"gpt_oss_120b": {"llm_name": "gpt-oss-120b"}
},
"llm_profiles": {
"default": {"model": "qwen_3_5_9b", "reasoning_effort": "low"},
"tiny": {"model": "qwen_3_5_9b", "reasoning_effort": "none"},
"mini": {"model": "qwen_3_5_9b", "reasoning_effort": "low"},
"large": "llama_3_3_70b",
"reasoning": {"model": "gpt_oss_120b", "reasoning_effort": "medium"}
}
}
Llama 3.1 8B is no longer listed and its previous model endpoint returns 404. Mistral 7B Instruct v0.3 remains listed by the models API but is absent from the web catalogue; AIHub no longer selects it by default. Catalogue absence alone is not evidence of a scheduled retirement.
Calls forward messages, temperature, the output-token budget, tool definitions,
tool choice and JSON response formats. An explicit JSON schema takes precedence
over JSON-object mode. The adapter forwards reasoning effort for Qwen3.5-9B
(none, minimal, low, medium, high, as exposed by OVH's API schema) and
gpt-oss-120b (low, medium, high); unsupported values are rejected before a
request. It omits this parameter for Llama and other models without registered
reasoning support. Explicit profile reasoning settings remain authoritative.
Llama supports text, function calling and structured outputs, but not image
input. An image workflow explicitly selecting Llama needs a vision-capable
profile; the connector does not switch models automatically. Qwen3.5-9B, selected
by default, supports images. OVH streaming, asynchronous batch jobs and explicit
prompt-cache directives are not implemented by this adapter.
The client has a 120-second timeout; shorter workflow deadlines still apply.
Clients are closed on success, failure and cancellation. The existing LLM
bounded SDK retry policy applies, without a second application retry layer.
Token usage, including reported reasoning tokens, and provider-reported costs
are normalized. AIHub has no built-in OVH token-price table: configure a
model-level pricing block in USD when the endpoint does not report costs.
For comparison, the catalogue displayed the following EUR rates per million tokens on the verification date. These are reference prices, not an AIHub billing configuration or a guarantee of future prices:
| Model | Input | Output |
|---|---|---|
| Llama 3.3 70B | €0.67 | €0.67 |
| Qwen3.5-9B | €0.10 | €0.15 |
| gpt-oss-120b | €0.08 | €0.40 |
Embeddings¶
Both existing BGE models remain in the official catalogue and models API:
| Catalogue alias | embedding_name |
Dimensions | Maximum input per text |
|---|---|---|---|
bge_multilingual_gemma2 (default) |
bge-multilingual-gemma2 |
3,584 | 8,192 tokens |
bge_m3 |
bge-m3 |
1,024 | 8,192 tokens |
The connector now calls POST /v1/embeddings with model, input and
encoding_format = "float", through the OpenAI SDK. It reads vectors from
data[].embedding and orders them by data[].index. Each request contains at
most 25 texts, with one client reused across sequential batches. Missing,
duplicate or unexpected indices and incorrect BGE vector dimensions fail the
operation. HTTP errors, timeouts and cancellation propagate; the connector
never returns a partial list after a failed batch.
Only the transport and configured identifiers change. Preserve the existing
mongo_vector_index, mongo_vector_path, embedding_dimension,
threshold_delta and embedding profile/default selections. The two BGE models
and their vector storage layouts remain unchanged. OVH also lists
Qwen3-Embedding-8B (32–4,096 dimensions, 32,768 input tokens), but adopting it
would require a separate model migration and recomputation of stored vectors,
even when choosing the same dimension.
Migrating existing configuration¶
Updating the PostgreSQL initialization seed does not overwrite existing
aihub_ai_providers rows or MongoDB common_data.AIProviders documents. Prepare
the configuration change together with deployment: older AIHub versions expect
URLs, while the new connector requires model IDs for both generation and
embeddings.
Back up the provider configuration and review tenant ai_configuration.llm_profiles
overrides first. Replace tenant references to removed aliases or inline endpoint
URLs with the intended new catalogue alias/model ID, preserving their explicit
reasoning settings. The migration command updates the provider document only;
it does not change tenant overrides, select a different embedding model or
rebuild vectors/indexes.
# Preview the provider update using the configured DATABASE_URL and PG_SCHEMA.
.venv/bin/python -m scripts.migrate_ovh_provider --backend postgres
# Apply the reviewed update.
.venv/bin/python -m scripts.migrate_ovh_provider --backend postgres --apply
# MongoDB deployments use MONGO_CONNECTION_STR instead.
.venv/bin/python -m scripts.migrate_ovh_provider --backend mongodb
.venv/bin/python -m scripts.migrate_ovh_provider --backend mongodb --apply
The command replaces the standard legacy LLM entries/profile mappings, adds missing defaults, and changes the two known BGE URLs to model IDs. It preserves custom model IDs, profile options and embedding metadata. Ambiguous custom legacy URLs or conflicting catalogue aliases require manual migration and abort before writing. PostgreSQL locks the provider row in a transaction; MongoDB uses a conditional update to detect concurrent changes. Repeated application is a no-op. Restart AIHub after applying the configuration update to refresh cached provider settings.
Official sources¶
- AI Endpoints catalogue
- Public model IDs and API pricing
- Llama 3.3 70B
- Qwen3.5-9B
- Qwen3.5-9B API schema
- gpt-oss-120b
- BGE multilingual Gemma2
- BGE M3
- Qwen3 Embedding 8B
Tasks routed through each profile¶
The following table groups representative current tasks. It identifies the profile requested by the workflow; the concrete provider and model still come from runtime configuration, including provider-specific workflows below.
| Profile | Application areas | Current tasks |
|---|---|---|
default |
Main API, Chatbot, Data Exchange and Talent Intelligence | Experience-to-skills generation, prompt-engine generation, Talent Match Insights, development-objective generation, talent recommendation rationales, on-demand training rationales (profile- or search-based), feedback skill and sentiment extraction, chatbot rationales, objectives and simulations, and conversation titles. |
tiny |
Main API, Chatbot, MCP, Data Exchange and Skills Library | Chatbot and MCP structured language detection when py3langid is inconclusive, and an immediate translation fallback when DeepL is unavailable or its single attempt fails. |
mini |
Chatbot, Talent Intelligence, entity standardization and Lexi | CV extraction, supervisor/guardrail decisions, conditional guardrail responses, conversation summaries, opportunity intent and filter classification, training-title enrichment, job/skill classification and normalization, and Lexi skill-group/type mapping. |
large |
Chatbot, matching, Talent Intelligence and Lexi | LangGraph specialist work, global detection of skills completely irrelevant to a job, Lexi job-mission generation, contextual skill-level descriptions, and PDF/image document extraction. |
reasoning |
Talent Intelligence and Lexi | Anthropic catalogue generation, role-to-skill assignment and provided-skills selection. |
Conversation summaries are a specialized mini task with a 1,024-token output
limit. Guardrail boundary responses use 512 output tokens. Other LangGraph mini
calls use up to 2,048 output tokens and large
calls use up to 4,096. Direct calls normally use the shared 4,096-token policy;
known long-output workflows and Lexi-managed generation have their own limits.
Only Chatbot and MCP enable the language detector's tiny fallback; it has 15
seconds and disables prompt caching. Every other surface trusts py3langid alone.
Translation gives tiny 30 seconds, disables prompt caching, and bounds the
output. Both generation paths inherit the tiny profile effort (none by
default); configured overrides are preserved. Native Decisions has no effort
parameter. See
Language detection and translation
for the complete provider and persistence rules.
Workflows requiring a particular provider¶
| Workflow | Provider and profile | Provider requirement |
|---|---|---|
Talent Intelligence skill definitions and expected job-skill levels when type_llm=Anthropic |
Anthropic large |
The request selects Anthropic. The existing billing/credit retry remains unchanged. |
| Lexi catalogue generation, assignment and provided-skills selection with Anthropic | Anthropic reasoning |
Native token counting, model limits, streaming and Message Batches. Counting and generation resolve the same model. |
| Prompt engine | Selected provider, caller-selected profile (default when omitted) |
The multipart model_profile field accepts default, tiny, mini, large or reasoning. It replaces llm_model; callers must migrate that field. |
LangGraph supervisor routing and guardrail classification select mini through
OpenAI Decisions when the resolved model supports it. Azure, Anthropic, OVH and
unsupported OpenAI model mappings retain structured generation on the configured
provider and mini profile. Existing mappings are never overwritten and native
failures do not trigger a second generative call. Guardrail doubt/block responses
use a separate generative mini call on every provider. See the graph safety gate.
The same capability selection applies to memory, opportunity profile intents,
objective relevance, Lexi classifications, global skill-fit checks, marketplace
preselection and ambiguous-language detection. Native decisions use mini;
legacy providers keep each workflow's previous profile. See the
workflow and batching table.
Lexi's other phases use mini for classification and normalization, and large
for job missions and skill-level descriptions. Configure the provider catalogue
or tenant profiles instead of the removed LEXI_PROVIDED_MODEL environment
variable. Administrative client provisioning can still write model choices into
the stored profile configuration; generation uses that configuration.
Claude Sonnet 5.5¶
The Anthropic large fallback and initial provider catalogue now select
claude-sonnet-5-5. Other profiles keep their mappings. The pinned Anthropic SDK
(see current dependency constraints)
supports native JSON, normal responses, SDK streaming and
Message Batches without a dependency upgrade.
- Effort accepts
low,medium,high,xhighandmax. AIHub resolves profile effort (large=mediumby default); direct GenAI model selection without effort keeps the API defaulthigh. AIHub'snonetranslates tothinking.type=between_tools. This prevents up-front thinking, but does not disable thinking between tools. - JSON Schema goes through
output_config.format. The dynamic LangChain model uses native JSON forwith_structured_output()on Sonnet 5.5 and Opus 5.5, preserving Pydantic/dictionary parsing andinclude_rawbehavior. It resolves the tenant's provider and model at invocation time. The pinned SDK transforms generated schemas into Anthropic's supported JSON Schema subset (including closed objects); Pydantic still validates the original model constraints locally. - Tools support
autoandnone. Forced choices (requiredor a named function) are rejected before the request reaches Anthropic. GenAI discovery advertisesforced_tool_choice: false; no silent conversion toautooccurs. - No temperature, top-p, top-k or manual thinking budget is sent. Text parsing
ignores thinking blocks, while tool responses retain every native block in
anthropic_content, including empty signed thinking and redacted thinking. Tool continuations must replay that content unchanged, with the same preceding system prompt, tools, history and Anthropic account. The chatbot only replays native blocks to the originating provider and model. - Internal SDK streaming still returns the assembled response. Public GenAI SSE
support remains limited to the providers advertising
streaming: true. - Prompt caching requires at least 512 prompt tokens. The context window is 1,000,000 tokens; standard output supports up to 128,000 tokens. Existing application token limits still apply.
Global list prices, in USD per million tokens, are 2 input / 10 output, 0.20 cache read, 2.50 cache write (5 minutes) and 4 cache write (1 hour). Message Batches receive the standard 50% discount. The obsolete Sonnet 5 scheduled price increase is removed. Explicit configured pricing still takes precedence.
Migrating persisted Sonnet 5 settings¶
Changing the seed or fallback does not rewrite existing databases. Review the following dry-run against each configured backend before applying it:
.venv/bin/python -m scripts.migrate_anthropic_sonnet55 --backend mongodb
.venv/bin/python -m scripts.migrate_anthropic_sonnet55 --backend postgres
Add --apply only after reviewing the affected configuration count. The command
uses the existing database environment settings and performs no LLM inference.
It replaces exact claude-sonnet-5 identifiers and the standard
claude_sonnet_5 alias with claude-sonnet-5-5 / claude_sonnet_5_5, preserving
other models, custom aliases, reasoning settings, pricing overrides and prompts.
Review any explicit pricing overrides separately against the rates above.
Conflicting or repurposed standard catalogue aliases cause the migration to fail.
MongoDB requires exactly one Anthropic AIProviders document in common_data
and visits Config collections only in databases registered through
ClientConfig.clientDB. It validates all plans before writing and guards each
write against concurrent changes. Writes across documents are not atomic; a
partial migration can be rerun safely after resolving a conflict. Unregistered
tenant databases require separate review.
PostgreSQL updates the Anthropic row in aihub_ai_providers and the
aihub_config configuration of the configured schema in one transaction with
row locks. Run it separately for each deployed database/schema. Dry-run also
uses row locks while inspecting that transaction. Neither backend creates indexes
or changes the database schema; existing provider lookups, registry scans and
configuration access patterns are reused.
Sources: model specifications, migration guide, and pricing.
Claude Opus 5.5¶
The centralized Anthropic reasoning fallback is claude-opus-5-5, also used by
the Message Batches helper when no resolved model is supplied. Provider documents
and tenant profile overrides remain authoritative. Deploying this change does
not rewrite stored settings: update existing Opus 5 profile mappings separately.
Pricing overrides must also match the selected model's rates.
AIHub sends the resolved profile effort through output_config.effort for
Opus 5.5: the central reasoning default is medium, and provider/tenant
overrides remain authoritative. There is no connector-specific high default.
External GenAI requests may override the selected profile. Structured JSON
formats are preserved alongside effort. The connector sends no sampling parameters or
manual thinking budget, and extracts text independently of thinking blocks.
The pinned Anthropic SDK
(see current dependency constraints)
supports this model; no dependency upgrade
is required.
The migrated workflows make independent requests without tools or assistant
prefill. Opus 5.5 always uses adaptive thinking and rejects forced tool choices
(any and tool) and disabled/manual thinking. AIHub rejects forced choices
before opening the SDK client, including for streaming and batches. GenAI
advertises forced_tool_choice: false. tool_choice="none" explicitly disables
tool calls, even when tools are supplied. The chatbot uses native JSON Schema
for with_structured_output() on this model, rather than forcing a tool call;
Pydantic validation and include_raw retain their existing behavior.
Tool responses preserve native blocks in
anthropic_content, including signed and redacted thinking, for unchanged replay
in append-only conversations with the same account and model. Computer-use
tools are not used by the migrated workflows.
The context window is 1,000,000 tokens. Classic output is limited to 128,000
tokens; Message Batches supports 300,000 with output-300k-2026-03-24. Lexi
retains these limits and the beta header. Large classic requests use SDK
streaming internally, including provided-skills selection; callers still receive
the assembled response. Small non-streaming requests remain supported.
Standard global API list prices in USD per million tokens:
| Usage | Standard | Message Batches |
|---|---|---|
| Uncached input | 4.00 | 2.00 |
| Output, including thinking | 20.00 | 10.00 |
| Cache read | 0.20 | 0.10 |
| Cache write, 5 minutes | 5.00 | 2.50 |
| Cache write, 1 hour | 8.00 | 4.00 |
Obsolete Opus 5 and Claude 3.5 Sonnet prices have been removed from the built-in table. Configured pricing and provider-reported costs remain authoritative. Price resolution prefers the most specific model version. Fast mode and geographic pricing premiums are not enabled by these workflows.
Sources: model specifications, migration guide, pricing, and SDK 1.8.0 changelog.
Embedding models¶
Embeddings use ai_configuration.embedding_provider and embedding_model,
independently of the generation provider and its semantic LLM profiles. The tenant
selects a catalogue alias; the provider's embedding_models resolves it to
embedding_name, dimensions and vector storage metadata. An unspecified or
unknown tenant model inherits a valid default_embedding_model, then the
provider's built-in model if the database default is absent or invalid. Resolved
fallbacks include dimensions, vector index/path and threshold metadata together;
metadata from the rejected model is not reused.
The following table describes the repository defaults and the Lexi profile installed by the PostgreSQL migration chain. Existing database settings can differ.
| Provider | Selection / catalogue alias | Model or Azure deployment | Dimensions | Use |
|---|---|---|---|---|
| OpenAI | Default: ada_002 |
text-embedding-ada-002 |
1,536 | General embedding consumers, including persisted matching, skills and RAG vectors |
| OpenAI | Lexi: ada_003_small |
text-embedding-3-small |
1,536 | On-demand duplicate detection and provided-skills matching |
| Azure | Default: ada_002 |
text-embedding-ada-002 |
1,536 | General embedding consumers using the Azure resource |
| Azure | Lexi: ada_003_small |
text-embedding-3-small |
1,536 | Lexi embeddings using the Azure resource |
| OVH | Default: bge_multilingual_gemma2 |
bge-multilingual-gemma2 |
3,584 | General embedding consumers configured for OVH |
| OVH | Alternative: bge_m3 |
bge-m3 |
1,024 | Explicitly selected OVH alternative |
| Anthropic | None | No embedding connector | — | Select OpenAI, Azure or OVH independently |
The global seed marks OpenAI as the default embedding provider for tenants.
Calls without resolved tenant configuration currently fall back to Azure and
text-embedding-ada-002; supply the resolved configuration when the intended
provider differs. The built-in OVH fallback is bge-m3 (1,024 dimensions,
bge_m3_vector_index, bge_m3_vector, threshold delta 0). OpenAI and Azure use
text-embedding-ada-002 (1,536 dimensions, ada_002_vector_index, ada_002_vector,
threshold delta 0). These code defaults do not update stored provider documents
or recreate existing vectors/indexes.
The Azure deployment inventory checked on 2026-09-24 contains both
text-embedding-ada-002 and text-embedding-3-small. The OpenAI and Azure seed alias
ada_003_mini points to text-embedding-3-small with 1,536 dimensions. Its alias,
vector paths and index names are preserved. The Azure generation-profile migration
does not alter embedding entries in existing databases.
Lexi's independent embedding profile¶
The provider-level mapping embedding_profiles.lexi selects the model used by
Lexi's duplicate-detection and provided-skills matching. The seed maps it to
ada_003_mini for OpenAI/Azure and bge_multilingual_gemma2 for OVH. The PostgreSQL
migration retains its existing OpenAI/Azure alias ada_003_small, which resolves
to the same text-embedding-3-small model, and loads the OVH mapping after creating
the profile column. It preserves existing profile mappings on replay and only adds
a seeded mapping when its model alias is present in the provider catalogue.
General embedding defaults and stored-vector metadata are unchanged. MongoDB
provider records must carry an equivalent mapping when overriding the code default.
These initialization changes do not automatically update databases where the migrations have already run; update those provider records separately.
If this profile is missing or references an unknown model, it inherits the
resolved default embedding model for the selected provider. This avoids sending
an OpenAI model to OVH. Calls without any resolved AI configuration retain the
standalone Lexi fallback, text-embedding-3-small.
These Lexi vectors are computed in memory and are not persisted.
Training's enriched-title embedding profile¶
The provider-level mapping embedding_profiles.training selects the same model
for MongoDB enriched-title generation, PostgreSQL enrichment workers and chatbot
training queries. It resolves catalogue aliases through the shared provider
configuration, just like Lexi's embedding profile:
{
"embedding_models": {
"training_candidate": {
"embedding_name": "text-embedding-3-small",
"embedding_dimension": 1536
}
},
"embedding_profiles": {"training": "training_candidate"}
}
An explicit valid mapping wins. When the mapping is absent, the shared resolver
supplies a dedicated training default independent of the general embedding model:
text-embedding-ada-002 for OpenAI/Azure, preserving the existing training space,
and bge-m3 for OVH. These are runtime defaults, not writes to provider records.
Training remains a dedicated embedding selector; generation profiles such as
mini do not select vector models.
The current enriched-title storage/index contract remains 1,536 dimensions. Changing to a different dimension (including OVH's 1,024-dimensional default) requires a separately coordinated schema/index migration. Even at 1,536 dimensions, changing models requires rebuilding all stored training vectors before using the new query model. Unchanged MongoDB titles may reuse existing vectors, so ordinary reimports alone are not proof of a rebuild. This profile change performs no reembedding or index migration. Compare candidates with the embedding evaluation suite first.
Embedding calls and stored-vector compatibility¶
OpenAI and Azure use the SDK embeddings endpoint; Azure's model is a deployment
name. OVH uses the shared POST /v1/embeddings endpoint with a model ID and batches
of at most 25 texts; see OVH embeddings for input limits and response
validation. Embedding calls do not use reasoning_effort.
Changing a model changes its vector space, even when dimensions stay the same.
For persisted embeddings, regenerate the affected document vectors and query
vectors together, and align the configured dimensions and MongoDB/PostgreSQL
vector indexes. Changing default or large generation profiles does not affect
embeddings. The Azure update retains existing embedding models and vectors.
Realtime and speech models¶
Speech and continuous voice retain dedicated model selectors. Live's delegated
reasoning backend separately uses the OpenAI mini semantic profile, preserving
its configured model and reasoning effort for simulations.
| Capability | Tenant selector | OpenAI catalogue alias | Default model | Integration / use |
|---|---|---|---|---|
| Speech to text | llm_speech_to_text_model |
gpt_transcribe |
gpt-transcribe |
Uploaded audio transcription and file-based simulations |
| Text to speech | llm_text_to_speech_model |
gpt_4o_mini_tts |
gpt-4o-mini-tts |
Simulation MP3 replies |
| Continuous voice | llm_realtime_model |
gpt_live_1 |
gpt-live-1 |
Live WebSocket for roleplay |
Each selector resolves through its corresponding catalogue and default_llm_...
alias. The continuous-voice configuration field retains its name, but its transport
is the Live API. There is no separate input transcription catalogue. Stored
Realtime selections must be migrated before using Live; incompatible voice models
are rejected rather than substituted at connection time.
Only OpenAI implements these audio capabilities. Live explicitly uses OpenAI.
File STT/TTS still follows the provider selected by its existing connector.
TTS defaults to alloy and MP3; Live defaults to the French voice brise and raw
24 kHz PCM16. Simulation clients can override the voice through context.voice
when opening a new session.
See Live integration and configuration migration, tenant configuration, and the OpenAI Live guide.
Finding the model used by a request¶
Do not infer the effective model from the profile name alone. Inspect the
resolved tenant AI configuration or the call_llm_async child run in
LangSmith. The run records the task name, provider, actual model, token policy,
usage and available cost information. Direct background calls execute through
the same connector but appear as child runs only when an active LangGraph trace
exists.
For configuration examples, see Tenant AI configuration. For caching, limits and trace fields, see LLM runtime, caching and observability.