fix(chat-headers): skip x-initiator override for @ai-sdk/github-copilot models
OpenCode's copilot fetch wrapper already sets x-initiator based on the actual HTTP request body content. When oh-my-opencode's chat.headers hook overrides it with 'agent', the Copilot API detects a mismatch between the header and the request body and rejects the request with 'invalid initiator'. This matches the approach OpenCode's own chat.headers handler uses (copilot.ts:314) — it explicitly skips @ai-sdk/github-copilot models because the fetch wrapper handles x-initiator correctly on its own.
This commit is contained in:
parent
e556c4a5c8
commit
890a737d1e
@ -106,4 +106,41 @@ describe("createChatHeadersHandler", () => {
|
|||||||
|
|
||||||
expect(output.headers["x-initiator"]).toBeUndefined()
|
expect(output.headers["x-initiator"]).toBeUndefined()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("skips x-initiator override when model uses @ai-sdk/github-copilot", async () => {
|
||||||
|
const handler = createChatHeadersHandler({
|
||||||
|
ctx: {
|
||||||
|
client: {
|
||||||
|
session: {
|
||||||
|
message: async () => ({
|
||||||
|
data: {
|
||||||
|
parts: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `notification\n${OMO_INTERNAL_INITIATOR_MARKER}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as never,
|
||||||
|
})
|
||||||
|
const output: { headers: Record<string, string> } = { headers: {} }
|
||||||
|
|
||||||
|
await handler(
|
||||||
|
{
|
||||||
|
sessionID: "ses_4",
|
||||||
|
provider: { id: "github-copilot" },
|
||||||
|
model: { api: { npm: "@ai-sdk/github-copilot" } },
|
||||||
|
message: {
|
||||||
|
id: "msg_4",
|
||||||
|
role: "user",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
output,
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(output.headers["x-initiator"]).toBeUndefined()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -123,6 +123,17 @@ export function createChatHeadersHandler(args: { ctx: PluginContext }): (input:
|
|||||||
if (!isChatHeadersOutput(output)) return
|
if (!isChatHeadersOutput(output)) return
|
||||||
|
|
||||||
if (!isCopilotProvider(normalizedInput.provider.id)) return
|
if (!isCopilotProvider(normalizedInput.provider.id)) return
|
||||||
|
|
||||||
|
// Do not override x-initiator when @ai-sdk/github-copilot is active.
|
||||||
|
// OpenCode's copilot fetch wrapper already sets x-initiator based on
|
||||||
|
// the actual request body content. Overriding it here causes a mismatch
|
||||||
|
// that the Copilot API rejects with "invalid initiator".
|
||||||
|
const model = isRecord(input) && isRecord((input as Record<string, unknown>).model)
|
||||||
|
? (input as Record<string, unknown>).model as Record<string, unknown>
|
||||||
|
: undefined
|
||||||
|
const api = model && isRecord(model.api) ? model.api as Record<string, unknown> : undefined
|
||||||
|
if (api?.npm === "@ai-sdk/github-copilot") return
|
||||||
|
|
||||||
if (!(await isOmoInternalMessage(normalizedInput, ctx.client))) return
|
if (!(await isOmoInternalMessage(normalizedInput, ctx.client))) return
|
||||||
|
|
||||||
output.headers["x-initiator"] = "agent"
|
output.headers["x-initiator"] = "agent"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user