diff --git a/packages/opencode/src/plugin/copilot.ts b/packages/opencode/src/plugin/copilot.ts index 0be134587..51f29db5e 100644 --- a/packages/opencode/src/plugin/copilot.ts +++ b/packages/opencode/src/plugin/copilot.ts @@ -61,12 +61,13 @@ export async function CopilotAuthPlugin(input: PluginInput): Promise { const info = await getAuth() if (info.type !== "oauth") return fetch(request, init) + const url = request instanceof URL ? request.href : request.toString() const { isVision, isAgent } = iife(() => { try { const body = typeof init?.body === "string" ? JSON.parse(init.body) : init?.body // Completions API - if (body?.messages) { + if (body?.messages && url.includes("completions")) { const last = body.messages[body.messages.length - 1] return { isVision: body.messages.some( @@ -88,6 +89,28 @@ export async function CopilotAuthPlugin(input: PluginInput): Promise { isAgent: last?.role !== "user", } } + + // Messages API + if (body?.messages) { + const last = body.messages[body.messages.length - 1] + const hasNonToolCalls = + Array.isArray(last?.content) && last.content.some((part: any) => part?.type !== "tool_result") + return { + isVision: body.messages.some( + (item: any) => + Array.isArray(item?.content) && + item.content.some( + (part: any) => + part?.type === "image" || + // images can be nested inside tool_result content + (part?.type === "tool_result" && + Array.isArray(part?.content) && + part.content.some((nested: any) => nested?.type === "image")), + ), + ), + isAgent: !(last?.role === "user" && hasNonToolCalls), + } + } } catch {} return { isVision: false, isAgent: false } })