Compare commits

...
1 Commits
Author SHA1 Message Date
Adam d90a8b7944 fix(console): preserve inference sessions 2026-08-17 15:26:24 -05:00
3 changed files with 45 additions and 7 deletions
@@ -52,6 +52,7 @@ import { createProviderBudgetTracker } from "./providerBudgetTracker"
import { accumulateUsage, HOT_WORKSPACES } from "./usageBatcher"
import { Workspace } from "@opencode-ai/console-core/workspace.js"
import { countryFromRequest } from "~/lib/request-country"
import { finalizeProviderHeaders } from "./providerHeaders"
type ZenData = Awaited<ReturnType<typeof ZenData.list>>
type RetryOptions = {
@@ -244,13 +245,7 @@ export async function handler(
}
headers.set(k, v)
})
headers.delete("host")
headers.delete("content-length")
headers.delete("x-opencode-request")
headers.delete("x-opencode-session")
headers.delete("x-opencode-project")
headers.delete("x-opencode-client")
return headers
return finalizeProviderHeaders(headers, isNewInference, sessionId)
})(),
body: reqBody,
// Propagate caller disconnects to the upstream provider request so
@@ -0,0 +1,10 @@
export function finalizeProviderHeaders(headers: Headers, isNewInference: boolean, sessionId: string) {
headers.delete("host")
headers.delete("content-length")
headers.delete("x-opencode-request")
headers.delete("x-opencode-session")
headers.delete("x-opencode-project")
headers.delete("x-opencode-client")
if (isNewInference && sessionId) headers.set("x-opencode-session", sessionId)
return headers
}
@@ -0,0 +1,33 @@
import { describe, expect, test } from "bun:test"
import { finalizeProviderHeaders } from "../src/routes/zen/util/providerHeaders"
describe("finalizeProviderHeaders", () => {
test("preserves the session for the managed inference gateway", () => {
const headers = finalizeProviderHeaders(
new Headers({
host: "opencode.ai",
"content-length": "10",
"x-opencode-request": "request-1",
"x-opencode-session": "session-1",
"x-opencode-project": "project-1",
"x-opencode-client": "cli",
}),
true,
"session-1",
)
expect(Object.fromEntries(headers)).toEqual({ "x-opencode-session": "session-1" })
})
test("does not forward the session to a provider", () => {
const headers = finalizeProviderHeaders(new Headers({ "x-opencode-session": "session-1" }), false, "session-1")
expect(headers.has("x-opencode-session")).toBe(false)
})
test("does not create an empty managed inference session", () => {
const headers = finalizeProviderHeaders(new Headers({ "x-opencode-session": "ignored" }), true, "")
expect(headers.has("x-opencode-session")).toBe(false)
})
})