-
Notifications
You must be signed in to change notification settings - Fork 479
fix(cursor): add kimi-k3 with low/high/max effort tiers #646
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
31c7326
d220150
e96efb1
60bd535
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -219,8 +219,11 @@ Cursor отслеживается отдельно как эксперимент | |||||||||||||
| `ocx init` и в селекторе Add Provider дашборда как экспериментальная запись локальной конфигурации | ||||||||||||||
| с метаданными статического резервного каталога моделей Cursor. Когда настроен токен доступа Cursor, | ||||||||||||||
| opencodex использует живой транспорт HTTP/2 Cursor. Его резервный список версии v2.7.1 включает | ||||||||||||||
| `gpt-5.6-sol` / `terra` / `luna` (контекст 1M) плюс `grok-4.5` / `grok-4.5-fast` (500K); живое | ||||||||||||||
| обнаружение решает, какие из них останутся видимыми для аккаунта. Управляемое сервером Cursor | ||||||||||||||
| `gpt-5.6-sol` / `terra` / `luna` (контекст 1M), `grok-4.5` / `grok-4.5-fast` (500K) и `kimi-k3` | ||||||||||||||
| (262K); живое обнаружение решает, какие из них останутся видимыми для аккаунта. Cursor отдаёт | ||||||||||||||
| Kimi K3 только через wire id с суффиксом усилия, поэтому `cursor/kimi-k3` предоставляет лестницу | ||||||||||||||
| `low` / `high` / `max` и по умолчанию использует `max` — как и задокументированное значение по | ||||||||||||||
| умолчанию в API модели. Управляемое сервером Cursor | ||||||||||||||
|
Comment on lines
+224
to
+226
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win Fix the Russian case/agreement in the Cursor note. The phrase Proposed fix-`low` / `high` / `max` и по умолчанию использует `max` — как и задокументированное значение по
-умолчанию в API модели.
+`low` / `high` / `max` и по умолчанию использует `max`, что соответствует
+задокументированному в API модели значению по умолчанию.📝 Committable suggestion
Suggested change
🧰 Tools🪛 LanguageTool[uncategorized] ~226-~226: Прилагательное не согласуется с существительным по падежу. (Unify_Adj_NN_case) 🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||||||||||||||
| нативное выполнение read/write/delete/ls/grep/shell/fetch по умолчанию отключено, поскольку оно | ||||||||||||||
| обходит путь одобрений и песочницу Codex; устанавливайте `unsafeAllowNativeLocalExec: true` в | ||||||||||||||
| объекте `providers.cursor` файла `~/.opencodex/config.json` только для доверенных локальных | ||||||||||||||
|
|
||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -167,7 +167,7 @@ export const CURSOR_STATIC_MODELS: readonly CursorModelInfo[] = normalizeCursorM | |
| // the request builder appends the per-model suffix (see effort-map.ts) and reasoning models | ||
| // advertise effort so Codex exposes the tier picker. `supportsReasoningEffort` tracks whether the | ||
| // model has *selectable effort tiers* (CURSOR_MODEL_EFFORT_TIERS), NOT merely whether it reasons: | ||
| // gemini/grok/kimi/gpt-5-mini are reasoning models in the SOT but are sent bare (no tier picker). | ||
| // gemini/grok/kimi-k2.7/gpt-5-mini are reasoning models in the SOT but are sent bare (no tier picker). | ||
| ...CURSOR_ROUTER_MODEL_IDS.map(id => ({ id, contextWindow: CONTEXT_200K, supportsReasoningEffort: false })), | ||
|
|
||
| { id: "claude-sonnet-5", contextWindow: CONTEXT_200K, supportsReasoningEffort: true }, | ||
|
|
@@ -224,6 +224,9 @@ export const CURSOR_STATIC_MODELS: readonly CursorModelInfo[] = normalizeCursorM | |
| // take PR #73's supportsReasoningEffort for glm-5.2 (its effort-map tiers landed with the PR). | ||
| { id: "glm-5.2", contextWindow: CONTEXT_1M, supportsReasoningEffort: true }, | ||
| { id: "kimi-k2.7-code", contextWindow: CONTEXT_262K }, | ||
| // kimi-k3: cursor.com/docs/models/kimi-k3; account-verified via GetUsableModels (2026-07-28) — | ||
| // ships only as effort-suffixed kimi-k3-{low,high,max}, so the tier picker is exposed. | ||
| { id: "kimi-k3", contextWindow: CONTEXT_262K, supportsReasoningEffort: true }, | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Adding AGENTS.md reference: AGENTS.md:L96-L97 Useful? React with 👍 / 👎. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When this model is used through the Codex catalog, Useful? React with 👍 / 👎. |
||
|
|
||
| { id: "grok-4.5", contextWindow: 500_000, supportsReasoningEffort: true }, | ||
| { id: "grok-4.5-fast", contextWindow: 500_000, supportsReasoningEffort: true }, | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -457,6 +457,12 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ | |
| modelContextWindows: cursorModelContextWindows(CURSOR_STATIC_MODELS), | ||
| modelInputModalities: cursorModelInputModalities(CURSOR_STATIC_MODELS), | ||
| modelReasoningEfforts: cursorModelReasoningEfforts(CURSOR_STATIC_MODELS), | ||
| // Kimi K3 documents `max` as its API default, and its Cursor ladder has no `medium` | ||
| // rung — so applyReasoningLevels' medium->high->first fallback would settle the catalog | ||
| // default on `high`, the picker would send `high` explicitly, and the request builder's | ||
| // no-effort fallback to `kimi-k3-max` would never be reached. Mirrors the other K3 | ||
| // routes (kimi, kimi-code, opencode-go). | ||
| modelDefaultReasoningEfforts: { "kimi-k3": "max" }, | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When an existing Cursor configuration already has Useful? React with 👍 / 👎. |
||
| // Cursor's wire protocol never forwards image parts (request-builder emits an unsupported- | ||
| // content marker), so the vision sidecar covers ALL cursor models regardless of what the | ||
| // upstream model could natively do. Live-discovered models outside the static list fall back | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -696,6 +696,34 @@ describe("Google Gemini catalog metadata", () => { | |||||||||
| }); | ||||||||||
| }); | ||||||||||
|
|
||||||||||
| describe("Cursor Kimi K3 catalog default effort", () => { | ||||||||||
| // Regression for the effort-tier ladder added with cursor/kimi-k3: the Cursor ladder is | ||||||||||
| // low/high/max with NO medium rung, so applyReasoningLevels' medium -> high -> first | ||||||||||
| // preference would settle default_reasoning_level on "high" unless the registry supplies a | ||||||||||
| // default. Kimi documents `max` as K3's API default, and a "high" default makes the picker | ||||||||||
| // send high explicitly so the request builder never falls back to kimi-k3-max. | ||||||||||
| test("keeps max as the catalog default instead of falling back to high", async () => { | ||||||||||
| const cursor = { | ||||||||||
| adapter: "cursor", | ||||||||||
| authMode: "oauth" as const, | ||||||||||
| liveModels: false, | ||||||||||
| }; | ||||||||||
| enrichProviderFromRegistry("cursor", cursor); | ||||||||||
| const models = await gatherRoutedModels({ | ||||||||||
| port: 0, | ||||||||||
| defaultProvider: "cursor", | ||||||||||
| providers: { cursor }, | ||||||||||
| }); | ||||||||||
| const entry = buildCatalogEntries(nativeTemplate(), [], models) | ||||||||||
| .find(row => row.slug === "cursor/kimi-k3"); | ||||||||||
|
|
||||||||||
| expect(entry).toBeDefined(); | ||||||||||
| expect((entry?.supported_reasoning_levels as Array<{ effort: string }>).map(level => level.effort)) | ||||||||||
| .toEqual(["low", "high", "max", "ultra"]); | ||||||||||
|
Comment on lines
+721
to
+722
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win Remove the unsupported The Cursor effort map defines Proposed fix expect((entry?.supported_reasoning_levels as Array<{ effort: string }>).map(level => level.effort))
- .toEqual(["low", "high", "max", "ultra"]);
+ .toEqual(["low", "high", "max"]);📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||
| expect(entry?.default_reasoning_level).toBe("max"); | ||||||||||
| }); | ||||||||||
| }); | ||||||||||
|
|
||||||||||
| describe("configured CatalogModel displayName -> catalog display_name", () => { | ||||||||||
| test("a routed CatalogModel displayName becomes the catalog display_name", () => { | ||||||||||
| const model = { provider: "deepseek", id: "deepseek-v4", displayName: "DeepSeek V4", owned_by: "deepseek" }; | ||||||||||
|
|
||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The new documentation says
cursor/kimi-k3exposes only alow/high/maxladder, butapplyReasoningLevelsalways addsultrato routed reasoning models, and the new catalog test explicitly expects['low', 'high', 'max', 'ultra']. Users therefore see an undocumented fourth picker option; describeultraas an alias that resolves to themaxwire tier and make the same correction in each translated locale.AGENTS.md reference: AGENTS.md:L96-L97
Useful? React with 👍 / 👎.