fix(kimi): use versioned OpenAI base URL

This commit is contained in:
Supra4E8C
2026-07-16 23:42:02 +08:00
parent f860bc81bc
commit f3241356cd
2 changed files with 39 additions and 5 deletions
+6 -3
View File
@@ -3,8 +3,9 @@ import type { SponsorProviderRaw } from './types';
export const KIMI_PROVIDER_NAME = 'kimi';
export const KIMI_DISPLAY_NAME = 'Kimi';
export const KIMI_OPENAI_BASE_URL = 'https://api.moonshot.ai';
export const KIMI_ANTHROPIC_BASE_URL = 'https://api.moonshot.ai/anthropic';
export const KIMI_LEGACY_OPENAI_BASE_URL = 'https://api.moonshot.ai';
export const KIMI_OPENAI_BASE_URL = `${KIMI_LEGACY_OPENAI_BASE_URL}/v1`;
export const KIMI_ANTHROPIC_BASE_URL = `${KIMI_LEGACY_OPENAI_BASE_URL}/anthropic`;
export const KIMI_CHINESE_AFFILIATE_URL = 'https://platform.kimi.com/?aff=cliproxyapi';
export const KIMI_INTERNATIONAL_AFFILIATE_URL = 'https://platform.kimi.ai/?aff=cliproxyapi';
@@ -46,9 +47,11 @@ export const getKimiProtocolUrls = (_value: string | undefined | null) => ({
export const isKimiOpenAIProvider = (config: OpenAIProviderConfig | undefined | null): boolean => {
if (!config) return false;
const baseUrl = normalizeBaseUrl(config.baseUrl);
return (
normalizeText(config.name) === KIMI_PROVIDER_NAME ||
normalizeBaseUrl(config.baseUrl) === normalizeBaseUrl(KIMI_OPENAI_BASE_URL)
baseUrl === normalizeBaseUrl(KIMI_OPENAI_BASE_URL) ||
baseUrl === normalizeBaseUrl(KIMI_LEGACY_OPENAI_BASE_URL)
);
};
+33 -2
View File
@@ -1,8 +1,10 @@
import { describe, expect, test } from 'bun:test';
import { afterEach, describe, expect, test } from 'bun:test';
import { buildOpenAIChatCompletionsEndpoint } from '../src/components/providers/utils';
import {
KIMI_ANTHROPIC_BASE_URL,
KIMI_CHINESE_AFFILIATE_URL,
KIMI_INTERNATIONAL_AFFILIATE_URL,
KIMI_LEGACY_OPENAI_BASE_URL,
KIMI_OPENAI_BASE_URL,
buildKimiRaw,
getKimiAffiliateUrl,
@@ -13,18 +15,41 @@ import {
import { PROVIDER_LOGOS } from '../src/features/providers/brandLogos';
import { PROVIDER_BRAND_ORDER } from '../src/features/providers/descriptors';
import { getSponsorProviderDefinition } from '../src/features/providers/sponsorDefinitions';
import { apiCallApi } from '../src/services/api/apiCall';
import { modelsApi } from '../src/services/api/models';
const originalApiCallRequest = apiCallApi.request;
afterEach(() => {
apiCallApi.request = originalApiCallRequest;
});
describe('Kimi provider', () => {
test('maps OpenAI-compatible and Claude protocols to their exact endpoints', () => {
expect(getKimiProtocolUrls(undefined)).toEqual({
openai: 'https://api.moonshot.ai',
openai: 'https://api.moonshot.ai/v1',
anthropic: 'https://api.moonshot.ai/anthropic',
codex: '',
gemini: '',
});
expect(buildOpenAIChatCompletionsEndpoint(KIMI_OPENAI_BASE_URL)).toBe(
'https://api.moonshot.ai/v1/chat/completions'
);
expect(getSponsorProviderDefinition('kimi').protocols).toEqual(['openai', 'claude']);
});
test('discovers models through the versioned OpenAI endpoint', async () => {
let requestedUrl = '';
apiCallApi.request = (async (payload) => {
requestedUrl = payload.url;
return { statusCode: 200, header: {}, bodyText: '', body: { data: [] } };
}) as typeof apiCallApi.request;
await modelsApi.fetchModelsViaApiCall(KIMI_OPENAI_BASE_URL, 'test-key');
expect(requestedUrl).toBe('https://api.moonshot.ai/v1/models');
});
test('uses the domestic registration link for Chinese and the international link otherwise', () => {
expect(getKimiAffiliateUrl('zh-CN')).toBe(KIMI_CHINESE_AFFILIATE_URL);
expect(getKimiAffiliateUrl('zh-TW')).toBe(KIMI_CHINESE_AFFILIATE_URL);
@@ -53,6 +78,12 @@ describe('Kimi provider', () => {
baseUrl: `${KIMI_OPENAI_BASE_URL}/`,
})
).toBeTrue();
expect(
isKimiOpenAIProvider({
name: 'legacy-moonshot',
baseUrl: KIMI_LEGACY_OPENAI_BASE_URL,
})
).toBeTrue();
expect(
isKimiClaudeProvider({ apiKey: 'sk-test', baseUrl: KIMI_ANTHROPIC_BASE_URL })
).toBeTrue();