Merge pull request #1308 from simonsmh/feat/add-qoder-provider

feat(cliproxy): Qoder provider
This commit is contained in:
Kai (Tam Nhu) Tran authored and GitHub committed 2026-05-30 15:35:55 -04:00
commit f815db391d
21 files changed
+236 -1

No files matched your search

@@ -46,6 +46,7 @@ describe('provider-capabilities', () => {
'gitlab',
'codebuddy',
'kilo',
'qoder',
]);
});
@@ -66,6 +67,7 @@ describe('provider-capabilities', () => {
'cursor',
'codebuddy',
'kilo',
'qoder',
]);
expect(getProvidersByOAuthFlow('authorization_code')).toEqual([
'gemini',
@@ -85,6 +87,7 @@ describe('provider-capabilities', () => {
'kimi',
'codebuddy',
'kilo',
'qoder',
]);
});
+7
View File
@@ -306,6 +306,13 @@ export const OAUTH_CONFIGS: Record<CLIProxyProvider, ProviderOAuthConfig> = {
scopes: [],
authFlag: '--kilo-login',
},
qoder: {
provider: 'qoder',
displayName: 'Qoder',
authUrl: 'https://qoder.com/device/selectAccounts',
scopes: [],
authFlag: '--qoder-login',
},
};
/**
@@ -8,6 +8,7 @@ describe('base-config-loader new providers', () => {
['gitlab', '/api/provider/gitlab', 'gitlab-duo'],
['codebuddy', '/api/provider/codebuddy', 'auto'],
['kilo', '/api/provider/kilo', 'kilo/auto'],
['qoder', '/api/provider/qoder', 'qoder/auto'],
] as const)('loads base settings for %s', (provider, baseUrlPath, defaultModel) => {
const config = loadBaseConfig(provider);
+62
View File
@@ -265,6 +265,68 @@ export const MODEL_CATALOG: Partial<Record<CLIProxyProvider, ProviderCatalog>> =
},
],
},
qoder: {
provider: 'qoder',
displayName: 'Qoder',
defaultModel: 'qoder/auto',
models: [
{
id: 'qoder/auto',
name: 'Qoder Auto',
description: 'Auto selects the best Qoder model for your prompt',
},
{
id: 'qoder/ultimate',
name: 'Qoder Ultimate',
description: 'Highest quality Qoder tier',
},
{
id: 'qoder/performance',
name: 'Qoder Performance',
description: 'Balanced quality and speed',
},
{
id: 'qoder/efficient',
name: 'Qoder Efficient',
description: 'Cost-efficient Qoder tier',
},
{
id: 'qoder/lite',
name: 'Qoder Lite',
description: 'Fastest and most affordable Qoder tier',
},
{
id: 'qoder/qmodel',
name: 'Qwen 3.6 Plus (via Qoder)',
description: 'Qwen 3.6 Plus frontier model',
},
{
id: 'qoder/dmodel',
name: 'DeepSeek V4 Pro (via Qoder)',
description: 'DeepSeek V4 Pro frontier model',
},
{
id: 'qoder/dfmodel',
name: 'DeepSeek V4 Flash (via Qoder)',
description: 'DeepSeek V4 Flash frontier model',
},
{
id: 'qoder/gm51model',
name: 'GLM 5.1 (via Qoder)',
description: 'GLM 5.1 frontier model',
},
{
id: 'qoder/kmodel',
name: 'Kimi K2.6 (via Qoder)',
description: 'Kimi K2.6 frontier model',
},
{
id: 'qoder/mmodel',
name: 'MiniMax M2.7 (via Qoder)',
description: 'MiniMax M2.7 frontier model',
},
],
},
kimi: {
provider: 'kimi',
displayName: 'Kimi (Moonshot)',
+12
View File
@@ -182,6 +182,18 @@ export const PROVIDER_CAPABILITIES: Record<CLIProxyProvider, ProviderCapabilitie
tokenTypeValues: ['kilo'],
aliases: [],
},
qoder: {
displayName: 'Qoder',
description: 'Qoder AI coding assistant',
oauthFlow: 'device_code',
callbackPort: null,
callbackProviderName: 'qoder',
authUrlProviderName: 'qoder',
refreshOwnership: 'unsupported',
authFilePrefixes: ['qoder-'],
tokenTypeValues: ['qoder'],
aliases: [],
},
};
export const CLIPROXY_PROVIDER_IDS = Object.freeze(
+1
View File
@@ -38,6 +38,7 @@ const CHANNEL_TO_PROVIDER: Record<string, CLIProxyProvider> = {
kimi: 'kimi',
kiro: 'kiro',
'github-copilot': 'ghcp',
qoder: 'qoder',
};
/** CCS provider → channel name mapping (reverse) */
+3 -1
View File
@@ -16,7 +16,8 @@ export type CLIProxyProvider =
| 'cursor'
| 'gitlab'
| 'codebuddy'
| 'kilo';
| 'kilo'
| 'qoder';
/** CLIProxy backend selection */
export type CLIProxyBackend = 'original' | 'plus';
@@ -32,6 +33,7 @@ export const PLUS_ONLY_PROVIDERS: CLIProxyProvider[] = [
'gitlab',
'codebuddy',
'kilo',
'qoder',
];
/** Model mapping for each provider */
+1
View File
@@ -205,6 +205,7 @@ export const BUILTIN_PROVIDER_SHORTCUTS: readonly ShortcutEntry[] = CLIPROXY_PRO
gitlab: 'GitLab Duo via CLIProxy OAuth',
codebuddy: 'CodeBuddy via CLIProxy OAuth',
kilo: 'Kilo AI via CLIProxy OAuth',
qoder: 'Qoder AI via CLIProxy OAuth',
}[name] || 'CLIProxy OAuth provider',
})
);
+1
View File
@@ -16,6 +16,7 @@ export const RESERVED_PROFILE_NAMES = [
'gitlab',
'codebuddy',
'kilo',
'qoder',
// Copilot API (GitHub Copilot proxy)
'copilot',
// Cursor IDE (Cursor proxy daemon)
+1
View File
@@ -57,6 +57,7 @@ const PROVIDER_OWNER_HINTS: Record<string, string[]> = {
kimi: ['kimi', 'moonshot'],
kiro: ['kiro', 'aws'],
ghcp: ['github', 'copilot'],
qoder: ['qoder'],
};
function normalize(value: string | null | undefined): string {