mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-22 20:37:48 +00:00
chore: vitest support (#4026)
* chore: vitest * chore: move test files * chore: support vitest * fix: exclude test files * chore(ci): add test workflow * feat: remove read env
This commit is contained in:
145
packages/service/core/ai/utils.test.ts
Normal file
145
packages/service/core/ai/utils.test.ts
Normal file
@@ -0,0 +1,145 @@
|
||||
import { parseReasoningStreamContent } from './utils';
|
||||
import { expect, test } from 'vitest';
|
||||
|
||||
test('Parse reasoning stream content test', async () => {
|
||||
const partList = [
|
||||
{
|
||||
data: [{ content: '你好1' }, { content: '你好2' }, { content: '你好3' }],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ reasoning_content: '这是' },
|
||||
{ reasoning_content: '思考' },
|
||||
{ reasoning_content: '过程' },
|
||||
{ content: '你好1' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '这是思考过程' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ content: '<t' },
|
||||
{ content: 'hink>' },
|
||||
{ content: '这是' },
|
||||
{ content: '思考' },
|
||||
{ content: '过程' },
|
||||
{ content: '</think>' },
|
||||
{ content: '你好1' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '这是思考过程' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ content: '<think>' },
|
||||
{ content: '这是' },
|
||||
{ content: '思考' },
|
||||
{ content: '过程' },
|
||||
{ content: '</think>' },
|
||||
{ content: '你好1' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '这是思考过程' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ content: '<think>这是' },
|
||||
{ content: '思考' },
|
||||
{ content: '过程' },
|
||||
{ content: '</think>' },
|
||||
{ content: '你好1' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '这是思考过程' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ content: '<think>这是' },
|
||||
{ content: '思考' },
|
||||
{ content: '过程</' },
|
||||
{ content: 'think>' },
|
||||
{ content: '你好1' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '这是思考过程' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ content: '<think>这是' },
|
||||
{ content: '思考' },
|
||||
{ content: '过程</think>' },
|
||||
{ content: '你好1' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '这是思考过程' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ content: '<think>这是' },
|
||||
{ content: '思考' },
|
||||
{ content: '过程</think>你好1' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '这是思考过程' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ content: '<think>这是' },
|
||||
{ content: '思考' },
|
||||
{ content: '过程</th' },
|
||||
{ content: '假的' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' },
|
||||
{ content: '过程</think>你好1' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '你好1你好2你好3', reasoning: '这是思考过程</th假的你好2你好3过程' }
|
||||
},
|
||||
{
|
||||
data: [
|
||||
{ content: '<think>这是' },
|
||||
{ content: '思考' },
|
||||
{ content: '过程</th' },
|
||||
{ content: '假的' },
|
||||
{ content: '你好2' },
|
||||
{ content: '你好3' }
|
||||
],
|
||||
correct: { answer: '', reasoning: '这是思考过程</th假的你好2你好3' }
|
||||
}
|
||||
];
|
||||
|
||||
partList.forEach((part) => {
|
||||
const { parsePart } = parseReasoningStreamContent();
|
||||
|
||||
let answer = '';
|
||||
let reasoning = '';
|
||||
part.data.forEach((item) => {
|
||||
const formatPart = {
|
||||
choices: [
|
||||
{
|
||||
delta: {
|
||||
role: 'assistant',
|
||||
content: item.content,
|
||||
reasoning_content: item.reasoning_content
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
const [reasoningContent, content] = parsePart(formatPart, true);
|
||||
answer += content;
|
||||
reasoning += reasoningContent;
|
||||
});
|
||||
|
||||
expect(answer).toBe(part.correct.answer);
|
||||
expect(reasoning).toBe(part.correct.reasoning);
|
||||
});
|
||||
});
|
@@ -1,94 +0,0 @@
|
||||
import { ERROR_ENUM } from '@fastgpt/global/common/error/errorCode';
|
||||
|
||||
export type TestTokenType = {
|
||||
userId: string;
|
||||
teamId: string;
|
||||
tmbId: string;
|
||||
isRoot: boolean;
|
||||
};
|
||||
|
||||
export type TestRequest = {
|
||||
headers: {
|
||||
cookie?: {
|
||||
token?: TestTokenType;
|
||||
};
|
||||
authorization?: string; // testkey
|
||||
rootkey?: string; // rootkey
|
||||
};
|
||||
query: {
|
||||
[key: string]: string;
|
||||
};
|
||||
body: {
|
||||
[key: string]: string;
|
||||
};
|
||||
};
|
||||
|
||||
export function getTestRequest<Q = any, B = any>({
|
||||
query = {},
|
||||
body = {},
|
||||
authToken = true,
|
||||
// authRoot = false,
|
||||
// authApiKey = false,
|
||||
user
|
||||
}: {
|
||||
query?: Partial<Q>;
|
||||
body?: Partial<B>;
|
||||
authToken?: boolean;
|
||||
authRoot?: boolean;
|
||||
authApiKey?: boolean;
|
||||
user?: {
|
||||
uid: string;
|
||||
tmbId: string;
|
||||
teamId: string;
|
||||
isRoot: boolean;
|
||||
};
|
||||
}): [any, any] {
|
||||
const headers: TestRequest['headers'] = {};
|
||||
if (authToken) {
|
||||
headers.cookie = {
|
||||
token: {
|
||||
userId: String(user?.uid || ''),
|
||||
teamId: String(user?.teamId || ''),
|
||||
tmbId: String(user?.tmbId || ''),
|
||||
isRoot: user?.isRoot || false
|
||||
}
|
||||
};
|
||||
}
|
||||
return [
|
||||
{
|
||||
headers,
|
||||
query,
|
||||
body
|
||||
},
|
||||
{}
|
||||
];
|
||||
}
|
||||
|
||||
export const parseHeaderCertMock = async ({
|
||||
req,
|
||||
authToken = true,
|
||||
authRoot = false,
|
||||
authApiKey = false
|
||||
}: {
|
||||
req: TestRequest;
|
||||
authToken?: boolean;
|
||||
authRoot?: boolean;
|
||||
authApiKey?: boolean;
|
||||
}): Promise<TestTokenType> => {
|
||||
if (authToken) {
|
||||
const token = req.headers?.cookie?.token;
|
||||
if (!token) {
|
||||
return Promise.reject(ERROR_ENUM.unAuthorization);
|
||||
}
|
||||
return token;
|
||||
}
|
||||
// if (authRoot) {
|
||||
// // TODO: unfinished
|
||||
// return req.headers.rootkey;
|
||||
// }
|
||||
// if (authApiKey) {
|
||||
// // TODO: unfinished
|
||||
// return req.headers.authorization;
|
||||
// }
|
||||
return {} as any;
|
||||
};
|
Reference in New Issue
Block a user