54 lines
2.1 KiB
TypeScript
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
|
|
? "结论:赋值机制有效 —— 会话卫生的失败不能归因于此"
|
|
: "结论:赋值机制无效 —— 这就是会话卫生失败的原因",
|
|
);
|