diff --git a/docs/docs/_generated/current_models_codexresponses.md b/docs/docs/_generated/current_models_codexresponses.md
index bde8aa824..de2867c0a 100644
--- a/docs/docs/_generated/current_models_codexresponses.md
+++ b/docs/docs/_generated/current_models_codexresponses.md
@@ -1,7 +1,8 @@
| Model string or alias | Resolves to / equivalent | Notes |
| --- | --- | --- |
| `astra` | `codexresponses.gpt-6-astra?reasoning=medium` | — |
-| `sol` | `codexresponses.gpt-6-sol?reasoning=medium` | — |
+| `sol` | `codexresponses.gpt-6.1-sol?reasoning=medium` | — |
+| `sol6` | `codexresponses.gpt-6-sol?reasoning=medium` | — |
| `luna` | `codexresponses.gpt-6-luna?reasoning=medium` | Fast |
| `sol56` | `codexresponses.gpt-5.6-sol?reasoning=high` | — |
| `terra` | `codexresponses.gpt-5.6-terra?reasoning=high` | — |
diff --git a/docs/docs/_generated/current_models_responses.md b/docs/docs/_generated/current_models_responses.md
index 59042562a..429b666af 100644
--- a/docs/docs/_generated/current_models_responses.md
+++ b/docs/docs/_generated/current_models_responses.md
@@ -1,6 +1,7 @@
| Model string or alias | Resolves to / equivalent | Notes |
| --- | --- | --- |
| `gpt-6-astra` | `responses.gpt-6-astra?reasoning=medium` | — |
+| `gpt-6.1-sol` | `responses.gpt-6.1-sol?reasoning=medium` | — |
| `gpt-6-sol` | `responses.gpt-6-sol?reasoning=medium` | — |
| `gpt-6-luna` | `responses.gpt-6-luna?reasoning=medium` | Fast |
| `gpt-5.6-sol` | `responses.gpt-5.6-sol?reasoning=medium` | — |
diff --git a/docs/docs/_generated/model_aliases_anthropic.md b/docs/docs/_generated/model_aliases_anthropic.md
index 39a7a6dd5..99d1c74f3 100644
--- a/docs/docs/_generated/model_aliases_anthropic.md
+++ b/docs/docs/_generated/model_aliases_anthropic.md
@@ -1,6 +1,6 @@
| Model Alias | Maps to | Model Alias | Maps to |
| --- | --- | --- | --- |
-| `claude` | `claude-sonnet-5` | `claude-sonnet-5` | `claude-sonnet-5` |
+| `claude` | `claude-sonnet-5-5` | `claude-sonnet-5-5` | `claude-sonnet-5-5` |
| `claude-3-5-haiku` | `claude-3-5-haiku` | `fable` | `claude-fable-5` |
| `claude-3-5-haiku-latest` | `claude-3-5-haiku-latest` | `fable5` | `claude-fable-5` |
| `claude-fable-5` | `claude-fable-5` | `haiku` | `claude-haiku-4-5` |
@@ -12,8 +12,9 @@
| `claude-opus-4-6` | `claude-opus-4-6` | `opus48` | `claude-opus-4-8` |
| `claude-opus-4-7` | `claude-opus-4-7` | `opus5` | `claude-opus-5` |
| `claude-opus-4-8` | `claude-opus-4-8` | `opus55` | `claude-opus-5-5` |
-| `claude-opus-5` | `claude-opus-5` | `sonnet` | `claude-sonnet-5` |
+| `claude-opus-5` | `claude-opus-5` | `sonnet` | `claude-sonnet-5-5` |
| `claude-opus-5-5` | `claude-opus-5-5` | `sonnet4` | `claude-sonnet-4-6` |
| `claude-sonnet-4-0` | `claude-sonnet-4-0` | `sonnet46` | `claude-sonnet-4-6` |
| `claude-sonnet-4-5` | `claude-sonnet-4-5` | `sonnet5` | `claude-sonnet-5` |
-| `claude-sonnet-4-6` | `claude-sonnet-4-6` | | |
+| `claude-sonnet-4-6` | `claude-sonnet-4-6` | `sonnet55` | `claude-sonnet-5-5` |
+| `claude-sonnet-5` | `claude-sonnet-5` | | |
diff --git a/docs/docs/_generated/model_aliases_codexresponses.md b/docs/docs/_generated/model_aliases_codexresponses.md
index e11956cb4..9c2842d76 100644
--- a/docs/docs/_generated/model_aliases_codexresponses.md
+++ b/docs/docs/_generated/model_aliases_codexresponses.md
@@ -9,6 +9,7 @@
| `gpt-5.3-codex-spark` | `gpt-5.3-codex-spark` |
| `luna` | `codexresponses.gpt-6-luna?reasoning=medium` |
| `luna56` | `codexresponses.gpt-5.6-luna?reasoning=medium` |
-| `sol` | `codexresponses.gpt-6-sol?reasoning=medium` |
+| `sol` | `codexresponses.gpt-6.1-sol?reasoning=medium` |
| `sol56` | `codexresponses.gpt-5.6-sol?reasoning=high` |
+| `sol6` | `codexresponses.gpt-6-sol?reasoning=medium` |
| `terra` | `codexresponses.gpt-5.6-terra?reasoning=high` |
diff --git a/docs/docs/_generated/model_aliases_hf.md b/docs/docs/_generated/model_aliases_hf.md
index cee980a8b..a9db933b3 100644
--- a/docs/docs/_generated/model_aliases_hf.md
+++ b/docs/docs/_generated/model_aliases_hf.md
@@ -1,6 +1,6 @@
| Model Alias | Maps to |
| --- | --- |
-| `DeepSeek V4 Flash 0731 (baseten)` | `hf.deepseek-ai/DeepSeek-V4-Flash-0731:baseten?max_tokens=384000` |
+| `DeepSeek V4 Flash 0731 (baseten)` | `hf.deepseek-ai/DeepSeek-V4-Flash-0731:baseten` |
| `DeepSeek V4 Flash 0731 (deepinfra)` | `hf.deepseek-ai/DeepSeek-V4-Flash-0731:deepinfra` |
| `DeepSeek V4.1 Flash (novita)` | `hf.deepseek-ai/DeepSeek-V4.1-Flash:novita` |
| `deepseek-ai/deepseek-v3.1` | `deepseek-ai/deepseek-v3.1` |
@@ -62,3 +62,5 @@
| `qwen36` | `hf.Qwen/Qwen3.6-35B-A3B:deepinfra?temperature=0.6&top_p=0.95&top_k=20&min_p=0.0&presence_penalty=0.0&repetition_penalty=1.0&reasoning=on` |
| `qwen36instruct` | `hf.Qwen/Qwen3.6-35B-A3B:deepinfra?temperature=0.7&top_p=0.8&top_k=20&min_p=0.0&presence_penalty=1.5&repetition_penalty=1.0&reasoning=off` |
| `zai-org/glm-5.2` | `zai-org/glm-5.2` |
+| `zai-org/glm-5.3` | `zai-org/glm-5.3` |
+| `zai-org/glm-5.3-flash` | `zai-org/glm-5.3-flash` |
diff --git a/docs/docs/_generated/model_aliases_responses.md b/docs/docs/_generated/model_aliases_responses.md
index 15e8f6e67..5a5337212 100644
--- a/docs/docs/_generated/model_aliases_responses.md
+++ b/docs/docs/_generated/model_aliases_responses.md
@@ -21,6 +21,7 @@
| `gpt-6-astra` | `responses.gpt-6-astra?reasoning=medium` |
| `gpt-6-luna` | `responses.gpt-6-luna?reasoning=medium` |
| `gpt-6-sol` | `responses.gpt-6-sol?reasoning=medium` |
+| `gpt-6.1-sol` | `responses.gpt-6.1-sol?reasoning=medium` |
| `gpt51` | `responses.gpt-5.1` |
| `gpt52` | `responses.gpt-5.2` |
| `gpt54` | `responses.gpt-5.4` |
@@ -31,6 +32,7 @@
| `gpt56-luna` | `responses.gpt-5.6-luna` |
| `gpt56-sol` | `responses.gpt-5.6-sol` |
| `gpt56-terra` | `responses.gpt-5.6-terra` |
+| `gpt61sol` | `responses.gpt-6.1-sol?reasoning=medium` |
| `gpt6astra` | `responses.gpt-6-astra?reasoning=medium` |
| `gpt6luna` | `responses.gpt-6-luna?reasoning=medium` |
| `gpt6sol` | `responses.gpt-6-sol?reasoning=medium` |
diff --git a/docs/docs/_generated/model_aliases_xai.md b/docs/docs/_generated/model_aliases_xai.md
index b3e3ed493..4df455357 100644
--- a/docs/docs/_generated/model_aliases_xai.md
+++ b/docs/docs/_generated/model_aliases_xai.md
@@ -1,24 +1,13 @@
-| Model Alias | Maps to |
-| --- | --- |
-| `grok` | `xai.grok-4.7` |
-| `Grok 4.3` | `xai.grok-4.3` |
-| `Grok 4.5` | `xai.grok-4.5` |
-| `Grok 4.5 (X Search)` | `xai.grok-4.5?x_search=true` |
-| `Grok 4.6` | `xai.grok-4.6` |
-| `Grok 4.6 (X Search)` | `xai.grok-4.6?x_search=true` |
-| `Grok 4.7` | `xai.grok-4.7` |
-| `Grok 4.7 (X Search)` | `xai.grok-4.7?x_search=true` |
-| `Grok 4.7 Fast (OAuth)` | `xai.grok-4.7-build-fast` |
-| `Grok 4.7 Fast (X Search, OAuth)` | `xai.grok-4.7-build-fast?x_search=true` |
-| `grok-4.3` | `grok-4.3` |
-| `grok-4.5` | `grok-4.5` |
-| `grok-4.6` | `grok-4.6` |
-| `grok-4.7` | `grok-4.7` |
-| `grok-4.7-build-fast` | `grok-4.7-build-fast` |
-| `grok4` | `xai.grok-4.7` |
-| `grok43` | `xai.grok-4.3` |
-| `grok45` | `xai.grok-4.5` |
-| `grok46` | `xai.grok-4.6` |
-| `grok47` | `xai.grok-4.7` |
-| `grok47fast` | `xai.grok-4.7-build-fast` |
-| `grokfast` | `xai.grok-4.7-build-fast` |
+| Model Alias | Maps to | Model Alias | Maps to |
+| --- | --- | --- | --- |
+| `grok` | `xai.grok-4.7` | `grok-4.5` | `grok-4.5` |
+| `Grok 4.3` | `xai.grok-4.3` | `grok-4.6` | `grok-4.6` |
+| `Grok 4.5` | `xai.grok-4.5` | `grok-4.7` | `grok-4.7` |
+| `Grok 4.5 (X Search)` | `xai.grok-4.5?x_search=true` | `grok-4.7-build-fast` | `grok-4.7-build-fast` |
+| `Grok 4.6` | `xai.grok-4.6` | `grok4` | `xai.grok-4.7` |
+| `Grok 4.6 (X Search)` | `xai.grok-4.6?x_search=true` | `grok43` | `xai.grok-4.3` |
+| `Grok 4.7` | `xai.grok-4.7` | `grok45` | `xai.grok-4.5` |
+| `Grok 4.7 (X Search)` | `xai.grok-4.7?x_search=true` | `grok46` | `xai.grok-4.6` |
+| `Grok 4.7 Fast (OAuth)` | `xai.grok-4.7-build-fast` | `grok47` | `xai.grok-4.7` |
+| `Grok 4.7 Fast (X Search, OAuth)` | `xai.grok-4.7-build-fast?x_search=true` | `grok47fast` | `xai.grok-4.7-build-fast` |
+| `grok-4.3` | `grok-4.3` | `grokfast` | `xai.grok-4.7-build-fast` |
diff --git a/docs/docs/_generated/models_reference.md b/docs/docs/_generated/models_reference.md
index 9cbd2b15c..dc5e6ad6e 100644
--- a/docs/docs/_generated/models_reference.md
+++ b/docs/docs/_generated/models_reference.md
@@ -23,7 +23,7 @@
| `claude-sonnet-4-20250514` | `anthropic` | Text, Vision, Document | `tool_use` | budget: `low`, `medium`, `high`, `max`, `0`, `1024`, `16000`, `32000`, `off`
Example: `claude-sonnet-4-20250514?reasoning=1024` | — | `web_search` (web_search_20250305)
`web_fetch` (web_fetch_20250910) |
| `claude-sonnet-4-5-20250929` | `anthropic` | Text, Vision, Document | `json` (schema) | budget: `low`, `medium`, `high`, `max`, `0`, `1024`, `16000`, `32000`, `off`
Example: `claude-sonnet-4-5-20250929?reasoning=1024` | — | `web_search` (web_search_20250305)
`web_fetch` (web_fetch_20250910) |
| `claude-sonnet-4-5` | `anthropic` | Text, Vision, Document | `json` (schema) | budget: `low`, `medium`, `high`, `max`, `0`, `1024`, `16000`, `32000`, `off`
Example: `claude-sonnet-4-5?reasoning=1024` | — | `web_search` (web_search_20250305)
`web_fetch` (web_fetch_20250910) |
-| `claude` | `anthropic` | Text, Vision, Document | `json` (schema) | effort: `auto`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `claude?reasoning=auto` | — | `web_search` (web_search_20260209)
`web_fetch` (web_fetch_20260209)
beta: `code-execution-web-tools-2026-02-09` |
+| `claude` | `anthropic` | Text, Vision, Document | `json` (schema) | effort: `auto`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `claude?reasoning=high` | — | `web_search` (web_search_20260209)
`web_fetch` (web_fetch_20260209)
beta: `code-execution-web-tools-2026-02-09` |
| `fable` | `anthropic` | Text, Vision, Document | `json` (schema) | effort: `auto`, `low`, `medium`, `high`, `xhigh`
Example: `fable?reasoning=auto` | — | `web_search` (web_search_20260209)
`web_fetch` (web_fetch_20260209)
beta: `code-execution-web-tools-2026-02-09` |
| `haiku` | `anthropic` | Text, Vision, Document | `json` (schema) | budget: `low`, `medium`, `high`, `max`, `0`, `1024`, `16000`, `32000`, `off`
Example: `haiku?reasoning=1024` | — | `web_search` (web_search_20250305)
`web_fetch` (web_fetch_20250910) |
| `opus46` | `anthropic` | Text, Vision, Document | `json` (schema) | effort: `auto`, `low`, `medium`, `high`, `max`, `off`
Example: `opus46?reasoning=auto` | — | `web_search` (web_search_20260209)
`web_fetch` (web_fetch_20260209)
beta: `code-execution-web-tools-2026-02-09` |
@@ -32,12 +32,14 @@
| `opus5` | `anthropic` | Text, Vision, Document | `json` (schema) | effort: `auto`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `opus5?reasoning=auto` | — | `web_search` (web_search_20260209)
beta: `code-execution-web-tools-2026-02-09` |
| `opus` | `anthropic` | Text, Vision, Document | `json` (schema) | effort: `auto`, `low`, `medium`, `high`, `xhigh`, `max`
Example: `opus?reasoning=medium` | — | `web_search` (web_search_20260209)
beta: `code-execution-web-tools-2026-02-09` |
| `sonnet4` | `anthropic` | Text, Vision, Document | `json` (schema) | effort: `auto`, `low`, `medium`, `high`, `max`, `off`
Example: `sonnet4?reasoning=auto` | — | `web_search` (web_search_20260209)
`web_fetch` (web_fetch_20260209)
beta: `code-execution-web-tools-2026-02-09` |
+| `sonnet5` | `anthropic` | Text, Vision, Document | `json` (schema) | effort: `auto`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `sonnet5?reasoning=auto` | — | `web_search` (web_search_20260209)
`web_fetch` (web_fetch_20260209)
beta: `code-execution-web-tools-2026-02-09` |
| `astra` | `codexresponses` | Text, Vision, Document | `json` (schema) | effort: `low`, `medium`, `high`, `xhigh`, `max`
Example: `astra?reasoning=medium` | `low`, `medium`, `high`
Example: `astra?verbosity=low` | — |
| `codexspark` | `codexresponses` | Text | `json` (schema) | — | — | — |
| `luna56` | `codexresponses` | Text, Vision, Document | `json` (schema) | effort: `none`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `luna56?reasoning=high` | `low`, `medium`, `high`
Example: `luna56?verbosity=low` | — |
| `luna` | `codexresponses` | Text, Vision, Document | `json` (schema) | effort: `none`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `luna?reasoning=medium` | `low`, `medium`, `high`
Example: `luna?verbosity=low` | — |
| `sol56` | `codexresponses` | Text, Vision, Document | `json` (schema) | effort: `none`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `sol56?reasoning=high` | `low`, `medium`, `high`
Example: `sol56?verbosity=low` | — |
-| `sol` | `codexresponses` | Text, Vision, Document | `json` (schema) | effort: `none`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `sol?reasoning=medium` | `low`, `medium`, `high`
Example: `sol?verbosity=low` | — |
+| `sol6` | `codexresponses` | Text, Vision, Document | `json` (schema) | effort: `none`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `sol6?reasoning=medium` | `low`, `medium`, `high`
Example: `sol6?verbosity=low` | — |
+| `sol` | `codexresponses` | Text, Vision, Document | `json` (schema) | effort: `low`, `medium`, `high`, `xhigh`, `max`
Example: `sol?reasoning=medium` | `low`, `medium`, `high`
Example: `sol?verbosity=low` | — |
| `terra` | `codexresponses` | Text, Vision, Document | `json` (schema) | effort: `none`, `low`, `medium`, `high`, `xhigh`, `max`, `off`
Example: `terra?reasoning=high` | `low`, `medium`, `high`
Example: `terra?verbosity=low` | — |
| `deepseek-v4-flash-vision-exp` | `deepseek` | Text, Vision | `json` (schema) | effort: `none`, `low`, `high`, `max`, `off`
Example: `deepseek-v4-flash-vision-exp?reasoning=max` | — | — |
| `deepseek-v4-flash` | `deepseek` | Text, Vision | `json` (schema) | effort: `none`, `low`, `high`, `max`, `off`
Example: `deepseek-v4-flash?reasoning=max` | — | — |
@@ -67,6 +69,7 @@
| `deepseek-ai/deepseek-v3.1` | `hf` | Text | `json` (schema) | — | — | — |
| `deepseek-hf` | `hf` | Text | `json` (schema) | — | — | — |
| `deepseek32` | `hf` | Text | `json` (schema) | — | — | — |
+| `deepseek41-hf` | `hf` | Text, Vision | `json` (schema) | effort: `none`, `low`, `high`, `max`, `off`
Example: `deepseek41-hf?reasoning=max` | — | — |
| `gemma4` | `hf` | Text, Vision | `json` (schema) | effort: `none`, `low`, `medium`, `high`, `off`
Example: `gemma4?reasoning=none` | — | — |
| `glimmer` | `hf` | Text, Vision | — | effort: `low`, `medium`, `high`, `xhigh`
Example: `glimmer?reasoning=high` | — | — |
| `glm47` | `hf` | Text | `json` (schema) | toggle: `on`, `off`
Example: `glm47?reasoning=off` | — | — |
@@ -88,6 +91,8 @@
| `qwen/qwen3.8-27b` | `hf` | Text, Vision, Video | `json` (object) | effort: `low`, `medium`, `xhigh`, `off`
Example: `qwen/qwen3.8-27b?reasoning=medium` | — | — |
| `qwen35` | `hf` | Text, Vision | `json` (object) | toggle: `on`, `off`
Example: `qwen35?reasoning=off` | — | — |
| `qwen36` | `hf` | Text | — | toggle: `on`, `off`
Example: `qwen36?reasoning=off` | — | — |
+| `zai-org/glm-5.3-flash` | `hf` | Text, Vision, Document, Video | `json` (object) | effort: `low`, `high`, `max`
Example: `zai-org/glm-5.3-flash?reasoning=max` | — | — |
+| `zai-org/glm-5.3` | `hf` | Text | `json` (object) | effort: `low`, `high`, `max`
Example: `zai-org/glm-5.3?reasoning=max` | — | — |
| `Muse Spark 1.1` | `metaai` | Text, Vision, Document, Video | `json` (schema) | effort: `minimal`, `low`, `medium`, `high`, `xhigh`
Example: `Muse Spark 1.1?reasoning=medium` | — | — |
| `Muse Spark 1.2 (Contributor)` | `metaai` | Text, Vision, Document, Video | `json` (schema) | effort: `minimal`, `low`, `medium`, `high`, `xhigh`
Example: `Muse Spark 1.2 (Contributor)?reasoning=medium` | — | — |
| `Muse Spark 1.2` | `metaai` | Text, Vision, Document, Video | `json` (schema) | effort: `minimal`, `low`, `medium`, `high`, `xhigh`
Example: `Muse Spark 1.2?reasoning=medium` | — | — |
diff --git a/docs/docs/models/providers/copilot.md b/docs/docs/models/providers/copilot.md
index f053a1248..71f38a45a 100644
--- a/docs/docs/models/providers/copilot.md
+++ b/docs/docs/models/providers/copilot.md
@@ -107,6 +107,7 @@ not canonical and has no alias; use `copilot.claude-opus-5`.
| `copilot.gpt-5.6-terra` | Responses |
| `copilot.gpt-5.6-sol` | Responses |
| `copilot.gpt-6-astra` | Responses |
+| `copilot.gpt-6.1-sol` | Responses |
| `copilot.gpt-6-sol` | Responses |
| `copilot.gpt-6-luna` | Responses |
@@ -116,7 +117,7 @@ with `(cp)`; this does not change the model name used in configuration.
## Structured output
-GPT-6 Astra/Sol/Luna use Responses JSON schema (`text.format`).
+GPT-6 Astra/Sol/Luna and GPT-6.1 Sol use Responses JSON schema (`text.format`).
Opus 5.5 and Sonnet 5.5 select Messages JSON schema (`output_config.format`)
automatically, without direct Anthropic beta headers. Regular tools can coexist
with the schema; explicit `structured_tool_policy` overrides remain supported.
@@ -128,6 +129,10 @@ its `reasoning=off` setting. These results confirm access for the tested account
availability can still vary by account. Use `structured_schema()` for the tool
loop. See the [credentialed smoke tests](anthropic.md#structured-output-current-models).
+GPT-6.1 Sol (`copilot.gpt-6.1-sol`) passed the same schema-only and
+tool-call-to-schema smoke tests on September 29, 2026 (also verified on the Codex
+OAuth route via `sol`).
+
## Claude 5.5 progress visibility
Live-tested on September 28, 2026 through the normal fast-agent tool loop.
diff --git a/docs/docs/models/providers/openai.md b/docs/docs/models/providers/openai.md
index bf7662b18..4cc459cb6 100644
--- a/docs/docs/models/providers/openai.md
+++ b/docs/docs/models/providers/openai.md
@@ -78,6 +78,7 @@ Examples:
- `responses.gpt-5.5?web_search=on`
- `responses.gpt-5.4?service_tier=flex`
- `responses.gpt-6-luna?service_tier=flex`
+- `responses.gpt-6.1-sol?reasoning=high`
### Codex Responses models
@@ -101,6 +102,7 @@ Examples:
- `astra`
- `codexresponses.gpt-6-astra?reasoning=max`
- `sol`
+- `sol6?reasoning=none`
- `luna?reasoning=none`
- `codexplan`
- `codexresponses.gpt-5.5?reasoning=high`
@@ -219,8 +221,8 @@ for card-scoped runtime targets.
## Codex (OAuth Responses)
**`fast-agent`** supports using your OpenAI Codex subscription. Run `fast-agent auth provider login codex`
-once, then use a Codex OAuth model alias such as `astra` (GPT-6-Astra), `sol` (GPT-6-Sol),
-`luna` (GPT-6-Luna), `codexplan` (GPT-6-Astra, medium reasoning),
+once, then use a Codex OAuth model alias such as `astra` (GPT-6-Astra), `sol` (GPT-6.1-Sol),
+`sol6` (GPT-6-Sol), `luna` (GPT-6-Luna), `codexplan` (GPT-6-Astra, medium reasoning),
`codexplan54` (GPT-5.4 planning), `codexplan53` (GPT-5.3 Codex planning), or
`codexspark` (GPT-5.3 Codex Spark).
@@ -262,10 +264,15 @@ codexresponses:
- Tokens are stored in your OS keyring, with a secure file fallback, via `fast-agent auth provider login codex`.
- `astra` maps to `codexresponses.gpt-6-astra?reasoning=medium`.
- `gpt-6-astra` maps to the API-key-backed `responses.gpt-6-astra?reasoning=medium` route; availability still depends on the OpenAI API account's model access.
-- `sol` maps to `codexresponses.gpt-6-sol?reasoning=medium`, and `luna` maps to
+- `sol` maps to `codexresponses.gpt-6.1-sol?reasoning=medium`; `gpt-6.1-sol` (alias
+ `gpt61sol`) uses the API-key-backed `responses` route. GPT-6.1-Sol uses the same shell
+ tool layout, transports and context windows as GPT-6-Sol, but like Astra it accepts
+ only `low`, `medium` (default), `high`, `xhigh` and `max` reasoning; `none` is rejected.
+- `sol6` maps to `codexresponses.gpt-6-sol?reasoning=medium`, and `luna` maps to
`codexresponses.gpt-6-luna?reasoning=medium`. `gpt-6-sol` and `gpt-6-luna` use the
- API-key-backed `responses` route. Unlike Astra, Sol and Luna also accept `reasoning=none`.
-- The previous `sol` and `luna` targets remain available as `sol56`
+ API-key-backed `responses` route. Unlike Astra and GPT-6.1-Sol, GPT-6-Sol and Luna also
+ accept `reasoning=none`.
+- The GPT-5.6 `sol` and `luna` targets remain available as `sol56`
(`codexresponses.gpt-5.6-sol?reasoning=high`) and `luna56`
(`codexresponses.gpt-5.6-luna?reasoning=medium`).
- `codexplan` maps to `codexresponses.gpt-6-astra?reasoning=medium`.
@@ -308,7 +315,7 @@ fast-agent go --model 'astra?lite=on&web_search=false'
```
No shell access or MCP server is required. This standalone route applies only to
-Lite requests (`lite=on`) for models such as Astra, GPT-6-Sol and GPT-6-Luna. Without
+Lite requests (`lite=on`) for models such as Astra, GPT-6.1-Sol, GPT-6-Sol and GPT-6-Luna. Without
`lite=on`, `web_search=true` uses hosted Responses web search, as it does for
public OpenAI Responses. The existing `codexresponses.web_search.enabled`
setting provides the configuration default; the model flag overrides it. Existing
@@ -371,9 +378,9 @@ limit. `response_length` requests detail, not a client-side hard cap.
fast-agent keeps the default context window at **272,000 tokens** for both
`astra` (Codex OAuth) and `gpt-6-astra` (Responses API). Larger context is opt-in,
-not an automatic increase: retaining more input can increase cost. GPT-6-Sol
-(`sol`/`gpt-6-sol`) and GPT-6-Luna (`luna`/`gpt-6-luna`) use the same route-specific
-defaults and opt-in windows as Astra.
+not an automatic increase: retaining more input can increase cost. GPT-6.1-Sol
+(`sol`/`gpt-6.1-sol`), GPT-6-Sol (`sol6`/`gpt-6-sol`) and GPT-6-Luna (`luna`/`gpt-6-luna`)
+use the same route-specific defaults and opt-in windows as Astra.
The local Codex source snapshot (`~/reference/codex/codex-rs/`) lists
`gpt-6-astra` as the first entry in `models-manager/models.json`, with
diff --git a/pyproject.toml b/pyproject.toml
index bc5d71733..d6ff6d6a1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "fast-agent-mcp"
-version = "0.10.39"
+version = "0.10.40"
description = "Code, Build and Evaluate agents - excellent Model and Skills/MCP/ACP/A2A Support"
readme = "README.md"
license = { file = "LICENSE" }
@@ -24,7 +24,7 @@ dependencies = [
"rich==15.0.0",
"typer==0.27.2",
"anthropic[vertex]==1.9.0",
- "openai[aiohttp,realtime]==3.19.2",
+ "openai[aiohttp,realtime]==3.21.0",
"prompt-toolkit==3.0.53",
"aiohttp==3.14.3",
"opentelemetry-exporter-otlp-proto-http==1.44.0",
diff --git a/src/fast_agent/llm/model_aliases.py b/src/fast_agent/llm/model_aliases.py
index ecc43c50d..14b7afd8d 100644
--- a/src/fast_agent/llm/model_aliases.py
+++ b/src/fast_agent/llm/model_aliases.py
@@ -12,6 +12,7 @@
"gpt56-terra": "responses.gpt-5.6-terra",
"gpt56-luna": "responses.gpt-5.6-luna",
"gpt6astra": "responses.gpt-6-astra?reasoning=medium",
+ "gpt61sol": "responses.gpt-6.1-sol?reasoning=medium",
"gpt6sol": "responses.gpt-6-sol?reasoning=medium",
"gpt6luna": "responses.gpt-6-luna?reasoning=medium",
"gpt54-mini": "responses.gpt-5.4-mini",
@@ -19,7 +20,8 @@
"chatgpt": "responses.chat-latest",
"chat-latest": "responses.chat-latest",
"codex": "responses.gpt-5.3-codex",
- "sol": "codexresponses.gpt-6-sol?reasoning=medium",
+ "sol": "codexresponses.gpt-6.1-sol?reasoning=medium",
+ "sol6": "codexresponses.gpt-6-sol?reasoning=medium",
"luna": "codexresponses.gpt-6-luna?reasoning=medium",
"sol56": "codexresponses.gpt-5.6-sol?reasoning=high",
"terra": "codexresponses.gpt-5.6-terra?reasoning=high",
@@ -149,6 +151,7 @@
"gpt-5.6-terra": "responses.gpt-5.6-terra?reasoning=medium",
"gpt-5.6-luna": "responses.gpt-5.6-luna?reasoning=medium",
"gpt-6-astra": "responses.gpt-6-astra?reasoning=medium",
+ "gpt-6.1-sol": "responses.gpt-6.1-sol?reasoning=medium",
"gpt-6-sol": "responses.gpt-6-sol?reasoning=medium",
"gpt-6-luna": "responses.gpt-6-luna?reasoning=medium",
"gpt-5.5": "responses.gpt-5.5?reasoning=medium",
diff --git a/src/fast_agent/llm/model_database.py b/src/fast_agent/llm/model_database.py
index 9ae492bd4..7ce927ae2 100644
--- a/src/fast_agent/llm/model_database.py
+++ b/src/fast_agent/llm/model_database.py
@@ -669,6 +669,10 @@ class ModelDatabase:
update={"reasoning_effort_spec": OPENAI_GPT_6_SOL_LUNA_REASONING}
)
+ # GPT-6.1 Sol keeps the GPT-6 Sol tool/transport layout but, like Astra, rejects
+ # `none`/`minimal` effort (verified on Codex OAuth and Copilot Responses).
+ OPENAI_GPT_61_SOL = OPENAI_GPT_6_ASTRA
+
# Freeform shell comes from Astra. The runaway-input limit is about 1.8x the
# largest observed legitimate GPT-6 Luna tool input (35,438 tokens); observed
# runaways streamed whitespace for 25-73 minutes.
@@ -1393,6 +1397,7 @@ class ModelDatabase:
"gpt-5.6-terra": _with_fast(OPENAI_GPT_56),
"gpt-5.6-luna": _with_fast(OPENAI_GPT_56_LUNA),
"gpt-6-astra": OPENAI_GPT_6_ASTRA,
+ "gpt-6.1-sol": OPENAI_GPT_61_SOL,
"gpt-6-sol": OPENAI_GPT_6_SOL_LUNA,
"gpt-6-luna": _with_fast(OPENAI_GPT_6_LUNA),
"gpt-5.4-mini": OPENAI_GPT_54_SMALL.model_copy(
@@ -1538,6 +1543,7 @@ class ModelDatabase:
(provider, model): _with_long_context(params, window)
for model, params in (
("gpt-6-astra", OPENAI_GPT_6_ASTRA),
+ ("gpt-6.1-sol", OPENAI_GPT_61_SOL),
("gpt-6-sol", OPENAI_GPT_6_SOL_LUNA),
("gpt-6-luna", _with_fast(OPENAI_GPT_6_LUNA)),
)
diff --git a/src/fast_agent/llm/model_selection.py b/src/fast_agent/llm/model_selection.py
index 785e05c58..d8cade7d3 100644
--- a/src/fast_agent/llm/model_selection.py
+++ b/src/fast_agent/llm/model_selection.py
@@ -58,6 +58,7 @@ class ModelSelectionCatalog:
CATALOG_ENTRIES_BY_PROVIDER: ClassVar[dict[Provider, tuple[CatalogModelEntry, ...]]] = {
Provider.RESPONSES: (
_builtin_entry("gpt-6-astra"),
+ _builtin_entry("gpt-6.1-sol"),
_builtin_entry("gpt-6-sol"),
_builtin_entry("gpt-6-luna", fast=True),
_builtin_entry("gpt-5.6-sol"),
@@ -279,7 +280,8 @@ class ModelSelectionCatalog:
),
Provider.CODEX_RESPONSES: (
_builtin_entry("astra", display_label="GPT-6-Astra"),
- _builtin_entry("sol", display_label="GPT-6-Sol"),
+ _builtin_entry("sol", display_label="GPT-6.1-Sol"),
+ _builtin_entry("sol6", display_label="GPT-6-Sol"),
_builtin_entry("luna", display_label="GPT-6-Luna", fast=True),
_builtin_entry("sol56"),
_builtin_entry("terra"),
diff --git a/src/fast_agent/llm/provider/copilot/models.py b/src/fast_agent/llm/provider/copilot/models.py
index af44ba43e..41bb74382 100644
--- a/src/fast_agent/llm/provider/copilot/models.py
+++ b/src/fast_agent/llm/provider/copilot/models.py
@@ -44,7 +44,7 @@ class CopilotModelSpec:
("sse", "websocket"),
supports_web_search=True,
)
- for model_id in ("gpt-6-sol", "gpt-6-luna")
+ for model_id in ("gpt-6.1-sol", "gpt-6-sol", "gpt-6-luna")
),
CopilotModelSpec(
"gpt-5.6-sol",
diff --git a/tests/e2e/structured/test_current_model_structured_outputs.py b/tests/e2e/structured/test_current_model_structured_outputs.py
index 9ada4d7f7..92b9353f2 100644
--- a/tests/e2e/structured/test_current_model_structured_outputs.py
+++ b/tests/e2e/structured/test_current_model_structured_outputs.py
@@ -21,11 +21,13 @@ class ArithmeticResult(BaseModel):
"model_name",
[
"responses.gpt-6-astra",
+ "responses.gpt-6.1-sol",
"responses.gpt-6-sol",
"responses.gpt-6-luna",
"opus55",
"sonnet55",
"copilot.gpt-6-astra",
+ "copilot.gpt-6.1-sol",
"copilot.gpt-6-sol",
"copilot.gpt-6-luna",
"copilot.opus55",
diff --git a/tests/unit/fast_agent/agents/test_mcp_agent_local_tools.py b/tests/unit/fast_agent/agents/test_mcp_agent_local_tools.py
index c9a75d263..24bc9eaed 100644
--- a/tests/unit/fast_agent/agents/test_mcp_agent_local_tools.py
+++ b/tests/unit/fast_agent/agents/test_mcp_agent_local_tools.py
@@ -1090,6 +1090,8 @@ async def test_write_text_file_auto_mode_prefers_apply_patch_for_codex_family_mo
"sol",
"luna",
"gpt-6-sol",
+ "gpt-6.1-sol",
+ "sol6",
"responses.gpt-6-luna?reasoning=none",
],
)
@@ -1108,7 +1110,10 @@ async def test_gpt6_defaults_to_writer_editor_pair_with_shell_name(model_name: s
@pytest.mark.asyncio
-@pytest.mark.parametrize("gpt6_model", ["codexresponses.gpt-6-sol", "codexresponses.gpt-6-astra"])
+@pytest.mark.parametrize(
+ "gpt6_model",
+ ["codexresponses.gpt-6.1-sol", "codexresponses.gpt-6-sol", "codexresponses.gpt-6-astra"],
+)
async def test_gpt6_sol_astra_use_freeform_shell_with_folding_capability(gpt6_model: str) -> None:
agents = [
McpAgent(
diff --git a/tests/unit/fast_agent/llm/providers/test_responses_helpers.py b/tests/unit/fast_agent/llm/providers/test_responses_helpers.py
index 098a08808..b06b29c3c 100644
--- a/tests/unit/fast_agent/llm/providers/test_responses_helpers.py
+++ b/tests/unit/fast_agent/llm/providers/test_responses_helpers.py
@@ -923,7 +923,9 @@ def test_codexresponses_provider_defaults_to_websocket_preferred_transport() ->
assert llm.configured_transport == "auto"
-@pytest.mark.parametrize("model_name", ["gpt-5.6-luna", "gpt-6-astra", "gpt-6-sol", "gpt-6-luna"])
+@pytest.mark.parametrize(
+ "model_name", ["gpt-5.6-luna", "gpt-6-astra", "gpt-6.1-sol", "gpt-6-sol", "gpt-6-luna"]
+)
def test_codexresponses_lite_uses_internal_request_contract(model_name: str) -> None:
llm = _build_responses_family_llm(Provider.CODEX_RESPONSES, model_name=model_name, lite=True)
input_items = [
@@ -1068,7 +1070,15 @@ async def test_codexresponses_inlines_local_pdf_without_files_api(tmp_path: Path
@pytest.mark.parametrize(
"model_name",
# Lite-capable models also use the standard contract unless `lite=on` is set.
- ["gpt-5.5", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-6-astra", "gpt-6-sol"],
+ [
+ "gpt-5.5",
+ "gpt-5.6-sol",
+ "gpt-5.6-terra",
+ "gpt-5.6-luna",
+ "gpt-6-astra",
+ "gpt-6.1-sol",
+ "gpt-6-sol",
+ ],
)
def test_codexresponses_standard_model_omits_lite_contract(model_name: str) -> None:
llm = _build_responses_family_llm(Provider.CODEX_RESPONSES, model_name=model_name)
diff --git a/tests/unit/fast_agent/llm/test_model_database.py b/tests/unit/fast_agent/llm/test_model_database.py
index 26538abcf..7bc1ff6d8 100644
--- a/tests/unit/fast_agent/llm/test_model_database.py
+++ b/tests/unit/fast_agent/llm/test_model_database.py
@@ -126,6 +126,38 @@ def test_gpt_6_sol_luna_match_astra_contract_with_none_effort(model: str) -> Non
assert routed.shell_tool_profile == params.shell_tool_profile
+def test_gpt_61_sol_uses_sol_layout_without_none_effort() -> None:
+ params = ModelDatabase.get_model_params("gpt-6.1-sol")
+ sol = ModelDatabase.get_model_params("gpt-6-sol")
+
+ assert params is not None and sol is not None
+ assert params.reasoning_effort_spec is not None
+ assert params.reasoning_effort_spec.allowed_efforts == ["low", "medium", "high", "xhigh", "max"]
+ assert params.reasoning_effort_spec.default == ReasoningEffortSetting(
+ kind="effort", value="medium"
+ )
+ layout = {
+ "context_window",
+ "max_output_tokens",
+ "json_mode",
+ "codex_responses_lite",
+ "response_transports",
+ "response_service_tiers",
+ "shell_tool_name",
+ "shell_tool_profile",
+ "shell_edit_tool",
+ "text_verbosity_spec",
+ "tokenizes",
+ "managed_process_poll_folding",
+ }
+ assert params.model_dump(include=layout) == sol.model_dump(include=layout)
+ assert params.fast is False
+ for provider, window in ((Provider.RESPONSES, 1_050_000), (Provider.CODEX_RESPONSES, 872_000)):
+ routed = ModelDatabase.get_model_params("gpt-6.1-sol", provider=provider)
+ assert routed is not None
+ assert routed.long_context_window == window
+
+
@pytest.mark.parametrize("provider", [Provider.RESPONSES, Provider.CODEX_RESPONSES])
@pytest.mark.parametrize("mime_type", [*DOCUMENT_MIME_TYPES, "image/png", "text/plain"])
def test_astra_supports_documents_and_existing_modalities(
diff --git a/tests/unit/fast_agent/llm/test_model_factory.py b/tests/unit/fast_agent/llm/test_model_factory.py
index 9d2479dc7..80484d184 100644
--- a/tests/unit/fast_agent/llm/test_model_factory.py
+++ b/tests/unit/fast_agent/llm/test_model_factory.py
@@ -575,7 +575,7 @@ def test_codexresponses_fast_service_tier_query_requires_model_support(
ModelFactory.parse_model_string(f"codexresponses.{model_name}?service_tier=fast")
-@pytest.mark.parametrize("model_name", ["gpt-6-astra", "gpt-6-sol", "gpt-6-luna"])
+@pytest.mark.parametrize("model_name", ["gpt-6-astra", "gpt-6.1-sol", "gpt-6-sol", "gpt-6-luna"])
def test_responses_gpt6_flex_service_tier_query(model_name: str) -> None:
config = ModelFactory.parse_model_string(f"responses.{model_name}?service_tier=flex")
@@ -1583,7 +1583,7 @@ def test_long_context_false_overrides_preset(default: str) -> None:
# One Codex alias and one Responses route; alias resolution is covered by the catalog tests.
-@pytest.mark.parametrize("model", ["astra", "responses.gpt-6-astra"])
+@pytest.mark.parametrize("model", ["astra", "responses.gpt-6-astra", "sol"])
@pytest.mark.parametrize(("query", "expected"), [("", "medium"), ("?reasoning=low", "low")])
def test_astra_reasoning_default_and_override(model: str, query: str, expected: str) -> None:
llm = ModelFactory.create_factory(f"{model}{query}")(LlmAgent(AgentConfig(name="test")))
@@ -1592,7 +1592,7 @@ def test_astra_reasoning_default_and_override(model: str, query: str, expected:
assert llm._resolve_reasoning_effort() == expected
-@pytest.mark.parametrize("model", ["sol", "responses.gpt-6-luna"])
+@pytest.mark.parametrize("model", ["sol6", "responses.gpt-6-luna"])
@pytest.mark.parametrize(("query", "expected"), [("", "medium"), ("?reasoning=none", "none")])
def test_gpt_6_sol_luna_reasoning_default_and_none(model: str, query: str, expected: str) -> None:
llm = ModelFactory.create_factory(f"{model}{query}")(LlmAgent(AgentConfig(name="test")))
diff --git a/tests/unit/fast_agent/llm/test_model_selection_catalog.py b/tests/unit/fast_agent/llm/test_model_selection_catalog.py
index 622d48603..7b5800179 100644
--- a/tests/unit/fast_agent/llm/test_model_selection_catalog.py
+++ b/tests/unit/fast_agent/llm/test_model_selection_catalog.py
@@ -117,7 +117,8 @@ def test_metaai_muse_aliases_select_the_current_and_contributor_tiers() -> None:
def test_codex_picker_aliases_resolve_through_the_canonical_runtime_presets() -> None:
expected = {
"astra": "codexresponses.gpt-6-astra?reasoning=medium",
- "sol": "codexresponses.gpt-6-sol?reasoning=medium",
+ "sol": "codexresponses.gpt-6.1-sol?reasoning=medium",
+ "sol6": "codexresponses.gpt-6-sol?reasoning=medium",
"luna": "codexresponses.gpt-6-luna?reasoning=medium",
"sol56": "codexresponses.gpt-5.6-sol?reasoning=high",
"luna56": "codexresponses.gpt-5.6-luna?reasoning=medium",
@@ -139,9 +140,16 @@ def test_codex_picker_aliases_resolve_through_the_canonical_runtime_presets() ->
) == ModelFactory.parse_model_string(model_spec)
-@pytest.mark.parametrize("name", ["astra", "sol", "luna"])
-def test_gpt_6_models_are_available_through_codex_and_api_routes(name: str) -> None:
- model = f"gpt-6-{name}"
+@pytest.mark.parametrize(
+ ("name", "model"),
+ [
+ ("astra", "gpt-6-astra"),
+ ("sol", "gpt-6.1-sol"),
+ ("sol6", "gpt-6-sol"),
+ ("luna", "gpt-6-luna"),
+ ],
+)
+def test_gpt_6_models_are_available_through_codex_and_api_routes(name: str, model: str) -> None:
assert BUILTIN_MODEL_ALIASES[name] == f"codexresponses.{model}?reasoning=medium"
assert BUILTIN_MODEL_ALIASES[model] == f"responses.{model}?reasoning=medium"
assert name in ModelSelectionCatalog.list_current_aliases(Provider.CODEX_RESPONSES)
diff --git a/tests/unit/llm/test_copilot_adapters.py b/tests/unit/llm/test_copilot_adapters.py
index 49ef8af5c..a392fbfb4 100644
--- a/tests/unit/llm/test_copilot_adapters.py
+++ b/tests/unit/llm/test_copilot_adapters.py
@@ -389,7 +389,15 @@ async def test_always_on_policy_and_thinking_preservation(
@pytest.mark.asyncio
@pytest.mark.parametrize(
"model",
- ["gpt-6-astra", "gpt-6-sol", "gpt-6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"],
+ [
+ "gpt-6-astra",
+ "gpt-6.1-sol",
+ "gpt-6-sol",
+ "gpt-6-luna",
+ "gpt-5.6-sol",
+ "gpt-5.6-terra",
+ "gpt-5.6-luna",
+ ],
)
@pytest.mark.parametrize("factory", [False, True])
async def test_gpt_defaults_to_websocket_without_sse_fallback(
@@ -926,7 +934,8 @@ def client_factory(**kwargs: Any) -> AsyncOpenAI:
@pytest.mark.asyncio
@pytest.mark.parametrize(
- "model", ["gpt-6-astra", "gpt-6-sol", "gpt-6-luna", "gpt-5.6-luna", "gpt-5.6-sol"]
+ "model",
+ ["gpt-6-astra", "gpt-6.1-sol", "gpt-6-sol", "gpt-6-luna", "gpt-5.6-luna", "gpt-5.6-sol"],
)
async def test_verified_web_search_toggle_and_websocket_payload(
model: str, broker: FakeBroker, context: Context
@@ -1294,7 +1303,7 @@ def test_factory_opus48_high_reasoning(context: Context) -> None:
@pytest.mark.asyncio
-@pytest.mark.parametrize("model", ["gpt-6-astra", "gpt-6-sol", "gpt-6-luna"])
+@pytest.mark.parametrize("model", ["gpt-6-astra", "gpt-6.1-sol", "gpt-6-sol", "gpt-6-luna"])
@pytest.mark.parametrize("copilot", [False, True], ids=["native", "copilot"])
@pytest.mark.parametrize(
"with_tools,policy",
diff --git a/tests/unit/llm/test_copilot_models.py b/tests/unit/llm/test_copilot_models.py
index 356210706..5c681954d 100644
--- a/tests/unit/llm/test_copilot_models.py
+++ b/tests/unit/llm/test_copilot_models.py
@@ -31,6 +31,7 @@
"gpt-5.6-terra",
"gpt-5.6-sol",
"gpt-6-astra",
+ "gpt-6.1-sol",
"gpt-6-sol",
"gpt-6-luna",
}
diff --git a/uv.lock b/uv.lock
index 7456c0bfc..984f7dcdf 100644
--- a/uv.lock
+++ b/uv.lock
@@ -911,7 +911,7 @@ requires-dist = [{ name = "fast-agent-mcp", editable = "." }]
[[package]]
name = "fast-agent-mcp"
-version = "0.10.39"
+version = "0.10.40"
source = { editable = "." }
dependencies = [
{ name = "a2a-sdk" },
@@ -1037,7 +1037,7 @@ requires-dist = [
{ name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'privacy-gpu'", specifier = ">=9" },
{ name = "onnxruntime", marker = "extra == 'privacy'", specifier = ">=1.25" },
{ name = "onnxruntime-gpu", marker = "extra == 'privacy-gpu'", specifier = ">=1.25" },
- { name = "openai", extras = ["aiohttp", "realtime"], specifier = "==3.19.2" },
+ { name = "openai", extras = ["aiohttp", "realtime"], specifier = "==3.21.0" },
{ name = "opentelemetry-exporter-otlp-proto-http", specifier = "==1.44.0" },
{ name = "opentelemetry-instrumentation-anthropic", marker = "python_full_version >= '3.10' and python_full_version < '4'", specifier = "==0.62.3" },
{ name = "opentelemetry-instrumentation-google-genai", specifier = "==1.1b1" },
@@ -2295,7 +2295,7 @@ wheels = [
[[package]]
name = "openai"
-version = "3.19.2"
+version = "3.21.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
@@ -2305,9 +2305,9 @@ dependencies = [
{ name = "sniffio" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/7c/91/2d5722388a50cc86e162779df5fbfe0afa652a6e2d5c9ee616e081a82098/openai-3.19.2.tar.gz", hash = "sha256:de185f9834ad064d965ec42bd0766731cf66bceea16a7670294a835d207019e6", size = 1716953, upload-time = "2026-09-24T00:06:07.315Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/ae/8d/52cfa8ed2edbe3ec14c0e9ca4f6258a234129b0846fa7e5779d8aba3d791/openai-3.21.0.tar.gz", hash = "sha256:b3da56a0693953fa1851d554579e8904d0166f524d004048b636c548e0b7ef8f", size = 1746642, upload-time = "2026-09-29T17:41:17.609Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/bd/20/4fe123e60525375878c67d1d8d051c9c5dec81cc56a579ba9304ca743303/openai-3.19.2-py3-none-any.whl", hash = "sha256:66247fcd07266e72536e90656dc27f3b0bb1e9d8696d4013fc55402c0b96a5c2", size = 2071459, upload-time = "2026-09-24T00:06:05.416Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/ad/1a1424ffc597cda66dabff0ca99da3f06c7218d679e3183a4bb55e8d0369/openai-3.21.0-py3-none-any.whl", hash = "sha256:28040df2ca1ffcb358c22d574aa3c339f37309650df972de0511fa1df8b09184", size = 2082977, upload-time = "2026-09-29T17:41:15.572Z" },
]
[package.optional-dependencies]