Scope: live model ID catalog (volatile: refreshed on 404 / retirement). For adapter wiring + behaviour (config snippets, mutual-exclusion quirks, custom adapter callbacks), see
PROVIDERS.md.
Tracks which model identifiers each stock adapter is known to accept, plus retired names that the API rejects for new users. Update when an example breaks with a 404 NOT_FOUND / model retired error.
How to refresh: query Context7 or the provider's official docs (URLs in §Sources). Do not guess model names; vendors quietly retire them. If unsure, run a list-models request against the live API.
Last verified: 2026-05-02.
1. Gemini
GA / stable
| Model | Notes |
|---|---|
gemini-2.5-pro | Top reasoning, multimodal |
gemini-2.5-flash | Fast + cheap, GA. Default for examples/gemini_example.exs. |
gemini-2.5-flash-lite | Cheapest, lowest latency |
gemini-2.5-flash-image | Image generation |
Preview (may shift without notice)
| Model |
|---|
gemini-3-flash-preview |
gemini-3-pro-image-preview |
gemini-3.1-flash-preview |
gemini-3.1-flash-lite-preview |
gemini-3.1-flash-image-preview |
gemini-3.1-pro-preview |
Auto-rolling aliases
gemini-flash-latest: latest stable flashgemini-pro-latest: latest stable pro
Retired (API rejects for new users)
| Model | Last known good | Replacement |
|---|---|---|
gemini-2.0-flash | pre-2026-05 | gemini-2.5-flash |
gemini-1.5-* | older | gemini-2.5-* |
Schema dialect quirks
generation_config.response_schemais OpenAPI 3.0 subset. RejectsadditionalProperties. CouncilEx'sProvider.Adapters.Geministrips that key viasanitize_for_gemini/1.$ref/$defsnot yet exercised; revisit if user schemas with embeds break.
Sources
- Google AI docs: https://ai.google.dev/gemini-api/docs
- Live model list:
GET https://generativelanguage.googleapis.com/v1beta/models?key=$GEMINI_API_KEY - Context7 library ID:
/websites/ai_google_dev_gemini-api - Pulled 2026-05-02 from Context7 priority-inference + google-search supported-models tables.
2. Anthropic
GA / stable
| Model | Notes |
|---|---|
claude-sonnet-4-6 | Default for examples/anthropic_streaming_example.exs and structured-output example |
claude-opus-4-7 | Top reasoning |
claude-haiku-4-5 | Fast + cheap |
Retired
| Model | Replacement |
|---|---|
claude-3-5-sonnet-* | claude-sonnet-4-6 |
claude-3-opus-* | claude-opus-4-7 |
claude-3-haiku-* | claude-haiku-4-5 |
Sources
- Anthropic docs: https://docs.anthropic.com/en/docs/about-claude/models
- Context7 library ID:
/websites/docs_anthropic_com - Live model list:
GET https://api.anthropic.com/v1/modelswithx-api-key
TODO: refresh against Context7 next time an Anthropic example 404s.
3. OpenAI
GA / stable
| Model | Notes |
|---|---|
gpt-4o | Multimodal flagship (legacy-stable) |
gpt-4o-mini | Cheap, used in TESTING.md tool-calling recipe |
o1 / o3 family | Reasoning models: verify availability per account |
Sources
- OpenAI docs: https://platform.openai.com/docs/models
- Live model list:
GET https://api.openai.com/v1/modelswithAuthorization: Bearer
TODO: refresh via Context7 (
/openai/openai-cookbookor platform docs) when next OpenAI example breaks. Catalog above reflects what's hard-coded in examples, not what's currently latest.
4. Ollama (local)
Model names = whatever you've ollama pulled locally. No central catalog. Common defaults used in examples:
| Model | Pull command |
|---|---|
llama3.1 | ollama pull llama3.1 |
If 404 model not found, the model isn't pulled. Run ollama list to inspect.
Sources
- Ollama library: https://ollama.com/library
- Local list:
ollama list
5. OpenRouter
Adapter
Use CouncilEx.Provider.Adapters.OpenRouter (thin wrapper over the OpenAI
adapter). It sets the OpenRouter :base_url default and accepts optional
:referer / :title opts that map to HTTP-Referer / X-Title
attribution headers.
Application.put_env(:council_ex, :providers,
openrouter: [
adapter: CouncilEx.Provider.Adapters.OpenRouter,
api_key: {:system, "OPENROUTER_API_KEY"},
referer: "https://example.com", # optional
title: "MyApp" # optional
]
)Catalog discovery
Unlike vendor-specific providers, OpenRouter's catalog is live and volatile. Models are added, deprecated, and re-priced continuously across hundreds of upstream providers. Do not maintain a static list as authoritative; query the API at lookup time.
- Live model list:
GET https://openrouter.ai/api/v1/models(auth required) - Filter by capability:
?supported_parameters=tools,?output_modalities=image - RSS feed for change tracking:
?use_rss=true - Live page: https://openrouter.ai/models
Recommended stable IDs (no date suffix, GA)
| ID | Cost tier | Capabilities |
|---|---|---|
google/gemini-2.5-flash | Cheap | Text, vision, tools, structured output |
openai/gpt-4o-mini | Cheap | Text, tools, structured output |
openai/gpt-4o | Mid | Flagship multimodal |
anthropic/claude-haiku-4-5 | Cheap | Text, tools |
anthropic/claude-sonnet-4-6 | Mid | Strong reasoning |
google/gemini-2.5-flash-lite | Cheapest | Text |
meta-llama/llama-3.3-70b-instruct | Cheap | Strong open-weight, tools |
mistralai/mistral-small-3.2 | Cheap | Tools + vision + structured output |
Special routing aliases
openrouter/auto: meta-model that routes to one of ~19 top models based on prompt complexity. Pay the selected model's rate; no premium.openrouter/free: routes to free-tier models matching the request's feature requirements.
IDs to avoid
- Anything with a date slug (e.g.
deepseek/deepseek-chat-v3-0324:free): these change without notice on upstream model updates. - Pin a date-suffixed version only if you need exact reproducibility.
Quirks
- Mid-stream errors arrive as SSE events with HTTP 200 (not 4xx). The adapter currently silently drops them.
- Auto context compression on models with
context <= 8192tokens unless explicitly disabled viaplugins: [{"id": "context-compression", "enabled": false}]. - Use
provider.require_parameters: truein the request body to fail fast when a structured-output / tool-calling request might land on an incapable provider.
Refresh protocol
Do NOT maintain a static table here as authoritative. The catalog is live. When an example breaks or a model is in question, hit GET /api/v1/models or check the live page. Prefer undated IDs in examples.
Sources
- https://openrouter.ai/docs/quickstart
- https://openrouter.ai/docs/api/reference/overview
- https://openrouter.ai/docs/api/api-reference/models/get-models
- https://openrouter.ai/docs/guides/overview/models
- https://openrouter.ai/docs/guides/routing/provider-selection
- Context7 library ID (fallback if live API is unavailable):
/llmstxt/openrouter_ai_llms_txt
Update protocol
When an example fails with 404 / not_found_error / model X is no longer available:
- Fetch current catalog (Context7 or vendor docs URL above).
- Update the example's
model("...")string. - Update this file's table: move the retired model to the Retired row.
- Bump Last verified date at the top.
- Tests using Bypass mocks don't need updating: the model name is part of the mocked URL path, not a real API call.
- OpenRouter exception: do not update §5's recommended-IDs table reactively. The catalog is live. Refresh from
GET /api/v1/modelsor https://openrouter.ai/models at lookup time and prefer undated IDs in the example instead.