
























@@ -149,6 +149,7 @@ const TINY_PNG_BASE64 =
149149"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO7Z0nQAAAAASUVORK5CYII=";
150150const QA_REASONING_ONLY_RECOVERY_PROMPT_RE = /reasoning-only continuation qa check/i;
151151const QA_REASONING_ONLY_SIDE_EFFECT_PROMPT_RE = /reasoning-only after write safety check/i;
152+const QA_ANTHROPIC_THINKING_ERROR_RECOVERY_PROMPT_RE = /anthropic thinking error qa check/i;
152153const QA_THINKING_VISIBILITY_OFF_PROMPT_RE = /qa thinking visibility check off/i;
153154const QA_THINKING_VISIBILITY_MAX_PROMPT_RE = /qa thinking visibility check max/i;
154155const QA_EMPTY_RESPONSE_RECOVERY_PROMPT_RE = /empty response continuation qa check/i;
@@ -189,6 +190,7 @@ const QA_GROUP_AUDIO_MIN_MULTIPART_BODY_CHARS = 48_000;
189190const QA_MCP_CODE_MODE_API_FILE_PROMPT_RE = /mcp code mode api file qa check/i;
190191191192type MockScenarioState = {
193+anthropicThinkingErrorPhase: number;
192194subagentFanoutPhase: number;
193195subagentHandoffSpawned: boolean;
194196};
@@ -3128,6 +3130,90 @@ function buildAnthropicMessageResponse(params: {
31283130};
31293131}
313031323133+const QA_ANTHROPIC_THINKING_ERROR_TEXT =
3134+"QA replay-safe read completed, but the provider stream failed after signed thinking.";
3135+const QA_ANTHROPIC_THINKING_ERROR_SIGNATURE = "qa_signed_thinking_block_91953";
3136+const QA_ANTHROPIC_THINKING_ERROR_MESSAGE = "QA injected provider stream failure";
3137+3138+function buildAnthropicThinkingErrorResponse(params: { model: string }): Record<string, unknown> {
3139+return {
3140+type: "error",
3141+error: {
3142+type: "api_error",
3143+message: QA_ANTHROPIC_THINKING_ERROR_MESSAGE,
3144+},
3145+model: params.model || "claude-opus-4-8",
3146+};
3147+}
3148+3149+function buildAnthropicThinkingErrorStreamEvents(params: {
3150+model: string;
3151+}): AnthropicStreamEvent[] {
3152+const messageId = `msg_mock_${Math.floor(Math.random() * 1_000_000).toString(16)}`;
3153+return [
3154+{
3155+type: "message_start",
3156+message: {
3157+id: messageId,
3158+type: "message",
3159+role: "assistant",
3160+model: params.model || "claude-opus-4-8",
3161+content: [],
3162+stop_reason: null,
3163+stop_sequence: null,
3164+usage: {
3165+input_tokens: 64,
3166+output_tokens: 0,
3167+},
3168+},
3169+},
3170+{
3171+type: "content_block_start",
3172+index: 0,
3173+content_block: {
3174+type: "thinking",
3175+thinking: "",
3176+signature: "",
3177+},
3178+},
3179+{
3180+type: "content_block_delta",
3181+index: 0,
3182+delta: {
3183+type: "thinking_delta",
3184+thinking: QA_ANTHROPIC_THINKING_ERROR_TEXT,
3185+},
3186+},
3187+{
3188+type: "content_block_delta",
3189+index: 0,
3190+delta: {
3191+type: "signature_delta",
3192+signature: QA_ANTHROPIC_THINKING_ERROR_SIGNATURE,
3193+},
3194+},
3195+{
3196+type: "content_block_stop",
3197+index: 0,
3198+},
3199+{
3200+type: "message_delta",
3201+delta: {},
3202+usage: {
3203+input_tokens: 64,
3204+output_tokens: 1120,
3205+},
3206+},
3207+{
3208+type: "error",
3209+error: {
3210+type: "api_error",
3211+message: QA_ANTHROPIC_THINKING_ERROR_MESSAGE,
3212+},
3213+},
3214+];
3215+}
3216+31313217function buildAnthropicMessageStreamEvents(params: {
31323218model: string;
31333219extracted: ExtractedAssistantOutput;
@@ -3254,6 +3340,35 @@ async function buildMessagesPayload(
32543340stream: false,
32553341 ...(Array.isArray(body.tools) ? { tools: body.tools } : {}),
32563342};
3343+const allInputText = extractAllRequestTexts(input, dispatchBody);
3344+if (QA_ANTHROPIC_THINKING_ERROR_RECOVERY_PROMPT_RE.test(allInputText)) {
3345+const toolOutput = extractToolOutput(input);
3346+const shouldEmitThinkingError =
3347+toolOutput.length > 0 && scenarioState.anthropicThinkingErrorPhase === 0;
3348+const events =
3349+toolOutput.length === 0
3350+ ? buildToolCallEventsWithArgs("read", { path: "QA_KICKOFF_TASK.md" })
3351+ : shouldEmitThinkingError
3352+ ? (() => {
3353+scenarioState.anthropicThinkingErrorPhase = 1;
3354+return buildAssistantEvents("");
3355+})()
3356+ : buildAssistantEvents("ANTHROPIC-THINKING-ERROR-RECOVERED-OK");
3357+const extracted = extractFinalAssistantOutputFromEvents(events);
3358+const responseBody = shouldEmitThinkingError
3359+ ? buildAnthropicThinkingErrorResponse({ model: normalizedModel })
3360+ : buildAnthropicMessageResponse({
3361+model: normalizedModel,
3362+ extracted,
3363+});
3364+const streamEvents = shouldEmitThinkingError
3365+ ? buildAnthropicThinkingErrorStreamEvents({ model: normalizedModel })
3366+ : buildAnthropicMessageStreamEvents({
3367+model: normalizedModel,
3368+ extracted,
3369+});
3370+return { events, input, extracted, responseBody, streamEvents, model: normalizedModel };
3371+}
32573372const events = await buildResponsesPayload(dispatchBody, scenarioState);
32583373const extracted = extractFinalAssistantOutputFromEvents(events);
32593374const responseBody = buildAnthropicMessageResponse({
@@ -3270,6 +3385,7 @@ async function buildMessagesPayload(
32703385export async function startQaMockOpenAiServer(params?: { host?: string; port?: number }) {
32713386const host = params?.host ?? "127.0.0.1";
32723387const scenarioState: MockScenarioState = {
3388+anthropicThinkingErrorPhase: 0,
32733389subagentFanoutPhase: 0,
32743390subagentHandoffSpawned: false,
32753391};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。