feat(tests): enhance modelTesterSession tests and add proxy logs tests

- Updated modelTesterSession tests to serialize assistant history as output_text and removed mime_type from input_file.
- Introduced new tests for stats proxy logs routes, covering paginated log retrieval and detailed log views with parsed billing details.
- Added server-driven tests for ProxyLogs component to validate API interactions and UI rendering based on server data.
This commit is contained in:
cita
2026-03-09 13:48:39 +08:00
parent 3dcf45851f
commit 136a038538
28 changed files with 1631 additions and 727 deletions
@@ -252,7 +252,42 @@ describe('modelTesterSession', () => {
role: 'user',
content: [
{ type: 'input_text', text: '请总结上传文件' },
{ type: 'input_file', file_id: 'file_123', filename: 'notes.txt', mime_type: 'text/plain' },
{ type: 'input_file', file_id: 'file_123', filename: 'notes.txt' },
],
},
],
stream: false,
temperature: 0.7,
});
});
it('serializes assistant history as output_text for responses payloads', () => {
const payload = buildApiPayload(
[
{ id: 'u1', role: 'user', content: '先看附件', createAt: 1 },
{ id: 'a1', role: 'assistant', content: '我已经看过摘要', createAt: 2 },
],
{
...DEFAULT_INPUTS,
model: 'gpt-5.2',
protocol: 'responses',
},
DEFAULT_PARAMETER_ENABLED,
);
expect(payload.jsonBody).toEqual({
model: 'gpt-5.2',
input: [
{
role: 'user',
content: [
{ type: 'input_text', text: '先看附件' },
],
},
{
role: 'assistant',
content: [
{ type: 'output_text', text: '我已经看过摘要' },
],
},
],
@@ -357,7 +392,6 @@ describe('modelTesterSession', () => {
type: 'input_file',
file_id: 'file_metapi_123',
filename: 'paper.pdf',
mime_type: 'application/pdf',
},
],
},
+4 -3
View File
@@ -343,7 +343,6 @@ const toResponsesContentPart = (part: ConversationContentPart): Record<string, u
if (typeof part.fileId === 'string' && part.fileId.trim()) fileBlock.file_id = part.fileId.trim();
if (typeof part.filename === 'string' && part.filename.trim()) fileBlock.filename = part.filename.trim();
if (typeof part.data === 'string' && part.data.trim()) fileBlock.file_data = part.data.trim();
if (typeof part.mimeType === 'string' && part.mimeType.trim()) fileBlock.mime_type = part.mimeType.trim();
if (Object.keys(fileBlock).length === 1) return null;
return fileBlock;
}
@@ -383,10 +382,12 @@ const toResponsesInput = (messages: ApiChatMessage[]) => {
if (!hasStructuredParts && messages.length === 1 && messages[0].role === 'user') {
return messages[0].content;
}
const toResponsesTextType = (role: ApiChatMessage['role']) =>
role === 'assistant' ? 'output_text' : 'input_text';
return messages.map((message) => ({
role: message.role === 'assistant' ? 'assistant' : 'user',
content: [
...(message.content.trim() ? [{ type: 'input_text', text: message.content }] : []),
...(message.content.trim() ? [{ type: toResponsesTextType(message.role), text: message.content }] : []),
...((Array.isArray(message.parts)
? message.parts
.map((part) => toResponsesContentPart(part))
@@ -394,7 +395,7 @@ const toResponsesInput = (messages: ApiChatMessage[]) => {
: [])),
].length > 0
? [
...(message.content.trim() ? [{ type: 'input_text', text: message.content }] : []),
...(message.content.trim() ? [{ type: toResponsesTextType(message.role), text: message.content }] : []),
...((Array.isArray(message.parts)
? message.parts
.map((part) => toResponsesContentPart(part))