UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

633 lines (632 loc) • 27.7 kB
import { c as isRecord } from "./record-coerce-TIsquoVR.mjs"; import { E as createDiagnosticTraceContextFromActiveScope, O as freezeDiagnosticTraceContext, p as isDiagnosticsEnabled, s as emitTrustedDiagnosticEvent } from "./diagnostic-events-BADdmgZf.mjs"; import { t as _usingCtx } from "./usingCtx-DwOBYOJf.mjs"; import { r as normalizeProviderId } from "./provider-id-D1VImdKk.mjs"; import { a as resolveAgentDir, d as resolveAgentWorkspaceDir } from "./agent-scope-config-CDYpzA0r.mjs"; import { t as splitTrailingAuthProfile } from "./model-ref-profile-BNjB2hED.mjs"; import "./agent-scope-CG17uXFn.mjs"; import { l as getAgentRunContext } from "./agent-run-registry-BaxMDLZF.mjs"; import { o as emitAgentEventForRunContext } from "./agent-events-GvNTkbe3.mjs"; import { n as withPluginRuntimeGenerationScope } from "./generation-scope-tH9UXyLm.mjs"; import { a as resolveProviderModelRoutes } from "./provider-model-routes-C609Pdvh.mjs"; import { v as resolveModelRefFromString } from "./model-selection-shared-DcM6hdAC.mjs"; import { a as projectProviderModelRouteConfig } from "./provider-model-route-Bjk37zK0.mjs"; import { a as resolveModelCatalogIdentityKey } from "./openai-model-routes-C1mdGNT1.mjs"; import { t as resolveDefaultModelForAgent } from "./model-selection-config-BdeHEviO.mjs"; import { r as getRuntimeConfig } from "./io.runtime-BsUXSsD4.mjs"; import "./config-DLycWFvB.mjs"; import { t as resolveAgentHarnessPolicy } from "./policy-C25OZkRl.mjs"; import { o as getModelLlmRuntime } from "./model-runtime-binding-DgnrsJj9.mjs"; import "./model-selection-CC48fyGE.mjs"; import { t as acquireAgentRunPreparedModelRuntime } from "./prepared-model-runtime-BbAS5OtQ.mjs"; import { a as loadSessionEntry } from "./session-accessor.sqlite-entry-Dn_MsDKD.mjs"; import { g as sanitizeOpenAIReasoningSignature } from "./session-accessor.sqlite-transcript-store-DdXV7Yge.mjs"; import "./session-accessor-BDmTPdtx.mjs"; import { d as toDiagnosticUsage, s as hasObservedModelUsage, u as normalizeUsage } from "./usage-XmAH1cfG.mjs"; import { r as estimateUsageCost, s as resolveModelCostConfig } from "./usage-format-Dw-I2oJo.mjs"; import { l as resolveFastModeForElapsed } from "./fast-mode-smSVCJXN.mjs"; import { n as resolveDiagnosticModelContentCapturePolicy } from "./diagnostic-llm-content-P2SGagoP.mjs"; import { r as formatWorkerInferenceError, t as boundedWorkerError } from "./worker-error-DmRBUSui.mjs"; import { m as readWorkerTurnPromptCacheContext } from "./placement-turn-claim-events-BCSz3C5d.mjs"; import { r as prepareSimpleCompletionModel } from "./simple-completion-runtime-BYHNOuzH.mjs"; import { t as resolveFastModeState } from "./fast-mode-CdiysUl0.mjs"; import { n as createModelVisibilityPolicy, t as RUNTIME_MODEL_VISIBILITY_NORMALIZATION } from "./model-visibility-policy-CJ73IRCN.mjs"; import { t as applyExtraParamsToAgent } from "./extra-params-Db1xnEl9.mjs"; import { t as mapThinkingLevel } from "./utils-DDl8xHLo.mjs"; import { a as resolveEmbeddedAgentStream, n as createOpenAIServiceTierObservationWrapper, t as wrapStreamFnWithDiagnosticModelCallEvents } from "./attempt.model-diagnostic-events-Bz4GFzsv.mjs"; import { t as registerProviderStreamForModel } from "./provider-stream-CQjNOiOR.mjs"; import { t as resolveSessionBoundaryPromptCacheKey } from "./session-boundary-prompt-cache-key-Qws1--Tf.mjs"; import { a as projectWorkerAssistantContent, r as projectWorkerProviderReplay, s as projectWorkerTokenUsage, t as WORKER_PROVIDER_REPLAY_LOCAL_RETRY_MESSAGE } from "./transcript-message-Dz1c-AeG.mjs"; import { n as resolveSessionAuthSelection } from "./session-override-Dww-KmFM.mjs"; import { isDeepStrictEqual } from "node:util"; import { normalizeCodexResponsesBaseUrlForOpenAISdk } from "@openclaw/ai/transports"; //#region src/gateway/worker-environments/inference-terminal-message.ts const ERROR_MESSAGES = { "model-not-approved": "Model is not approved for this agent.", "invalid-context": "Inference context is invalid.", "epoch-mismatch": "Worker run epoch does not match.", "session-not-attached": "Worker session is not attached.", "provider-error": "Model provider request failed.", cancelled: "Inference request was cancelled." }; function inferenceError(reason, usage, message = ERROR_MESSAGES[reason]) { return { type: "error", reason, message, ...usage ? { usage: structuredClone(usage) } : {} }; } function projectWorkerInferenceTerminalMessage(params) { const usage = params.message.usage; const projected = { role: "assistant", content: params.message.content.map((part) => { if (part.type !== "text" && part.type !== "thinking" && part.type !== "toolCall") throw new Error("Unsupported assistant terminal content"); const content = projectWorkerAssistantContent(part); if (content.type === "thinking" && content.thinkingSignature) content.thinkingSignature = sanitizeOpenAIReasoningSignature(content.thinkingSignature, params.modelIdentity) ?? content.thinkingSignature; return content; }), api: params.modelIdentity.api, provider: params.modelIdentity.provider, model: params.modelIdentity.model, ...params.message.responseModel ? { responseModel: params.message.responseModel } : {}, ...params.message.responseId ? { responseId: params.message.responseId } : {}, usage: { ...projectWorkerTokenUsage(usage), ...usage.contextUsage?.state === "available" ? { contextUsage: { state: usage.contextUsage.state, promptTokens: usage.contextUsage.promptTokens, totalTokens: usage.contextUsage.totalTokens } } : usage.contextUsage?.state === "unavailable" ? { contextUsage: { state: usage.contextUsage.state } } : {} }, stopReason: params.stopReason, timestamp: params.message.timestamp }; return projectWorkerProviderReplay({ message: projected, providerReplay: params.message.providerReplay, purpose: "transcript" }); } //#endregion //#region src/gateway/worker-environments/inference-tool-call-stream.ts const MAX_PENDING_TOOL_DELTA_BYTES = 1048576; const MAX_PENDING_TOOL_DELTAS = 4096; const MAX_STREAMED_TOOL_DELTAS = 65536; const RETAINED_TOOL_ARGUMENT_CHUNK_BYTES = 16384; function createWorkerToolCallStream(params) { const pendingDeltas = /* @__PURE__ */ new Map(); let pendingDeltaBytes = 0; let pendingDeltaCount = 0; const ended = /* @__PURE__ */ new Set(); const identities = /* @__PURE__ */ new Map(); const emittedArgumentChunks = /* @__PURE__ */ new Map(); let retainedArgumentBytes = 0; let streamedDeltaCount = 0; const emitDelta = (contentIndex, delta) => { if (!params.isCurrent()) return "cancelled"; if (streamedDeltaCount + 1 > MAX_STREAMED_TOOL_DELTAS) return "invalid"; streamedDeltaCount += 1; const deltaBytes = Buffer.byteLength(delta, "utf8"); if (deltaBytes === 0) return params.isCurrent() ? "ok" : "cancelled"; if (retainedArgumentBytes + deltaBytes > MAX_PENDING_TOOL_DELTA_BYTES) return "invalid"; params.emit({ type: "toolcall_delta", contentIndex, delta }); const emitted = emittedArgumentChunks.get(contentIndex) ?? []; const last = emitted.at(-1); if (last && last.bytes + deltaBytes <= RETAINED_TOOL_ARGUMENT_CHUNK_BYTES) { last.text += delta; last.bytes += deltaBytes; } else emitted.push({ text: delta, bytes: deltaBytes }); emittedArgumentChunks.set(contentIndex, emitted); retainedArgumentBytes += deltaBytes; return params.isCurrent() ? "ok" : "cancelled"; }; const start = (contentIndex, partial) => { if (identities.has(contentIndex)) return params.isCurrent() ? "ok" : "cancelled"; const content = partial.content[contentIndex]; if (content?.type !== "toolCall" || !content.id || !content.name) return "invalid"; if (!params.isCurrent()) return "cancelled"; identities.set(contentIndex, { id: content.id, name: content.name }); params.emit({ type: "toolcall_start", contentIndex, id: content.id, toolName: content.name }); if (!params.isCurrent()) return "cancelled"; for (const delta of pendingDeltas.get(contentIndex) ?? []) { const result = emitDelta(contentIndex, delta); pendingDeltaBytes -= Buffer.byteLength(delta, "utf8"); pendingDeltaCount -= 1; if (result !== "ok") return result; } pendingDeltas.delete(contentIndex); return "ok"; }; const delta = (contentIndex, value, partial) => { if (ended.has(contentIndex)) return "invalid"; if (identities.has(contentIndex)) return emitDelta(contentIndex, value); const pending = pendingDeltas.get(contentIndex) ?? []; pendingDeltaBytes += Buffer.byteLength(value, "utf8"); pendingDeltaCount += 1; if (pendingDeltaBytes > MAX_PENDING_TOOL_DELTA_BYTES || pendingDeltaCount > MAX_PENDING_TOOL_DELTAS) return "invalid"; pending.push(value); pendingDeltas.set(contentIndex, pending); const result = start(contentIndex, partial); return result === "invalid" ? "ok" : result; }; const reconcile = (contentIndex, complete) => { const identity = identities.get(contentIndex); if (!identity || identity.id !== complete.id || identity.name !== complete.name) return "invalid"; const emittedJson = (emittedArgumentChunks.get(contentIndex) ?? []).map((chunk) => chunk.text).join(""); if (!emittedJson) try { const completeJson = JSON.stringify(complete.arguments); return typeof completeJson === "string" ? emitDelta(contentIndex, completeJson) : "invalid"; } catch { return "invalid"; } try { return isDeepStrictEqual(JSON.parse(emittedJson), complete.arguments) ? params.isCurrent() ? "ok" : "cancelled" : "invalid"; } catch { return "invalid"; } }; const end = (contentIndex, partial, complete) => { if (ended.has(contentIndex)) return reconcile(contentIndex, complete); const startResult = start(contentIndex, partial); if (startResult !== "ok") return startResult; const reconcileResult = reconcile(contentIndex, complete); if (reconcileResult !== "ok") return reconcileResult; ended.add(contentIndex); params.emit({ type: "toolcall_end", contentIndex }); return params.isCurrent() ? "ok" : "cancelled"; }; return { delta, end, matchesTerminal: (message) => { const terminal = new Set(message.content.flatMap((content, contentIndex) => content.type === "toolCall" ? [contentIndex] : [])); return pendingDeltas.size === 0 && terminal.size === identities.size && [...identities.keys()].every((contentIndex) => terminal.has(contentIndex) && ended.has(contentIndex)); }, start }; } //#endregion //#region src/gateway/worker-environments/inference-runtime.ts function buildContext(context) { const tools = []; for (const tool of context.tools ?? []) { if (!isRecord(tool.parameters) || tool.parameters.type !== "object") return; tools.push({ name: tool.name, description: tool.description, parameters: structuredClone(tool.parameters) }); } return { ...context.systemPrompt !== void 0 ? { systemPrompt: context.systemPrompt } : {}, messages: structuredClone(context.messages), ...tools.length > 0 ? { tools } : {} }; } function toWorkerStreamEvent(event, modelIdentity) { switch (event.type) { case "start": return { type: "start", resolvedModel: { api: modelIdentity.api, provider: modelIdentity.provider, model: modelIdentity.model }, timestamp: event.partial.timestamp }; case "text_start": case "text_end": case "thinking_end": { const content = event.partial.content[event.contentIndex]; const signature = event.type === "thinking_end" ? content?.type === "thinking" && content.thinkingSignature : content?.type === "text" && content.textSignature; return { type: event.type, contentIndex: event.contentIndex, ...signature ? { contentSignature: signature } : {} }; } case "thinking_start": return { type: "thinking_start", contentIndex: event.contentIndex }; case "text_delta": case "thinking_delta": return { type: event.type, contentIndex: event.contentIndex, delta: event.delta }; case "toolcall_start": case "toolcall_delta": case "toolcall_end": case "done": case "error": return; } } function emitWorkerInferenceUsage(params) { if (!isDiagnosticsEnabled(params.config)) return; const usage = normalizeUsage(params.usage); if (!hasObservedModelUsage(usage)) return; const costUsd = usage.cost?.total ?? estimateUsageCost({ usage, cost: resolveModelCostConfig({ provider: params.model.provider, model: params.model.id, config: params.config }) }); emitTrustedDiagnosticEvent({ type: "model.usage", trace: freezeDiagnosticTraceContext(params.trace), sessionKey: params.target.sessionKey, sessionId: params.request.sessionId, channel: "worker", agentId: params.target.agentId, provider: params.model.provider, model: params.model.id, usage: toDiagnosticUsage(usage), context: { limit: params.model.contextTokens ?? params.model.contextWindow, ...usage.contextUsage?.state === "available" ? { used: usage.contextUsage.promptTokens } : {} }, ...costUsd !== void 0 ? { costUsd } : {}, durationMs: params.durationMs }); } async function resolveApprovedModel(params) { const { target, request, signal, runtimeSnapshot } = params; return await withPluginRuntimeGenerationScope(runtimeSnapshot, async () => { const lifecycleConfig = runtimeSnapshot.config; const agentDir = runtimeSnapshot.agentDir; const workspaceDir = runtimeSnapshot.workspaceDir ?? resolveAgentWorkspaceDir(lifecycleConfig, target.agentId); const selection = { cfg: lifecycleConfig, agentId: target.agentId, manifestPlugins: runtimeSnapshot.metadataSnapshot, ...RUNTIME_MODEL_VISIBILITY_NORMALIZATION }; const defaultModel = resolveDefaultModelForAgent(selection); const policy = createModelVisibilityPolicy({ ...selection, catalog: runtimeSnapshot.modelCatalog.entries, defaultProvider: defaultModel.provider, defaultModel }); const resolved = resolveModelRefFromString({ ...selection, raw: `${request.modelRef.provider}/${request.modelRef.model}`, defaultProvider: defaultModel.provider, aliasIndex: policy.selectionAliasIndex }); if (!resolved || normalizeProviderId(resolved.ref.provider) !== normalizeProviderId(request.modelRef.provider)) return; const resolvedKey = resolveModelCatalogIdentityKey({ provider: resolved.ref.provider, id: resolved.ref.model }); if (!(policy.allowedCatalog.some((entry) => resolvedKey === resolveModelCatalogIdentityKey(entry)) || policy.retainedKeys.has(resolvedKey)) || !policy.allows(resolved.ref)) return; const harnessPolicy = resolveAgentHarnessPolicy({ provider: resolved.ref.provider, modelId: resolved.ref.model, config: lifecycleConfig, agentId: target.agentId, sessionKey: target.sessionKey }); const agentRuntimeId = harnessPolicy.runtimeSource !== "implicit" || lifecycleConfig.plugins?.entries?.codex?.enabled === true ? harnessPolicy.runtime : void 0; const sessionSelection = await resolveSessionAuthSelection({ cfg: lifecycleConfig, provider: resolved.ref.provider, modelId: resolved.ref.model, agentId: target.agentId, harnessRuntime: harnessPolicy.runtime, agentDir, sessionEntry: target.sessionEntry, sessionStore: { [target.sessionKey]: target.sessionEntry }, sessionKey: target.sessionKey, storePath: target.storePath, assertCommitAllowed: params.assertCurrent, isNewSession: false }); const selectedProfileId = sessionSelection?.profileId; const routeRequirement = sessionSelection?.routeRequirement; let modelConfig = lifecycleConfig; const routeResolution = routeRequirement ? resolveProviderModelRoutes({ provider: resolved.ref.provider, modelId: resolved.ref.model, config: lifecycleConfig }) : void 0; const route = routeResolution?.kind === "routes" ? routeResolution.routes.find((candidate) => candidate.authRequirement === routeRequirement) : void 0; if (route) modelConfig = projectProviderModelRouteConfig({ provider: resolved.ref.provider, config: lifecycleConfig, route }); const prepared = await prepareSimpleCompletionModel({ cfg: modelConfig, transport: "provider-stream", agentId: target.agentId, provider: resolved.ref.provider, modelId: resolved.ref.model, agentDir, modelIdSource: "selected", ...selectedProfileId ? { profileId: selectedProfileId, preferredProfile: selectedProfileId, bindAuthOwner: true } : {}, allowMissingApiKeyModes: ["aws-sdk"], allowBundledStaticCatalogFallback: true, signal, preparedModelRuntime: runtimeSnapshot, workspaceDir, ...agentRuntimeId ? { agentRuntimeId } : {} }); return { provider: resolved.ref.provider, model: resolved.ref.model, config: lifecycleConfig, agentDir, workspaceDir, prepared }; }); } const executeWorkerInference = async (params) => { try { var _usingCtx$1 = _usingCtx(); const { identity, request, signal } = params; if (identity.sessionId !== request.sessionId) return inferenceError("session-not-attached"); if (identity.ownerEpoch !== request.runEpoch) return inferenceError("epoch-mismatch"); if (signal.aborted || !params.isCurrent()) return inferenceError("cancelled"); const promptCacheContext = readWorkerTurnPromptCacheContext(identity); if (!promptCacheContext) return inferenceError("session-not-attached"); const config = params.config ?? getRuntimeConfig(); const sessionEntry = loadSessionEntry(params.sessionTarget); if (sessionEntry?.sessionId !== request.sessionId) return inferenceError("session-not-attached"); const target = { ...params.sessionTarget, sessionEntry }; const runContext = getAgentRunContext(request.runId); const context = buildContext(request.context); if (!context) return inferenceError("invalid-context"); if (splitTrailingAuthProfile(`${request.modelRef.provider}/${request.modelRef.model}`).profile) return inferenceError("model-not-approved"); const runtimeLease = _usingCtx$1.a(await acquireAgentRunPreparedModelRuntime({ config, agentId: target.agentId, agentDir: resolveAgentDir(config, target.agentId) })); const approved = await resolveApprovedModel({ target, request, signal, runtimeSnapshot: runtimeLease.snapshot, assertCurrent: () => { signal.throwIfAborted(); if (!params.isCurrent()) throw new Error("Worker inference source is no longer current"); } }); if (!approved) return inferenceError("model-not-approved"); return await withPluginRuntimeGenerationScope(runtimeLease.snapshot, async () => { if ("error" in approved.prepared) return inferenceError("provider-error", void 0, boundedWorkerError(approved.prepared.error, 256)); const prepared = approved.prepared; const modelIdentity = { api: prepared.model.api, provider: approved.provider, model: approved.model }; const logicalModel = prepared.model; const llmRuntime = getModelLlmRuntime(logicalModel); if (!llmRuntime) throw new Error("Prepared worker model has no lifecycle runtime owner"); const providerModel = logicalModel.provider === "openai" && logicalModel.api === "openai-chatgpt-responses" ? { ...logicalModel, baseUrl: normalizeCodexResponsesBaseUrlForOpenAISdk(logicalModel.baseUrl) } : logicalModel; const providerStream = registerProviderStreamForModel({ model: providerModel, cfg: approved.config, agentDir: approved.agentDir, workspaceDir: approved.workspaceDir }); const authValue = prepared.auth.apiKey; const streamAgent = resolveEmbeddedAgentStream({ llmRuntime, currentStreamFn: llmRuntime.streamSimple, ...providerStream ? { providerStreamFn: providerStream } : {}, sessionId: request.sessionId, signal, model: providerModel, resolvedApiKey: authValue, authProfileId: prepared.auth.profileId }); const streamPolicyOptions = { ...request.options.temperature !== void 0 ? { temperature: request.options.temperature } : {}, ...request.options.maxTokens !== void 0 ? { maxTokens: request.options.maxTokens } : {}, ...request.options.reasoning !== void 0 ? { reasoning: request.options.reasoning } : {}, ...request.options.thinkingBudgets ? { thinkingBudgets: { ...request.options.thinkingBudgets } } : {} }; const fastMode = resolveFastModeState({ cfg: approved.config, provider: approved.provider, model: approved.model, agentId: target.agentId, sessionEntry: target.sessionEntry }); const fastModeSetting = promptCacheContext.fastMode ?? fastMode.mode; const fastModeStartedAtMs = promptCacheContext.fastModeStartedAtMs ?? runContext?.lifecycleStartedAt ?? runContext?.registeredAt ?? Date.now(); applyExtraParamsToAgent(streamAgent, approved.config, approved.provider, approved.model, { ...structuredClone(streamPolicyOptions), fastMode: fastModeSetting === "auto" ? () => resolveFastModeForElapsed({ mode: "auto", startedAtMs: fastModeStartedAtMs, fastAutoOnSeconds: promptCacheContext.fastModeAutoOnSeconds ?? fastMode.fastAutoOnSeconds }).enabled : fastModeSetting }, streamPolicyOptions.reasoning, target.agentId, approved.workspaceDir, providerModel, approved.agentDir); const recordServiceTierObservation = prepared.recordServiceTierObservation; const scopedStream = recordServiceTierObservation ? createOpenAIServiceTierObservationWrapper(streamAgent.streamFn, (model) => !signal.aborted && params.isCurrent() && recordServiceTierObservation({ modelId: model.id, runtimeId: "openclaw", api: model.api, baseUrl: model.baseUrl, serviceTiers: ["priority"] })) : streamAgent.streamFn; const model = providerModel; if ([request.options.maxTokens, ...Object.values(request.options.thinkingBudgets ?? {})].some((budget) => budget !== void 0 && budget > model.maxTokens)) return inferenceError("invalid-context"); if (signal.aborted || !params.isCurrent()) return inferenceError("cancelled"); const startedAt = Date.now(); const trace = createDiagnosticTraceContextFromActiveScope(); let modelCallSeq = 0; const stream = wrapStreamFnWithDiagnosticModelCallEvents(scopedStream, { config: approved.config, runId: request.runId, sessionKey: target.sessionKey, sessionId: request.sessionId, provider: model.provider, model: model.id, api: model.api, contextTokenBudget: model.contextTokens ?? model.contextWindow, trace, contentCapture: resolveDiagnosticModelContentCapturePolicy(approved.config), nextCallId: () => `${request.runId}:${request.turnId}:worker-model:${modelCallSeq += 1}` }); const recordUsage = (usage) => { emitWorkerInferenceUsage({ config: approved.config, target, request, model, usage, durationMs: Math.max(0, Date.now() - startedAt), trace }); }; const executionIsCurrent = () => !signal.aborted && params.isCurrent(); const toolCalls = createWorkerToolCallStream({ emit: params.emit, isCurrent: executionIsCurrent }); const providerAbort = new AbortController(); const providerSignal = AbortSignal.any([signal, providerAbort.signal]); let currentMessage; let publishedModel; const { reasoning, ...streamOptions } = streamPolicyOptions; try { const events = await stream(model, context, { ...streamOptions, ...reasoning !== void 0 ? { reasoning: mapThinkingLevel(reasoning) } : {}, signal: providerSignal, sessionId: request.sessionId, ...authValue ? { apiKey: authValue } : {}, promptCacheKey: resolveSessionBoundaryPromptCacheKey({ ...promptCacheContext, api: model.api, sessionId: request.sessionId }) }); for await (const event of events) { if (event.type !== "error") { currentMessage = event.type === "done" ? event.message : event.partial ?? currentMessage; const executingModel = currentMessage?.responseModel ?? modelIdentity.model; if (currentMessage && executingModel !== publishedModel && runContext?.sessionId === request.sessionId && runContext.sessionKey === target.sessionKey && (runContext.agentId === void 0 || runContext.agentId === target.agentId) && executionIsCurrent()) { emitAgentEventForRunContext({ runId: request.runId, stream: "lifecycle", data: { phase: "model", provider: modelIdentity.provider, model: executingModel } }, runContext); publishedModel = executingModel; } } if (event.type === "done") { recordUsage(event.message.usage); if (signal.aborted || !params.isCurrent()) return inferenceError("cancelled", event.message.usage); for (const [contentIndex, content] of event.message.content.entries()) if (content.type === "toolCall") { const endResult = toolCalls.end(contentIndex, event.message, content); if (endResult === "cancelled") return inferenceError("cancelled", event.message.usage); if (endResult === "invalid") return inferenceError("provider-error"); } if (!toolCalls.matchesTerminal(event.message)) return inferenceError("provider-error"); const terminal = projectWorkerInferenceTerminalMessage({ message: event.message, modelIdentity, stopReason: event.reason }); if (terminal.kind === "provider-replay-unavailable") { if (isDiagnosticsEnabled(approved.config)) { const { bytes, limitBytes, reason } = terminal.details; emitTrustedDiagnosticEvent({ type: "payload.large", surface: "worker.provider-replay", action: "rejected", bytes, limitBytes, reason, trace: freezeDiagnosticTraceContext(trace) }); } return inferenceError("provider-error", event.message.usage, WORKER_PROVIDER_REPLAY_LOCAL_RETRY_MESSAGE); } return { type: "done", message: terminal.message }; } if (event.type === "error") { recordUsage(event.error.usage); return inferenceError(event.reason === "aborted" ? "cancelled" : "provider-error", event.error.usage, event.reason === "aborted" ? void 0 : formatWorkerInferenceError({ message: event.error.errorMessage ?? ERROR_MESSAGES["provider-error"], errorCode: event.error.errorCode, errorType: event.error.errorType, errorBody: event.error.errorBody })); } if (signal.aborted || !params.isCurrent()) return inferenceError("cancelled"); if (event.type === "toolcall_start") { if (toolCalls.start(event.contentIndex, event.partial) === "cancelled") return inferenceError("cancelled"); continue; } if (event.type === "toolcall_delta" || event.type === "toolcall_end") { const result = event.type === "toolcall_delta" ? toolCalls.delta(event.contentIndex, event.delta, event.partial) : toolCalls.end(event.contentIndex, event.partial, event.toolCall); if (result === "cancelled") return inferenceError("cancelled"); if (result === "invalid") return inferenceError("provider-error"); continue; } const workerEvent = toWorkerStreamEvent(event, modelIdentity); if (workerEvent) params.emit(workerEvent); } return inferenceError(signal.aborted ? "cancelled" : "provider-error"); } catch (error) { return inferenceError(signal.aborted ? "cancelled" : "provider-error", void 0, signal.aborted ? void 0 : formatWorkerInferenceError(error)); } finally { providerAbort.abort(); } }); } catch (_) { _usingCtx$1.e = _; } finally { await _usingCtx$1.d(); } }; //#endregion export { executeWorkerInference };