mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-24 15:19:29 +00:00
Remove replayed thinking and redacted-thinking blocks from GitHub Copilot Claude history and final Anthropic payloads while preserving visible content, tool turns, and non-empty assistant structure. Fixes #81520 Supersedes #87060 and #81534 Co-authored-by: Gio Della-Libera <giodl73@gmail.com>
56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
// Github Copilot plugin module implements replay policy behavior.
|
|
import type { ProviderSanitizeReplayHistoryContext } from "openclaw/plugin-sdk/plugin-entry";
|
|
import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
|
|
const OMITTED_COPILOT_REASONING_TEXT = "[assistant reasoning omitted]";
|
|
|
|
function isCopilotClaudeModel(modelId?: string | null): boolean {
|
|
return normalizeLowercaseStringOrEmpty(modelId).includes("claude");
|
|
}
|
|
|
|
function isThinkingBlock(value: unknown): boolean {
|
|
if (!value || typeof value !== "object") {
|
|
return false;
|
|
}
|
|
const type = (value as { type?: unknown }).type;
|
|
return type === "thinking" || type === "redacted_thinking";
|
|
}
|
|
|
|
export function stripCopilotAssistantThinkingMessages<T>(messages: T[]): T[] {
|
|
let touched = false;
|
|
const sanitized = messages.map((message) => {
|
|
if (!message || typeof message !== "object") {
|
|
return message;
|
|
}
|
|
const record = message as { role?: unknown; content?: unknown };
|
|
if (record.role !== "assistant" || !Array.isArray(record.content)) {
|
|
return message;
|
|
}
|
|
const content = record.content.filter((block) => !isThinkingBlock(block));
|
|
if (content.length === record.content.length) {
|
|
return message;
|
|
}
|
|
touched = true;
|
|
return {
|
|
...message,
|
|
content:
|
|
content.length > 0 ? content : [{ type: "text", text: OMITTED_COPILOT_REASONING_TEXT }],
|
|
};
|
|
});
|
|
return touched ? sanitized : messages;
|
|
}
|
|
|
|
export function buildGithubCopilotReplayPolicy(modelId?: string) {
|
|
return isCopilotClaudeModel(modelId)
|
|
? {
|
|
dropThinkingBlocks: true,
|
|
}
|
|
: {};
|
|
}
|
|
|
|
export function sanitizeGithubCopilotReplayHistory(ctx: ProviderSanitizeReplayHistoryContext) {
|
|
return isCopilotClaudeModel(ctx.modelId)
|
|
? stripCopilotAssistantThinkingMessages(ctx.messages)
|
|
: ctx.messages;
|
|
}
|