import type { LlmRuntime } from "@openclaw/ai"; import type { ThinkLevel } from "../../auto-reply/thinking.js"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; import { getModelProviderRuntimePluginHandle } from "../../plugins/provider-hook-runtime.js"; import type { ProviderRuntimeModel } from "../../plugins/provider-runtime-model.types.js"; import { resolveProviderTextTransforms } from "../../plugins/provider-runtime.js"; import { wrapStreamFnTextTransforms } from "../plugin-text-transforms.js"; import type { AgentRuntimePlan } from "../runtime-plan/types.js"; import { applyExtraParamsToAgent } from "./extra-params.js"; import { resolveEmbeddedAgentApiKey, resolveEmbeddedAgentBaseStreamFn, resolveEmbeddedAgentStream, } from "./stream-resolution.js"; import { mapThinkingLevelForProvider } from "./utils.js"; export async function prepareCompactionSessionAgent(params: { session: { agent: { streamFn?: unknown } }; llmRuntime: LlmRuntime; providerStreamFn: unknown; sessionId: string; signal: AbortSignal; effectiveModel: ProviderRuntimeModel; resolvedApiKey?: string; authStorage: unknown; config?: OpenClawConfig; provider: string; modelId: string; thinkLevel: ThinkLevel; sessionAgentId: string; effectiveWorkspace: string; agentDir: string; runtimePlan?: AgentRuntimePlan; sessionKey?: string; sandboxToolPolicy?: { allow?: string[]; deny?: string[] }; messageProvider?: string; agentAccountId?: string | null; groupId?: string | null; groupChannel?: string | null; groupSpace?: string | null; spawnedBy?: string | null; senderId?: string | null; senderName?: string | null; senderUsername?: string | null; senderE164?: string | null; }) { const authStorage = params.authStorage && typeof params.authStorage === "object" && "getApiKey" in params.authStorage && typeof params.authStorage.getApiKey === "function" ? (params.authStorage as { getApiKey(provider: string): Promise; }) : undefined; const transportApiKey = authStorage ? await resolveEmbeddedAgentApiKey({ provider: params.effectiveModel.provider, resolvedApiKey: params.resolvedApiKey, authStorage, }) : params.resolvedApiKey; params.session.agent.streamFn = resolveEmbeddedAgentStream({ llmRuntime: params.llmRuntime, currentStreamFn: resolveEmbeddedAgentBaseStreamFn({ session: params.session as never }), providerStreamFn: params.providerStreamFn as never, sessionId: params.sessionId, signal: params.signal, model: params.effectiveModel, resolvedApiKey: params.resolvedApiKey, transportAuthAvailable: Boolean(transportApiKey?.trim()), authProfileId: params.runtimePlan?.auth.forwardedAuthProfileId, authStorage: params.authStorage as never, }).streamFn; const providerTextTransforms = resolveProviderTextTransforms({ provider: params.provider, config: params.config, workspaceDir: params.effectiveWorkspace, runtimeHandle: getModelProviderRuntimePluginHandle(params.effectiveModel), }); if (providerTextTransforms) { params.session.agent.streamFn = wrapStreamFnTextTransforms({ streamFn: params.session.agent.streamFn as never, input: providerTextTransforms.input, output: providerTextTransforms.output, transformSystemPrompt: false, }) as never; } const providerThinkingLevel = mapThinkingLevelForProvider(params.thinkLevel); const preparedRuntimeExtraParams = params.runtimePlan?.transport.resolveExtraParams({ thinkingLevel: providerThinkingLevel, agentId: params.sessionAgentId, workspaceDir: params.effectiveWorkspace, model: params.effectiveModel, }); const extraParams = applyExtraParamsToAgent( params.session.agent as never, params.config, params.provider, params.modelId, undefined, providerThinkingLevel, params.sessionAgentId, params.effectiveWorkspace, params.effectiveModel, params.agentDir, undefined, { ...(preparedRuntimeExtraParams ? { preparedExtraParams: preparedRuntimeExtraParams } : {}), nativeWebSearchPolicyContext: { // Summaries have no tool loop; provider-hosted tools must not inherit // the originating conversation's broader web-search authority. sessionKey: params.sessionKey, webSearchEnabled: false, runtimeToolAllowlist: [], sandboxToolPolicy: params.sandboxToolPolicy, messageProvider: params.messageProvider, agentAccountId: params.agentAccountId, groupId: params.groupId, groupChannel: params.groupChannel, groupSpace: params.groupSpace, spawnedBy: params.spawnedBy, senderId: params.senderId, senderName: params.senderName, senderUsername: params.senderUsername, senderE164: params.senderE164, }, }, ); return { ...extraParams, transportApiKey }; }