UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

53 lines (52 loc) 2.79 kB
import { a as WORKER_PROTOCOL_MAX_INFERENCE_PAYLOAD_BYTES } from "./worker-inference-CNQgy0yo.js"; //#region src/worker/replay-message-window.ts function windowWorkerReplayMessages(messages, limitMessages) { if (messages.length <= limitMessages) return { kind: "complete", messages }; const minimumStart = messages.length - limitMessages; const replayIndex = messages.findLastIndex((message) => message.providerReplay !== void 0); if (replayIndex >= 0 && messages.length - replayIndex > limitMessages) return { kind: "provider-replay-unavailable", details: { reason: "provider-replay-message-limit", messageCount: messages.length - replayIndex, limitMessages } }; const completeTurnStart = messages.findIndex((message, index) => index >= minimumStart && message.role === "user"); const start = replayIndex >= 0 && (completeTurnStart < 0 || completeTurnStart > replayIndex) ? replayIndex : completeTurnStart; if (start < 0) throw new Error("Worker context has no complete user turn within the message limit."); return { kind: "complete", messages: messages.slice(start) }; } const PROCESSED_IMAGE_MARKER = { type: "text", text: "[image data removed - already processed by model]" }; /** Fit only the model projection; persisted images and replay checkpoints stay untouched. */ function fitWorkerReplayImages(messages, measureBytes, protectedToolCallId) { if (measureBytes(messages) <= WORKER_PROTOCOL_MAX_INFERENCE_PAYLOAD_BYTES) return messages; if (messages.some((message) => message.role === "assistant" && message.providerReplay !== void 0)) return; const observedBefore = messages.findLastIndex((message) => message.role === "assistant" && message.stopReason !== "error" && message.stopReason !== "aborted"); const latestImage = messages.findLastIndex((message) => message.role !== "assistant" && Array.isArray(message.content) && message.content.some((part) => part.type === "image")); let fitted = messages; for (let index = 0; index < observedBefore; index++) { const message = messages[index]; if (index === latestImage || message.role === "assistant" || !Array.isArray(message.content) || message.role === "toolResult" && message.toolCallId === protectedToolCallId) continue; let content = message.content; for (const [blockIndex, block] of message.content.entries()) { if (block.type !== "image") continue; if (fitted === messages) fitted = messages.slice(); if (content === message.content) content = message.content.slice(); content[blockIndex] = PROCESSED_IMAGE_MARKER; fitted[index] = Object.assign({}, message, { content }); if (measureBytes(fitted) <= WORKER_PROTOCOL_MAX_INFERENCE_PAYLOAD_BYTES) return fitted; } } } //#endregion export { windowWorkerReplayMessages as n, fitWorkerReplayImages as t };