Compare commits

...
1 Commits
Author SHA1 Message Date
rekram1-node d99272b387 fix(opencode): send parent session header 2026-08-24 18:44:46 +00:00
2 changed files with 70 additions and 1 deletions
+1 -1
View File
@@ -196,9 +196,9 @@ export const prepare = Effect.fn("LLMRequestPrep.prepare")(function* (input: Pre
: {
"x-session-affinity": input.sessionID,
"X-Session-Id": input.sessionID,
...(input.parentSessionID ? { "x-parent-session-id": input.parentSessionID } : {}),
"User-Agent": USER_AGENT,
}),
...(input.parentSessionID ? { "x-parent-session-id": input.parentSessionID } : {}),
...input.model.headers,
...headers,
},
@@ -754,6 +754,75 @@ function createEventResponse(chunks: unknown[], includeDone = false) {
describe("session.llm.stream", () => {
const vivgridFixture = { providerID: "vivgrid", modelID: "gemini-3.1-pro-preview" }
const opencodeFixture = { providerID: "opencode-test", modelID: vivgridFixture.modelID }
it.instance(
"sends the parent session header for opencode providers",
() =>
Effect.gen(function* () {
const fixture = loadFixture(vivgridFixture.providerID, vivgridFixture.modelID)
const request = waitRequest(
"/chat/completions",
new Response(createChatStream("Hello"), {
status: 200,
headers: { "Content-Type": "text/event-stream" },
}),
)
const resolved = yield* Provider.use.getModel(
ProviderV2.ID.make(opencodeFixture.providerID),
ModelV2.ID.make(opencodeFixture.modelID),
)
const sessionID = SessionID.make("session-child")
const parentSessionID = SessionID.make("session-parent")
const agent = {
name: "test",
mode: "primary",
options: {},
permission: [{ permission: "*", pattern: "*", action: "allow" }],
} satisfies Agent.Info
const user = {
id: MessageID.make("msg_user-parent-header"),
sessionID,
role: "user",
time: { created: Date.now() },
agent: agent.name,
model: {
providerID: ProviderV2.ID.make(opencodeFixture.providerID),
modelID: resolved.id,
},
} satisfies SessionV1.User
yield* drain({
user,
sessionID,
parentSessionID,
model: resolved,
agent,
system: ["You are a helpful assistant."],
messages: [{ role: "user", content: "Hello" }],
tools: {},
})
expect((yield* Effect.promise(() => request)).headers.get("x-parent-session-id")).toBe(parentSessionID)
}),
{
config: () => {
const fixture = loadFixture(vivgridFixture.providerID, vivgridFixture.modelID)
return {
enabled_providers: [opencodeFixture.providerID],
provider: {
[opencodeFixture.providerID]: {
name: "OpenCode Test",
npm: "@ai-sdk/openai-compatible",
models: { [fixture.model.id]: configModel(fixture.model) },
options: { apiKey: "test-key", baseURL: `${state.server!.url.origin}/v1` },
},
},
}
},
},
)
it.instance(
"sends temperature, tokens, and reasoning options for openai-compatible models",
() =>