Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/integrations/compatibility.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { describe, expect, test } from 'bun:test'
import './index.js'
import {
getGateway,
getModelsForGateway,
getVendor,
} from './index.js'
import {
Expand Down Expand Up @@ -76,6 +77,26 @@ describe('compatibility mappings', () => {
}
})

test('Atlas Cloud is modeled as a gateway while preserving the atlas-cloud preset', () => {
expect(getVendor('atlas-cloud')).toBeUndefined()
expect(getGateway('atlas-cloud')?.id).toBe('atlas-cloud')
expect(routeForPreset('atlas-cloud')).toEqual({
vendorId: 'openai',
gatewayId: 'atlas-cloud',
routeId: 'atlas-cloud',
})
expect(resolveProfileRoute('atlas-cloud')).toEqual({
vendorId: 'openai',
gatewayId: 'atlas-cloud',
routeId: 'atlas-cloud',
})
})

test('Atlas Cloud gateway models do not resolve to NearAI-scoped descriptors', () => {
expect(
getModelsForGateway('atlas-cloud').filter(model => model.vendorId === 'nearai'),
).toEqual([])
})
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
test('native gateway profile routes use their descriptor vendor', () => {
expect(resolveProfileRoute('bedrock')).toEqual({
vendorId: 'anthropic',
Expand Down
1 change: 1 addition & 0 deletions src/integrations/descriptors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ export type ReadinessProbeKind = 'ollama-generation' | 'openai-compatible-models
export interface ModelCatalogEntry {
id: string
apiName: string
aliases?: string[]
label?: string
default?: boolean
hidden?: boolean
Expand Down
94 changes: 94 additions & 0 deletions src/integrations/gateways/atlas-cloud.ts

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions src/integrations/generated/integrationArtifacts.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import type { AnthropicProxyDescriptor, BrandDescriptor, GatewayDescriptor, ModelDescriptor, VendorDescriptor } from '../descriptors.js'
import vendorAnthropic from '../vendors/anthropic.js'
import vendorAtlasCloud from '../vendors/atlas-cloud.js'
import vendorBankr from '../vendors/bankr.js'
import vendorDeepseek from '../vendors/deepseek.js'
import vendorFireworks from '../vendors/fireworks.js'
Expand All @@ -19,6 +18,7 @@ import vendorVenice from '../vendors/venice.js'
import vendorXai from '../vendors/xai.js'
import vendorXiaomiMimo from '../vendors/xiaomi-mimo.js'
import vendorZai from '../vendors/zai.js'
import gatewayAtlasCloud from '../gateways/atlas-cloud.js'
import gatewayAtomicChat from '../gateways/atomic-chat.js'
import gatewayAzureOpenai from '../gateways/azure-openai.js'
import gatewayBedrock from '../gateways/bedrock.js'
Expand Down Expand Up @@ -75,8 +75,8 @@ import modelQwen from '../models/qwen.js'
import modelXai from '../models/xai.js'
import modelXiaomiMimo from '../models/xiaomi-mimo.js'

export const VENDOR_DESCRIPTORS = [vendorAnthropic, vendorAtlasCloud, vendorBankr, vendorDeepseek, vendorFireworks, vendorGemini, vendorMinimax, vendorMoonshot, vendorNearai, vendorOpenai, vendorVenice, vendorXai, vendorXiaomiMimo, vendorZai] as const satisfies readonly VendorDescriptor[]
export const GATEWAY_DESCRIPTORS = [gatewayAtomicChat, gatewayAzureOpenai, gatewayBedrock, gatewayCustom, gatewayDashscopeCn, gatewayDashscopeIntl, gatewayGithubEnterprise, gatewayGithub, gatewayGitlawbOpengateway, gatewayGroq, gatewayHicap, gatewayKimiCode, gatewayLmstudio, gatewayMistral, gatewayNvidiaNim, gatewayOllama, gatewayOpencodeGo, gatewayOpencode, gatewayOpenrouter, gatewayTogether, gatewayVertex, gatewayXiaomiMimoToken] as const satisfies readonly GatewayDescriptor[]
export const VENDOR_DESCRIPTORS = [vendorAnthropic, vendorBankr, vendorDeepseek, vendorFireworks, vendorGemini, vendorMinimax, vendorMoonshot, vendorNearai, vendorOpenai, vendorVenice, vendorXai, vendorXiaomiMimo, vendorZai] as const satisfies readonly VendorDescriptor[]
export const GATEWAY_DESCRIPTORS = [gatewayAtlasCloud, gatewayAtomicChat, gatewayAzureOpenai, gatewayBedrock, gatewayCustom, gatewayDashscopeCn, gatewayDashscopeIntl, gatewayGithubEnterprise, gatewayGithub, gatewayGitlawbOpengateway, gatewayGroq, gatewayHicap, gatewayKimiCode, gatewayLmstudio, gatewayMistral, gatewayNvidiaNim, gatewayOllama, gatewayOpencodeGo, gatewayOpencode, gatewayOpenrouter, gatewayTogether, gatewayVertex, gatewayXiaomiMimoToken] as const satisfies readonly GatewayDescriptor[]
export const ANTHROPIC_PROXY_DESCRIPTORS = [] as const satisfies readonly AnthropicProxyDescriptor[]
export const BRAND_DESCRIPTORS = [brandClaude, brandDeepseek, brandFireworks, brandGemini, brandGlm, brandGpt, brandKimi, brandLlama, brandMinimax, brandMistral, brandNearai, brandNemotron, brandOpenaiCompatibleAlias, brandQwen, brandXai, brandXiaomiMimo] as const satisfies readonly BrandDescriptor[]
export const MODEL_DESCRIPTOR_GROUPS = [modelClaude, modelDeepseek, modelFireworksMerged, modelGemini, modelGlm, modelGpt, modelKimi, modelLlama, modelMinimax, modelMistral, modelNearai, modelNemotron, modelOpenaiCompatibleAlias, modelOpencode, modelQwen, modelXai, modelXiaomiMimo] as const satisfies readonly (readonly ModelDescriptor[])[]
Expand Down
5 changes: 3 additions & 2 deletions src/integrations/generated/integrationManifest.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,10 @@ export const PROVIDER_PRESET_MANIFEST = [
},
{
"preset": "atlas-cloud",
"routeKind": "vendor",
"routeKind": "gateway",
"routeId": "atlas-cloud",
"vendorId": "atlas-cloud",
"vendorId": "openai",
"gatewayId": "atlas-cloud",
"description": "Atlas Cloud AI (OpenAI-compatible)",
"apiKeyEnvVars": [
"ATLAS_CLOUD_API_KEY"
Expand Down
18 changes: 18 additions & 0 deletions src/integrations/models/claude.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,24 @@
import { defineModel } from '../define.js'

export default [
defineModel({
id: 'claude-opus-4-8',
label: 'Claude Opus 4.8',
brandId: 'claude',
vendorId: 'anthropic',
classification: ['chat', 'reasoning', 'vision', 'coding'],
defaultModel: 'claude-opus-4-8',
capabilities: {
supportsVision: true,
supportsStreaming: true,
supportsFunctionCalling: true,
supportsJsonMode: true,
supportsReasoning: true,
supportsPreciseTokenCount: false,
},
contextWindow: 1_000_000,
maxOutputTokens: 128_000,
}),
defineModel({
id: 'claude-sonnet-4-6',
label: 'Claude Sonnet 4.6',
Expand Down
2 changes: 2 additions & 0 deletions src/integrations/models/gemini.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ export default [
geminiModel('gemini-2.5-flash', 'Gemini 2.5 Flash', 65_536),
geminiModel('gemini-2.5-pro', 'Gemini 2.5 Pro', 65_536),
geminiModel('gemini-2.0-flash', 'Gemini 2.0 Flash', 8_192),
geminiModel('gemini-3.5-flash', 'Gemini 3.5 Flash', 65_536),
geminiModel('google/gemini-3.1-pro-preview', 'Google Gemini 3.1 Pro Preview', 64_000),
geminiModel('google/gemini-3.1-flash-lite', 'Google Gemini 3.1 Flash Lite', 65_536),
geminiModel('google/gemini-2.5-pro', 'Google Gemini 2.5 Pro', 65_536),
geminiModel('google/gemini-2.0-flash', 'Google Gemini 2.0 Flash', 8_192),
Expand Down
15 changes: 15 additions & 0 deletions src/integrations/models/glm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,20 @@ function glmModel(
}

export default [
defineModel({
id: 'glm-5v-turbo',
label: 'GLM 5V Turbo',
brandId: 'glm',
vendorId: 'zai',
classification: ['chat', 'reasoning', 'vision', 'coding'],
defaultModel: 'glm-5v-turbo',
capabilities: {
...glmCapabilities,
supportsVision: true,
},
contextWindow: 202_752,
maxOutputTokens: 131_072,
}),
glmModel('glm-5.2', 'GLM 5.2', 1_000_000, 131_072),
glmModel('GLM-5.1', 'GLM-5.1', 202_752, 131_072),
glmModel('GLM-5-Turbo', 'GLM-5-Turbo', 202_752, 131_072),
Expand All @@ -39,5 +53,6 @@ export default [
glmModel('glm-5-turbo', 'GLM 5 Turbo', 202_752, 16_384),
glmModel('glm-5', 'GLM 5', 202_752, 16_384),
glmModel('glm-4.7', 'GLM 4.7', 202_752, 16_384),
glmModel('glm-4.6', 'GLM 4.6', 202_752, 202_752),
glmModel('glm-4.5-air', 'GLM 4.5 Air', 128_000, 16_384),
]
1 change: 1 addition & 0 deletions src/integrations/models/kimi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ function kimiModel(

export default [
kimiModel('kimi-for-coding', 'Kimi for Coding', 262_144, 32_768),
kimiModel('kimi-k2.7-code', 'Kimi K2.7 Code', 262_144, 262_144),
kimiModel('kimi-k2.6', 'Kimi K2.6', 262_144, 32_768),
kimiModel('kimi-k2.5', 'Kimi K2.5', 262_144, 32_768),
kimiModel('kimi-k2-thinking', 'Kimi K2 Thinking', 262_144, 32_768),
Expand Down
7 changes: 7 additions & 0 deletions src/integrations/models/openai-compatible-alias.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ function aliasModel(
}

const aliasModels: readonly AliasModel[] = [
['deepseek-ai/DeepSeek-V3.2-Exp', 'DeepSeek V3.2 Exp', 163_840, 163_840],
['bytedance/doubao-seed-2.0-pro-260215', 'Doubao Seed 2.0 Pro', 262_144, 131_072],
['bytedance/doubao-seed-2.0-code-preview-260215', 'Doubao Seed 2.0 Code Preview', 262_144, 131_072],
['bytedance/doubao-seed-2.0-lite-260428', 'Doubao Seed 2.0 Lite', 262_144, 131_072],
['bytedance/doubao-seed-2.0-mini-260428', 'Doubao Seed 2.0 Mini', 262_144, 131_072],
['kwaipilot/kat-coder-pro-v2', 'KAT Coder Pro V2', 262_144, 144_000],
['owl', 'OWL', 1_048_576, 262_144],
['github:copilot', 'GitHub Copilot', 128_000, 16_384],
['github:copilot:claude-sonnet-4', 'GitHub Copilot Claude Sonnet 4', 216_000, 16_000],
['github:copilot:claude-haiku-4', 'GitHub Copilot Claude Haiku 4', 200_000, 64_000],
Expand Down
58 changes: 58 additions & 0 deletions src/integrations/models/qwen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,65 @@ function qwenModel(
})
}

function qwenTextModel(
id: string,
label: string,
contextWindow: number,
maxOutputTokens: number,
) {
return defineModel({
id,
label,
brandId: 'qwen',
vendorId: 'openai',
classification: ['chat', 'reasoning', 'coding'],
defaultModel: id,
capabilities: {
...qwenCapabilities,
supportsVision: false,
},
contextWindow,
maxOutputTokens,
})
}

function qwenInstructModel(
id: string,
label: string,
contextWindow: number,
maxOutputTokens: number,
supportsVision = true,
) {
return defineModel({
id,
label,
brandId: 'qwen',
vendorId: 'openai',
classification: supportsVision ? ['chat', 'vision', 'coding'] : ['chat', 'coding'],
defaultModel: id,
capabilities: {
...qwenCapabilities,
supportsVision,
supportsReasoning: false,
},
contextWindow,
maxOutputTokens,
})
}
export default [
qwenTextModel('qwen3.7-plus', 'Qwen 3.7 Plus', 1_000_000, 67_072),
qwenModel('qwen/qwen3.6-35b-a3b', 'Qwen 3.6 35B A3B', 262_144, 65_536),
qwenModel('qwen/qwen3.5-397b-a17b', 'Qwen 3.5 397B A17B', 262_144, 65_536),
qwenModel('qwen/qwen3.5-122b-a10b', 'Qwen 3.5 122B A10B', 262_144, 65_536),
qwenModel('qwen/qwen3.5-35b-a3b', 'Qwen 3.5 35B A3B', 262_144, 65_536),
qwenModel('qwen/qwen3.5-27b', 'Qwen 3.5 27B', 262_144, 65_536),
qwenModel('qwen/qwen3-vl-30b-a3b-thinking', 'Qwen 3 VL 30B A3B Thinking', 128_000, 32_000),
qwenInstructModel('qwen/qwen3-vl-30b-a3b-instruct', 'Qwen 3 VL 30B A3B Instruct', 128_000, 32_000),
qwenInstructModel('qwen/qwen3-vl-8b-instruct', 'Qwen 3 VL 8B Instruct', 128_000, 32_000),
qwenInstructModel('Qwen/Qwen3-VL-235B-A22B-Instruct', 'Qwen 3 VL 235B A22B Instruct', 131_072, 32_768),
qwenTextModel('Qwen/Qwen3-Next-80B-A3B-Thinking', 'Qwen 3 Next 80B A3B Thinking', 262_144, 32_768),
qwenInstructModel('Qwen/Qwen3-Next-80B-A3B-Instruct', 'Qwen 3 Next 80B A3B Instruct', 262_144, 131_072, false),
qwenInstructModel('qwen3-30b-a3b-instruct-2507', 'Qwen 3 30B A3B Instruct 2507', 131_072, 131_072, false),
qwenModel('qwen3.6-plus', 'Qwen 3.6 Plus', 1_000_000, 65_536),
qwenModel('qwen3.5-plus', 'Qwen 3.5 Plus', 1_000_000, 65_536),
qwenModel('qwen3-coder-plus', 'Qwen 3 Coder Plus', 1_000_000, 65_536),
Expand Down
14 changes: 14 additions & 0 deletions src/integrations/models/xai.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,20 @@ const grokCapabilities = {
}

export default [
defineModel({
id: 'xai/grok-build-0.1',
label: 'Grok Build 0.1',
brandId: 'xai',
vendorId: 'xai',
classification: ['chat', 'reasoning', 'coding'],
defaultModel: 'xai/grok-build-0.1',
capabilities: {
...grokCapabilities,
supportsVision: false,
},
contextWindow: 262_144,
maxOutputTokens: 262_144,
}),
defineModel({
id: 'grok-4.3',
label: 'Grok 4.3',
Expand Down
Loading