openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
80 lines (79 loc) • 3.29 kB
JavaScript
import { m as readProviderJsonResponse, r as assertOkOrThrowProviderError } from "../../provider-http-errors-BEswZaxl.mjs";
import { n as normalizeGooglePreviewModelId } from "../../provider-model-id-normalize-DjenOxD2.mjs";
import { d as postJsonRequest } from "../../shared-DRwlUeUJ.mjs";
import "../../provider-http-JgjW-z-k.mjs";
import "../../model-id-DXogAzNC.mjs";
import { f as createGoogleMediaUnderstandingProviderMetadata, o as GOOGLE_MEDIA_UNDERSTANDING_DEFAULT_MODELS } from "../../generation-provider-metadata-CpAeukLp.mjs";
import { t as resolveGoogleGenerativeAiHttpRequestConfig } from "../../http-request-BWbC_2Gn.mjs";
//#region extensions/google/media-understanding-provider.ts
const DEFAULT_GOOGLE_AUDIO_PROMPT = "Transcribe the audio.";
const DEFAULT_GOOGLE_VIDEO_PROMPT = "Describe the video.";
async function generateGeminiInlineDataText(params) {
const fetchFn = params.fetchFn ?? fetch;
const requestedModel = params.model?.trim();
const model = requestedModel ? normalizeGooglePreviewModelId(requestedModel) : params.defaultModel;
const { baseUrl, allowPrivateNetwork, headers, dispatcherPolicy } = resolveGoogleGenerativeAiHttpRequestConfig({
apiKey: params.apiKey,
baseUrl: params.baseUrl,
headers: params.headers,
request: params.request,
capability: params.defaultMime.startsWith("audio/") ? "audio" : "video",
transport: "media-understanding"
});
const url = `${baseUrl}/models/${model}:generateContent`;
const body = { contents: [{
role: "user",
parts: [{ text: params.prompt?.trim() || params.defaultPrompt }, { inline_data: {
mime_type: params.mime ?? params.defaultMime,
data: params.buffer.toString("base64")
} }]
}] };
const { response: res, release } = await postJsonRequest({
url,
headers,
body,
timeoutMs: params.timeoutMs,
...params.signal ? { signal: params.signal } : {},
fetchFn,
allowPrivateNetwork,
dispatcherPolicy
});
try {
await assertOkOrThrowProviderError(res, params.httpErrorLabel);
const text = ((await readProviderJsonResponse(res, params.httpErrorLabel)).candidates?.[0]?.content?.parts ?? []).map((part) => part?.text?.trim()).filter(Boolean).join("\n");
if (!text) throw new Error(params.missingTextError);
return {
text,
model
};
} finally {
await release();
}
}
async function transcribeGeminiAudio(params) {
return await generateGeminiInlineDataText({
...params,
defaultModel: GOOGLE_MEDIA_UNDERSTANDING_DEFAULT_MODELS.audio,
defaultPrompt: DEFAULT_GOOGLE_AUDIO_PROMPT,
defaultMime: "audio/wav",
httpErrorLabel: "Audio transcription failed",
missingTextError: "Audio transcription response missing text"
});
}
async function describeGeminiVideo(params) {
return await generateGeminiInlineDataText({
...params,
defaultModel: GOOGLE_MEDIA_UNDERSTANDING_DEFAULT_MODELS.video,
defaultPrompt: DEFAULT_GOOGLE_VIDEO_PROMPT,
defaultMime: "video/mp4",
httpErrorLabel: "Video description failed",
missingTextError: "Video description response missing text"
});
}
const googleMediaUnderstandingProvider = {
...createGoogleMediaUnderstandingProviderMetadata(),
transcribeAudio: transcribeGeminiAudio,
describeVideo: describeGeminiVideo
};
//#endregion
export { describeGeminiVideo, googleMediaUnderstandingProvider, transcribeGeminiAudio };