



























@@ -132,23 +132,43 @@ async function resolveImageRuntime(params: {
132132function buildImageContext(
133133prompt: string,
134134images: Array<{ buffer: Buffer; mime?: string }>,
135+opts?: { promptInUserContent?: boolean },
135136): Context {
137+const imageContent = images.map((image) => ({
138+type: "image" as const,
139+data: image.buffer.toString("base64"),
140+mimeType: image.mime ?? "image/jpeg",
141+}));
142+const content = opts?.promptInUserContent
143+ ? [{ type: "text" as const, text: prompt }, ...imageContent]
144+ : imageContent;
145+136146return {
137-systemPrompt: prompt,
147+...(opts?.promptInUserContent ? {} : { systemPrompt: prompt }),
138148messages: [
139149{
140150role: "user",
141-content: images.map((image) => ({
142-type: "image" as const,
143-data: image.buffer.toString("base64"),
144-mimeType: image.mime ?? "image/jpeg",
145-})),
151+ content,
146152timestamp: Date.now(),
147153},
148154],
149155};
150156}
151157158+function shouldPlaceImagePromptInUserContent(model: Model<Api>): boolean {
159+const capabilities = resolveProviderRequestCapabilities({
160+provider: model.provider,
161+api: model.api,
162+baseUrl: model.baseUrl,
163+capability: "image",
164+transport: "media-understanding",
165+});
166+return (
167+capabilities.endpointClass === "openrouter" ||
168+(model.provider.toLowerCase() === "openrouter" && capabilities.endpointClass === "default")
169+);
170+}
171+152172async function describeImagesWithMinimax(params: {
153173apiKey: string;
154174modelId: string;
@@ -252,7 +272,9 @@ export async function describeImagesWithModel(
252272agentDir: params.agentDir,
253273});
254274255-const context = buildImageContext(prompt, params.images);
275+const context = buildImageContext(prompt, params.images, {
276+promptInUserContent: shouldPlaceImagePromptInUserContent(model),
277+});
256278const controller = new AbortController();
257279const timeout =
258280typeof params.timeoutMs === "number" &&
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。