Files
beaver_project/app-instance/frontend/lib/chat-messages.test.ts
steven_li 6e9e74d1ee feat(engine): 添加运行时上下文支持并重构工具迭代限制
添加 RuntimeContext 类用于捕获模型运行时的日期时间信息,
包括UTC时间、本地时间和时区信息,并在系统提示中显示这些信息。

同时增加最大上下文消息数和工具迭代次数的配置选项,
将验证服务从引擎加载器中移除,并更新相关的数据结构和接口。

BREAKING CHANGE: 移除了验证服务,相关字段被替换为证据状态和接受状态。

- 添加 RuntimeContext 类和相关渲染方法
- 增加 max_context_messages 和 max_tool_iterations 配置
- 移除 ValidationService 相关代码
- 更新消息记录中的验证状态字段
- 添加原始工具调用检测和回退处理
2026-05-26 11:18:35 +08:00

102 lines
3.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { getTaskCardMessageIndexes, mergeServerWithPendingUsers, shouldDisplayChatMessage, shouldMergePendingUsers } from '@/lib/chat-messages';
import type { ChatMessage } from '@/types';
describe('chat message helpers', () => {
it('keeps pending local user messages after server refreshes', () => {
const serverMessages: ChatMessage[] = [
{
role: 'assistant',
content: 'Earlier answer',
timestamp: '2026-05-21T08:00:00.000Z',
},
];
const localMessages: ChatMessage[] = [
...serverMessages,
{
role: 'user',
content: 'Please continue',
timestamp: '2026-05-21T08:01:00.000Z',
},
];
expect(mergeServerWithPendingUsers(serverMessages, localMessages)).toEqual([
...serverMessages,
localMessages[1],
]);
});
it('does not duplicate local user messages already persisted by the server', () => {
const serverMessages: ChatMessage[] = [
{
role: 'user',
content: 'Please continue',
timestamp: '2026-05-21T08:01:00.000Z',
},
];
const localMessages: ChatMessage[] = [
{
role: 'user',
content: 'Please continue',
timestamp: '2026-05-21T08:01:01.000Z',
},
];
expect(mergeServerWithPendingUsers(serverMessages, localMessages)).toEqual(serverMessages);
});
it('merges pending user messages when local state has an unpersisted trailing user turn', () => {
const serverMessages: ChatMessage[] = [
{
role: 'assistant',
content: 'Earlier answer',
timestamp: '2026-05-21T08:00:00.000Z',
},
];
const localMessages: ChatMessage[] = [
...serverMessages,
{
role: 'user',
content: 'Do this long task',
timestamp: '2026-05-21T08:01:00.000Z',
},
];
expect(shouldMergePendingUsers(serverMessages, localMessages, false)).toBe(true);
});
it('shows a task card only on the latest assistant message for the same task', () => {
const messages: ChatMessage[] = [
{
role: 'assistant',
content: 'I will start.',
run_id: 'run-1',
task_id: 'task-1',
},
{
role: 'assistant',
content: 'I found data.',
run_id: 'run-1',
task_id: 'task-1',
},
{
role: 'assistant',
content: 'Final answer.',
run_id: 'run-1',
task_id: 'task-1',
task_status: 'awaiting_acceptance',
},
];
expect(Array.from(getTaskCardMessageIndexes(messages))).toEqual([2]);
});
it('hides empty assistant records from session history', () => {
expect(shouldDisplayChatMessage({ role: 'assistant', content: '', task_id: 'task-1', run_id: 'run-1' })).toBe(false);
expect(shouldDisplayChatMessage({ role: 'assistant', content: '\u200B\uFEFF', task_id: 'task-1', run_id: 'run-1' })).toBe(false);
expect(shouldDisplayChatMessage({ role: 'assistant', content: 'Final answer.', task_id: 'task-1', run_id: 'run-1' })).toBe(true);
expect(shouldDisplayChatMessage({ role: 'user', content: '' })).toBe(true);
});
});