




























@@ -28,6 +28,9 @@ type ReplayableReasoningItem = Extract<InputItem, { type: "reasoning" }>;
2828type ReplayableReasoningSignature = {
2929type: "reasoning" | `reasoning.${string}`;
3030id?: string;
31+content?: unknown;
32+encrypted_content?: string;
33+summary?: unknown;
3134};
3235type ToolCallReplayId = { callId: string; itemId?: string };
3336export type PlannedTurnInput = {
@@ -166,18 +169,35 @@ function toReplayableReasoningId(value: unknown): string | null {
166169return id && id.startsWith("rs_") ? id : null;
167170}
168171169-function toReasoningSignature(value: unknown): ReplayableReasoningSignature | null {
172+function toReasoningSignature(
173+value: unknown,
174+options?: { requireReplayableId?: boolean },
175+): ReplayableReasoningSignature | null {
170176if (!value || typeof value !== "object") {
171177return null;
172178}
173-const record = value as { type?: unknown; id?: unknown };
179+const record = value as {
180+type?: unknown;
181+id?: unknown;
182+content?: unknown;
183+encrypted_content?: unknown;
184+summary?: unknown;
185+};
174186if (!isReplayableReasoningType(record.type)) {
175187return null;
176188}
177189const reasoningId = toReplayableReasoningId(record.id);
190+if (options?.requireReplayableId && !reasoningId) {
191+return null;
192+}
178193return {
179194type: record.type,
180195 ...(reasoningId ? { id: reasoningId } : {}),
196+ ...(record.content !== undefined ? { content: record.content } : {}),
197+ ...(typeof record.encrypted_content === "string"
198+ ? { encrypted_content: record.encrypted_content }
199+ : {}),
200+ ...(record.summary !== undefined ? { summary: record.summary } : {}),
181201};
182202}
183203@@ -186,28 +206,18 @@ function encodeThinkingSignature(signature: ReplayableReasoningSignature): strin
186206}
187207188208function parseReasoningItem(value: unknown): ReplayableReasoningItem | null {
189-if (!value || typeof value !== "object") {
190-return null;
191-}
192-const record = value as {
193-type?: unknown;
194-id?: unknown;
195-content?: unknown;
196-encrypted_content?: unknown;
197-summary?: unknown;
198-};
199-if (!isReplayableReasoningType(record.type)) {
209+const signature = toReasoningSignature(value);
210+if (!signature) {
200211return null;
201212}
202-const reasoningId = toReplayableReasoningId(record.id);
203213return {
204214type: "reasoning",
205- ...(reasoningId ? { id: reasoningId } : {}),
206- ...(typeof record.content === "string" ? { content: record.content } : {}),
207- ...(typeof record.encrypted_content === "string"
208- ? { encrypted_content: record.encrypted_content }
215+ ...(signature.id ? { id: signature.id } : {}),
216+ ...(signature.content !== undefined ? { content: signature.content } : {}),
217+ ...(signature.encrypted_content !== undefined
218+ ? { encrypted_content: signature.encrypted_content }
209219 : {}),
210- ...(typeof record.summary === "string" ? { summary: record.summary } : {}),
220+ ...(signature.summary !== undefined ? { summary: signature.summary } : {}),
211221};
212222}
213223@@ -216,8 +226,7 @@ function parseThinkingSignature(value: unknown): ReplayableReasoningItem | null
216226return null;
217227}
218228try {
219-const signature = toReasoningSignature(JSON.parse(value));
220-return signature ? parseReasoningItem(signature) : null;
229+return parseReasoningItem(JSON.parse(value));
221230} catch {
222231return null;
223232}
@@ -271,7 +280,25 @@ function extractResponseReasoningText(item: unknown): string {
271280if (summaryText) {
272281return summaryText;
273282}
274-return normalizeOptionalString(record.content) ?? "";
283+if (typeof record.content === "string") {
284+return normalizeOptionalString(record.content) ?? "";
285+}
286+if (Array.isArray(record.content)) {
287+return record.content
288+.map((part) => {
289+if (typeof part === "string") {
290+return part.trim();
291+}
292+if (!part || typeof part !== "object") {
293+return "";
294+}
295+return normalizeOptionalString((part as { text?: unknown }).text) ?? "";
296+})
297+.filter(Boolean)
298+.join("\n")
299+.trim();
300+}
301+return "";
275302}
276303277304export function convertTools(
@@ -573,21 +600,16 @@ export function buildAssistantMessageFromResponse(
573600if (!isReplayableReasoningType(item.type)) {
574601continue;
575602}
603+const reasoningSignature = toReasoningSignature(item, { requireReplayableId: true });
576604const reasoning = extractResponseReasoningText(item);
577-if (!reasoning) {
605+if (!reasoning && !reasoningSignature) {
578606continue;
579607}
580-const reasoningId = toReplayableReasoningId(item.id);
581608content.push({
582609type: "thinking",
583610thinking: reasoning,
584- ...(reasoningId
585- ? {
586-thinkingSignature: encodeThinkingSignature({
587-id: reasoningId,
588-type: item.type,
589-}),
590-}
611+ ...(reasoningSignature
612+ ? { thinkingSignature: encodeThinkingSignature(reasoningSignature) }
591613 : {}),
592614} as AssistantMessage["content"][number]);
593615}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。