From e49a831cc4115d146ff5cdc437a3fa4c84a8a8ff Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Fri, 21 Jul 2023 19:49:18 +0800 Subject: [PATCH] perf: response key --- client/src/constants/app.ts | 5 +- client/src/constants/chat.ts | 24 ++++++++++ client/src/constants/flow/ModuleTemplate.ts | 6 +-- client/src/pages/api/app/modules/chat/gpt.ts | 4 +- client/src/pages/api/app/modules/kb/search.ts | 13 ++++-- .../pages/api/openapi/v1/chat/completions.ts | 46 ++++++------------- client/src/service/api/request.ts | 8 ++-- client/src/service/models/chat.ts | 9 ++++ 8 files changed, 67 insertions(+), 48 deletions(-) diff --git a/client/src/constants/app.ts b/client/src/constants/app.ts index fab3520b6..758471851 100644 --- a/client/src/constants/app.ts +++ b/client/src/constants/app.ts @@ -14,8 +14,9 @@ export enum SystemInputEnum { 'history' = 'history', 'userChatInput' = 'userChatInput' } -export enum SpecificInputEnum { - 'answerText' = 'answerText' // answer module text key +export enum TaskResponseKeyEnum { + 'answerText' = 'answerText', // answer module text key + 'responseData' = 'responseData' } export enum VariableInputEnum { input = 'input', diff --git a/client/src/constants/chat.ts b/client/src/constants/chat.ts index 08eb057e0..3f0ed25b6 100644 --- a/client/src/constants/chat.ts +++ b/client/src/constants/chat.ts @@ -24,6 +24,30 @@ export const ChatRoleMap = { } }; +export enum ChatSourceEnum { + 'test' = 'test', + online = 'online', + share = 'share', + api = 'api' +} + +export const ChatSourceMap = { + [ChatSourceEnum.test]: { + name: '调试测试' + }, + [ChatSourceEnum.online]: { + name: '在线使用' + }, + [ChatSourceEnum.share]: { + name: '链接分享' + }, + [ChatSourceEnum.api]: { + name: 'API调用' + } +}; + +export const responseDataKey = 'responseData'; + export const rawSearchKey = 'rawSearch'; export const quoteLenKey = 'quoteLen'; diff --git a/client/src/constants/flow/ModuleTemplate.ts b/client/src/constants/flow/ModuleTemplate.ts index 564e42db1..44020104c 100644 --- a/client/src/constants/flow/ModuleTemplate.ts +++ b/client/src/constants/flow/ModuleTemplate.ts @@ -1,4 +1,4 @@ -import { AppModuleItemTypeEnum, SystemInputEnum, SpecificInputEnum } from '../app'; +import { AppModuleItemTypeEnum, SystemInputEnum, TaskResponseKeyEnum } from '../app'; import { FlowModuleTypeEnum, FlowInputItemTypeEnum, FlowOutputItemTypeEnum } from './index'; import type { AppItemType, AppModuleTemplateItemType } from '@/types/app'; import { chatModelList } from '@/store/static'; @@ -177,7 +177,7 @@ export const ChatModule: AppModuleTemplateItemType = { ], outputs: [ { - key: SpecificInputEnum.answerText, + key: TaskResponseKeyEnum.answerText, label: '模型回复', description: '直接响应,无需配置', type: FlowOutputItemTypeEnum.hidden, @@ -264,7 +264,7 @@ export const AnswerModule: AppModuleTemplateItemType = { inputs: [ Input_Template_TFSwitch, { - key: SpecificInputEnum.answerText, + key: TaskResponseKeyEnum.answerText, value: '', type: FlowInputItemTypeEnum.textarea, label: '回复的内容' diff --git a/client/src/pages/api/app/modules/chat/gpt.ts b/client/src/pages/api/app/modules/chat/gpt.ts index d763c7c4d..2bd51806c 100644 --- a/client/src/pages/api/app/modules/chat/gpt.ts +++ b/client/src/pages/api/app/modules/chat/gpt.ts @@ -10,7 +10,7 @@ import type { ChatItemType } from '@/types/chat'; import { ChatRoleEnum, sseResponseEventEnum } from '@/constants/chat'; import { parseStreamChunk, textAdaptGptResponse } from '@/utils/adapt'; import { getOpenAIApi, axiosConfig } from '@/service/ai/openai'; -import { SpecificInputEnum } from '@/constants/app'; +import { TaskResponseKeyEnum } from '@/constants/app'; import { getChatModel } from '@/service/utils/data'; import { countModelPrice, pushTaskBillListItem } from '@/service/events/pushBill'; import { authUser } from '@/service/utils/auth'; @@ -27,7 +27,7 @@ export type Props = { limitPrompt?: string; billId?: string; }; -export type Response = { [SpecificInputEnum.answerText]: string; totalTokens: number }; +export type Response = { [TaskResponseKeyEnum.answerText]: string; totalTokens: number }; export default async function handler(req: NextApiRequest, res: NextApiResponse) { let { model, stream } = req.body as Props; diff --git a/client/src/pages/api/app/modules/kb/search.ts b/client/src/pages/api/app/modules/kb/search.ts index e4bc3c195..984bc6a37 100644 --- a/client/src/pages/api/app/modules/kb/search.ts +++ b/client/src/pages/api/app/modules/kb/search.ts @@ -3,7 +3,7 @@ import { jsonRes } from '@/service/response'; import { PgClient } from '@/service/pg'; import { withNextCors } from '@/service/utils/tools'; import type { ChatItemType } from '@/types/chat'; -import { ChatRoleEnum, rawSearchKey } from '@/constants/chat'; +import { ChatRoleEnum, rawSearchKey, responseDataKey } from '@/constants/chat'; import { modelToolMap } from '@/utils/plugin'; import { getVector } from '@/pages/api/openapi/plugin/vector'; import { countModelPrice, pushTaskBillListItem } from '@/service/events/pushBill'; @@ -29,7 +29,9 @@ type Props = { billId?: string; }; type Response = { - [rawSearchKey]: QuoteItemType[]; + [responseDataKey]: { + [rawSearchKey]: QuoteItemType[]; + }; isEmpty?: boolean; quotePrompt?: string; }; @@ -112,7 +114,6 @@ export async function kbSearch({ // filter part quote by maxToken const sliceResult = modelToolMap .tokenSlice({ - model: 'gpt-3.5-turbo', maxToken, messages: searchRes.map((item, i) => ({ obj: ChatRoleEnum.System, @@ -128,7 +129,9 @@ export async function kbSearch({ return { isEmpty: rawSearch.length === 0 ? true : undefined, - rawSearch, - quotePrompt: sliceResult ? `知识库:\n${sliceResult}` : undefined + quotePrompt: sliceResult ? `知识库:\n${sliceResult}` : undefined, + responseData: { + rawSearch + } }; } diff --git a/client/src/pages/api/openapi/v1/chat/completions.ts b/client/src/pages/api/openapi/v1/chat/completions.ts index dfd5de2ea..8a4c73ba7 100644 --- a/client/src/pages/api/openapi/v1/chat/completions.ts +++ b/client/src/pages/api/openapi/v1/chat/completions.ts @@ -10,7 +10,7 @@ import { getChatHistory } from './getHistory'; import { saveChat } from '@/pages/api/chat/saveChat'; import { sseResponse } from '@/service/utils/tools'; import { type ChatCompletionRequestMessage } from 'openai'; -import { SpecificInputEnum, AppModuleItemTypeEnum } from '@/constants/app'; +import { TaskResponseKeyEnum, AppModuleItemTypeEnum } from '@/constants/app'; import { Types } from 'mongoose'; import { moduleFetch } from '@/service/api/request'; import { AppModuleItemType, RunningModuleItemType } from '@/types/app'; @@ -223,34 +223,23 @@ export async function dispatchModules({ }) { const runningModules = loadModules(modules, variables); - let storeData: Record = {}; // after module used - let responseData: Record = {}; // response request and save to database + // let storeData: Record = {}; // after module used + let chatResponse: Record = {}; // response request and save to database let answerText = ''; // AI answer function pushStore({ - isResponse = false, answer, - data = {} + responseData = {} }: { - isResponse?: boolean; answer?: string; - data?: Record; + responseData?: Record; }) { - if (isResponse) { - responseData = { - ...responseData, - ...data - }; - } - - if (answer) { - answerText += answer; - } - - storeData = { - ...storeData, - ...data + chatResponse = { + ...chatResponse, + ...responseData }; + + answerText += answer; } function moduleInput( module: RunningModuleItemType, @@ -282,20 +271,13 @@ export async function dispatchModules({ module: RunningModuleItemType, result: Record = {} ): Promise { + pushStore(result); return Promise.all( module.outputs.map((outputItem) => { if (result[outputItem.key] === undefined) return; /* update output value */ outputItem.value = result[outputItem.key]; - pushStore({ - isResponse: outputItem.response, - answer: outputItem.answer ? outputItem.value : '', - data: { - [outputItem.key]: outputItem.value - } - }); - /* update target */ return Promise.all( outputItem.targets.map((target: any) => { @@ -315,7 +297,7 @@ export async function dispatchModules({ // direct answer if (module.type === AppModuleItemTypeEnum.answer) { const text = - module.inputs.find((item) => item.key === SpecificInputEnum.answerText)?.value || ''; + module.inputs.find((item) => item.key === TaskResponseKeyEnum.answerText)?.value || ''; pushStore({ answer: text }); @@ -365,7 +347,7 @@ export async function dispatchModules({ await Promise.all(initModules.map((module) => moduleInput(module, params))); return { - responseData, + responseData: chatResponse, answerText }; } @@ -402,7 +384,7 @@ function loadModules( }), outputs: module.outputs.map((item) => ({ key: item.key, - answer: item.key === SpecificInputEnum.answerText, + answer: item.key === TaskResponseKeyEnum.answerText, response: item.response, value: undefined, targets: item.targets diff --git a/client/src/service/api/request.ts b/client/src/service/api/request.ts index 1bc7275a9..feda9333d 100644 --- a/client/src/service/api/request.ts +++ b/client/src/service/api/request.ts @@ -3,7 +3,7 @@ import { getErrText } from '@/utils/tools'; import { parseStreamChunk } from '@/utils/adapt'; import { NextApiResponse } from 'next'; import { sseResponse } from '../utils/tools'; -import { SpecificInputEnum } from '@/constants/app'; +import { TaskResponseKeyEnum } from '@/constants/app'; interface Props { res: NextApiResponse; // 用于流转发 @@ -45,7 +45,7 @@ export const moduleFetch = ({ url, data, res }: Props) => const reader = response.body?.getReader(); let chatResponse: Record = { - [SpecificInputEnum.answerText]: '' + [TaskResponseKeyEnum.answerText]: '' }; const read = async () => { @@ -85,8 +85,8 @@ export const moduleFetch = ({ url, data, res }: Props) => if (answer) { chatResponse = { ...chatResponse, - [SpecificInputEnum.answerText]: - chatResponse[SpecificInputEnum.answerText] + answer + [TaskResponseKeyEnum.answerText]: + chatResponse[TaskResponseKeyEnum.answerText] + answer }; } diff --git a/client/src/service/models/chat.ts b/client/src/service/models/chat.ts index 4b9ae0833..df5d2fbe2 100644 --- a/client/src/service/models/chat.ts +++ b/client/src/service/models/chat.ts @@ -1,6 +1,7 @@ import { Schema, model, models, Model } from 'mongoose'; import { ChatSchema as ChatType } from '@/types/mongoSchema'; import { ChatRoleMap } from '@/constants/chat'; +import { ChatSourceEnum, ChatSourceMap } from '@/constants/chat'; const ChatSchema = new Schema({ userId: { @@ -32,6 +33,14 @@ const ChatSchema = new Schema({ type: Object, default: {} }, + // source: { + // type: String, + // enum: Object.keys(ChatSourceMap), + // required: true + // }, + // shareId: { + // type: String + // }, content: { type: [ {