diff --git a/src/server/services/downstreamApiKeyService.test.ts b/src/server/services/downstreamApiKeyService.test.ts index faa08e8..c2c3bb1 100644 --- a/src/server/services/downstreamApiKeyService.test.ts +++ b/src/server/services/downstreamApiKeyService.test.ts @@ -116,6 +116,12 @@ describe('downstreamApiKeyService', () => { expect(service.isModelAllowedByPolicy('gemini-2.0-flash', result.policy)).toBe(false); }); + it('keeps all explicitly selected supported models when list exceeds 200 items', () => { + const selectedModels = Array.from({ length: 260 }, (_, index) => `model-${String(index + 1).padStart(3, '0')}`); + + expect(service.normalizeSupportedModelsInput(selectedModels)).toEqual(selectedModels); + }); + it('treats selected groups as additional allowed exposed route scope (union semantics)', async () => { const claudeGroup = await db.insert(schema.tokenRoutes).values({ modelPattern: 're:^claude-(opus|sonnet)-4-6$', diff --git a/src/server/services/downstreamApiKeyService.ts b/src/server/services/downstreamApiKeyService.ts index 9db2e41..105f6d0 100644 --- a/src/server/services/downstreamApiKeyService.ts +++ b/src/server/services/downstreamApiKeyService.ts @@ -131,16 +131,14 @@ export function normalizeSupportedModelsInput(input: unknown): string[] { if (Array.isArray(input)) { return input .map((item) => (typeof item === 'string' ? item.trim() : '')) - .filter((item, index, arr) => item.length > 0 && arr.indexOf(item) === index) - .slice(0, 200); + .filter((item, index, arr) => item.length > 0 && arr.indexOf(item) === index); } if (typeof input === 'string') { return input .split(/\r?\n|,/g) .map((item) => item.trim()) - .filter((item, index, arr) => item.length > 0 && arr.indexOf(item) === index) - .slice(0, 200); + .filter((item, index, arr) => item.length > 0 && arr.indexOf(item) === index); } return [];