mirror of
https://github.com/tiennm99/ccs.git
synced 2026-07-29 08:20:26 +00:00
Merge pull request #950 from kaitranntt/kai/fix/941-provider-model-alias-routing
fix: preserve requested provider model aliases in AI Providers
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import { ProviderEntryCard } from '@/components/cliproxy/ai-providers/provider-entry-card';
|
||||
import { render, screen } from '../../../setup/test-utils';
|
||||
|
||||
describe('ProviderEntryCard', () => {
|
||||
it('renders mapped models as requested to upstream', () => {
|
||||
render(
|
||||
<ProviderEntryCard
|
||||
family={{
|
||||
id: 'openai-compatibility',
|
||||
displayName: 'OpenAI-Compatible',
|
||||
description: 'Connectors',
|
||||
authMode: 'connector',
|
||||
routePath: '/api/provider/openai-compat',
|
||||
status: 'ready',
|
||||
supportsNamedEntries: true,
|
||||
entries: [],
|
||||
}}
|
||||
entry={{
|
||||
id: 'openai-compatibility:0',
|
||||
index: 0,
|
||||
name: 'openrouter',
|
||||
label: 'openrouter',
|
||||
baseUrl: 'https://openrouter.ai/api/v1',
|
||||
headers: [],
|
||||
excludedModels: [],
|
||||
models: [{ name: 'gpt-5', alias: 'claude-sonnet-4-5' }],
|
||||
apiKeysMasked: ['...1234'],
|
||||
secretConfigured: true,
|
||||
}}
|
||||
onEdit={vi.fn()}
|
||||
onDelete={vi.fn()}
|
||||
/>
|
||||
);
|
||||
|
||||
expect(screen.getByText('claude-sonnet-4-5')).toBeInTheDocument();
|
||||
expect(screen.getByText('gpt-5')).toBeInTheDocument();
|
||||
expect(screen.getByText('→')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,44 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import {
|
||||
formatRequestedUpstreamModelRules,
|
||||
getRequestedUpstreamModelRuleErrors,
|
||||
getRequestedModelId,
|
||||
parseRequestedUpstreamModelRules,
|
||||
} from '@/lib/provider-config';
|
||||
|
||||
describe('provider model mapping helpers', () => {
|
||||
it('parses requested=upstream rules into stored upstream+alias pairs', () => {
|
||||
expect(
|
||||
parseRequestedUpstreamModelRules('claude-sonnet-4-5=gpt-4.1\nminimax/minimax-m2.7')
|
||||
).toEqual([
|
||||
{ name: 'gpt-4.1', alias: 'claude-sonnet-4-5' },
|
||||
{ name: 'minimax/minimax-m2.7', alias: '' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('formats stored model rules back into requested=upstream text', () => {
|
||||
expect(
|
||||
formatRequestedUpstreamModelRules([
|
||||
{ name: 'gpt-4.1', alias: 'claude-sonnet-4-5' },
|
||||
{ name: 'minimax/minimax-m2.7', alias: '' },
|
||||
])
|
||||
).toBe('claude-sonnet-4-5=gpt-4.1\nminimax/minimax-m2.7');
|
||||
});
|
||||
|
||||
it('prefers the requested alias for generated settings previews', () => {
|
||||
expect(getRequestedModelId({ name: 'gpt-4.1', alias: 'claude-sonnet-4-5' })).toBe(
|
||||
'claude-sonnet-4-5'
|
||||
);
|
||||
expect(getRequestedModelId({ name: 'minimax/minimax-m2.7', alias: '' })).toBe(
|
||||
'minimax/minimax-m2.7'
|
||||
);
|
||||
});
|
||||
|
||||
it('rejects malformed requested=upstream lines instead of coercing them', () => {
|
||||
expect(getRequestedUpstreamModelRuleErrors('claude-sonnet-4-5=\n=gpt-5\nqwen3-coder')).toEqual([
|
||||
'Line 1: use requested=upstream or a plain model name.',
|
||||
'Line 2: use requested=upstream or a plain model name.',
|
||||
]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user