From 33057d02a47e84cf789aa62b8b2cbdf621df0f87 Mon Sep 17 00:00:00 2001 From: Pranjal Agarwal Date: Fri, 16 Oct 2026 16:49:39 +0530 Subject: [PATCH] fix(litellm): derive video input modality from supports_video_input --- src/types/index.ts | 1 + src/utils/model-info/litellm.ts | 13 ++++++++++--- test/litellm-model-info.test.ts | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/types/index.ts b/src/types/index.ts index 06257237..0faa1d9b 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -27,6 +27,7 @@ export interface LiteLLMModelInfo { supports_max_reasoning_effort?: boolean | null supported_openai_params?: string[] | null supports_vision?: boolean | null + supports_video_input?: boolean | null modalities?: { input?: string[] | null output?: string[] | null diff --git a/src/utils/model-info/litellm.ts b/src/utils/model-info/litellm.ts index 86862ab4..9a0e49c8 100644 --- a/src/utils/model-info/litellm.ts +++ b/src/utils/model-info/litellm.ts @@ -95,9 +95,16 @@ function buildModalities(info: LiteLLMModelInfo): { input: string[]; output: str if (input || output) { return { input: input ?? ['text'], output: output ?? ['text'] } } - // Older LiteLLM deployments do not expose modalities; derive image input from supports_vision. - if (info.supports_vision === true) { - return { input: ['text', 'image'], output: ['text'] } + // Older LiteLLM deployments do not expose modalities; derive inputs from the capability flags. + if (info.supports_vision === true || info.supports_video_input === true) { + return { + input: [ + 'text', + ...(info.supports_vision === true ? ['image'] : []), + ...(info.supports_video_input === true ? ['video'] : []), + ], + output: ['text'], + } } return undefined } diff --git a/test/litellm-model-info.test.ts b/test/litellm-model-info.test.ts index c8e7eee0..bbc00190 100644 --- a/test/litellm-model-info.test.ts +++ b/test/litellm-model-info.test.ts @@ -16,6 +16,20 @@ describe('native LiteLLM enricher', () => { expect(enrich({ supports_vision: true }).modalities).toEqual({ input: ['text', 'image'], output: ['text'] }) }) + it('derives video input from supports_video_input', () => { + expect(enrich({ supports_video_input: true }).modalities).toEqual({ input: ['text', 'video'], output: ['text'] }) + }) + + it('combines vision and video capability flags', () => { + expect(enrich({ supports_vision: true, supports_video_input: true }).modalities) + .toEqual({ input: ['text', 'image', 'video'], output: ['text'] }) + }) + + it('prefers declared modalities over capability flags', () => { + expect(enrich({ modalities: { input: ['text'] }, supports_vision: true, supports_video_input: true }).modalities) + .toEqual({ input: ['text'], output: ['text'] }) + }) + it('defaults a missing modality side to text', () => { expect(enrich({ modalities: { input: ['text', 'image'] } }).modalities) .toEqual({ input: ['text', 'image'], output: ['text'] })