Files
dev/third_party/pi/packages/ai/src/providers/opencode-headers.ts
alexion 6081e3e325 chore(vendor): import pi 1.3.0
Imported as a linear vendor commit so forge rebases do not replay the upstream root tree.

git-subtree-dir: third_party/pi

git-subtree-split: 71023aec1546d6d677a65669c5665c0927ce0dd0
2026-10-15 17:58:48 -04:00

26 lines
1.1 KiB
TypeScript

import type { ProviderHeaders, ProviderStreams, StreamOptions } from "../types.ts";
const OPENCODE_SESSION_HEADER = "x-opencode-session";
function hasHeader(headers: ProviderHeaders | undefined, name: string): boolean {
const expected = name.toLowerCase();
return Object.keys(headers ?? {}).some((key) => key.toLowerCase() === expected);
}
function withSessionHeader<TOptions extends StreamOptions>(options: TOptions | undefined): TOptions | undefined {
if (!options?.sessionId || hasHeader(options.headers, OPENCODE_SESSION_HEADER)) return options;
return {
...options,
headers: { ...options.headers, [OPENCODE_SESSION_HEADER]: options.sessionId },
};
}
/** Adds OpenCode's required per-conversation routing header before API dispatch. */
export function withOpenCodeSessionHeader(streams: ProviderStreams): ProviderStreams {
return {
...streams,
stream: (model, context, options) => streams.stream(model, context, withSessionHeader(options)),
streamSimple: (model, context, options) => streams.streamSimple(model, context, withSessionHeader(options)),
};
}