diff --git a/changelog.d/maintenance/8484-vision-capability-literal.md b/changelog.d/maintenance/8484-vision-capability-literal.md new file mode 100644 index 0000000000..b155ef82e6 --- /dev/null +++ b/changelog.d/maintenance/8484-vision-capability-literal.md @@ -0,0 +1 @@ +- **fix(types):** preserve the literal `capabilities.vision: true` contract for catalog vision fields so custom-model capability composition remains type-safe under TypeScript 7 ([#9121](https://github.com/diegosouzapw/OmniRoute/pull/9121)) diff --git a/src/app/api/v1/models/catalogVision.ts b/src/app/api/v1/models/catalogVision.ts index 6526d26e2a..00e6b5fe9d 100644 --- a/src/app/api/v1/models/catalogVision.ts +++ b/src/app/api/v1/models/catalogVision.ts @@ -6,7 +6,11 @@ import { isVisionModelId } from "@/shared/constants/visionModels"; // Re-exported (here and from ./catalog.ts) for callers/tests that imported it from there. export { isVisionModelId }; -export function getVisionCapabilityFields(modelId: string) { +export function getVisionCapabilityFields(modelId: string): { + capabilities: { vision: true }; + input_modalities: string[]; + output_modalities: string[]; +} | null { if (!isVisionModelId(modelId)) return null; return { capabilities: { vision: true }, diff --git a/tests/unit/catalog-helpers-extraction.test.ts b/tests/unit/catalog-helpers-extraction.test.ts index 7fa31de3ac..42062bf7b3 100644 --- a/tests/unit/catalog-helpers-extraction.test.ts +++ b/tests/unit/catalog-helpers-extraction.test.ts @@ -141,6 +141,12 @@ test("catalogVision: re-exports isVisionModelId and derives capability fields", // id-based heuristic const visionFields = getVisionCapabilityFields("gpt-4o"); assert.ok(visionFields, "gpt-4o must be detected as vision-capable"); + const typedVisionFields: { + capabilities: { vision: true }; + input_modalities: string[]; + output_modalities: string[]; + } | null = visionFields; + assert.equal(typedVisionFields?.capabilities.vision, true); assert.equal(visionFields?.capabilities.vision, true); assert.equal(getVisionCapabilityFields("kimi-k2"), null); });