diff --git a/docs-site/src/content/docs/guides/codex-app-models.md b/docs-site/src/content/docs/guides/codex-app-models.md index 70ea33de9..69faac2e8 100644 --- a/docs-site/src/content/docs/guides/codex-app-models.md +++ b/docs-site/src/content/docs/guides/codex-app-models.md @@ -104,8 +104,8 @@ metadata instead of an older-template approximation. | Codex login (account-qualified rows enabled with eligible selectors) | One `/` row per eligible selector and supported native model; each row uses only its mapped account, and bare native rows are hidden from the picker. Native metadata and context windows are preserved. | | OpenAI (API key) | Exactly eight namespaced rows: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, and the three `*-pro` virtual ids (1,050,000 context; 922,000 max input for all eight) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (1,050,000) | -| Cursor | Static fallback includes `cursor/gpt-5.6-sol`, `cursor/gpt-5.6-terra`, and `cursor/gpt-5.6-luna` (1,000,000), plus `cursor/grok-4.5` and `cursor/grok-4.5-fast` (500,000); live account discovery decides which remain visible. | -| xAI | Live discovery is authoritative; the fallback catalog defaults to `xai/grok-4.5` with a 500,000-token window and `low` / `medium` / `high` reasoning controls. | +| Cursor | Static fallback includes `cursor/gpt-5.6-sol`, `cursor/gpt-5.6-terra`, and `cursor/gpt-5.6-luna` (1,000,000), plus regular/Fast rows for Grok 4.5 and 4.6 (500,000); 4.6 adds `xhigh`, and live account discovery decides which rows remain visible. | +| xAI | Live discovery is authoritative; the fallback catalog defaults to `xai/grok-4.5` and also includes `xai/grok-4.6` (500,000). Grok 4.5 exposes `low` / `medium` / `high`; 4.6 also exposes `xhigh`. | The pinned GPT-5.6 entries preserve the exact upstream ladder. Sol and Terra expose `low` through `ultra`; Luna stops at `max`. Sol defaults to `low`, while Terra and Luna default to `medium`. diff --git a/docs-site/src/content/docs/guides/providers.md b/docs-site/src/content/docs/guides/providers.md index 46348e537..cc4fc8c3e 100644 --- a/docs-site/src/content/docs/guides/providers.md +++ b/docs-site/src/content/docs/guides/providers.md @@ -503,8 +503,9 @@ Cursor is tracked separately as an experimental adapter. `adapter: "cursor"` app and the dashboard Add Provider picker as an experimental local config entry with Cursor's static fallback model catalog metadata. When a Cursor access token is configured, opencodex uses Cursor's live HTTP/2 transport. Its bundled fallback seed includes `gpt-5.6-sol` / `terra` / `luna` (1M context), -`grok-4.5` / `grok-4.5-fast` (500K), and `kimi-k3` (262K); live discovery decides which remain -visible for the account. Cursor serves Kimi K3 only as effort-suffixed wire ids, so +regular/Fast rows for Grok 4.5 and 4.6 (500K), and `kimi-k3` (262K); live discovery decides which +remain visible for the account. Grok 4.6 additionally exposes `xhigh` in both regular and Fast +forms. Cursor serves Kimi K3 only as effort-suffixed wire ids, so `cursor/kimi-k3` exposes a `low` / `high` / `max` ladder and defaults to `max`, matching the model's documented API default. Cursor server-driven native read/write/delete/ls/grep/shell/fetch execution is disabled by default because it bypasses Codex's approval and sandbox path; set diff --git a/docs-site/src/content/docs/ja/guides/codex-app-models.md b/docs-site/src/content/docs/ja/guides/codex-app-models.md index 8a992e027..ae0c8d2c3 100644 --- a/docs-site/src/content/docs/ja/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ja/guides/codex-app-models.md @@ -56,8 +56,8 @@ visibility = "list" | Codex ログイン (account-qualified 行が有効で、有効な selector あり) | 有効な selector とサポート対象 native model の各組み合わせに `/` 行を表示します。各行は対応付けられたアカウントだけを使用し、bare native 行はピッカーで非表示になります。Native metadata と context window は保持されます。 | | OpenAI (API キー) |正確に 8 つの名前空間行: `gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna、および 3 つの `*-pro` 仮想 ID (コンテキスト 1,050,000、8 つすべての最大入力 922,000) | |オープンルーター | `openrouter/openai/gpt-5.6-sol`、`openrouter/openai/gpt-5.6-terra`、`openrouter/openai/gpt-5.6-luna` (1,050,000) | -|カーソル |静的フォールバックには、`cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、および `cursor/gpt-5.6-luna` (1,000,000)、さらに `cursor/grok-4.5` および `cursor/grok-4.5-fast` (500,000) が含まれます。ライブアカウントの検出により、どれが表示されたままになるかが決まります。 | -|かおるライブディスカバリーには信頼性があります。フォールバック カタログのデフォルトは、500,000 トークン ウィンドウと `low` / `medium` / `high` 推論制御を備えた `xai/grok-4.5` です。 | +| Cursor | 静的フォールバックには `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna` (1,000,000) と、Grok 4.5 / 4.6 の通常・Fast 行 (500,000) が含まれます。4.6 は `xhigh` も公開し、ライブアカウントの検出によって表示される行が決まります。 | +| xAI | ライブディスカバリーが正です。フォールバックカタログのデフォルトは `xai/grok-4.5` で、`xai/grok-4.6` (500,000) も含まれます。4.5 は `low` / `medium` / `high`、4.6 はさらに `xhigh` を公開します。 | 固定された GPT-5.6 エントリは、正確な上流ラダーを保存します。 Sol と Terra は `low` から `ultra` を公開します。ルナは`max`で止まります。 Sol のデフォルトは `low`、Terra と Luna のデフォルトは `medium` です。 `ultra` は、最大限の推論とプロアクティブな委任を目的としたクライアント向けの選択肢であり、`max` としてバックエンドに到達します。ピッカーのエントリは、カタログの準備ができていることを意味するだけです。接続されたアカウントまたは API キーには、そのモデルを使用する資格がまだある必要があります。 diff --git a/docs-site/src/content/docs/ja/guides/providers.md b/docs-site/src/content/docs/ja/guides/providers.md index 54db46fdb..140b4663e 100644 --- a/docs-site/src/content/docs/ja/guides/providers.md +++ b/docs-site/src/content/docs/ja/guides/providers.md @@ -391,8 +391,9 @@ Cursor は別の実験的アダプターとして追跡します。`adapter: "cu Provider ピッカーに実験的 local config 項目として表示され、Cursor の静的フォールバックモデルカタログ メタデータを保存します。Cursor アクセストークンを設定すると opencodex は Cursor ライブ HTTP/2 トランスポートを 使います。バンドル済みフォールバックリストには 1M コンテキストの `gpt-5.6-sol` / `terra` / `luna`、500K コンテキストの -`grok-4.5` / `grok-4.5-fast`、262K コンテキストの `kimi-k3` が含まれ、ライブ探索結果に基づき現在の -アカウントに表示するモデルを決定します。Cursor は Kimi K3 を effort サフィックス付きの wire id +Grok 4.5 / 4.6 の通常・Fast 行、262K コンテキストの `kimi-k3` が含まれ、ライブ探索結果に基づき現在の +アカウントに表示するモデルを決定します。Grok 4.6 は通常・Fast の両方で `xhigh` も公開します。 +Cursor は Kimi K3 を effort サフィックス付きの wire id としてのみ提供するため、`cursor/kimi-k3` は `low` / `high` / `max` のラダーを公開し、既定値はモデル ドキュメントの API 既定値と同じ `max` です。Cursor サーバーが直接送るネイティブ read/write/delete/ls/grep/shell/fetch 実行は Codex 承認とサンドボックス経路をバイパスするためデフォルトで無効です。信頼できるローカル実験でのみ diff --git a/docs-site/src/content/docs/ja/reference/adapters.md b/docs-site/src/content/docs/ja/reference/adapters.md index fc05e0a61..08e5c6979 100644 --- a/docs-site/src/content/docs/ja/reference/adapters.md +++ b/docs-site/src/content/docs/ja/reference/adapters.md @@ -123,8 +123,9 @@ filtered incomplete になります。実際のツール呼び出しを伴わな - 通常の fetch/parse 経路の代わりに `runTurn` を使います。リクエスト、サーバーイベント、ツール引数、使用量 checkpoint、クライアントレスポンスは `cursor/gen/agent_pb.ts` の `@bufbuild/protobuf` スキーマでエンコードしたのち Connect メッセージとして framing します。 - content-addressed blob で対話状態を再生し、サーバーツール呼び出しを Codex に再マッピングします。protobuf の `GetUsableModels` RPC でリアルタイム Cursor モデルを探し、run リクエストが wire に commit される前だけリトライします。 -- `cursor/grok-4.5-fast` は選択可能なモデルとして維持しつつ、Cursor には正規の `grok-4.5` - モデルを送信し、個別の `effort` および `fast=true` 値は `requested_model.parameters` に格納します。 +- `cursor/grok-4.5` の reasoning effort は `high` まで、`cursor/grok-4.6` はさらに `xhigh` まで + 公開します。両方の `-fast` 行を選択可能なまま維持し、Cursor には対応する正規の Grok ベースモデルを + 送信して、個別の `effort` および `fast=true` 値を `requested_model.parameters` に格納します。 - Cursor ネイティブのローカルファイルシステム/shell/network 実行はデフォルトで拒否します。明示的な `mcpServers` と `desktopExecutor` 統合はそれぞれ別の opt-in です。`unsafeAllowNativeLocalExec` はより広い組み込み executor を有効にし、Codex の承認/サンドボックスルールを迂回します。 ## `azure-openai`(別名: `azure`) diff --git a/docs-site/src/content/docs/ko/guides/codex-app-models.md b/docs-site/src/content/docs/ko/guides/codex-app-models.md index b6f31f1b5..b8f196bcd 100644 --- a/docs-site/src/content/docs/ko/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ko/guides/codex-app-models.md @@ -83,8 +83,8 @@ GPT-5.6에만 사용합니다. 오래된 템플릿으로 근사하지 않고 모 | Codex 로그인(계정 한정 선택기 행 활성, 유효한 selector 있음) | 유효한 selector와 지원되는 native model의 각 조합마다 `/` 행을 표시합니다. 각 행은 매핑된 계정만 사용하며 bare native 행은 선택기에서 숨깁니다. Native metadata와 context window는 보존됩니다. | | OpenAI(API key) | 정확히 여덟 개의 네임스페이스 행: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, 그리고 세 개의 `*-pro` 가상 id (모두 컨텍스트 1,050,000; 최대 입력 922,000) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (1,050,000) | -| Cursor | 정적 폴백에는 `cursor/gpt-5.6-sol`, `cursor/gpt-5.6-terra`, `cursor/gpt-5.6-luna` (1,000,000)와 `cursor/grok-4.5`, `cursor/grok-4.5-fast` (500,000)가 들어갑니다. 실시간 계정 탐색이 어떤 항목을 계속 보일지 정합니다. | -| xAI | 실시간 탐색이 기준입니다. 폴백 카탈로그의 기본값은 `xai/grok-4.5`이고, 컨텍스트 500,000과 `low` / `medium` / `high` 추론 제어를 제공합니다. | +| Cursor | 정적 폴백에는 `cursor/gpt-5.6-sol`, `cursor/gpt-5.6-terra`, `cursor/gpt-5.6-luna` (1,000,000)와 Grok 4.5/4.6의 일반·Fast 항목(500,000)이 들어갑니다. 4.6은 `xhigh`도 노출하며, 실시간 계정 탐색이 어떤 항목을 계속 보일지 정합니다. | +| xAI | 실시간 탐색이 기준입니다. 폴백 카탈로그의 기본값은 `xai/grok-4.5`이고 `xai/grok-4.6`(500,000)도 포함합니다. 4.5는 `low` / `medium` / `high`, 4.6은 추가로 `xhigh`를 제공합니다. | 고정된 GPT-5.6 항목은 업스트림 ladder를 그대로 보존합니다. Sol과 Terra는 `low`부터 `ultra`까지 노출하고, Luna는 `max`에서 멈춥니다. Sol의 기본값은 `low`이고, Terra와 Luna의 기본값은 `medium`입니다. `ultra`는 diff --git a/docs-site/src/content/docs/ko/guides/providers.md b/docs-site/src/content/docs/ko/guides/providers.md index 9be3bdf6f..6dd3d009d 100644 --- a/docs-site/src/content/docs/ko/guides/providers.md +++ b/docs-site/src/content/docs/ko/guides/providers.md @@ -382,8 +382,9 @@ Cursor는 별도의 실험적 어댑터로 추적합니다. `adapter: "cursor"` Provider picker에 실험적 local config 항목으로 표시되며, Cursor의 static fallback model catalog metadata를 저장합니다. Cursor access token이 설정되면 opencodex는 Cursor live HTTP/2 transport를 사용합니다. 번들 폴백 목록에는 1M 컨텍스트의 `gpt-5.6-sol` / `terra` / `luna`, 500K 컨텍스트의 -`grok-4.5` / `grok-4.5-fast`, 262K 컨텍스트의 `kimi-k3`가 들어 있으며, 실시간 탐색 결과에 따라 -현재 계정에 표시할 모델을 결정합니다. Cursor는 Kimi K3를 effort 접미사가 붙은 wire id로만 +Grok 4.5/4.6의 일반·Fast 항목, 262K 컨텍스트의 `kimi-k3`가 들어 있으며, 실시간 탐색 결과에 따라 +현재 계정에 표시할 모델을 결정합니다. Grok 4.6은 일반·Fast 양쪽에서 `xhigh`도 노출합니다. +Cursor는 Kimi K3를 effort 접미사가 붙은 wire id로만 제공하므로 `cursor/kimi-k3`는 `low` / `high` / `max` 래더를 노출하고 기본값은 모델 문서의 API 기본값과 같은 `max`입니다. Cursor 서버가 직접 보내는 native read/write/delete/ls/grep/shell/fetch 실행은 Codex 승인 및 sandbox 경로를 우회하므로 기본적으로 비활성화되어 있습니다. 신뢰한 로컬 실험에서만 diff --git a/docs-site/src/content/docs/ko/reference/adapters.md b/docs-site/src/content/docs/ko/reference/adapters.md index e742eafa7..8acbd83dd 100644 --- a/docs-site/src/content/docs/ko/reference/adapters.md +++ b/docs-site/src/content/docs/ko/reference/adapters.md @@ -142,8 +142,9 @@ commentary로 유지하고 비공개 완료 툴을 한 번 검증합니다. - content-addressed blob으로 대화 상태를 재생하고 서버 툴 호출을 Codex에 다시 매핑합니다. protobuf `GetUsableModels` RPC로 실시간 Cursor 모델을 찾으며, run 요청이 wire에 commit되기 전까지만 재시도합니다. -- `cursor/grok-4.5-fast`는 선택 가능한 모델로 유지하되, Cursor에는 정식 `grok-4.5` 모델을 보내고 - 별도의 `effort`, `fast=true` 값은 `requested_model.parameters`에 담습니다. +- `cursor/grok-4.5`의 reasoning effort는 `high`까지, `cursor/grok-4.6`은 추가로 `xhigh`까지 + 노출합니다. 두 모델의 `-fast` 항목을 선택 가능하게 유지하되, Cursor에는 대응하는 정식 Grok 기본 + 모델을 보내고 별도의 `effort`, `fast=true` 값은 `requested_model.parameters`에 담습니다. - Cursor 네이티브 로컬 파일시스템/shell/network 실행은 기본적으로 거부합니다. 명시적인 `mcpServers`와 `desktopExecutor` 통합은 각각 별도 opt-in입니다. `unsafeAllowNativeLocalExec`은 더 넓은 내장 executor를 켜며 Codex 승인/샌드박스 규칙을 우회합니다. diff --git a/docs-site/src/content/docs/reference/adapters.md b/docs-site/src/content/docs/reference/adapters.md index ad7b82078..52449b2c6 100644 --- a/docs-site/src/content/docs/reference/adapters.md +++ b/docs-site/src/content/docs/reference/adapters.md @@ -198,9 +198,10 @@ advertised effort control on those models as proof of upstream-native reasoning - Exposes Cursor Router as `cursor/auto` plus explicit `cursor/auto-cost`, `cursor/auto-balance`, and `cursor/auto-intelligence` entries. Explicit levels are encoded in `requested_model.parameters` while the legacy `cursor/auto` entry retains the account/team default. -- Sends regular `cursor/grok-4.5` tiers with Cursor's exact live-discovery wire ids - (`cursor-grok-4.5-low`, `-medium`, or `-high`). Keeps `cursor/grok-4.5-fast` selectable while - sending the canonical `grok-4.5` model with separate `effort` and `fast=true` parameters. +- Sends regular `cursor/grok-4.5` and `cursor/grok-4.6` tiers with Cursor's exact live-discovery + wire ids. Grok 4.5 stops at `high`; Grok 4.6 also exposes `xhigh`. Keeps both matching `-fast` + rows selectable while sending the canonical Grok base model with separate `effort` and + `fast=true` values in `requested_model.parameters`. - Cursor-native local filesystem/shell/network execution is denied by default. Explicit `mcpServers` and `desktopExecutor` integrations have separate opt-ins; `nativeLocalExec: "on"` enables the broader built-in executor and bypasses Codex approval/sandbox semantics, and legacy diff --git a/docs-site/src/content/docs/ru/guides/codex-app-models.md b/docs-site/src/content/docs/ru/guides/codex-app-models.md index 425e71464..5c11001d4 100644 --- a/docs-site/src/content/docs/ru/guides/codex-app-models.md +++ b/docs-site/src/content/docs/ru/guides/codex-app-models.md @@ -89,8 +89,8 @@ per-model identity и метаданные вместо приближения | Вход Codex (строки с указанием аккаунта включены и есть подходящие селекторы) | По одной строке `/` для каждой пары подходящего селектора и поддерживаемой нативной модели; каждая строка использует только сопоставленный аккаунт, а bare native-строки скрыты из picker'а. Нативные метаданные и окна контекста сохраняются. | | OpenAI (API key) | Ровно восемь namespaced-строк: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna и три виртуальных id `*-pro` (контекст 1,050,000; максимум входа 922,000 у всех восьми) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (1,050,000) | -| Cursor | Статический fallback включает `cursor/gpt-5.6-sol`, `cursor/gpt-5.6-terra` и `cursor/gpt-5.6-luna` (1,000,000), а также `cursor/grok-4.5` и `cursor/grok-4.5-fast` (500,000); какие из них останутся видимыми, решает live-discovery аккаунта. | -| xAI | Live-discovery авторитетно; fallback-каталог по умолчанию содержит `xai/grok-4.5` с окном 500,000 токенов и reasoning-control `low` / `medium` / `high`. | +| Cursor | Статический fallback включает `cursor/gpt-5.6-sol`, `cursor/gpt-5.6-terra` и `cursor/gpt-5.6-luna` (1,000,000), а также обычные/Fast-строки Grok 4.5 и 4.6 (500,000). Для 4.6 доступен ещё `xhigh`; какие строки останутся видимыми, решает live-discovery аккаунта. | +| xAI | Live-discovery авторитетно; fallback-каталог по умолчанию содержит `xai/grok-4.5` и также включает `xai/grok-4.6` (500,000). Для 4.5 доступны `low` / `medium` / `high`, для 4.6 — ещё и `xhigh`. | Закреплённые записи GPT-5.6 сохраняют точную upstream-лестницу. Sol и Terra дают диапазон от `low` до `ultra`; у Luna верхняя ступень — `max`. По умолчанию у Sol стоит `low`, а у Terra и diff --git a/docs-site/src/content/docs/ru/guides/providers.md b/docs-site/src/content/docs/ru/guides/providers.md index 966d75dcb..c548edd5d 100644 --- a/docs-site/src/content/docs/ru/guides/providers.md +++ b/docs-site/src/content/docs/ru/guides/providers.md @@ -422,8 +422,9 @@ Cursor отслеживается отдельно как эксперимент `ocx init` и в селекторе Add Provider дашборда как экспериментальная запись локальной конфигурации с метаданными статического резервного каталога моделей Cursor. Когда настроен токен доступа Cursor, opencodex использует живой транспорт HTTP/2 Cursor. Его встроенный резервный список включает -`gpt-5.6-sol` / `terra` / `luna` (контекст 1M), `grok-4.5` / `grok-4.5-fast` (500K) и `kimi-k3` -(262K); живое обнаружение решает, какие из них останутся видимыми для аккаунта. Cursor отдаёт +`gpt-5.6-sol` / `terra` / `luna` (контекст 1M), обычные/Fast-строки Grok 4.5 и 4.6 (500K) и +`kimi-k3` (262K); живое обнаружение решает, какие из них останутся видимыми для аккаунта. Для +Grok 4.6 доступен `xhigh` как в обычной, так и в Fast-форме. Cursor отдаёт Kimi K3 только через wire id с суффиксом усилия, поэтому `cursor/kimi-k3` предоставляет лестницу `low` / `high` / `max` и по умолчанию использует `max` — как и задокументированное значение по умолчанию в API модели. Управляемое сервером Cursor diff --git a/docs-site/src/content/docs/ru/reference/adapters.md b/docs-site/src/content/docs/ru/reference/adapters.md index 6386236c4..319c4023e 100644 --- a/docs-site/src/content/docs/ru/reference/adapters.md +++ b/docs-site/src/content/docs/ru/reference/adapters.md @@ -155,8 +155,10 @@ authorization. - Воспроизводит состояние диалога через content-addressed blob'ы, отображает серверные вызовы инструментов обратно в Codex, обнаруживает актуальные модели Cursor через protobuf RPC `GetUsableModels` и повторяет попытки только до того, как run-запрос зафиксирован на wire. -- Сохраняет `cursor/grok-4.5-fast` доступной для выбора, но отправляет Cursor каноническую модель - `grok-4.5`, помещая отдельные значения `effort` и `fast=true` в `requested_model.parameters`. +- Для `cursor/grok-4.5` предоставляет уровни reasoning до `high`, а для `cursor/grok-4.6` — также + `xhigh`. Обе соответствующие строки `-fast` остаются доступными для выбора; Cursor получает + каноническую базовую модель Grok, а отдельные значения `effort` и `fast=true` помещаются в + `requested_model.parameters`. - Нативное для Cursor локальное выполнение операций с файловой системой/shell/сетью по умолчанию запрещено. Явные интеграции `mcpServers` и `desktopExecutor` включаются отдельно; `unsafeAllowNativeLocalExec` включает более широкий встроенный executor и обходит семантику diff --git a/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md b/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md index c5773baae..c7b806988 100644 --- a/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md +++ b/docs-site/src/content/docs/zh-cn/guides/codex-app-models.md @@ -69,8 +69,8 @@ visibility = "list" | Codex 登录(账户限定的选择器行已启用且存在有效 selector) | 为每个有效 selector 与受支持原生模型的组合显示 `/` 行。每行只使用映射账户,裸原生行会从选择器中隐藏。原生 metadata 与 context window 会保留。 | | OpenAI(API key) | 恰好八个命名空间行:`gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna,以及三个 `*-pro` 虚拟 id(八个条目均为 1,050,000 context / 922,000 max input) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`、`openrouter/openai/gpt-5.6-terra`、`openrouter/openai/gpt-5.6-luna`(1,050,000) | -| Cursor | 静态回退包含 `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna`(1,000,000),以及 `cursor/grok-4.5` 和 `cursor/grok-4.5-fast`(500,000);实时账户发现会决定最终哪些条目仍然可见。 | -| xAI | 实时发现具有权威性;回退目录默认使用 `xai/grok-4.5`,上下文窗口为 500,000,并提供 `low` / `medium` / `high` reasoning 控制。 | +| Cursor | 静态回退包含 `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna`(1,000,000),以及 Grok 4.5/4.6 的普通和 Fast 条目(500,000)。4.6 还提供 `xhigh`;实时账户发现会决定最终哪些条目仍然可见。 | +| xAI | 实时发现具有权威性;回退目录默认使用 `xai/grok-4.5`,并包含 `xai/grok-4.6`(500,000)。4.5 提供 `low` / `medium` / `high`,4.6 还提供 `xhigh`。 | 固定的 GPT-5.6 条目保留了精确的上游阶梯。Sol 和 Terra 暴露从 `low` 到 `ultra` 的档位;Luna 只到 `max`。Sol 默认是 `low`,Terra 和 Luna 默认是 `medium`。`ultra` 是面向客户端的最大 reasoning 加主动委派选项,在后端会以 `max` 传入。选择器里的一个条目只表示目录已经准备好:关联的账户或 API key 仍然必须有权使用该模型。 diff --git a/docs-site/src/content/docs/zh-cn/guides/providers.md b/docs-site/src/content/docs/zh-cn/guides/providers.md index 2d57170b9..598952531 100644 --- a/docs-site/src/content/docs/zh-cn/guides/providers.md +++ b/docs-site/src/content/docs/zh-cn/guides/providers.md @@ -363,8 +363,9 @@ adapter。若要将没有内置默认值的模型(例如 `gpt-5.4-nano`)接 Cursor 作为单独的实验性 adapter 进行跟踪。`adapter: "cursor"` 会作为实验性本地配置出现在 `ocx init` 和 dashboard Add Provider picker 中,并保存 Cursor 的静态回退模型目录 metadata。配置 Cursor access token 后,opencodex 会使用 Cursor live HTTP/2 transport。内置回退列表包含上下文为 -1M 的 `gpt-5.6-sol` / `terra` / `luna`、上下文为 500K 的 `grok-4.5` / `grok-4.5-fast`,以及上下文为 -262K 的 `kimi-k3`;最终显示哪些模型由账号的实时发现结果决定。Cursor 只以带 effort 后缀的 wire id +1M 的 `gpt-5.6-sol` / `terra` / `luna`、上下文为 500K 的 Grok 4.5/4.6 普通与 Fast 条目,以及上下文为 +262K 的 `kimi-k3`;最终显示哪些模型由账号的实时发现结果决定。Grok 4.6 的普通和 Fast 形式还提供 +`xhigh`。Cursor 只以带 effort 后缀的 wire id 提供 Kimi K3,因此 `cursor/kimi-k3` 暴露 `low` / `high` / `max` 阶梯,默认值为 `max`,与该模型 文档中的 API 默认值一致。Cursor 服务器直接发起的 native read/write/delete/ls/grep/shell/fetch 执行默认禁用,因为它会绕过 Codex 的 approval 和 diff --git a/docs-site/src/content/docs/zh-cn/reference/adapters.md b/docs-site/src/content/docs/zh-cn/reference/adapters.md index e6d1c3063..ae3f6ed75 100644 --- a/docs-site/src/content/docs/zh-cn/reference/adapters.md +++ b/docs-site/src/content/docs/zh-cn/reference/adapters.md @@ -133,7 +133,8 @@ Kiro 的 assistant 文本本身没有可靠的回合结束标记,但终止的 Connect message。 - 经 content-addressed blob 重放对话状态,把 server tool call 映射回 Codex,用 protobuf `GetUsableModels` RPC 发现实时 Cursor 模型,并且只在 run request 尚未 commit 到 wire 前重试。 -- 保留 `cursor/grok-4.5-fast` 作为可选模型,但向 Cursor 发送规范的 `grok-4.5` 模型,并将独立的 +- `cursor/grok-4.5` 提供到 `high` 的 reasoning 档位,`cursor/grok-4.6` 还提供 `xhigh`。 + 两者对应的 `-fast` 条目都会保留;向 Cursor 发送的是对应的规范 Grok 基础模型,独立的 `effort` 和 `fast=true` 值放入 `requested_model.parameters`。 - Cursor 原生本地 filesystem/shell/network 执行默认被拒绝。显式 `mcpServers` 与 `desktopExecutor` 集成分别需要 opt-in;`unsafeAllowNativeLocalExec` 会启用更广泛的内置 diff --git a/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md b/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md index 0bc0e5e4d..f7e16002c 100644 --- a/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md +++ b/docs-site/src/content/docs/zh-tw/guides/codex-app-models.md @@ -91,8 +91,8 @@ GPT-5.6,以便提供每個模型真實的身份和後設資料,而不是套 | Codex 登入(啟用帳號限定列且有合格選擇器) | 每個合格選擇器與受支援的原生模型各有一列 `/`;每列只使用其對應帳號,且裸原生列會從選擇器中隱藏。原生後設資料與 context 視窗保持不變。 | | OpenAI(API key) | 恰好八個帶名稱空間的列:`gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna 與三個 `*-pro` 虛擬 id(全部八個都是 1,050,000 context;922,000 max input) | | OpenRouter | `openrouter/openai/gpt-5.6-sol`、`openrouter/openai/gpt-5.6-terra`、`openrouter/openai/gpt-5.6-luna`(1,050,000) | -| Cursor | 靜態回退目錄包含 `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna`(1,000,000),以及 `cursor/grok-4.5`、`cursor/grok-4.5-fast`(500,000);帳號的即時發現結果決定最終顯示哪些模型。 | -| xAI | 以即時發現結果為準;回退目錄預設使用 `xai/grok-4.5`,視窗為 500,000 token,並提供 `low` / `medium` / `high` reasoning 控制。 | +| Cursor | 靜態回退目錄包含 `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna`(1,000,000),以及 Grok 4.5/4.6 的一般與 Fast 項目(500,000)。4.6 還提供 `xhigh`;帳號的即時發現結果決定最終顯示哪些模型。 | +| xAI | 以即時發現結果為準;回退目錄預設使用 `xai/grok-4.5`,並包含 `xai/grok-4.6`(500,000)。4.5 提供 `low` / `medium` / `high`,4.6 還提供 `xhigh`。 | 固定的 GPT-5.6 條目會保留精確的上游 reasoning 階梯。Sol 和 Terra 從 `low` 到 `ultra`,Luna 最高到 `max`。Sol 預設使用 `low`,Terra 和 Luna 預設使用 `medium`。`ultra` 是用戶端側的 diff --git a/docs-site/src/content/docs/zh-tw/guides/providers.md b/docs-site/src/content/docs/zh-tw/guides/providers.md index cbbe1d38f..451ab8dc7 100644 --- a/docs-site/src/content/docs/zh-tw/guides/providers.md +++ b/docs-site/src/content/docs/zh-tw/guides/providers.md @@ -462,8 +462,9 @@ Copilot 的 catalog 混合多種 wire:GPT-5 family(`gpt-5.3-codex`、`gpt-5. Cursor 另以實驗性 adapter 追蹤。`adapter: "cursor"` 會在 `ocx init` 與 dashboard Add Provider picker 出現為實驗性 local config,並帶 Cursor static fallback model catalog metadata。設定 Cursor access token 後,opencodex 使用 Cursor 即時 HTTP/2 transport。bundled fallback seed 包含 1M context 的 -`gpt-5.6-sol`/`terra`/`luna`、500K 的 `grok-4.5`/`grok-4.5-fast`,以及 262K 的 `kimi-k3`;即時探索 -決定哪些模型對帳號保持可見。Cursor 的 Kimi K3 只以帶 effort suffix 的 wire id 提供,因此 +`gpt-5.6-sol`/`terra`/`luna`、500K 的 Grok 4.5/4.6 一般與 Fast 項目,以及 262K 的 `kimi-k3`;即時探索 +決定哪些模型對帳號保持可見。Grok 4.6 的一般與 Fast 形式還提供 `xhigh`。Cursor 的 Kimi K3 只以帶 +effort suffix 的 wire id 提供,因此 `cursor/kimi-k3` 暴露 `low`/`high`/`max` ladder,預設為 `max`,符合該模型文件化的 API default。 Cursor server-driven native read/write/delete/ls/grep/shell/fetch execution 預設停用,因為它會繞過 Codex approval 與 sandbox 路徑;只有可信本機實驗才應在 `~/.opencodex/config.json` 的 `providers.cursor` diff --git a/src/adapters/cursor/effort-map.ts b/src/adapters/cursor/effort-map.ts index 1dc70a793..dea40066d 100644 --- a/src/adapters/cursor/effort-map.ts +++ b/src/adapters/cursor/effort-map.ts @@ -4,7 +4,7 @@ * Cursor model ids encode the reasoning effort as a suffix (`claude-4.6-opus-high`), and the available * tiers differ per model — `claude-4.6-opus` tops out at `-max`, `claude-opus-4-8` at `-xhigh`, * `claude-4.6-sonnet` only has `-medium`, and most `composer`/`gemini` models take no suffix at all. - * Grok Fast puts its mode marker after the effort (`grok-4.5-high-fast`). A bare id for a model that + * Grok Fast puts its mode marker after the effort (`grok-4.6-xhigh-fast`). A bare id for a model that * requires a suffix is rejected `ERROR_BAD_MODEL_NAME` (devlog 350.105). * * Canonical effort order is always low < medium < high < xhigh < max (max is the top tier, confirmed @@ -35,10 +35,10 @@ const CURSOR_MODEL_EFFORT_TIERS: Record = { // cursor-grok-4.5-{low,medium,high}-fast. The bare Fast id returns not_found. "grok-4.5": ["low", "medium", "high"], "grok-4.5-fast": ["low", "medium", "high"], - // 260813 preemptive: grok-4.6 tiers mirrored from grok-4.5 ahead of Cursor's lineup update, - // so the suffix/wire handling is already correct the day the slugs appear. - "grok-4.6": ["low", "medium", "high"], - "grok-4.6-fast": ["low", "medium", "high"], + // Cursor's 260813 lineup exposes Grok 4.6 Extra High in both regular and Fast forms. + // Unlike 4.5, xAI also documents xhigh as a real upstream tier for 4.6 and later. + "grok-4.6": ["low", "medium", "high", "xhigh"], + "grok-4.6-fast": ["low", "medium", "high", "xhigh"], "gpt-5.1": ["low", "high"], "gpt-5.1-codex-max": ["low", "medium", "high", "xhigh"], "gpt-5.1-codex-mini": ["low", "high"], diff --git a/src/adapters/cursor/request-builder.ts b/src/adapters/cursor/request-builder.ts index 872a9040c..32e9d9ae0 100644 --- a/src/adapters/cursor/request-builder.ts +++ b/src/adapters/cursor/request-builder.ts @@ -130,7 +130,7 @@ function catalogLimitNote(kept: readonly OcxTool[], omitted: readonly OcxTool[]) /** * Resolve a `cursor/` selection + Codex reasoning effort to Cursor's requested model shape. * Most models encode effort in a flat id (`claude-4.6-opus-high`). Grok Fast is parameterized - * instead: current Cursor clients send the `grok-4.5` base id plus `effort` and `fast` parameters. + * instead: current Cursor clients send the matching Grok base id plus `effort` and `fast` parameters. * A fully-qualified id (one that is not a known effort base) passes through unchanged. */ function normalizeCursorModelId(modelId: string, reasoning?: string): { diff --git a/src/providers/registry.ts b/src/providers/registry.ts index 83beadd94..ec347959d 100644 --- a/src/providers/registry.ts +++ b/src/providers/registry.ts @@ -950,8 +950,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ // devlog/model_update/260709_model_refresh/001_xai_lineup.md. // grok-4.20-multi-agent-0309 is intentionally absent: the OAuth chat-completions // transport returns 400 ("Multi Agent requests are not allowed on chat completions"). - // 260813: grok-4.6 added per the new docs.x.ai/developers/grok-4-6 page; specs mirrored - // from grok-4.5 until the official capability/pricing tables settle. + // 260813: grok-4.6 added per the official model and reasoning capability pages. models: ["grok-4.6", "grok-4.5", "grok-4.3", "grok-4.20-0309-reasoning", "grok-4.20-0309-non-reasoning", "grok-build-0.1", "grok-composer-2.5-fast"], defaultModel: "grok-4.5", // Vision lineup per docs.x.ai model-capabilities/images/understanding: the grok-4.x chat @@ -973,8 +972,8 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ // (docs.x.ai prompt-caching/multi-turn, verified 2026-07-13 — devlog/_plan/260713_grok_caching). // Models that never emit reasoning simply have no thinking parts to replay (no-op). preserveReasoningContentModels: ["grok-4.6", "grok-4.5", "grok-4.3", "grok-4.20-0309-reasoning"], - // grok-4.5 reasoning is always-on with low/medium/high control (no off tier upstream). - modelReasoningEfforts: { "grok-4.6": ["low", "medium", "high"], "grok-4.5": ["low", "medium", "high"] }, + // Grok 4.5 and 4.6 reasoning is always-on; 4.6 adds a real xhigh tier. + modelReasoningEfforts: { "grok-4.6": ["low", "medium", "high", "xhigh"], "grok-4.5": ["low", "medium", "high"] }, modelContextWindows: { "grok-4.6": 500_000, "grok-4.5": 500_000, diff --git a/structure/04_transports-and-sidecars.md b/structure/04_transports-and-sidecars.md index 1b09e8fdd..ea3771e4e 100644 --- a/structure/04_transports-and-sidecars.md +++ b/structure/04_transports-and-sidecars.md @@ -408,11 +408,13 @@ All four route to the `default` Cursor wire model. Explicit variants additionall parameterized-model channel used by current Cursor clients. Router rows are static capabilities and must survive a live `GetUsableModels` response that omits `default`. -`cursor/grok-4.5-fast` is also a stable Codex-facing row, but current Cursor clients do not request -it as a flat model slug. OpenCodex sends `grok-4.5` through `requested_model` with separate `effort` -and `fast=true` parameters, leaving legacy `model_details` unset for that parameterized external -selection. Live discovery still recognizes Cursor's flattened `cursor-grok-4.5-{effort}-fast` -variants, plus the older `grok-4.5-fast-{effort}` ordering, as availability evidence only. +`cursor/grok-4.5-fast` and `cursor/grok-4.6-fast` are stable Codex-facing rows, but current Cursor +clients do not request them as flat model slugs. OpenCodex sends the matching Grok base id through +`requested_model` with separate `effort` and `fast=true` parameters, leaving legacy `model_details` +unset for that parameterized external selection. Grok 4.5 stops at `high`; Grok 4.6 additionally +advertises and sends `xhigh`. Live discovery recognizes Cursor's flattened +`cursor-grok-{version}-{effort}-fast` variants, plus the older +`grok-{version}-fast-{effort}` ordering, as availability evidence only. ## Cursor active-context usage diff --git a/tests/cursor-discovery.test.ts b/tests/cursor-discovery.test.ts index c8343deda..7e9595aca 100644 --- a/tests/cursor-discovery.test.ts +++ b/tests/cursor-discovery.test.ts @@ -44,6 +44,8 @@ describe("Cursor discovery metadata", () => { expect(ids).not.toContain("grok-4.3"); expect(ids).not.toContain("kimi-k2.5"); expect(ids).toContain("gpt-5.5-extra"); + expect(ids).toContain("grok-4.6"); + expect(ids).toContain("grok-4.6-fast"); expect(ids).not.toContain("composer-2"); // `auto` mirrors the jawcode SOT `default` entry (200k), not the generic fallback window. for (const id of CURSOR_ROUTER_MODEL_IDS) { @@ -70,6 +72,9 @@ describe("Cursor discovery metadata", () => { expect(isCursorModelAvailableForAccount("grok-4.5-fast", ["cursor-grok-4.5-fast-medium"])).toBe(true); expect(isCursorModelAvailableForAccount("grok-4.5-fast", ["cursor-grok-4.5-high"])).toBe(false); expect(isCursorModelAvailableForAccount("grok-4.5", ["cursor-grok-4.5-high-fast"])).toBe(false); + expect(isCursorModelAvailableForAccount("grok-4.6", ["cursor-grok-4.6-xhigh"])).toBe(true); + expect(isCursorModelAvailableForAccount("grok-4.6-fast", ["cursor-grok-4.6-xhigh-fast"])).toBe(true); + expect(isCursorModelAvailableForAccount("grok-4.6", ["cursor-grok-4.6-xhigh-fast"])).toBe(false); expect(isCursorModelAvailableForAccount("gpt-5.4", ["cursor-gpt-5.4-high"])).toBe(true); // Prefixed sibling rejection: cursor- prefix must not bypass sibling-model checks. expect(isCursorModelAvailableForAccount("gpt-5.5", ["cursor-gpt-5.5-extra-high"])).toBe(false); @@ -86,6 +91,12 @@ describe("Cursor discovery metadata", () => { ["cursor-grok-4.5-high", "cursor-grok-4.5-high-fast"], ); expect(grok.map(model => model.id)).toEqual(["grok-4.5", "grok-4.5-fast"]); + + const grok46 = filterCursorConfiguredModelsByLiveDiscovery( + [{ id: "grok-4.6" }, { id: "grok-4.6-fast" }], + ["cursor-grok-4.6-xhigh", "cursor-grok-4.6-xhigh-fast"], + ); + expect(grok46.map(model => model.id)).toEqual(["grok-4.6", "grok-4.6-fast"]); }); test("live discovery filter always keeps all router levels when GetUsableModels omits them", () => { @@ -130,6 +141,7 @@ describe("Cursor discovery metadata", () => { expect(inferCursorContextWindow("gemini-3.5-flash")).toBe(1_000_000); expect(inferCursorContextWindow("glm-5.2")).toBe(1_000_000); expect(inferCursorContextWindow("grok-4.3")).toBe(256_000); + expect(inferCursorContextWindow("grok-4.6")).toBe(500_000); expect(inferCursorContextWindow("gpt-5.5")).toBe(272_000); }); @@ -148,6 +160,8 @@ describe("Cursor discovery metadata", () => { { id: "claude-opus-4-8", supportsReasoningEffort: true }, { id: "glm-5.2", supportsReasoningEffort: true }, { id: "grok-4.3", supportsReasoningEffort: true }, + { id: "grok-4.6", supportsReasoningEffort: true }, + { id: "grok-4.6-fast", supportsReasoningEffort: true }, { id: "unknown-reasoning-model", supportsReasoningEffort: true }, { id: "composer-2.5", supportsReasoningEffort: false }, ]); @@ -157,6 +171,8 @@ describe("Cursor discovery metadata", () => { expect(efforts["claude-opus-4-8"]).toEqual(["low", "medium", "high", "xhigh", "max"]); expect(efforts["glm-5.2"]).toEqual(["high", "max"]); expect(efforts["grok-4.3"]).toEqual([]); + expect(efforts["grok-4.6"]).toEqual(["low", "medium", "high", "xhigh"]); + expect(efforts["grok-4.6-fast"]).toEqual(["low", "medium", "high", "xhigh"]); expect(efforts["unknown-reasoning-model"]).toEqual([]); expect(efforts["composer-2.5"]).toEqual([]); }); diff --git a/tests/cursor-effort-suffix.test.ts b/tests/cursor-effort-suffix.test.ts index 2d4c627f0..170b86e46 100644 --- a/tests/cursor-effort-suffix.test.ts +++ b/tests/cursor-effort-suffix.test.ts @@ -12,6 +12,19 @@ const RECORDED_CURSOR_GROK_45_DISCOVERY_IDS = [ "cursor-grok-4.5-high", ] as const; +// Account-visible Cursor CLI lineup recorded on 2026-08-13. Grok 4.6 adds a +// real Extra High tier in both regular and Fast forms; 4.5 still tops out at high. +const RECORDED_CURSOR_GROK_46_DISCOVERY_IDS = [ + "cursor-grok-4.6-low", + "cursor-grok-4.6-medium", + "cursor-grok-4.6-high", + "cursor-grok-4.6-xhigh", + "cursor-grok-4.6-low-fast", + "cursor-grok-4.6-medium-fast", + "cursor-grok-4.6-high-fast", + "cursor-grok-4.6-xhigh-fast", +] as const; + function modelIdFor(modelId: string, reasoning?: string): string { const parsed: OcxParsedRequest = { modelId, @@ -135,6 +148,33 @@ describe("Cursor per-model reasoning-effort suffix", () => { } }); + test("grok-4.6 exposes xhigh and sends Extra High Fast as parameters", () => { + expect(modelIdFor("cursor/grok-4.6", "low")).toBe("cursor-grok-4.6-low"); + expect(modelIdFor("cursor/grok-4.6", "medium")).toBe("cursor-grok-4.6-medium"); + expect(modelIdFor("cursor/grok-4.6", "high")).toBe("cursor-grok-4.6-high"); + expect(modelIdFor("cursor/grok-4.6", "xhigh")).toBe("cursor-grok-4.6-xhigh"); + expect(modelIdFor("cursor/grok-4.6", "max")).toBe("cursor-grok-4.6-xhigh"); + expect(selectionFor("cursor/grok-4.6-fast", "xhigh")).toEqual({ + modelId: "grok-4.6", + parameters: [{ id: "effort", value: "xhigh" }, { id: "fast", value: "true" }], + }); + expect(selectionFor("cursor/grok-4.6-fast", "max")).toEqual({ + modelId: "grok-4.6", + parameters: [{ id: "effort", value: "xhigh" }, { id: "fast", value: "true" }], + }); + expect(cursorModelEffortLadder("grok-4.6")).toEqual(["low", "medium", "high", "xhigh"]); + expect(cursorModelEffortLadder("grok-4.6-fast")).toEqual(["low", "medium", "high", "xhigh"]); + }); + + test("regular grok-4.6 request ids match the recorded discovery fixture", () => { + for (const effort of ["low", "medium", "high", "xhigh"] as const) { + const requestModelId = modelIdFor("cursor/grok-4.6", effort); + expect(requestModelId).toBe(`cursor-grok-4.6-${effort}`); + expect(RECORDED_CURSOR_GROK_46_DISCOVERY_IDS).toContain(requestModelId); + } + expect(RECORDED_CURSOR_GROK_46_DISCOVERY_IDS).toContain("cursor-grok-4.6-xhigh-fast"); + }); + test("kimi-k3 maps to its live effort-suffixed variants", () => { expect(modelIdFor("cursor/kimi-k3", "low")).toBe("kimi-k3-low"); expect(modelIdFor("cursor/kimi-k3", "medium")).toBe("kimi-k3-high"); diff --git a/tests/provider-registry-parity.test.ts b/tests/provider-registry-parity.test.ts index 653b23fee..390ec6a25 100644 --- a/tests/provider-registry-parity.test.ts +++ b/tests/provider-registry-parity.test.ts @@ -631,6 +631,8 @@ describe("provider registry parity", () => { expect(seed.modelContextWindows?.["gpt-5.6-luna"]).toBe(1_000_000); expect(seed.modelReasoningEfforts?.["gpt-5.5"]).toEqual(["low", "medium", "high"]); expect(seed.modelReasoningEfforts?.["gpt-5.6-sol"]).toEqual(["low", "medium", "high", "xhigh", "max"]); + expect(seed.modelReasoningEfforts?.["grok-4.6"]).toEqual(["low", "medium", "high", "xhigh"]); + expect(seed.modelReasoningEfforts?.["grok-4.6-fast"]).toEqual(["low", "medium", "high", "xhigh"]); const savedCursor: OcxProviderConfig = { adapter: "cursor", baseUrl: "https://api2.cursor.sh" }; enrichProviderFromCatalog("cursor", savedCursor); @@ -671,8 +673,10 @@ describe("provider registry parity", () => { expect(OAUTH_PROVIDERS.xai.providerConfig.defaultModel).toBe("grok-4.5"); expect(OAUTH_PROVIDERS.xai.providerConfig.liveModels).toBe(true); expect(OAUTH_PROVIDERS.xai.providerConfig.models).toContain("grok-4.5"); + expect(OAUTH_PROVIDERS.xai.providerConfig.models).toContain("grok-4.6"); expect(OAUTH_PROVIDERS.xai.providerConfig.modelContextWindows?.["grok-4.5"]).toBe(500_000); expect(OAUTH_PROVIDERS.xai.providerConfig.modelReasoningEfforts?.["grok-4.5"]).toEqual(["low", "medium", "high"]); + expect(OAUTH_PROVIDERS.xai.providerConfig.modelReasoningEfforts?.["grok-4.6"]).toEqual(["low", "medium", "high", "xhigh"]); expect(OAUTH_PROVIDERS.xai.providerConfig.noVisionModels).toContain("grok-build-0.1"); const antigravityRegistry = PROVIDER_REGISTRY.find(entry => entry.id === "google-antigravity"); expect(antigravityRegistry?.liveModels).toBe(true); @@ -832,19 +836,31 @@ describe("provider registry parity", () => { expect(routed?.max_context_window).toBe(204_800); }); - test("grok-4.5 flows from the xai registry seed into a built catalog entry (260709 refresh)", () => { + test("Grok 4.5/4.6 effort ladders reach the xAI and Cursor picker entries", () => { const xai = PROVIDER_REGISTRY.find(entry => entry.id === "xai"); - const seed = providerConfigSeed(xai!); - const model = applyProviderConfigHints("xai", seed, { id: "grok-4.5", provider: "xai" }); - expect(model.contextWindow).toBe(500_000); - expect(model.reasoningEfforts).toEqual(["low", "medium", "high"]); + const xaiSeed = providerConfigSeed(xai!); + const xai45 = applyProviderConfigHints("xai", xaiSeed, { id: "grok-4.5", provider: "xai" }); + const xai46 = applyProviderConfigHints("xai", xaiSeed, { id: "grok-4.6", provider: "xai" }); + expect(xai45.reasoningEfforts).toEqual(["low", "medium", "high"]); + expect(xai46.reasoningEfforts).toEqual(["low", "medium", "high", "xhigh"]); - const entries = buildCatalogEntries(nativeTemplate() as never, [], [model]); - const entry = entries.find(e => e.slug === "xai/grok-4.5"); - expect(entry).toBeTruthy(); - expect(entry?.context_window).toBe(500_000); - expect((entry?.supported_reasoning_levels as { effort: string }[]).map(l => l.effort)) + const cursor = PROVIDER_REGISTRY.find(entry => entry.id === "cursor"); + const cursorSeed = providerConfigSeed(cursor!); + const cursor46 = ["grok-4.6", "grok-4.6-fast"].map(id => + applyProviderConfigHints("cursor", cursorSeed, { id, provider: "cursor" }) + ); + + const entries = buildCatalogEntries(nativeTemplate() as never, [], [xai45, xai46, ...cursor46]); + const effortsFor = (slug: string) => + (entries.find(entry => entry.slug === slug)?.supported_reasoning_levels as { effort: string }[]) + .map(level => level.effort); + + expect(entries.find(entry => entry.slug === "xai/grok-4.6")?.context_window).toBe(500_000); + expect(effortsFor("xai/grok-4.5")) .toEqual(["low", "medium", "high", "max", "ultra"]); + for (const slug of ["xai/grok-4.6", "cursor/grok-4.6", "cursor/grok-4.6-fast"]) { + expect(effortsFor(slug)).toEqual(["low", "medium", "high", "xhigh", "max", "ultra"]); + } }); // The id-list assertion above only proves the preset exists. Pin the contract a user actually