Files
natural-memory-agent-lab/agent/check_state_mutation.ts
T

54 lines
2.1 KiB
TypeScript

/**
* 验证「会话卫生」所依赖的机制是否真的有效 —— 不需要模型、不需要显卡。
*
* 背景:熔断中止后,我用 `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
? "结论:赋值机制有效 —— 会话卫生的失败不能归因于此"
: "结论:赋值机制无效 —— 这就是会话卫生失败的原因",
);