



























@@ -110,6 +110,84 @@ async function createSessionAndStreamModel(model: Model): Promise<SimpleStreamOp
110110return streamMocks.streamSimple.mock.lastCall?.[2] ?? {};
111111}
112112113+function appendPersistedAssistantMessage(params: {
114+sessionManager: SessionManager;
115+content: unknown;
116+stopReason?: "stop" | "aborted";
117+}) {
118+params.sessionManager.appendMessage({
119+role: "assistant",
120+content: params.content,
121+api: "messages",
122+provider: "anthropic",
123+model: "sonnet-4.6",
124+usage: {
125+input: 0,
126+output: 0,
127+cacheRead: 0,
128+cacheWrite: 0,
129+totalTokens: 0,
130+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
131+},
132+stopReason: params.stopReason ?? "stop",
133+timestamp: Date.now(),
134+} as Parameters<SessionManager["appendMessage"]>[0]);
135+}
136+137+async function createSessionFromManager(sessionManager: SessionManager) {
138+const { session } = await createAgentSession({
139+model: testModel,
140+resourceLoader: createEmptyResourceLoader(),
141+ sessionManager,
142+settingsManager: SettingsManager.inMemory(),
143+modelRegistry: ModelRegistry.inMemory(AuthStorage.inMemory()),
144+});
145+return session;
146+}
147+148+async function createSessionWithPersistedAssistantContent(content: unknown) {
149+const sessionManager = SessionManager.inMemory();
150+appendPersistedAssistantMessage({ sessionManager, content });
151+return await createSessionFromManager(sessionManager);
152+}
153+154+describe("AgentSession getLastAssistantText", () => {
155+it.each([
156+{
157+name: "legacy string content",
158+content: " legacy assistant text ",
159+expected: "legacy assistant text",
160+},
161+{
162+name: "normal text blocks",
163+content: [
164+{ type: "thinking", thinking: "hidden" },
165+{ type: "text", text: "visible " },
166+{ type: "text", text: "answer" },
167+],
168+expected: "visible answer",
169+},
170+{ name: "null content", content: null, expected: undefined },
171+{ name: "object content", content: { type: "text", text: "malformed" }, expected: undefined },
172+])("reads $name without throwing", async ({ content, expected }) => {
173+const session = await createSessionWithPersistedAssistantContent(content);
174+expect(session.getLastAssistantText()).toBe(expected);
175+});
176+177+it("skips aborted malformed content and returns the preceding assistant text", async () => {
178+const sessionManager = SessionManager.inMemory();
179+appendPersistedAssistantMessage({ sessionManager, content: "previous answer" });
180+appendPersistedAssistantMessage({
181+ sessionManager,
182+content: null,
183+stopReason: "aborted",
184+});
185+const session = await createSessionFromManager(sessionManager);
186+187+expect(session.getLastAssistantText()).toBe("previous answer");
188+});
189+});
190+113191describe("createAgentSession attribution headers", () => {
114192it("tolerates Bedrock models that do not expose baseUrl", async () => {
115193const options = await createSessionAndStreamModel(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。