Sfoglia il codice sorgente

fix: ensure copilot plugin properly sets headers for new messages api

Aiden Cline 3 settimane fa
parent
commit
5a0b3ee673
1 ha cambiato i file con 24 aggiunte e 1 eliminazioni
  1. 24 1
      packages/opencode/src/plugin/copilot.ts

+ 24 - 1
packages/opencode/src/plugin/copilot.ts

@@ -61,12 +61,13 @@ export async function CopilotAuthPlugin(input: PluginInput): Promise<Hooks> {
             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<Hooks> {
                     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 }
             })