refactor: unify media provider options

This commit is contained in:
Peter Steinberger
2026-01-17 09:12:19 +00:00
parent 89f85ddeab
commit d66bc65ca6
7 changed files with 204 additions and 29 deletions

View File

@@ -71,21 +71,73 @@ function trimOutput(text: string, maxChars?: number): string {
return trimmed.slice(0, maxChars).trim();
}
function buildDeepgramQuery(options?: {
type ProviderQuery = Record<string, string | number | boolean>;
function normalizeProviderQuery(
options?: Record<string, string | number | boolean>,
): ProviderQuery | undefined {
if (!options) return undefined;
const query: ProviderQuery = {};
for (const [key, value] of Object.entries(options)) {
if (value === undefined) continue;
query[key] = value;
}
return Object.keys(query).length > 0 ? query : undefined;
}
function buildDeepgramCompatQuery(options?: {
detectLanguage?: boolean;
punctuate?: boolean;
smartFormat?: boolean;
}): Record<string, string | number | boolean> | undefined {
}): ProviderQuery | undefined {
if (!options) return undefined;
const query: Record<string, string | number | boolean> = {};
if (typeof options.detectLanguage === "boolean") {
query.detect_language = options.detectLanguage;
const query: ProviderQuery = {};
if (typeof options.detectLanguage === "boolean") query.detect_language = options.detectLanguage;
if (typeof options.punctuate === "boolean") query.punctuate = options.punctuate;
if (typeof options.smartFormat === "boolean") query.smart_format = options.smartFormat;
return Object.keys(query).length > 0 ? query : undefined;
}
function mergeProviderQuery(
base: ProviderQuery | undefined,
incoming: ProviderQuery | undefined,
): ProviderQuery | undefined {
if (!base && !incoming) return undefined;
return { ...(base ?? {}), ...(incoming ?? {}) };
}
function normalizeDeepgramQueryKeys(query: ProviderQuery): ProviderQuery {
const normalized = { ...query };
if ("detectLanguage" in normalized) {
normalized.detect_language = normalized.detectLanguage as boolean;
delete normalized.detectLanguage;
}
if (typeof options.punctuate === "boolean") {
query.punctuate = options.punctuate;
if ("smartFormat" in normalized) {
normalized.smart_format = normalized.smartFormat as boolean;
delete normalized.smartFormat;
}
if (typeof options.smartFormat === "boolean") {
query.smart_format = options.smartFormat;
return normalized;
}
function resolveProviderQuery(params: {
providerId: string;
config?: MediaUnderstandingConfig;
entry: MediaUnderstandingModelConfig;
}): ProviderQuery | undefined {
const { providerId, config, entry } = params;
const mergedOptions = normalizeProviderQuery({
...(config?.providerOptions?.[providerId] ?? {}),
...(entry.providerOptions?.[providerId] ?? {}),
});
if (providerId !== "deepgram") {
return mergedOptions;
}
let query = normalizeDeepgramQueryKeys(mergedOptions ?? {});
const compat = buildDeepgramCompatQuery({ ...config?.deepgram, ...entry.deepgram });
for (const [key, value] of Object.entries(compat ?? {})) {
if (query[key] === undefined) {
query[key] = value;
}
}
return Object.keys(query).length > 0 ? query : undefined;
}
@@ -246,13 +298,11 @@ async function runProviderEntry(params: {
...(entry.headers ?? {}),
};
const headers = Object.keys(mergedHeaders).length > 0 ? mergedHeaders : undefined;
const deepgramQuery =
providerId === "deepgram"
? buildDeepgramQuery({
...params.config?.deepgram,
...entry.deepgram,
})
: undefined;
const providerQuery = resolveProviderQuery({
providerId,
config: params.config,
entry,
});
const model = entry.model?.trim() || DEFAULT_AUDIO_MODELS[providerId] || entry.model;
const result = await provider.transcribeAudio({
buffer: media.buffer,
@@ -264,7 +314,7 @@ async function runProviderEntry(params: {
model,
language: entry.language ?? params.config?.language ?? cfg.tools?.media?.audio?.language,
prompt,
query: deepgramQuery,
query: providerQuery,
timeoutMs,
});
return {