/** * 验证「会话卫生」所依赖的机制是否真的有效 —— 不需要模型、不需要显卡。 * * 背景:熔断中止后,我用 `agent.state.messages = [...]` 把被污染的尾巴换成一句干净的说明。 * 但实测里下一轮仍在复读旧对话,我当时记为"卫生没生效"。这里直接验证机制本身: * 1) `agent.state.messages` 赋值是否被采纳? * 2) 赋值是否复制数组(Pi 的注释声称会复制)? * 3) 赋值后 `get messages` 读回来的是不是新内容? */ import { Agent } from "@earendil-works/pi-agent-core"; const agent = new Agent({ initialState: { systemPrompt: "test", model: {} as never, tools: [], messages: [], thinkingLevel: "off", }, streamFn: (() => { throw new Error("not used"); }) as never, sessionId: "hygiene-check", }); const before = agent.state.messages.length; console.log(`初始 messages 长度 = ${before}`); const replacement = [ { role: "user", content: [{ type: "text", text: "原始问题" }] }, { role: "assistant", content: [{ type: "text", text: "(本轮中止说明)" }] }, ]; agent.state.messages = replacement as never; const after = agent.state.messages; console.log(`赋值后 messages 长度 = ${after.length}`); console.log(`内容与预期一致 = ${JSON.stringify(after) === JSON.stringify(replacement)}`); // 复制语义:改原数组不应影响内部状态 replacement.push({ role: "user", content: [{ type: "text", text: "事后追加" }] } as never); console.log(`改动源数组后内部长度 = ${agent.state.messages.length}(若仍为 2,说明是复制)`); // 读回来的对象是不是同一引用(对象字面量 getter 每次返回同一个数组) const first = agent.state.messages; const second = agent.state.messages; console.log(`两次读取是同一引用 = ${first === second}`); console.log( after.length === 2 && agent.state.messages.length === 2 ? "结论:赋值机制有效 —— 会话卫生的失败不能归因于此" : "结论:赋值机制无效 —— 这就是会话卫生失败的原因", );