mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-13 10:11:20 +00:00
197 lines
7.0 KiB
TypeScript
197 lines
7.0 KiB
TypeScript
import type { StreamFn } from "@mariozechner/pi-agent-core";
|
|
import {
|
|
createGoogleThinkingPayloadWrapper,
|
|
sanitizeGoogleThinkingPayload,
|
|
} from "../agents/pi-embedded-runner/google-stream-wrappers.js";
|
|
import { createMinimaxFastModeWrapper } from "../agents/pi-embedded-runner/minimax-stream-wrappers.js";
|
|
import {
|
|
createMoonshotThinkingWrapper,
|
|
resolveMoonshotThinkingType,
|
|
} from "../agents/pi-embedded-runner/moonshot-thinking-stream-wrappers.js";
|
|
import {
|
|
createCodexNativeWebSearchWrapper,
|
|
createOpenAIAttributionHeadersWrapper,
|
|
createOpenAIFastModeWrapper,
|
|
createOpenAIReasoningCompatibilityWrapper,
|
|
createOpenAIResponsesContextManagementWrapper,
|
|
createOpenAIServiceTierWrapper,
|
|
createOpenAITextVerbosityWrapper,
|
|
resolveOpenAIFastMode,
|
|
resolveOpenAIServiceTier,
|
|
resolveOpenAITextVerbosity,
|
|
} from "../agents/pi-embedded-runner/openai-stream-wrappers.js";
|
|
import {
|
|
createKilocodeWrapper,
|
|
createOpenRouterSystemCacheWrapper,
|
|
createOpenRouterWrapper,
|
|
isProxyReasoningUnsupported,
|
|
} from "../agents/pi-embedded-runner/proxy-stream-wrappers.js";
|
|
import {
|
|
createToolStreamWrapper,
|
|
createZaiToolStreamWrapper,
|
|
} from "../agents/pi-embedded-runner/zai-stream-wrappers.js";
|
|
import type { ProviderPlugin } from "../plugins/types.js";
|
|
import type { ProviderWrapStreamFnContext } from "./plugin-entry.js";
|
|
|
|
export type ProviderStreamWrapperFactory =
|
|
| ((streamFn: StreamFn | undefined) => StreamFn | undefined)
|
|
| null
|
|
| undefined
|
|
| false;
|
|
|
|
export function composeProviderStreamWrappers(
|
|
baseStreamFn: StreamFn | undefined,
|
|
...wrappers: ProviderStreamWrapperFactory[]
|
|
): StreamFn | undefined {
|
|
return wrappers.reduce(
|
|
(streamFn, wrapper) => (wrapper ? wrapper(streamFn) : streamFn),
|
|
baseStreamFn,
|
|
);
|
|
}
|
|
|
|
export type ProviderStreamFamily =
|
|
| "google-thinking"
|
|
| "kilocode-thinking"
|
|
| "moonshot-thinking"
|
|
| "minimax-fast-mode"
|
|
| "openai-responses-defaults"
|
|
| "openrouter-thinking"
|
|
| "tool-stream-default-on";
|
|
|
|
type ProviderStreamFamilyHooks = Pick<ProviderPlugin, "wrapStreamFn">;
|
|
|
|
export function buildProviderStreamFamilyHooks(
|
|
family: ProviderStreamFamily,
|
|
): ProviderStreamFamilyHooks {
|
|
switch (family) {
|
|
case "google-thinking":
|
|
return {
|
|
wrapStreamFn: (ctx: ProviderWrapStreamFnContext) =>
|
|
createGoogleThinkingPayloadWrapper(ctx.streamFn, ctx.thinkingLevel),
|
|
};
|
|
case "moonshot-thinking":
|
|
return {
|
|
wrapStreamFn: (ctx: ProviderWrapStreamFnContext) => {
|
|
const thinkingType = resolveMoonshotThinkingType({
|
|
configuredThinking: ctx.extraParams?.thinking,
|
|
thinkingLevel: ctx.thinkingLevel,
|
|
});
|
|
return createMoonshotThinkingWrapper(ctx.streamFn, thinkingType);
|
|
},
|
|
};
|
|
case "kilocode-thinking":
|
|
return {
|
|
wrapStreamFn: (ctx: ProviderWrapStreamFnContext) => {
|
|
const thinkingLevel =
|
|
ctx.modelId === "kilo/auto" || isProxyReasoningUnsupported(ctx.modelId)
|
|
? undefined
|
|
: ctx.thinkingLevel;
|
|
return createKilocodeWrapper(ctx.streamFn, thinkingLevel);
|
|
},
|
|
};
|
|
case "minimax-fast-mode":
|
|
return {
|
|
wrapStreamFn: (ctx: ProviderWrapStreamFnContext) =>
|
|
createMinimaxFastModeWrapper(ctx.streamFn, ctx.extraParams?.fastMode === true),
|
|
};
|
|
case "openai-responses-defaults":
|
|
return {
|
|
wrapStreamFn: (ctx: ProviderWrapStreamFnContext) => {
|
|
let nextStreamFn = createOpenAIAttributionHeadersWrapper(ctx.streamFn);
|
|
|
|
if (resolveOpenAIFastMode(ctx.extraParams)) {
|
|
nextStreamFn = createOpenAIFastModeWrapper(nextStreamFn);
|
|
}
|
|
|
|
const serviceTier = resolveOpenAIServiceTier(ctx.extraParams);
|
|
if (serviceTier) {
|
|
nextStreamFn = createOpenAIServiceTierWrapper(nextStreamFn, serviceTier);
|
|
}
|
|
|
|
const textVerbosity = resolveOpenAITextVerbosity(ctx.extraParams);
|
|
if (textVerbosity) {
|
|
nextStreamFn = createOpenAITextVerbosityWrapper(nextStreamFn, textVerbosity);
|
|
}
|
|
|
|
nextStreamFn = createCodexNativeWebSearchWrapper(nextStreamFn, {
|
|
config: ctx.config,
|
|
agentDir: ctx.agentDir,
|
|
});
|
|
return createOpenAIResponsesContextManagementWrapper(
|
|
createOpenAIReasoningCompatibilityWrapper(nextStreamFn),
|
|
ctx.extraParams,
|
|
);
|
|
},
|
|
};
|
|
case "openrouter-thinking":
|
|
return {
|
|
wrapStreamFn: (ctx: ProviderWrapStreamFnContext) => {
|
|
const thinkingLevel =
|
|
ctx.modelId === "auto" || isProxyReasoningUnsupported(ctx.modelId)
|
|
? undefined
|
|
: ctx.thinkingLevel;
|
|
return createOpenRouterWrapper(ctx.streamFn, thinkingLevel);
|
|
},
|
|
};
|
|
case "tool-stream-default-on":
|
|
return {
|
|
wrapStreamFn: (ctx: ProviderWrapStreamFnContext) =>
|
|
createToolStreamWrapper(ctx.streamFn, ctx.extraParams?.tool_stream !== false),
|
|
};
|
|
}
|
|
}
|
|
|
|
// Public stream-wrapper helpers for provider plugins.
|
|
|
|
export {
|
|
applyAnthropicPayloadPolicyToParams,
|
|
resolveAnthropicPayloadPolicy,
|
|
} from "../agents/anthropic-payload-policy.js";
|
|
export {
|
|
buildCopilotDynamicHeaders,
|
|
hasCopilotVisionInput,
|
|
} from "../agents/copilot-dynamic-headers.js";
|
|
export { applyAnthropicEphemeralCacheControlMarkers } from "../agents/pi-embedded-runner/anthropic-cache-control-payload.js";
|
|
export {
|
|
createAnthropicToolPayloadCompatibilityWrapper,
|
|
createOpenAIAnthropicToolPayloadCompatibilityWrapper,
|
|
} from "../agents/pi-embedded-runner/anthropic-family-tool-payload-compat.js";
|
|
export {
|
|
createBedrockNoCacheWrapper,
|
|
isAnthropicBedrockModel,
|
|
} from "../agents/pi-embedded-runner/bedrock-stream-wrappers.js";
|
|
export {
|
|
createGoogleThinkingPayloadWrapper,
|
|
sanitizeGoogleThinkingPayload,
|
|
} from "../agents/pi-embedded-runner/google-stream-wrappers.js";
|
|
export {
|
|
createKilocodeWrapper,
|
|
createOpenRouterSystemCacheWrapper,
|
|
createOpenRouterWrapper,
|
|
isProxyReasoningUnsupported,
|
|
} from "../agents/pi-embedded-runner/proxy-stream-wrappers.js";
|
|
export { createMinimaxFastModeWrapper } from "../agents/pi-embedded-runner/minimax-stream-wrappers.js";
|
|
export {
|
|
createMoonshotThinkingWrapper,
|
|
resolveMoonshotThinkingType,
|
|
} from "../agents/pi-embedded-runner/moonshot-thinking-stream-wrappers.js";
|
|
export {
|
|
createOpenAIAttributionHeadersWrapper,
|
|
createCodexNativeWebSearchWrapper,
|
|
createOpenAIDefaultTransportWrapper,
|
|
createOpenAIFastModeWrapper,
|
|
createOpenAIReasoningCompatibilityWrapper,
|
|
createOpenAIResponsesContextManagementWrapper,
|
|
createOpenAIServiceTierWrapper,
|
|
createOpenAITextVerbosityWrapper,
|
|
resolveOpenAIFastMode,
|
|
resolveOpenAIServiceTier,
|
|
resolveOpenAITextVerbosity,
|
|
} from "../agents/pi-embedded-runner/openai-stream-wrappers.js";
|
|
export { streamWithPayloadPatch } from "../agents/pi-embedded-runner/stream-payload-utils.js";
|
|
export { createToolStreamWrapper, createZaiToolStreamWrapper };
|
|
export {
|
|
getOpenRouterModelCapabilities,
|
|
loadOpenRouterModelCapabilities,
|
|
} from "../agents/pi-embedded-runner/openrouter-model-capabilities.js";
|