Files
EasyCLIProxyAPI/tests/fixtures/legacyProviderRecords.ts
T
lzt404 0e7437493d fix(api): align management requests and configuration with v8
- Use native v8 routes for credentials, models, OAuth, and API calls
- Remove implicit legacy endpoint and response transformations
- Serialize OAuth exclusion updates while preserving other providers
- Send YAML as raw text and preserve explicit null request bodies
- Update mocks and regression tests, including migrated Claude aliases
2026-10-04 17:31:52 +08:00

70 lines
2.7 KiB
TypeScript

// Legacy fixtures used to verify migration into native v8 provider groups.
import { normalizeProviderModels } from '../../src/services/providerModels';
import { isRecord, readString } from '../../src/services/managementApi';
const SHARED_PROVIDER_FIELDS = new Set([
'priority',
'prefix',
'proxy-url',
'headers',
'models',
'excluded-models',
'disable-cooling',
'request-retry',
'request-scoped-errors',
]);
export function flattenV8ProviderGroups(provider: string, payload: unknown): Record<string, unknown>[] {
if (!Array.isArray(payload)) return [];
return payload.filter(isRecord).flatMap((group) => {
const keys = Array.isArray(group.keys) ? group.keys.filter(isRecord) : [];
if (provider === 'openai-compatibility') {
const record: Record<string, unknown> = { ...group };
delete record.keys;
delete record['test-model'];
delete record.testModel;
if (keys.length > 0) record['api-key-entries'] = keys.map((key) => ({ ...key }));
return [normalizeProviderModels(record)];
}
const shared = Object.fromEntries(
Object.entries(group).filter(([key]) => key === 'base-url' || SHARED_PROVIDER_FIELDS.has(key)),
);
const name = readString(group, 'name');
const generatedName = name.startsWith(`${provider}-`) && /^[0-9]+$/.test(name.slice(provider.length + 1));
if (name && !generatedName) shared.name = name;
return keys.map((key) => {
const overrides = Object.fromEntries(Object.entries(key).filter(([, value]) => value !== null));
return normalizeProviderModels({ ...shared, ...overrides });
});
});
}
export function groupLegacyProviderRecords(provider: string, payload: unknown): Record<string, unknown>[] {
if (!Array.isArray(payload)) return [];
return payload.filter(isRecord).map((input, index) => {
const record = normalizeProviderModels(input);
if (provider === 'openai-compatibility') {
const group: Record<string, unknown> = {
...record,
keys: Array.isArray(record['api-key-entries'])
? record['api-key-entries'].filter(isRecord).map((key) => ({ ...key }))
: [],
};
delete group['api-key-entries'];
delete group['test-model'];
delete group.testModel;
return group;
}
const group: Record<string, unknown> = { name: readString(record, 'name') || `${provider}-${index + 1}` };
const key: Record<string, unknown> = {};
Object.entries(record).forEach(([field, value]) => {
if (field === 'name') return;
if (field === 'base-url' || SHARED_PROVIDER_FIELDS.has(field)) group[field] = value;
else key[field] = value;
});
group.keys = [key];
return group;
});
}