From 7c70e13c5e1b832f4e441e0b5b828102a0daf242 Mon Sep 17 00:00:00 2001 From: "roomote-roomote[bot]" <301996811+roomote-roomote[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 15:38:22 -0400 Subject: [PATCH 1/3] [Feat] Add GPT-6.1 Terra model support (#3595) * feat: add verified GPT-6.1 Terra model routes * fix: register Terra runtime models for role-only selections --------- Co-authored-by: @mrubens <2600+mrubens@users.noreply.github.com> --- apps/docs/models.mdx | 21 ++++++ .../task-models/auto-add-models.test.ts | 1 + .../trpc/commands/task-models/index.test.ts | 1 + ...code-chatgpt-gateway-plugin-script.test.ts | 9 +++ apps/worker/src/run-task/agent-home.test.ts | 70 ++++++++++++++++++ apps/worker/src/run-task/agent-home.ts | 16 +++-- .../opencode-chatgpt-gateway-plugin-script.ts | 1 + .../server/__tests__/opencode-runtime.test.ts | 36 ++++++++++ .../src/server/opencode-runtime.ts | 9 ++- .../__tests__/curated-opencode-models.test.ts | 58 +++++++++++++++ .../types/src/chatgpt-subscription.test.ts | 4 ++ packages/types/src/chatgpt-subscription.ts | 1 + packages/types/src/curated-opencode-models.ts | 71 +++++++++++++++++++ packages/types/src/index.ts | 1 + .../types/src/model-provider-config.test.ts | 20 ++++++ packages/types/src/model-provider-config.ts | 7 ++ packages/types/src/recommended-task-models.ts | 2 + 17 files changed, 319 insertions(+), 9 deletions(-) create mode 100644 packages/types/src/__tests__/curated-opencode-models.test.ts create mode 100644 packages/types/src/curated-opencode-models.ts diff --git a/apps/docs/models.mdx b/apps/docs/models.mdx index c40bef710e..ba08ada9b5 100644 --- a/apps/docs/models.mdx +++ b/apps/docs/models.mdx @@ -163,6 +163,27 @@ Sol. OpenAI describes it as near-Astra performance at a lower cost. Existing defaults and saved mappings stay unchanged; differentiated recommendations that previously used GPT-6 Sol now use GPT-6.1 Sol. +**GPT-6.1 Terra** is available through Roomote inference, OpenRouter, +Vercel AI Gateway, OpenAI, Azure OpenAI, Azure AI Foundry, Requesty, and ChatGPT +Subscription. Enable it in **Available Models**, then assign it to a role or +select it for a session or task. Defaults and existing role mappings stay +unchanged. Azure requires a deployment named `gpt-6.1-terra`; Requesty's curated +route is `azure/gpt-6.1-terra@swedencentral`. Availability depends on account, +region, plan, and rollout. OpenCode Zen, OpenCode Go, GitHub Copilot, and Amazon +Bedrock are not yet included in Roomote's curated Terra routes. + +[OpenAI's model reference](https://developers.openai.com/api/docs/models/gpt-6.1-terra) +lists a 1,050,000-token context window, a 922,000-token input limit, and up to +128,000 output tokens, with text and image input and text output. Standard +OpenAI API rates are $1 input, $0.05 cached input, and $5 output per million +tokens; prompts over 272,000 input tokens incur higher rates. Provider pricing +and limits can differ. Tool calling on the OpenAI route requires the Responses +API. Roomote's model details refresh from provider catalogs as metadata becomes +available. + +Terra supports ChatGPT Subscription's **Fast mode** when available to the +connected plan. Selecting Terra on another route does not enable that option. + **DeepSeek V4.1 Flash** is recommended through [DeepSeek](/providers/inference/deepseek), [OpenRouter](/providers/inference/openrouter), diff --git a/apps/web/src/trpc/commands/task-models/auto-add-models.test.ts b/apps/web/src/trpc/commands/task-models/auto-add-models.test.ts index c7ac0a7820..f76c1c04b0 100644 --- a/apps/web/src/trpc/commands/task-models/auto-add-models.test.ts +++ b/apps/web/src/trpc/commands/task-models/auto-add-models.test.ts @@ -78,6 +78,7 @@ describe('buildAutoAddedTaskModelSettings', () => { 'openai/gpt-5.6-sol', 'openai/gpt-6-sol', 'openai/gpt-6.1-sol', + 'openai/gpt-6.1-terra', 'openai/gpt-5.6-luna', 'openai/gpt-6-luna', ]), diff --git a/apps/web/src/trpc/commands/task-models/index.test.ts b/apps/web/src/trpc/commands/task-models/index.test.ts index 2cf7621a76..150581f324 100644 --- a/apps/web/src/trpc/commands/task-models/index.test.ts +++ b/apps/web/src/trpc/commands/task-models/index.test.ts @@ -1942,6 +1942,7 @@ describe('task model provider commands', () => { 'openai/gpt-5.6-sol', 'openai/gpt-6-sol', 'openai/gpt-6.1-sol', + 'openai/gpt-6.1-terra', 'openai/gpt-5.6-terra', 'openai/gpt-5.6-luna', 'openai/gpt-6-luna', diff --git a/apps/worker/src/run-task/__tests__/opencode-chatgpt-gateway-plugin-script.test.ts b/apps/worker/src/run-task/__tests__/opencode-chatgpt-gateway-plugin-script.test.ts index 4c1a7cd3bd..3965c46857 100644 --- a/apps/worker/src/run-task/__tests__/opencode-chatgpt-gateway-plugin-script.test.ts +++ b/apps/worker/src/run-task/__tests__/opencode-chatgpt-gateway-plugin-script.test.ts @@ -94,6 +94,10 @@ describe('OPENCODE_CHATGPT_GATEWAY_PLUGIN_SCRIPT', () => { 'gpt-6-astra': createModel('gpt-6-astra'), 'gpt-6-sol': createModel('gpt-6-sol'), 'gpt-6.1-sol': createModel('gpt-6.1-sol'), + 'gpt-6.1-terra': { + ...createModel('gpt-6.1-terra'), + limit: { context: 1_050_000, input: 922_000, output: 128_000 }, + }, 'gpt-6-luna': createModel('gpt-6-luna'), 'gpt-5.6-luna': createModel('gpt-5.6-luna'), 'gpt-5.6': createModel('gpt-5.6'), @@ -110,6 +114,7 @@ describe('OPENCODE_CHATGPT_GATEWAY_PLUGIN_SCRIPT', () => { 'gpt-6-astra', 'gpt-6-sol', 'gpt-6.1-sol', + 'gpt-6.1-terra', 'gpt-6-luna', 'gpt-5.6-luna', 'gpt-5.6', @@ -121,6 +126,10 @@ describe('OPENCODE_CHATGPT_GATEWAY_PLUGIN_SCRIPT', () => { output: 0, cache: { read: 0, write: 0 }, }); + expect(models['gpt-6.1-terra']).toMatchObject({ + cost: { input: 0, output: 0, cache: { read: 0, write: 0 } }, + limit: { context: 1_050_000, input: 922_000, output: 128_000 }, + }); expect(models['gpt-6-astra']).toMatchObject({ cost: { input: 0, diff --git a/apps/worker/src/run-task/agent-home.test.ts b/apps/worker/src/run-task/agent-home.test.ts index 329fdab168..913e9d7823 100644 --- a/apps/worker/src/run-task/agent-home.test.ts +++ b/apps/worker/src/run-task/agent-home.test.ts @@ -254,6 +254,72 @@ describe('generateOpenCodeConfig provider support', () => { expect(result.model).toBe('openai-compatible/coding'); }); + it.each( + (['vision', 'planning', 'explore'] as const).flatMap((role) => + ( + [ + ['requesty', 'azure/gpt-6.1-terra@swedencentral'], + ['azure', 'gpt-6.1-terra'], + ['azure-cognitive-services', 'gpt-6.1-terra'], + ] as const + ).flatMap(([providerId, modelId]) => + [false, true].map((gateway) => ({ + role, + providerId, + modelId, + gateway, + })), + ), + ), + )( + 'registers $providerId Terra used only for $role (gateway=$gateway)', + ({ role, providerId, modelId, gateway }) => { + const descriptor = TASK_MODEL_ROLE_DESCRIPTORS[role]; + const result = generateOpenCodeConfig({ + homeDir: createHomeDir(), + model: 'openai/gpt-6.1-sol', + runtimeEnv: { + R_MODEL: 'openai/gpt-6.1-sol', + R_SMALL_MODEL: 'openai/gpt-6-luna', + [descriptor.modelEnvVar]: `${providerId}/${modelId}`, + ...(gateway + ? { + R_INFERENCE_GATEWAY_URL: + 'https://api.example.com/api/inference', + R_INFERENCE_GATEWAY_KEYS: [ + 'REQUESTY_API_KEY', + 'AZURE_API_KEY', + 'AZURE_COGNITIVE_SERVICES_API_KEY', + ].join(','), + } + : {}), + }, + }); + const config = JSON.parse(result.configContent); + expect(result.model).toBe('openai/gpt-6.1-sol'); + expect(config.small_model).toBe('openai/gpt-6-luna'); + expect(config.provider?.[providerId]?.models?.[modelId]).toMatchObject({ + name: 'GPT-6.1 Terra', + reasoning: true, + tool_call: true, + attachment: true, + modalities: { input: ['text', 'image'], output: ['text'] }, + limit: { context: 1_050_000, input: 922_000, output: 128_000 }, + }); + const agentName = { + vision: 'visual', + planning: 'advisor', + explore: 'explore', + }[role]; + expect(config.agent[agentName].model).toBe(`${providerId}/${modelId}`); + if (gateway) { + expect(config.provider[providerId].options.baseURL).toContain( + `https://api.example.com/api/inference/${providerId}`, + ); + } + }, + ); + it.each([false, true])( 'keeps shared-model variant and reasoning precedence with task override %s', (override) => { @@ -1269,6 +1335,7 @@ describe('generateOpenCodeConfig provider support', () => { R_MODEL: 'openai/gpt-6-sol', R_SMALL_MODEL: 'openai/gpt-6-luna', R_VISION_MODEL: 'openai/gpt-6.1-sol', + R_CODE_REVIEW_MODEL: 'openai/gpt-6.1-terra', R_MODEL_REASONING_EFFORT: 'high', R_CHATGPT_FAST_MODE: '1', }; @@ -1293,6 +1360,9 @@ describe('generateOpenCodeConfig provider support', () => { expect(config.provider.openai?.models?.['gpt-6.1-sol']?.options).toEqual({ serviceTier: 'priority', }); + expect(config.provider.openai?.models?.['gpt-6.1-terra']?.options).toEqual({ + serviceTier: 'priority', + }); expect(runtimeEnv).not.toHaveProperty('R_CHATGPT_FAST_MODE'); }); diff --git a/apps/worker/src/run-task/agent-home.ts b/apps/worker/src/run-task/agent-home.ts index eefb83482e..1151d19fb1 100644 --- a/apps/worker/src/run-task/agent-home.ts +++ b/apps/worker/src/run-task/agent-home.ts @@ -55,6 +55,7 @@ import { mergeBedrockMantleProviderConfig, mergeCatalogProviderCredentialConfig, mergeKimiForCodingProviderConfig, + mergeCuratedOpenCodeModelConfig, mergeOpenAiCompatibleProviderConfig, mergeOpenCodeModelReasoningOptions, mergeOpenCodeChatGptFastModeOptions, @@ -1740,12 +1741,15 @@ function resolveModelBackedOpenCodeConfig( // config entry or its cost block is silently dropped. ...Object.keys(modelCosts), ]; - const providerModelConfig = chatGptFastMode - ? mergeOpenCodeChatGptFastModeOptions( - providerReasoningConfig, - configuredModelIds, - ) - : providerReasoningConfig; + const providerModelConfig = mergeCuratedOpenCodeModelConfig( + chatGptFastMode + ? mergeOpenCodeChatGptFastModeOptions( + providerReasoningConfig, + configuredModelIds, + ) + : providerReasoningConfig, + configuredModelIds, + ); const providerConfig = mergeInferenceGatewayProviderConfig( // Binds the keys OpenCode would not find under its catalog's env var // names. Gateway mode replaces the key and base URL just above. diff --git a/apps/worker/src/run-task/opencode-chatgpt-gateway-plugin-script.ts b/apps/worker/src/run-task/opencode-chatgpt-gateway-plugin-script.ts index c01998fb54..ea8633108d 100644 --- a/apps/worker/src/run-task/opencode-chatgpt-gateway-plugin-script.ts +++ b/apps/worker/src/run-task/opencode-chatgpt-gateway-plugin-script.ts @@ -16,6 +16,7 @@ const ALLOWED_MODELS = new Set([ 'gpt-6-astra', 'gpt-6-sol', 'gpt-6.1-sol', + 'gpt-6.1-terra', 'gpt-6-luna', 'gpt-5.5', 'gpt-5.3-codex-spark', diff --git a/packages/cloud-agents/src/server/__tests__/opencode-runtime.test.ts b/packages/cloud-agents/src/server/__tests__/opencode-runtime.test.ts index 4c9de6b4ae..6b4571547b 100644 --- a/packages/cloud-agents/src/server/__tests__/opencode-runtime.test.ts +++ b/packages/cloud-agents/src/server/__tests__/opencode-runtime.test.ts @@ -129,6 +129,42 @@ describe('buildOpenCodeCliEnv', () => { }); }); + it.each( + ( + [ + ['requesty', 'azure/gpt-6.1-terra@swedencentral'], + ['azure', 'gpt-6.1-terra'], + ['azure-cognitive-services', 'gpt-6.1-terra'], + ] as const + ).flatMap(([providerId, modelId]) => + [ + undefined, + JSON.stringify({ + provider: { [providerId]: { options: { custom: true } } }, + }), + ].map((configContent) => ({ providerId, modelId, configContent })), + ), + )( + 'registers $providerId Terra for vision-only helper selection with config $configContent', + ({ providerId, modelId, configContent }) => { + const env = buildOpenCodeCliEnv({ + R_MODEL: 'openai/gpt-6.1-sol', + R_SMALL_MODEL: 'openai/gpt-6-luna', + R_VISION_MODEL: `${providerId}/${modelId}`, + OPENCODE_CONFIG_CONTENT: configContent, + }); + const config = JSON.parse(env.OPENCODE_CONFIG_CONTENT!); + expect(config.provider?.[providerId]?.models?.[modelId]).toMatchObject({ + reasoning: true, + tool_call: true, + modalities: { input: ['text', 'image'], output: ['text'] }, + limit: { context: 1_050_000, input: 922_000, output: 128_000 }, + }); + if (configContent) + expect(config.provider[providerId].options.custom).toBe(true); + }, + ); + it('materializes LiteLLM provider config for restricted helper inference', () => { const env = buildOpenCodeCliEnv({ R_MODEL: 'litellm/qwen3.6:35b-unsloth', diff --git a/packages/cloud-agents/src/server/opencode-runtime.ts b/packages/cloud-agents/src/server/opencode-runtime.ts index 12ae6f9334..9f6cffbdb5 100644 --- a/packages/cloud-agents/src/server/opencode-runtime.ts +++ b/packages/cloud-agents/src/server/opencode-runtime.ts @@ -16,6 +16,7 @@ import { mergeBedrockMantleProviderConfig, mergeCatalogProviderCredentialConfig, mergeKimiForCodingProviderConfig, + mergeCuratedOpenCodeModelConfig, mergeOpenAiCompatibleProviderConfig, mergeOpenCodeModelReasoningOptions, mergeOpenCodeChatGptFastModeOptions, @@ -192,13 +193,15 @@ function buildModelBackedOpenCodeConfigContent( const configuredModelIds = NON_TASK_OPENCODE_MODEL_ROLES.map( (role) => roleConfig[role].model, ); - const providerModelConfig = + const providerModelConfig = mergeCuratedOpenCodeModelConfig( env[CHATGPT_FAST_MODE_ENV_VAR_NAME]?.trim() === '1' ? mergeOpenCodeChatGptFastModeOptions( providerReasoningConfig, configuredModelIds, ) - : providerReasoningConfig; + : providerReasoningConfig, + configuredModelIds, + ); // Same Bedrock provider registrations the task worker applies: OpenCode's // catalog knows neither Mantle endpoint, and the native provider does not // read the deployment's bearer token on its own. @@ -495,7 +498,7 @@ function mergeBedrockRegistrationsIntoConfigContent( mergeBedrockMantleOpenAiProviderConfig( mergeKimiForCodingProviderConfig( mergeCatalogProviderCredentialConfig( - existingProvider, + mergeCuratedOpenCodeModelConfig(existingProvider, roleModelIds), env, roleModelIds, ), diff --git a/packages/types/src/__tests__/curated-opencode-models.test.ts b/packages/types/src/__tests__/curated-opencode-models.test.ts new file mode 100644 index 0000000000..4e68a670e5 --- /dev/null +++ b/packages/types/src/__tests__/curated-opencode-models.test.ts @@ -0,0 +1,58 @@ +import { mergeCuratedOpenCodeModelConfig } from '../curated-opencode-models'; + +describe('mergeCuratedOpenCodeModelConfig', () => { + it('leaves unrelated models and providers unchanged', () => { + const config = { azure: { options: { resourceName: 'example' } } }; + expect( + mergeCuratedOpenCodeModelConfig(config, [ + undefined, + 'openai/gpt-6.1-sol', + ]), + ).toBe(config); + }); + + it('fills model defaults without mutating options, SDKs or explicit limits', () => { + const config = { + azure: { + npm: '@ai-sdk/azure', + options: { baseURL: 'https://example.test/v1' }, + models: { + 'gpt-6.1-terra': { + name: 'Custom Terra', + limit: { output: 16_384 }, + modalities: { input: ['text'] }, + options: { reasoningEffort: 'high' }, + }, + other: { name: 'Other' }, + }, + }, + }; + const before = structuredClone(config); + const merged = mergeCuratedOpenCodeModelConfig(config, [ + ' azure/gpt-6.1-terra ', + 'azure/gpt-6.1-terra', + ]); + expect(merged).toMatchObject({ + azure: { + npm: '@ai-sdk/azure', + options: { baseURL: 'https://example.test/v1' }, + models: { + 'gpt-6.1-terra': { + name: 'Custom Terra', + reasoning: true, + tool_call: true, + attachment: true, + limit: { context: 1_050_000, input: 922_000, output: 16_384 }, + modalities: { input: ['text'], output: ['text'] }, + options: { reasoningEffort: 'high' }, + }, + other: { name: 'Other' }, + }, + }, + }); + expect(config).toEqual(before); + expect( + mergeCuratedOpenCodeModelConfig(merged, ['azure/gpt-6.1-terra']), + ).toEqual(merged); + }); +}); diff --git a/packages/types/src/chatgpt-subscription.test.ts b/packages/types/src/chatgpt-subscription.test.ts index 1cabadee51..7e0f8337fc 100644 --- a/packages/types/src/chatgpt-subscription.test.ts +++ b/packages/types/src/chatgpt-subscription.test.ts @@ -16,6 +16,7 @@ describe('mergeOpenCodeChatGptFastModeOptions', () => { 'openai/gpt-6-astra', 'openai/gpt-6-sol', 'openai/gpt-6.1-sol', + 'openai/gpt-6.1-terra', 'openai/gpt-6-luna', 'openai/gpt-5.6-terra', 'openai/gpt-5.6-sol', @@ -29,6 +30,7 @@ describe('mergeOpenCodeChatGptFastModeOptions', () => { 'gpt-6-astra': { options: { serviceTier: 'priority' } }, 'gpt-6-sol': { options: { serviceTier: 'priority' } }, 'gpt-6.1-sol': { options: { serviceTier: 'priority' } }, + 'gpt-6.1-terra': { options: { serviceTier: 'priority' } }, 'gpt-6-luna': { options: { serviceTier: 'priority' } }, 'gpt-5.6-terra': { options: { reasoningEffort: 'high', serviceTier: 'priority' }, @@ -46,6 +48,8 @@ describe('mergeOpenCodeChatGptFastModeOptions', () => { expect( mergeOpenCodeChatGptFastModeOptions(initial, [ 'openrouter/openai/gpt-5.4', + 'openrouter/openai/gpt-6.1-terra', + 'vercel/openai/gpt-6.1-terra', 'openai/gpt-5.4-mini', 'openai/gpt-5.3-codex-spark', ]), diff --git a/packages/types/src/chatgpt-subscription.ts b/packages/types/src/chatgpt-subscription.ts index 41af1c9f94..bde67c1a11 100644 --- a/packages/types/src/chatgpt-subscription.ts +++ b/packages/types/src/chatgpt-subscription.ts @@ -38,6 +38,7 @@ const CHATGPT_FAST_MODE_MODEL_IDS = new Set([ 'gpt-6-astra', 'gpt-6-sol', 'gpt-6.1-sol', + 'gpt-6.1-terra', 'gpt-6-luna', 'gpt-5.4', 'gpt-5.5', diff --git a/packages/types/src/curated-opencode-models.ts b/packages/types/src/curated-opencode-models.ts new file mode 100644 index 0000000000..cf77b3f6bd --- /dev/null +++ b/packages/types/src/curated-opencode-models.ts @@ -0,0 +1,71 @@ +/** + * Runtime definitions for curated routes that are not yet in OpenCode's + * catalog. Shared by task and helper config builders so role-only selections + * resolve without depending on reasoning options to register the model. + */ +const GPT_61_TERRA = { + name: 'GPT-6.1 Terra', + family: 'gpt-terra', + release_date: '2026-10-26', + attachment: true, + reasoning: true, + temperature: false, + tool_call: true, + modalities: { input: ['text', 'image'], output: ['text'] }, + limit: { context: 1_050_000, input: 922_000, output: 128_000 }, +}; + +// Capabilities/limits: https://developers.openai.com/api/docs/models/gpt-6.1-terra +// Azure: https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/models-sold-directly-by-azure#gpt-61 +// Requesty route: https://router.requesty.ai/v1/models +const CURATED_OPENCODE_MODELS = { + 'requesty/azure/gpt-6.1-terra@swedencentral': GPT_61_TERRA, + 'azure/gpt-6.1-terra': GPT_61_TERRA, + 'azure-cognitive-services/gpt-6.1-terra': GPT_61_TERRA, +}; + +function asRecord(value: unknown): Record { + return value && typeof value === 'object' && !Array.isArray(value) + ? (value as Record) + : {}; +} + +/** Fill known model defaults without changing SDKs, credentials or overrides. */ +export function mergeCuratedOpenCodeModelConfig( + providerConfig: Record, + modelIds: Array, +): Record { + let merged = providerConfig; + const selectedIds = new Set(modelIds.map((modelId) => modelId?.trim())); + + for (const [id, definition] of Object.entries(CURATED_OPENCODE_MODELS)) { + if (!selectedIds.has(id)) continue; + + const separator = id.indexOf('/'); + const providerId = id.slice(0, separator); + const modelId = id.slice(separator + 1); + const provider = asRecord(merged[providerId]); + const models = asRecord(provider.models); + const model = asRecord(models[modelId]); + merged = { + ...merged, + [providerId]: { + ...provider, + models: { + ...models, + [modelId]: { + ...definition, + ...model, + modalities: { + ...definition.modalities, + ...asRecord(model.modalities), + }, + limit: { ...definition.limit, ...asRecord(model.limit) }, + }, + }, + }, + }; + } + + return merged; +} diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 1f302134d9..875611dbb5 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -73,6 +73,7 @@ export * from './openai-compatible-providers'; export * from './recommended-task-models'; export * from './opencode-openrouter-variants'; export * from './opencode-provider-config'; +export * from './curated-opencode-models'; export * from './opencode-reasoning'; export * from './task-model-reasoning'; export * from './mcp-oauth'; diff --git a/packages/types/src/model-provider-config.test.ts b/packages/types/src/model-provider-config.test.ts index 0160fbf0e3..ce9b05d66b 100644 --- a/packages/types/src/model-provider-config.test.ts +++ b/packages/types/src/model-provider-config.test.ts @@ -818,6 +818,25 @@ describe('SETUP_MODEL_PROVIDER_CATALOG', () => { } }); + it('offers GPT-6.1 Terra only on verified routes', () => { + const terraRoutes = SETUP_MODEL_PROVIDER_CATALOG.flatMap((provider) => + provider.suggestedTaskModels + .filter((model) => model.displayName.startsWith('GPT-6.1 Terra')) + .map((model) => [provider.id, model.id]), + ); + + expect(terraRoutes).toEqual([ + ['roomote', 'roomote/openai/gpt-6.1-terra'], + ['openrouter', 'openrouter/openai/gpt-6.1-terra'], + ['vercel', 'vercel/openai/gpt-6.1-terra'], + ['requesty', 'requesty/azure/gpt-6.1-terra@swedencentral'], + ['openai', 'openai/gpt-6.1-terra'], + ['azure', 'azure/gpt-6.1-terra'], + ['azure-cognitive-services', 'azure-cognitive-services/gpt-6.1-terra'], + ['chatgpt', 'openai/gpt-6.1-terra'], + ]); + }); + it('uses the Default Luna preset for every applicable role', () => { for (const provider of SETUP_MODEL_PROVIDER_CATALOG) { const luna = provider.suggestedTaskModels.find( @@ -1208,6 +1227,7 @@ describe('SETUP_MODEL_PROVIDER_CATALOG', () => { 'requesty/gpt-5.6-sol@eu', 'requesty/gpt-6-sol@eu', 'requesty/gpt-6.1-sol@eu', + 'requesty/azure/gpt-6.1-terra@swedencentral', 'requesty/gpt-5.6-terra@eu', 'requesty/gpt-5.6-luna@eu', 'requesty/gpt-6-luna@eu', diff --git a/packages/types/src/model-provider-config.ts b/packages/types/src/model-provider-config.ts index ffceb50eb7..3635c31f73 100644 --- a/packages/types/src/model-provider-config.ts +++ b/packages/types/src/model-provider-config.ts @@ -779,6 +779,7 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ 'gpt-5-6-sol': 'vercel/openai/gpt-5.6-sol', 'gpt-6-sol': 'vercel/openai/gpt-6-sol', 'gpt-6-1-sol': 'vercel/openai/gpt-6.1-sol', + 'gpt-6-1-terra': 'vercel/openai/gpt-6.1-terra', 'gpt-5-6-terra': 'vercel/openai/gpt-5.6-terra', 'gpt-5-6-luna': 'vercel/openai/gpt-5.6-luna', 'gpt-6-luna': 'vercel/openai/gpt-6-luna', @@ -821,6 +822,8 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ 'gpt-5-6-sol': 'requesty/gpt-5.6-sol@eu', 'gpt-6-sol': 'requesty/gpt-6-sol@eu', 'gpt-6-1-sol': 'requesty/gpt-6.1-sol@eu', + // Requesty's live catalog publishes explicit Azure regional routes. + 'gpt-6-1-terra': 'requesty/azure/gpt-6.1-terra@swedencentral', 'gpt-5-6-terra': 'requesty/gpt-5.6-terra@eu', 'gpt-5-6-luna': 'requesty/gpt-5.6-luna@eu', 'gpt-6-luna': 'requesty/gpt-6-luna@eu', @@ -906,6 +909,7 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ 'gpt-5-6-sol': 'openai/gpt-5.6-sol', 'gpt-6-sol': 'openai/gpt-6-sol', 'gpt-6-1-sol': 'openai/gpt-6.1-sol', + 'gpt-6-1-terra': 'openai/gpt-6.1-terra', 'gpt-5-6-terra': 'openai/gpt-5.6-terra', 'gpt-5-6-luna': 'openai/gpt-5.6-luna', 'gpt-6-luna': 'openai/gpt-6-luna', @@ -936,6 +940,7 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ 'gpt-5-6-sol': 'azure/gpt-5.6-sol', 'gpt-6-sol': 'azure/gpt-6-sol', 'gpt-6-1-sol': 'azure/gpt-6.1-sol', + 'gpt-6-1-terra': 'azure/gpt-6.1-terra', 'gpt-5-6-terra': 'azure/gpt-5.6-terra', 'gpt-5-6-luna': 'azure/gpt-5.6-luna', 'gpt-6-luna': 'azure/gpt-6-luna', @@ -978,6 +983,7 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ 'gpt-5-6-sol': 'azure-cognitive-services/gpt-5.6-sol', 'gpt-6-sol': 'azure-cognitive-services/gpt-6-sol', 'gpt-6-1-sol': 'azure-cognitive-services/gpt-6.1-sol', + 'gpt-6-1-terra': 'azure-cognitive-services/gpt-6.1-terra', 'gpt-5-6-terra': 'azure-cognitive-services/gpt-5.6-terra', 'gpt-5-6-luna': 'azure-cognitive-services/gpt-5.6-luna', 'gpt-6-luna': 'azure-cognitive-services/gpt-6-luna', @@ -1409,6 +1415,7 @@ export const SETUP_MODEL_PROVIDER_CATALOG = [ 'gpt-5-6-sol': 'openai/gpt-5.6-sol', 'gpt-6-sol': 'openai/gpt-6-sol', 'gpt-6-1-sol': 'openai/gpt-6.1-sol', + 'gpt-6-1-terra': 'openai/gpt-6.1-terra', 'gpt-5-6-terra': 'openai/gpt-5.6-terra', 'gpt-5-6-luna': 'openai/gpt-5.6-luna', 'gpt-6-luna': 'openai/gpt-6-luna', diff --git a/packages/types/src/recommended-task-models.ts b/packages/types/src/recommended-task-models.ts index dbf521bcb4..d3ce949814 100644 --- a/packages/types/src/recommended-task-models.ts +++ b/packages/types/src/recommended-task-models.ts @@ -47,6 +47,7 @@ export const RECOMMENDED_TASK_MODELS = [ { id: 'gpt-5-6-sol', displayName: 'GPT 5.6 Sol', family: 'GPT' }, { id: 'gpt-6-sol', displayName: 'GPT-6 Sol', family: 'GPT' }, { id: 'gpt-6-1-sol', displayName: 'GPT-6.1 Sol', family: 'GPT' }, + { id: 'gpt-6-1-terra', displayName: 'GPT-6.1 Terra', family: 'GPT' }, { id: 'gpt-5-6-terra', displayName: 'GPT 5.6 Terra', family: 'GPT' }, { id: 'gpt-5-6-luna', displayName: 'GPT 5.6 Luna', family: 'GPT' }, { id: 'gpt-6-luna', displayName: 'GPT-6 Luna', family: 'GPT' }, @@ -119,6 +120,7 @@ export const OPENROUTER_RECOMMENDED_TASK_MODEL_SLUGS = { 'gpt-5-6-sol': 'openrouter/openai/gpt-5.6-sol', 'gpt-6-sol': 'openrouter/openai/gpt-6-sol', 'gpt-6-1-sol': 'openrouter/openai/gpt-6.1-sol', + 'gpt-6-1-terra': 'openrouter/openai/gpt-6.1-terra', 'gpt-5-6-terra': 'openrouter/openai/gpt-5.6-terra', 'gpt-5-6-luna': 'openrouter/openai/gpt-5.6-luna', 'gpt-6-luna': 'openrouter/openai/gpt-6-luna', From 62112eb0f8c4c3a2b49891e509891567504c99ee Mon Sep 17 00:00:00 2001 From: "roomote-roomote[bot]" <301996811+roomote-roomote[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 22:08:05 -0400 Subject: [PATCH 2/3] [Feat] Add Kimi K3.1 Pro and Highspeed models (#3596) * feat: add Kimi K3.1 Pro model support * fix: remove Requesty from Kimi K3.1 model additions --------- Co-authored-by: @mrubens <2600+mrubens@users.noreply.github.com> --- .changeset/kimi-k31-pro-models.md | 5 +++ apps/docs/models.mdx | 23 ++++++++++ .../commands/task-models/models-dev.test.ts | 42 +++++++++++++++++++ .../kimi-for-coding-opencode-provider.test.ts | 27 ++++++++++++ .../src/kimi-for-coding-opencode-provider.ts | 22 ++++++++++ .../types/src/model-provider-config.test.ts | 18 ++++++++ packages/types/src/model-provider-config.ts | 7 ++++ packages/types/src/recommended-task-models.ts | 7 ++++ 8 files changed, 151 insertions(+) create mode 100644 .changeset/kimi-k31-pro-models.md 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', From eb9dc4b46d9deae3df13946eb4f873f86f4056af Mon Sep 17 00:00:00 2001 From: "roomote-roomote[bot]" <301996811+roomote-roomote[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 22:39:46 -0400 Subject: [PATCH 3/3] Release Roomote 1.19.4 (#3597) Co-authored-by: @mrubens <2600+mrubens@users.noreply.github.com> --- .changeset/kimi-k31-pro-models.md | 5 ---- CHANGELOG.md | 14 ++++++++++ apps/docs/logo/integrations/kimi.svg | 2 ++ apps/docs/logo/integrations/moonshot.svg | 2 ++ apps/docs/logo/integrations/openai.svg | 2 ++ apps/docs/logo/integrations/openrouter.svg | 2 ++ apps/docs/models.mdx | 28 +++++++++---------- apps/docs/providers/inference/chatgpt.mdx | 2 +- .../providers/inference/kimi-for-coding.mdx | 2 +- apps/docs/providers/inference/moonshot-ai.mdx | 2 +- apps/docs/providers/inference/openai.mdx | 2 +- apps/docs/providers/inference/opencode-go.mdx | 2 +- apps/docs/providers/inference/opencode.mdx | 2 +- apps/docs/providers/inference/openrouter.mdx | 2 +- .../providers/inference/vercel-ai-gateway.mdx | 2 +- apps/docs/roomote.css | 2 ++ apps/docs/snippets/integration-name.jsx | 7 ++++- package.json | 2 +- 18 files changed, 53 insertions(+), 29 deletions(-) delete mode 100644 .changeset/kimi-k31-pro-models.md create mode 100644 apps/docs/logo/integrations/kimi.svg create mode 100644 apps/docs/logo/integrations/moonshot.svg create mode 100644 apps/docs/logo/integrations/openai.svg create mode 100644 apps/docs/logo/integrations/openrouter.svg diff --git a/.changeset/kimi-k31-pro-models.md b/.changeset/kimi-k31-pro-models.md deleted file mode 100644 index 3c3dabb455..0000000000 --- a/.changeset/kimi-k31-pro-models.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@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/CHANGELOG.md b/CHANGELOG.md index 4c29926609..6cdd201985 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ This file tracks product releases for Roomote (single monorepo version). Automated release entries are prepended by `pnpm run version`. +## 1.19.4 (2026-10-27) + +Roomote 1.19.4 expands model choice with GPT-6.1 Terra and Kimi K3.1 Pro, including Highspeed options on supported Kimi providers. + +### Highlights + +- Use GPT-6.1 Terra across supported API and subscription providers, with Fast mode on eligible ChatGPT plans. +- Choose Kimi K3.1 Pro or its Highspeed variant through supported Kimi providers and gateways. + +### Patch changes + +- Select GPT-6.1 Terra through Roomote inference, OpenRouter, Vercel AI Gateway, OpenAI, Azure OpenAI, Azure AI Foundry, Requesty, and ChatGPT Subscription, including Fast mode on eligible ChatGPT plans. Existing defaults and saved model mappings stay unchanged. +- Select Kimi K3.1 Pro through Moonshot AI, OpenRouter, Vercel AI Gateway, Kimi for Coding, and OpenCode Go, with Highspeed available through Moonshot AI, Vercel AI Gateway, and eligible Kimi for Coding memberships. + ## 1.19.3 (2026-10-24) Roomote 1.19.3 keeps scheduled automations and worker health checks running reliably while memory history backfills make progress in the background. diff --git a/apps/docs/logo/integrations/kimi.svg b/apps/docs/logo/integrations/kimi.svg new file mode 100644 index 0000000000..f02d7c47b8 --- /dev/null +++ b/apps/docs/logo/integrations/kimi.svg @@ -0,0 +1,2 @@ + +Kimi diff --git a/apps/docs/logo/integrations/moonshot.svg b/apps/docs/logo/integrations/moonshot.svg new file mode 100644 index 0000000000..18a4bd97f8 --- /dev/null +++ b/apps/docs/logo/integrations/moonshot.svg @@ -0,0 +1,2 @@ + +MoonshotAI diff --git a/apps/docs/logo/integrations/openai.svg b/apps/docs/logo/integrations/openai.svg new file mode 100644 index 0000000000..77f4f998d2 --- /dev/null +++ b/apps/docs/logo/integrations/openai.svg @@ -0,0 +1,2 @@ + +OpenAI diff --git a/apps/docs/logo/integrations/openrouter.svg b/apps/docs/logo/integrations/openrouter.svg new file mode 100644 index 0000000000..f40bad4deb --- /dev/null +++ b/apps/docs/logo/integrations/openrouter.svg @@ -0,0 +1,2 @@ + +OpenRouter diff --git a/apps/docs/models.mdx b/apps/docs/models.mdx index 4d5b7d58fe..b56c7a2149 100644 --- a/apps/docs/models.mdx +++ b/apps/docs/models.mdx @@ -70,17 +70,17 @@ These connections use metered API billing or a provider-managed gateway: | --- | --- | --- | | [Amazon Bedrock](/providers/inference/amazon-bedrock) | Mantle API key and optional AWS region | AWS account | | [Anthropic](/providers/inference/anthropic) | Anthropic API key | Anthropic API organization | -| [Azure AI Foundry](/providers/inference/azure-foundry) | Azure AI Services API key and resource name | Azure subscription | -| [Azure OpenAI](/providers/inference/azure-openai) | Azure OpenAI API key and resource name | Azure subscription | +| | Azure AI Services API key and resource name | Azure subscription | +| | Azure OpenAI API key and resource name | Azure subscription | | [Baseten](/providers/inference/baseten) | Baseten API key | Baseten workspace | | [DeepSeek](/providers/inference/deepseek) | DeepSeek API key | DeepSeek platform balance | | [Google Gemini](/providers/inference/google-gemini) | Google AI Studio key | Google Cloud project | | [MiniMax](/providers/inference/minimax) | MiniMax API key | MiniMax account | -| [Moonshot AI (Kimi)](/providers/inference/moonshot-ai) | Kimi Open Platform key | Moonshot Open Platform balance | -| [OpenAI](/providers/inference/openai) | OpenAI API key | OpenAI API project | +| | Kimi Open Platform key | Moonshot Open Platform balance | +| | OpenAI API key | OpenAI API project | | | OpenCode API key | OpenCode account | -| [OpenRouter](/providers/inference/openrouter) | OpenRouter API key | OpenRouter balance and key limit | -| [Requesty](/providers/inference/requesty) | Requesty API key | Requesty organization | +| | OpenRouter API key | OpenRouter balance and key limit | +| | Requesty API key | Requesty organization | | [Together AI](/providers/inference/together-ai) | Together AI API key | Together AI account | | | TypeSafe API key, used only for the [judgment model](#judgment-model) | TypeSafe account | | | AI Gateway API key | Vercel team | @@ -94,10 +94,10 @@ general API balance: | Provider | Connection | Usage behavior | | --- | --- | --- | -| [ChatGPT Subscription](/providers/inference/chatgpt) | OpenAI device authorization | ChatGPT plan windows | +| | OpenAI device authorization | ChatGPT plan windows | | | GitHub device authorization | Copilot plan allowance | -| [Kimi for Coding](/providers/inference/kimi-for-coding) | Kimi membership key | Coding membership allowance | -| [OpenCode Go](/providers/inference/opencode-go) | OpenCode API key | Go plan allowance | +| | Kimi membership key | Coding membership allowance | +| | OpenCode API key | Go plan allowance | | [xAI Grok Subscription](/providers/inference/xai-subscription) | xAI account authorization | SuperGrok or eligible X plan allowance | | [Z.AI Coding Plan](/providers/inference/zai-coding-plan) | Regional Coding Plan key | Coding Plan quota windows | @@ -264,11 +264,11 @@ 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` | — | +| | `moonshotai/kimi-k3.1-pro` | `moonshotai/kimi-k3.1-pro-highspeed` | +| | `openrouter/moonshotai/kimi-k3.1-pro` | — | +| | `vercel/moonshotai/kimi-k3.1-pro` | `vercel/moonshotai/kimi-k3.1-pro-highspeed` | +| | `kimi-for-coding/k3.1-pro` | `kimi-for-coding/k3.1-pro-highspeed` | +| | `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 diff --git a/apps/docs/providers/inference/chatgpt.mdx b/apps/docs/providers/inference/chatgpt.mdx index eb63d73c25..b898ea04a5 100644 --- a/apps/docs/providers/inference/chatgpt.mdx +++ b/apps/docs/providers/inference/chatgpt.mdx @@ -1,6 +1,6 @@ --- title: ChatGPT subscription -icon: 'https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/openai.svg' +icon: '/logo/integrations/openai.svg' description: Connect an eligible ChatGPT subscription to Roomote through OpenAI sign-in. --- diff --git a/apps/docs/providers/inference/kimi-for-coding.mdx b/apps/docs/providers/inference/kimi-for-coding.mdx index 2e33972d9a..696e527dd3 100644 --- a/apps/docs/providers/inference/kimi-for-coding.mdx +++ b/apps/docs/providers/inference/kimi-for-coding.mdx @@ -1,6 +1,6 @@ --- title: Kimi for Coding -icon: 'https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/kimi.svg' +icon: '/logo/integrations/kimi.svg' description: Connect a Kimi for Coding membership key and use its included coding models. --- diff --git a/apps/docs/providers/inference/moonshot-ai.mdx b/apps/docs/providers/inference/moonshot-ai.mdx index a663c3a077..638058bee7 100644 --- a/apps/docs/providers/inference/moonshot-ai.mdx +++ b/apps/docs/providers/inference/moonshot-ai.mdx @@ -1,6 +1,6 @@ --- title: Moonshot AI (Kimi) -icon: 'https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/moonshot.svg' +icon: '/logo/integrations/moonshot.svg' description: Use Kimi models through the metered Moonshot AI Open Platform API. --- diff --git a/apps/docs/providers/inference/openai.mdx b/apps/docs/providers/inference/openai.mdx index 4d42262021..6ee2eda6e9 100644 --- a/apps/docs/providers/inference/openai.mdx +++ b/apps/docs/providers/inference/openai.mdx @@ -1,6 +1,6 @@ --- title: OpenAI -icon: 'https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/openai.svg' +icon: '/logo/integrations/openai.svg' description: Use OpenAI API models with separately billed API capacity. --- diff --git a/apps/docs/providers/inference/opencode-go.mdx b/apps/docs/providers/inference/opencode-go.mdx index 3e0dd18f62..2cdd194d2d 100644 --- a/apps/docs/providers/inference/opencode-go.mdx +++ b/apps/docs/providers/inference/opencode-go.mdx @@ -1,6 +1,6 @@ --- title: OpenCode Go -icon: 'https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/opencode.svg' +icon: 'https://api.iconify.design/simple-icons/opencode.svg?color=currentColor' description: Use an OpenCode Go subscription with Roomote. --- diff --git a/apps/docs/providers/inference/opencode.mdx b/apps/docs/providers/inference/opencode.mdx index 8bb3891a4c..0eb660a5d1 100644 --- a/apps/docs/providers/inference/opencode.mdx +++ b/apps/docs/providers/inference/opencode.mdx @@ -1,6 +1,6 @@ --- title: OpenCode Zen -icon: 'https://api.iconify.design/simple-icons:opencode.svg?color=currentColor' +icon: 'https://api.iconify.design/simple-icons/opencode.svg?color=currentColor' description: Use OpenCode's routed Zen model service with Roomote. --- diff --git a/apps/docs/providers/inference/openrouter.mdx b/apps/docs/providers/inference/openrouter.mdx index 3b5fcc3df2..7786061930 100644 --- a/apps/docs/providers/inference/openrouter.mdx +++ b/apps/docs/providers/inference/openrouter.mdx @@ -1,6 +1,6 @@ --- title: OpenRouter -icon: 'https://unpkg.com/@lobehub/icons-static-svg@1.94.0/icons/openrouter.svg' +icon: '/logo/integrations/openrouter.svg' description: Access models from many vendors through one OpenRouter account and key. --- diff --git a/apps/docs/providers/inference/vercel-ai-gateway.mdx b/apps/docs/providers/inference/vercel-ai-gateway.mdx index 8dff256419..5ba7941f56 100644 --- a/apps/docs/providers/inference/vercel-ai-gateway.mdx +++ b/apps/docs/providers/inference/vercel-ai-gateway.mdx @@ -1,6 +1,6 @@ --- title: Vercel AI Gateway -icon: 'https://api.iconify.design/simple-icons:vercel.svg?color=currentColor' +icon: 'https://api.iconify.design/simple-icons/vercel.svg?color=currentColor' description: Route Roomote model calls through Vercel AI Gateway. --- diff --git a/apps/docs/roomote.css b/apps/docs/roomote.css index 293ae7742d..107992f812 100644 --- a/apps/docs/roomote.css +++ b/apps/docs/roomote.css @@ -95,6 +95,7 @@ nav a[href='https://roomote.dev'] svg, /* Keep integration marks in their original silhouette instead of clipping them. */ .integration-logo, +img[src^='https://api.iconify.design/simple-icons/'], img[src^='https://api.iconify.design/simple-icons:'], img[src^='https://unpkg.com/@lobehub/icons-static-svg@'], img[src*='/logo/integrations/'], @@ -121,6 +122,7 @@ img[src*='/favicon.svg'] { * In production Mintlify rehosts local logos under its S3 bucket, so match with * `*=` instead of `^=` to cover both dev and production URLs. */ +.dark img[src^='https://api.iconify.design/simple-icons/'], .dark img[src^='https://api.iconify.design/simple-icons:'] { filter: invert(1); } diff --git a/apps/docs/snippets/integration-name.jsx b/apps/docs/snippets/integration-name.jsx index 244696c4b4..9a36aa4d87 100644 --- a/apps/docs/snippets/integration-name.jsx +++ b/apps/docs/snippets/integration-name.jsx @@ -12,12 +12,17 @@ export function IntegrationName({ href, icon, name }) { rippling: '/logo/integrations/rippling.svg', typesafe: '/logo/integrations/typesafe.svg', voice: '/logo/integrations/voice.svg', + openai: '/logo/integrations/openai.svg', + openrouter: '/logo/integrations/openrouter.svg', + kimi: '/logo/integrations/kimi.svg', + moonshot: '/logo/integrations/moonshot.svg', + requesty: '/logo/integrations/requesty.png', }; const iconSrc = manualIcons[icon] ?? (icon?.startsWith('/') ? icon - : `https://api.iconify.design/simple-icons:${icon}.svg?color=currentColor`); + : `https://api.iconify.design/simple-icons/${icon}.svg?color=currentColor`); return ( diff --git a/package.json b/package.json index a06d945e65..0b95c0ff0e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "roomote", - "version": "1.19.3", + "version": "1.19.4", "license": "FCL-1.0-ALv2", "packageManager": "pnpm@10.29.3", "engines": {