Files
MyGoNavi/frontend/src/utils/aiMessagePayload.test.ts
Syngnat 5f9adcac37 🐛 fix(ai): 兼容 DeepSeek reasoning 内容响应
- 增加 reasoning_content 字段解析与前后端类型定义

- 兼容 DeepSeek 流式和非流式响应中的推理内容

- 统一 AI 消息 payload 映射,避免历史消息丢失推理内容

- 补充 OpenAI 兼容 Provider 与前端消息映射测试
2026-04-30 17:26:36 +08:00

79 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import type { AIChatMessage, AIToolCall } from '../types';
import { toAIRequestMessage } from './aiMessagePayload';
const toolCall: AIToolCall = {
id: 'call_schema',
type: 'function',
function: {
name: 'inspect_table_schema',
arguments: '{"table":"orders"}',
},
};
const message = (overrides: Partial<AIChatMessage>): AIChatMessage => ({
id: 'msg-1',
role: 'assistant',
content: '',
timestamp: 1,
...overrides,
});
describe('toAIRequestMessage', () => {
it('keeps reasoning_content on assistant tool-call messages', () => {
const payload = toAIRequestMessage(message({
tool_calls: [toolCall],
reasoning_content: '需要先检查表结构',
}));
expect(payload).toMatchObject({
role: 'assistant',
tool_calls: [toolCall],
reasoning_content: '需要先检查表结构',
});
});
it('keeps reasoning_content on assistant messages without tool calls', () => {
const payload = toAIRequestMessage(message({
content: '最终分析',
reasoning_content: '工具调用轮次的最终思考也需要保留',
}));
expect(payload).toMatchObject({
role: 'assistant',
content: '最终分析',
reasoning_content: '工具调用轮次的最终思考也需要保留',
});
});
it('omits reasoning_content from tool result messages while keeping tool_call_id', () => {
const payload = toAIRequestMessage(message({
role: 'tool',
content: '{"ok":true}',
tool_call_id: 'call_schema',
reasoning_content: '不应回传',
}));
expect(payload).toMatchObject({
role: 'tool',
content: '{"ok":true}',
tool_call_id: 'call_schema',
});
expect(payload).not.toHaveProperty('reasoning_content');
});
it('keeps user images without adding empty tool fields', () => {
const payload = toAIRequestMessage(message({
role: 'user',
content: '看图',
images: ['data:image/png;base64,abc'],
}));
expect(payload).toEqual({
role: 'user',
content: '看图',
images: ['data:image/png;base64,abc'],
});
});
});