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]