From 039d22cda8a7a288bbc775b51da0fb737f71125b Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 13:23:12 +0100 Subject: [PATCH] refactor: share media provider capability check --- src/media-understanding/defaults.ts | 17 +---------------- src/media-understanding/provider-supports.ts | 17 +++++++++++++++++ src/media-understanding/runner.ts | 17 +---------------- 3 files changed, 19 insertions(+), 32 deletions(-) create mode 100644 src/media-understanding/provider-supports.ts diff --git a/src/media-understanding/defaults.ts b/src/media-understanding/defaults.ts index 1ed085b9444..20be331daff 100644 --- a/src/media-understanding/defaults.ts +++ b/src/media-understanding/defaults.ts @@ -6,6 +6,7 @@ import { resolveBundledDefaultMediaModel, } from "./bundled-defaults.js"; import { buildMediaUnderstandingRegistry, normalizeMediaProviderId } from "./provider-registry.js"; +import { providerSupportsCapability } from "./provider-supports.js"; import type { MediaUnderstandingCapability, MediaUnderstandingProvider } from "./types.js"; const MB = 1024 * 1024; @@ -38,22 +39,6 @@ export const DEFAULT_VIDEO_MAX_BASE64_BYTES = 70 * MB; export const CLI_OUTPUT_MAX_BUFFER = 5 * MB; export const DEFAULT_MEDIA_CONCURRENCY = 2; -function providerSupportsCapability( - provider: MediaUnderstandingProvider | undefined, - capability: MediaUnderstandingCapability, -): boolean { - if (!provider) { - return false; - } - if (capability === "audio") { - return Boolean(provider.transcribeAudio); - } - if (capability === "image") { - return Boolean(provider.describeImage); - } - return Boolean(provider.describeVideo); -} - function resolveDefaultRegistry(cfg?: OpenClawConfig) { return buildMediaUnderstandingRegistry(undefined, cfg ?? ({} as OpenClawConfig)); } diff --git a/src/media-understanding/provider-supports.ts b/src/media-understanding/provider-supports.ts new file mode 100644 index 00000000000..60fcb1bd777 --- /dev/null +++ b/src/media-understanding/provider-supports.ts @@ -0,0 +1,17 @@ +import type { MediaUnderstandingCapability, MediaUnderstandingProvider } from "./types.js"; + +export function providerSupportsCapability( + provider: MediaUnderstandingProvider | undefined, + capability: MediaUnderstandingCapability, +): boolean { + if (!provider) { + return false; + } + if (capability === "audio") { + return Boolean(provider.transcribeAudio); + } + if (capability === "image") { + return Boolean(provider.describeImage); + } + return Boolean(provider.describeVideo); +} diff --git a/src/media-understanding/runner.ts b/src/media-understanding/runner.ts index b420e59a3ce..c02f28e7fe9 100644 --- a/src/media-understanding/runner.ts +++ b/src/media-understanding/runner.ts @@ -38,6 +38,7 @@ import { getMediaUnderstandingProvider, normalizeMediaProviderId, } from "./provider-registry.js"; +import { providerSupportsCapability } from "./provider-supports.js"; import { resolveModelEntries, resolveScopeDecision } from "./resolve.js"; import { buildModelDecision, @@ -63,22 +64,6 @@ export type RunCapabilityResult = { decision: MediaUnderstandingDecision; }; -function providerSupportsCapability( - provider: MediaUnderstandingProvider | undefined, - capability: MediaUnderstandingCapability, -): boolean { - if (!provider) { - return false; - } - if (capability === "audio") { - return Boolean(provider.transcribeAudio); - } - if (capability === "image") { - return Boolean(provider.describeImage); - } - return Boolean(provider.describeVideo); -} - function resolveConfiguredKeyProviderOrder(params: { cfg: OpenClawConfig; providerRegistry: ProviderRegistry;