























@@ -1,5 +1,4 @@
11import type { StreamFn } from "@mariozechner/pi-agent-core";
2-import { streamSimple } from "@mariozechner/pi-ai";
32import type { ProviderWrapStreamFnContext } from "openclaw/plugin-sdk/plugin-entry";
43import {
54applyAnthropicEphemeralCacheControlMarkers,
@@ -23,8 +22,26 @@ function patchOnPayloadResult(result: unknown): unknown {
2322return result;
2423}
252426-export function wrapCopilotAnthropicStream(baseStreamFn: StreamFn | undefined): StreamFn {
27-const underlying = baseStreamFn ?? streamSimple;
25+function buildCopilotRequestHeaders(
26+context: Parameters<StreamFn>[1],
27+headers: Record<string, string> | undefined,
28+): Record<string, string> {
29+return {
30+ ...buildCopilotDynamicHeaders({
31+messages: context.messages,
32+hasImages: hasCopilotVisionInput(context.messages),
33+}),
34+ ...headers,
35+};
36+}
37+38+export function wrapCopilotAnthropicStream(
39+baseStreamFn: StreamFn | undefined,
40+): StreamFn | undefined {
41+if (!baseStreamFn) {
42+return undefined;
43+}
44+const underlying = baseStreamFn;
2845return (model, context, options) => {
2946if (model.provider !== "github-copilot" || model.api !== "anthropic-messages") {
3047return underlying(model, context, options);
@@ -36,21 +53,20 @@ export function wrapCopilotAnthropicStream(baseStreamFn: StreamFn | undefined):
3653context,
3754{
3855 ...options,
39-headers: {
40- ...buildCopilotDynamicHeaders({
41-messages: context.messages,
42-hasImages: hasCopilotVisionInput(context.messages),
43-}),
44- ...options?.headers,
45-},
56+headers: buildCopilotRequestHeaders(context, options?.headers),
4657},
4758applyAnthropicEphemeralCacheControlMarkers,
4859);
4960};
5061}
516252-export function wrapCopilotOpenAIResponsesStream(baseStreamFn: StreamFn | undefined): StreamFn {
53-const underlying = baseStreamFn ?? streamSimple;
63+export function wrapCopilotOpenAIResponsesStream(
64+baseStreamFn: StreamFn | undefined,
65+): StreamFn | undefined {
66+if (!baseStreamFn) {
67+return undefined;
68+}
69+const underlying = baseStreamFn;
5470return (model, context, options) => {
5571if (model.provider !== "github-copilot" || model.api !== "openai-responses") {
5672return underlying(model, context, options);
@@ -59,13 +75,7 @@ export function wrapCopilotOpenAIResponsesStream(baseStreamFn: StreamFn | undefi
5975const originalOnPayload = options?.onPayload;
6076const wrappedOptions: StreamOptions = {
6177 ...options,
62-headers: {
63- ...buildCopilotDynamicHeaders({
64-messages: context.messages,
65-hasImages: hasCopilotVisionInput(context.messages),
66-}),
67- ...options?.headers,
68-},
78+headers: buildCopilotRequestHeaders(context, options?.headers),
6979onPayload: (payload, payloadModel) => {
7080rewriteCopilotResponsePayloadConnectionBoundIds(payload);
7181return patchOnPayloadResult(originalOnPayload?.(payload, payloadModel));
@@ -75,6 +85,6 @@ export function wrapCopilotOpenAIResponsesStream(baseStreamFn: StreamFn | undefi
7585};
7686}
778778-export function wrapCopilotProviderStream(ctx: ProviderWrapStreamFnContext): StreamFn {
88+export function wrapCopilotProviderStream(ctx: ProviderWrapStreamFnContext): StreamFn | undefined {
7989return wrapCopilotOpenAIResponsesStream(wrapCopilotAnthropicStream(ctx.streamFn));
8090}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。