





























@@ -95,6 +95,38 @@ function isImageModelNoTextError(err: unknown): boolean {
9595return err instanceof Error && /^Image model returned no text\b/.test(err.message);
9696}
979798+function isPromiseLike(value: unknown): value is PromiseLike<unknown> {
99+return Boolean(value) && typeof (value as { then?: unknown }).then === "function";
100+}
101+102+function composeImageDescriptionPayloadHandlers(
103+first: ProviderStreamOptions["onPayload"] | undefined,
104+second: ProviderStreamOptions["onPayload"] | undefined,
105+): ProviderStreamOptions["onPayload"] | undefined {
106+if (!first) {
107+return second;
108+}
109+if (!second) {
110+return first;
111+}
112+return (payload, payloadModel) => {
113+const runSecond = (firstResult: unknown) => {
114+const nextPayload = firstResult === undefined ? payload : firstResult;
115+const secondResult = second(nextPayload, payloadModel);
116+const coerceResult = (resolvedSecond: unknown) =>
117+resolvedSecond === undefined ? firstResult : resolvedSecond;
118+return isPromiseLike(secondResult)
119+ ? Promise.resolve(secondResult).then(coerceResult)
120+ : coerceResult(secondResult);
121+};
122+const firstResult = first(payload, payloadModel);
123+if (isPromiseLike(firstResult)) {
124+return Promise.resolve(firstResult).then(runSecond);
125+}
126+return runSecond(firstResult);
127+};
128+}
129+98130async function resolveImageRuntime(params: {
99131cfg: ImageDescriptionRequest["cfg"];
100132agentDir: string;
@@ -231,8 +263,9 @@ async function resolveMinimaxVlmFallbackRuntime(params: {
231263};
232264}
233265234-export async function describeImagesWithModel(
266+async function describeImagesWithModelInternal(
235267params: ImagesDescriptionRequest,
268+options: { onPayload?: ProviderStreamOptions["onPayload"] } = {},
236269): Promise<ImagesDescriptionResult> {
237270const prompt = params.prompt ?? "Describe the image.";
238271let apiKey: string;
@@ -284,13 +317,15 @@ export async function describeImagesWithModel(
284317 : undefined;
285318286319const maxTokens = resolveImageToolMaxTokens(model.maxTokens, params.maxTokens ?? 512);
287-const completeImage = async (onPayload?: ProviderStreamOptions["onPayload"]) =>
288-await complete(model, context, {
320+const completeImage = async (onPayload?: ProviderStreamOptions["onPayload"]) => {
321+const payloadHandler = composeImageDescriptionPayloadHandlers(onPayload, options.onPayload);
322+return await complete(model, context, {
289323 apiKey,
290324 maxTokens,
291325signal: controller.signal,
292- ...(onPayload ? { onPayload } : {}),
326+ ...(payloadHandler ? { onPayload: payloadHandler } : {}),
293327});
328+};
294329295330try {
296331const message = await completeImage();
@@ -319,6 +354,19 @@ export async function describeImagesWithModel(
319354}
320355}
321356357+export async function describeImagesWithModel(
358+params: ImagesDescriptionRequest,
359+): Promise<ImagesDescriptionResult> {
360+return await describeImagesWithModelInternal(params);
361+}
362+363+export async function describeImagesWithModelPayloadTransform(
364+params: ImagesDescriptionRequest,
365+onPayload: ProviderStreamOptions["onPayload"],
366+): Promise<ImagesDescriptionResult> {
367+return await describeImagesWithModelInternal(params, { onPayload });
368+}
369+322370export async function describeImageWithModel(
323371params: ImageDescriptionRequest,
324372): Promise<ImageDescriptionResult> {
@@ -342,3 +390,31 @@ export async function describeImageWithModel(
342390cfg: params.cfg,
343391});
344392}
393+394+export async function describeImageWithModelPayloadTransform(
395+params: ImageDescriptionRequest,
396+onPayload: ProviderStreamOptions["onPayload"],
397+): Promise<ImageDescriptionResult> {
398+return await describeImagesWithModelPayloadTransform(
399+{
400+images: [
401+{
402+buffer: params.buffer,
403+fileName: params.fileName,
404+mime: params.mime,
405+},
406+],
407+model: params.model,
408+provider: params.provider,
409+prompt: params.prompt,
410+maxTokens: params.maxTokens,
411+timeoutMs: params.timeoutMs,
412+profile: params.profile,
413+preferredProfile: params.preferredProfile,
414+authStore: params.authStore,
415+agentDir: params.agentDir,
416+cfg: params.cfg,
417+},
418+onPayload,
419+);
420+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。