forked from labring/FastGPT
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
23 changed files
with
2,047 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,10 @@ | ||
function Error({ statusCode }: { statusCode: number }) { | ||
return ( | ||
<p> | ||
{statusCode ? `An error ${statusCode} occurred on server` : 'An error occurred on client'} | ||
</p> | ||
); | ||
function Error({ errStr }: { errStr: string }) { | ||
return <p>{errStr}</p>; | ||
} | ||
|
||
Error.getInitialProps = ({ res, err }: { res: any; err: any }) => { | ||
const statusCode = res ? res.statusCode : err ? err.statusCode : 404; | ||
console.log(err); | ||
return { statusCode }; | ||
return { errStr: JSON.stringify(err) }; | ||
}; | ||
|
||
export default Error; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
import type { NextApiRequest, NextApiResponse } from 'next'; | ||
import { connectToDatabase } from '@/service/mongo'; | ||
import { authShareChat } from '@/service/utils/auth'; | ||
import { modelServiceToolMap } from '@/service/utils/chat'; | ||
import { ChatItemSimpleType } from '@/types/chat'; | ||
import { jsonRes } from '@/service/response'; | ||
import { PassThrough } from 'stream'; | ||
import { ChatModelMap, ModelVectorSearchModeMap } from '@/constants/model'; | ||
import { pushChatBill, updateShareChatBill } from '@/service/events/pushBill'; | ||
import { resStreamResponse } from '@/service/utils/chat'; | ||
import { searchKb } from '@/service/plugins/searchKb'; | ||
import { ChatRoleEnum } from '@/constants/chat'; | ||
|
||
/* 发送提示词 */ | ||
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | ||
let step = 0; // step=1 时,表示开始了流响应 | ||
const stream = new PassThrough(); | ||
stream.on('error', () => { | ||
console.log('error: ', 'stream error'); | ||
stream.destroy(); | ||
}); | ||
res.on('close', () => { | ||
stream.destroy(); | ||
}); | ||
res.on('error', () => { | ||
console.log('error: ', 'request error'); | ||
stream.destroy(); | ||
}); | ||
|
||
try { | ||
const { shareId, password, historyId, prompts } = req.body as { | ||
prompts: ChatItemSimpleType[]; | ||
password: string; | ||
shareId: string; | ||
historyId: string; | ||
}; | ||
|
||
if (!historyId || !prompts) { | ||
throw new Error('分享链接无效'); | ||
} | ||
|
||
await connectToDatabase(); | ||
let startTime = Date.now(); | ||
|
||
const { model, showModelDetail, userOpenAiKey, systemAuthKey, userId } = await authShareChat({ | ||
shareId, | ||
password | ||
}); | ||
|
||
const modelConstantsData = ChatModelMap[model.chat.chatModel]; | ||
|
||
// 使用了知识库搜索 | ||
if (model.chat.useKb) { | ||
const { code, searchPrompts } = await searchKb({ | ||
userOpenAiKey, | ||
prompts, | ||
similarity: ModelVectorSearchModeMap[model.chat.searchMode]?.similarity, | ||
model, | ||
userId | ||
}); | ||
|
||
// search result is empty | ||
if (code === 201) { | ||
return res.send(searchPrompts[0]?.value); | ||
} | ||
|
||
prompts.splice(prompts.length - 3, 0, ...searchPrompts); | ||
} else { | ||
// 没有用知识库搜索,仅用系统提示词 | ||
model.chat.systemPrompt && | ||
prompts.splice(prompts.length - 3, 0, { | ||
obj: ChatRoleEnum.System, | ||
value: model.chat.systemPrompt | ||
}); | ||
} | ||
|
||
// 计算温度 | ||
const temperature = (modelConstantsData.maxTemperature * (model.chat.temperature / 10)).toFixed( | ||
2 | ||
); | ||
|
||
// 发出请求 | ||
const { streamResponse } = await modelServiceToolMap[model.chat.chatModel].chatCompletion({ | ||
apiKey: userOpenAiKey || systemAuthKey, | ||
temperature: +temperature, | ||
messages: prompts, | ||
stream: true, | ||
res, | ||
chatId: historyId | ||
}); | ||
|
||
console.log('api response time:', `${(Date.now() - startTime) / 1000}s`); | ||
|
||
step = 1; | ||
|
||
const { totalTokens, finishMessages } = await resStreamResponse({ | ||
model: model.chat.chatModel, | ||
res, | ||
stream, | ||
chatResponse: streamResponse, | ||
prompts, | ||
systemPrompt: '' | ||
}); | ||
|
||
/* bill */ | ||
pushChatBill({ | ||
isPay: !userOpenAiKey, | ||
chatModel: model.chat.chatModel, | ||
userId, | ||
textLen: finishMessages.map((item) => item.value).join('').length, | ||
tokens: totalTokens | ||
}); | ||
updateShareChatBill({ | ||
shareId, | ||
tokens: totalTokens | ||
}); | ||
} catch (err: any) { | ||
if (step === 1) { | ||
// 直接结束流 | ||
console.log('error,结束'); | ||
stream.destroy(); | ||
} else { | ||
res.status(500); | ||
jsonRes(res, { | ||
code: 500, | ||
error: err | ||
}); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
import type { NextApiRequest, NextApiResponse } from 'next'; | ||
import { jsonRes } from '@/service/response'; | ||
import { connectToDatabase, ShareChat } from '@/service/mongo'; | ||
import { authModel, authToken } from '@/service/utils/auth'; | ||
import type { ShareChatEditType } from '@/types/model'; | ||
|
||
/* create a shareChat */ | ||
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | ||
try { | ||
const { modelId, name, maxContext, password } = req.body as ShareChatEditType & { | ||
modelId: string; | ||
}; | ||
|
||
await connectToDatabase(); | ||
|
||
const userId = await authToken(req); | ||
await authModel({ | ||
modelId, | ||
userId | ||
}); | ||
|
||
const { _id } = await ShareChat.create({ | ||
userId, | ||
modelId, | ||
name, | ||
password, | ||
maxContext | ||
}); | ||
|
||
jsonRes(res, { | ||
data: _id | ||
}); | ||
} catch (err) { | ||
jsonRes(res, { | ||
code: 500, | ||
error: err | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import type { NextApiRequest, NextApiResponse } from 'next'; | ||
import { jsonRes } from '@/service/response'; | ||
import { connectToDatabase, ShareChat } from '@/service/mongo'; | ||
import { authToken } from '@/service/utils/auth'; | ||
|
||
/* delete a shareChat by shareChatId */ | ||
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | ||
try { | ||
const { id } = req.query as { | ||
id: string; | ||
}; | ||
|
||
await connectToDatabase(); | ||
|
||
const userId = await authToken(req); | ||
|
||
await ShareChat.findOneAndRemove({ | ||
_id: id, | ||
userId | ||
}); | ||
|
||
jsonRes(res); | ||
} catch (err) { | ||
jsonRes(res, { | ||
code: 500, | ||
error: err | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
import type { NextApiRequest, NextApiResponse } from 'next'; | ||
import { jsonRes } from '@/service/response'; | ||
import { connectToDatabase, ShareChat } from '@/service/mongo'; | ||
import type { InitShareChatResponse } from '@/api/response/chat'; | ||
import { authModel } from '@/service/utils/auth'; | ||
import { hashPassword } from '@/service/utils/tools'; | ||
|
||
/* 初始化我的聊天框,需要身份验证 */ | ||
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | ||
try { | ||
let { shareId, password = '' } = req.query as { | ||
shareId: string; | ||
password: string; | ||
}; | ||
|
||
if (!shareId) { | ||
throw new Error('params is error'); | ||
} | ||
|
||
await connectToDatabase(); | ||
|
||
// get shareChat | ||
const shareChat = await ShareChat.findById(shareId); | ||
|
||
if (!shareChat) { | ||
throw new Error('分享链接已失效'); | ||
} | ||
|
||
if (shareChat.password !== hashPassword(password)) { | ||
return jsonRes(res, { | ||
code: 501, | ||
message: '密码不正确' | ||
}); | ||
} | ||
|
||
// 校验使用权限 | ||
const { model } = await authModel({ | ||
modelId: shareChat.modelId, | ||
userId: String(shareChat.userId) | ||
}); | ||
|
||
jsonRes<InitShareChatResponse>(res, { | ||
data: { | ||
maxContext: shareChat.maxContext, | ||
model: { | ||
name: model.name, | ||
avatar: model.avatar, | ||
intro: model.share.intro | ||
}, | ||
chatModel: model.chat.chatModel | ||
} | ||
}); | ||
} catch (err) { | ||
jsonRes(res, { | ||
code: 500, | ||
error: err | ||
}); | ||
} | ||
} |
Oops, something went wrong.