diff --git a/.changeset/kimi-k31-pro-models.md b/.changeset/kimi-k31-pro-models.md new file mode 100644 index 0000000000..3c3dabb455 --- /dev/null +++ b/.changeset/kimi-k31-pro-models.md @@ -0,0 +1,5 @@ +--- +'@roomote/web': patch +--- + +Add Kimi K3.1 Pro and Highspeed to recommended models on verified provider routes, including explicit Kimi for Coding runtime metadata. diff --git a/apps/docs/models.mdx b/apps/docs/models.mdx index ba08ada9b5..4d5b7d58fe 100644 --- a/apps/docs/models.mdx +++ b/apps/docs/models.mdx @@ -252,6 +252,29 @@ version, and whether the error occurs on navigation or when opening a preset. Check migration logs for schema errors separately from invalid saved selections. Do not wipe model settings or reset the database to recover a preset. +### Kimi K3.1 Pro + +**Kimi K3.1 Pro** is recommended through Moonshot AI, OpenRouter, Vercel AI +Gateway, Kimi for Coding, and OpenCode Go. **Kimi K3.1 Pro Highspeed** +is also available through Moonshot AI, Vercel AI Gateway, and Kimi +for Coding. + +In **Settings > Models**, connect one of these providers and select the model. +For manual configuration, use the provider's full task model ID: + +| Provider | Kimi K3.1 Pro | Kimi K3.1 Pro Highspeed | +| --- | --- | --- | +| Moonshot AI | `moonshotai/kimi-k3.1-pro` | `moonshotai/kimi-k3.1-pro-highspeed` | +| OpenRouter | `openrouter/moonshotai/kimi-k3.1-pro` | — | +| Vercel AI Gateway | `vercel/moonshotai/kimi-k3.1-pro` | `vercel/moonshotai/kimi-k3.1-pro-highspeed` | +| Kimi for Coding | `kimi-for-coding/k3.1-pro` | `kimi-for-coding/k3.1-pro-highspeed` | +| OpenCode Go | `opencode-go/kimi-k3.1-pro` | — | + +Kimi for Coding requires an eligible membership plan; access to the full 1M +context window and Highspeed depends on the plan. Keep thinking enabled and +start a new session when moving from an older Kimi model. See +[Kimi's model and membership requirements](https://www.kimi.com/code/docs/en/kimi-code/models.html). + ## Env-based setup Most deployments should configure providers from **Settings > Models**. Use diff --git a/apps/web/src/trpc/commands/task-models/models-dev.test.ts b/apps/web/src/trpc/commands/task-models/models-dev.test.ts index bc8ecde7b4..ad47301dcf 100644 --- a/apps/web/src/trpc/commands/task-models/models-dev.test.ts +++ b/apps/web/src/trpc/commands/task-models/models-dev.test.ts @@ -86,6 +86,12 @@ describe('resolveModelsDevSlug', () => { expect(resolveModelsDevSlug('kimi-for-coding/kimi-for-coding')).toBe( 'kimi-code-plan-cn/kimi-for-coding', ); + expect(resolveModelsDevSlug('kimi-for-coding/k3.1-pro')).toBe( + 'kimi-code-plan-cn/k3.1-pro', + ); + expect(resolveModelsDevSlug('kimi-for-coding/k3.1-pro-highspeed')).toBe( + 'kimi-code-plan-cn/k3.1-pro-highspeed', + ); }); it('strips the vercel/ prefix for AI Gateway routed models', () => { @@ -477,6 +483,42 @@ describe('lookupModelMetadataFromCatalog', () => { expect(result.displayName).toBe('Claude Sonnet 5'); }); + it.each(['k3.1-pro', 'k3.1-pro-highspeed'])( + 'resolves Kimi for Coding %s metadata through the renamed catalog provider', + (slug) => { + const catalog = buildCatalog({ + providers: { + 'kimi-code-plan-cn': { + models: { + [slug]: { + name: 'Kimi K3.1 Pro', + limit: { context: 1_048_576, output: 131_072 }, + modalities: { input: ['text', 'image', 'video'] }, + reasoning: true, + reasoning_options: [ + { type: 'effort', values: ['low', 'high', 'max'] }, + ], + cost: { input: 0, output: 0 }, + }, + }, + }, + }, + }); + + expect( + lookupModelMetadataFromCatalog(catalog, `kimi-for-coding/${slug}`), + ).toMatchObject({ + metadata: { + contextWindow: 1_048_576, + inputTypes: ['text', 'image', 'video'], + supportedReasoningEfforts: ['low', 'high', 'max'], + inputPricePerToken: 0, + outputPricePerToken: 0, + }, + }); + }, + ); + it('falls back to the provider-agnostic models map for requesty-routed models missing from the gateway entry', () => { const catalog = buildCatalog({ models: { diff --git a/packages/types/src/__tests__/kimi-for-coding-opencode-provider.test.ts b/packages/types/src/__tests__/kimi-for-coding-opencode-provider.test.ts index 3687ab5638..073c33b9db 100644 --- a/packages/types/src/__tests__/kimi-for-coding-opencode-provider.test.ts +++ b/packages/types/src/__tests__/kimi-for-coding-opencode-provider.test.ts @@ -38,6 +38,8 @@ describe('mergeKimiForCodingProviderConfig', () => { expect(Object.keys(models).sort()).toEqual([ 'k3', 'k3-256k', + 'k3.1-pro', + 'k3.1-pro-highspeed', 'kimi-for-coding', 'kimi-for-coding-highspeed', ]); @@ -53,6 +55,31 @@ describe('mergeKimiForCodingProviderConfig', () => { }); }); + it.each(['k3.1-pro', 'k3.1-pro-highspeed'])( + 'registers %s with full capabilities on the membership endpoint', + (modelId) => { + const merged = mergeKimiForCodingProviderConfig({}, [ + `kimi-for-coding/${modelId}`, + ]); + + expect(merged['kimi-for-coding']).toMatchObject({ + npm: '@ai-sdk/anthropic', + api: 'https://api.kimi.com/coding/v1', + models: { + [modelId]: { + family: 'kimi-k3', + reasoning: true, + temperature: false, + tool_call: true, + attachment: true, + modalities: { input: ['text', 'image', 'video'], output: ['text'] }, + limit: { context: 1_048_576, output: 131_072 }, + }, + }, + }); + }, + ); + it('gives a selected model Kimi added later a usable entry', () => { const merged = mergeKimiForCodingProviderConfig({}, [ ' kimi-for-coding/k4-preview ', diff --git a/packages/types/src/kimi-for-coding-opencode-provider.ts b/packages/types/src/kimi-for-coding-opencode-provider.ts index 8d8e4780ec..b4adfa9b66 100644 --- a/packages/types/src/kimi-for-coding-opencode-provider.ts +++ b/packages/types/src/kimi-for-coding-opencode-provider.ts @@ -47,6 +47,28 @@ type KimiForCodingModelDefinition = { const KIMI_FOR_CODING_MODELS: Readonly< Record > = { + 'k3.1-pro': { + name: 'Kimi K3.1 Pro', + family: 'kimi-k3', + release_date: '2026-10-23', + attachment: true, + reasoning: true, + temperature: false, + tool_call: true, + modalities: { input: ['text', 'image', 'video'], output: ['text'] }, + limit: { context: 1_048_576, output: 131_072 }, + }, + 'k3.1-pro-highspeed': { + name: 'Kimi K3.1 Pro Highspeed', + family: 'kimi-k3', + release_date: '2026-10-23', + attachment: true, + reasoning: true, + temperature: false, + tool_call: true, + modalities: { input: ['text', 'image', 'video'], output: ['text'] }, + limit: { context: 1_048_576, output: 131_072 }, + }, k3: { name: 'Kimi K3', family: 'kimi-k3', diff --git a/packages/types/src/model-provider-config.test.ts b/packages/types/src/model-provider-config.test.ts index ce9b05d66b..38fd3bfc54 100644 --- a/packages/types/src/model-provider-config.test.ts +++ b/packages/types/src/model-provider-config.test.ts @@ -538,6 +538,24 @@ describe('SETUP_MODEL_PROVIDER_CATALOG', () => { ['github-copilot', 'github-copilot/claude-opus-5.5'], ], }, + { + displayName: 'Kimi K3.1 Pro', + expected: [ + ['openrouter', 'openrouter/moonshotai/kimi-k3.1-pro'], + ['vercel', 'vercel/moonshotai/kimi-k3.1-pro'], + ['moonshotai', 'moonshotai/kimi-k3.1-pro'], + ['kimi-for-coding', 'kimi-for-coding/k3.1-pro'], + ['opencode-go', 'opencode-go/kimi-k3.1-pro'], + ], + }, + { + displayName: 'Kimi K3.1 Pro Highspeed', + expected: [ + ['vercel', 'vercel/moonshotai/kimi-k3.1-pro-highspeed'], + ['moonshotai', 'moonshotai/kimi-k3.1-pro-highspeed'], + ['kimi-for-coding', 'kimi-for-coding/k3.1-pro-highspeed'], + ], + }, { displayName: 'Kimi K3', expected: [ diff --git a/packages/types/src/model-provider-config.ts b/packages/types/src/model-provider-config.ts index 3635c31f73..af904012a7 100644 --- a/packages/types/src/model-provider-config.ts +++ b/packages/types/src/model-provider-config.ts @@ -788,6 +788,8 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ 'deepseek-v4-pro-0813': 'vercel/deepseek/deepseek-v4-pro-0813', 'glm-5-3-flash': 'vercel/zai/glm-5.3-flash', 'glm-5-3': 'vercel/zai/glm-5.3', + 'kimi-k3-1-pro': 'vercel/moonshotai/kimi-k3.1-pro', + 'kimi-k3-1-pro-highspeed': 'vercel/moonshotai/kimi-k3.1-pro-highspeed', 'kimi-k3': 'vercel/moonshotai/kimi-k3', 'kimi-k2-7-code': 'vercel/moonshotai/kimi-k2.7-code', 'qwen3-8-max': 'vercel/alibaba/qwen3.8-max', @@ -1035,6 +1037,8 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ linkLabel: 'Open Kimi API Platform keys', }, suggestedTaskModels: mapRecommendedTaskModels({ + 'kimi-k3-1-pro': 'moonshotai/kimi-k3.1-pro', + 'kimi-k3-1-pro-highspeed': 'moonshotai/kimi-k3.1-pro-highspeed', 'kimi-k3': 'moonshotai/kimi-k3', 'kimi-k2-7-code': 'moonshotai/kimi-k2.7-code', }), @@ -1062,6 +1066,8 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ // renamed upstream to `kimi-for-coding`, the rolling default coding model // (no longer K2.7, so it is not offered under that recommended name). suggestedTaskModels: mapRecommendedTaskModels({ + 'kimi-k3-1-pro': 'kimi-for-coding/k3.1-pro', + 'kimi-k3-1-pro-highspeed': 'kimi-for-coding/k3.1-pro-highspeed', 'kimi-k3': 'kimi-for-coding/k3', }), recommendedRoleModels: { @@ -1143,6 +1149,7 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ 'glm-5-3': 'opencode-go/glm-5.3', 'grok-4-7': 'opencode-go/grok-4.7', 'kimi-k2-7-code': 'opencode-go/kimi-k2.7-code', + 'kimi-k3-1-pro': 'opencode-go/kimi-k3.1-pro', 'kimi-k3': 'opencode-go/kimi-k3', 'minimax-m3': 'opencode-go/minimax-m3', 'qwen3-8-max': 'opencode-go/qwen3.8-max', diff --git a/packages/types/src/recommended-task-models.ts b/packages/types/src/recommended-task-models.ts index d3ce949814..082de829f6 100644 --- a/packages/types/src/recommended-task-models.ts +++ b/packages/types/src/recommended-task-models.ts @@ -69,6 +69,12 @@ export const RECOMMENDED_TASK_MODELS = [ { id: 'glm-5-3-flash', displayName: 'GLM 5.3 Flash', family: 'GLM' }, { id: 'glm-5-3', displayName: 'GLM 5.3', family: 'GLM' }, { id: 'glm-5-2', displayName: 'GLM 5.2', family: 'GLM' }, + { id: 'kimi-k3-1-pro', displayName: 'Kimi K3.1 Pro', family: 'Kimi' }, + { + id: 'kimi-k3-1-pro-highspeed', + displayName: 'Kimi K3.1 Pro Highspeed', + family: 'Kimi', + }, { id: 'kimi-k3', displayName: 'Kimi K3', family: 'Kimi' }, { id: 'kimi-k2-7-code', displayName: 'Kimi K2.7 Code', family: 'Kimi' }, { id: 'qwen3-8-max', displayName: 'Qwen3.8 Max', family: 'Qwen' }, @@ -129,6 +135,7 @@ export const OPENROUTER_RECOMMENDED_TASK_MODEL_SLUGS = { 'deepseek-v4-pro-0813': 'openrouter/deepseek/deepseek-v4-pro-0813', 'glm-5-3-flash': 'openrouter/z-ai/glm-5.3-flash', 'glm-5-3': 'openrouter/z-ai/glm-5.3', + 'kimi-k3-1-pro': 'openrouter/moonshotai/kimi-k3.1-pro', 'kimi-k3': 'openrouter/moonshotai/kimi-k3', 'kimi-k2-7-code': 'openrouter/moonshotai/kimi-k2.7-code', 'qwen3-8-max': 'openrouter/qwen/qwen3.8-max-0902',