Revert "sub plan page (#885)" (#886)

This reverts commit 443ad37b6a.
This commit is contained in:
Archer
2024-02-23 17:48:15 +08:00
committed by GitHub
parent 443ad37b6a
commit fd9b6291af
246 changed files with 4281 additions and 6286 deletions

View File

@@ -1,12 +1,9 @@
import { adaptChat2GptMessages } from '@fastgpt/global/core/chat/adapt';
import { ChatContextFilter, countMessagesChars } from '@fastgpt/service/core/chat/utils';
import { ChatContextFilter } from '@fastgpt/service/core/chat/utils';
import type { moduleDispatchResType, ChatItemType } from '@fastgpt/global/core/chat/type.d';
import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants';
import { getAIApi } from '@fastgpt/service/core/ai/config';
import type {
ClassifyQuestionAgentItemType,
ModuleDispatchResponse
} from '@fastgpt/global/core/module/type.d';
import type { ClassifyQuestionAgentItemType } from '@fastgpt/global/core/module/type.d';
import { ModuleInputKeyEnum, ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants';
import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d';
import { replaceVariable } from '@fastgpt/global/common/string/tools';
@@ -14,7 +11,7 @@ import { Prompt_CQJson } from '@/global/core/prompt/agent';
import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d';
import { ModelTypeEnum, getLLMModel } from '@/service/core/ai/model';
import { getHistories } from '../utils';
import { formatModelChars2Points } from '@/service/support/wallet/usage/utils';
import { formatModelPrice2Store } from '@/service/support/wallet/bill/utils';
type Props = ModuleDispatchProps<{
[ModuleInputKeyEnum.aiModel]: string;
@@ -23,9 +20,10 @@ type Props = ModuleDispatchProps<{
[ModuleInputKeyEnum.userChatInput]: string;
[ModuleInputKeyEnum.agents]: ClassifyQuestionAgentItemType[];
}>;
type CQResponse = ModuleDispatchResponse<{
type CQResponse = {
[ModuleOutputKeyEnum.responseData]: moduleDispatchResType;
[key: string]: any;
}>;
};
const agentFunName = 'classify_question';
@@ -33,7 +31,6 @@ const agentFunName = 'classify_question';
export const dispatchClassifyQuestion = async (props: Props): Promise<CQResponse> => {
const {
user,
module: { name },
histories,
params: { model, history = 6, agents, userChatInput }
} = props as Props;
@@ -46,7 +43,7 @@ export const dispatchClassifyQuestion = async (props: Props): Promise<CQResponse
const chatHistories = getHistories(history, histories);
const { arg, charsLength } = await (async () => {
const { arg, inputTokens, outputTokens } = await (async () => {
if (cqModel.toolChoice) {
return toolChoice({
...props,
@@ -63,31 +60,25 @@ export const dispatchClassifyQuestion = async (props: Props): Promise<CQResponse
const result = agents.find((item) => item.key === arg?.type) || agents[agents.length - 1];
const { totalPoints, modelName } = formatModelChars2Points({
const { total, modelName } = formatModelPrice2Store({
model: cqModel.model,
charsLength,
modelType: ModelTypeEnum.llm
inputLen: inputTokens,
outputLen: outputTokens,
type: ModelTypeEnum.llm
});
return {
[result.key]: true,
[ModuleOutputKeyEnum.responseData]: {
totalPoints: user.openaiAccount?.key ? 0 : totalPoints,
price: user.openaiAccount?.key ? 0 : total,
model: modelName,
query: userChatInput,
charsLength,
inputTokens,
outputTokens,
cqList: agents,
cqResult: result.value,
contextTotalLen: chatHistories.length + 2
},
[ModuleOutputKeyEnum.moduleDispatchBills]: [
{
moduleName: name,
totalPoints,
model: modelName,
charsLength
}
]
}
};
};
@@ -158,13 +149,11 @@ ${systemPrompt}
const arg = JSON.parse(
response?.choices?.[0]?.message?.tool_calls?.[0]?.function?.arguments || ''
);
const functionChars =
agentFunction.description.length +
agentFunction.parameters.properties.type.description.length;
return {
arg,
charsLength: countMessagesChars(messages) + functionChars
inputTokens: response.usage?.prompt_tokens || 0,
outputTokens: response.usage?.completion_tokens || 0
};
} catch (error) {
console.log(agentFunction.parameters);
@@ -174,7 +163,8 @@ ${systemPrompt}
return {
arg: {},
charsLength: 0
inputTokens: 0,
outputTokens: 0
};
}
}
@@ -216,7 +206,8 @@ async function completions({
agents.find((item) => answer.includes(item.key) || answer.includes(item.value))?.key || '';
return {
charsLength: countMessagesChars(messages),
inputTokens: data.usage?.prompt_tokens || 0,
outputTokens: data.usage?.completion_tokens || 0,
arg: { type: id }
};
}

View File

@@ -1,12 +1,9 @@
import { adaptChat2GptMessages } from '@fastgpt/global/core/chat/adapt';
import { ChatContextFilter, countMessagesChars } from '@fastgpt/service/core/chat/utils';
import { ChatContextFilter } from '@fastgpt/service/core/chat/utils';
import type { moduleDispatchResType, ChatItemType } from '@fastgpt/global/core/chat/type.d';
import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants';
import { getAIApi } from '@fastgpt/service/core/ai/config';
import type {
ContextExtractAgentItemType,
ModuleDispatchResponse
} from '@fastgpt/global/core/module/type';
import type { ContextExtractAgentItemType } from '@fastgpt/global/core/module/type';
import { ModuleInputKeyEnum, ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants';
import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d';
import { Prompt_ExtractJson } from '@/global/core/prompt/agent';
@@ -14,7 +11,7 @@ import { replaceVariable } from '@fastgpt/global/common/string/tools';
import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d';
import { getHistories } from '../utils';
import { ModelTypeEnum, getLLMModel } from '@/service/core/ai/model';
import { formatModelChars2Points } from '@/service/support/wallet/usage/utils';
import { formatModelPrice2Store } from '@/service/support/wallet/bill/utils';
type Props = ModuleDispatchProps<{
[ModuleInputKeyEnum.history]?: ChatItemType[];
@@ -23,18 +20,18 @@ type Props = ModuleDispatchProps<{
[ModuleInputKeyEnum.description]: string;
[ModuleInputKeyEnum.aiModel]: string;
}>;
type Response = ModuleDispatchResponse<{
type Response = {
[ModuleOutputKeyEnum.success]?: boolean;
[ModuleOutputKeyEnum.failed]?: boolean;
[ModuleOutputKeyEnum.contextExtractFields]: string;
}>;
[ModuleOutputKeyEnum.responseData]: moduleDispatchResType;
};
const agentFunName = 'extract_json_data';
export async function dispatchContentExtract(props: Props): Promise<Response> {
const {
user,
module: { name },
histories,
params: { content, history = 6, model, description, extractKeys }
} = props;
@@ -46,7 +43,7 @@ export async function dispatchContentExtract(props: Props): Promise<Response> {
const extractModel = getLLMModel(model);
const chatHistories = getHistories(history, histories);
const { arg, charsLength } = await (async () => {
const { arg, inputTokens, outputTokens } = await (async () => {
if (extractModel.toolChoice) {
return toolChoice({
...props,
@@ -83,10 +80,11 @@ export async function dispatchContentExtract(props: Props): Promise<Response> {
}
}
const { totalPoints, modelName } = formatModelChars2Points({
const { total, modelName } = formatModelPrice2Store({
model: extractModel.model,
charsLength,
modelType: ModelTypeEnum.llm
inputLen: inputTokens,
outputLen: outputTokens,
type: ModelTypeEnum.llm
});
return {
@@ -95,22 +93,15 @@ export async function dispatchContentExtract(props: Props): Promise<Response> {
[ModuleOutputKeyEnum.contextExtractFields]: JSON.stringify(arg),
...arg,
[ModuleOutputKeyEnum.responseData]: {
totalPoints: user.openaiAccount?.key ? 0 : totalPoints,
price: user.openaiAccount?.key ? 0 : total,
model: modelName,
query: content,
charsLength,
inputTokens,
outputTokens,
extractDescription: description,
extractResult: arg,
contextTotalLen: chatHistories.length + 2
},
[ModuleOutputKeyEnum.moduleDispatchBills]: [
{
moduleName: name,
totalPoints,
model: modelName,
charsLength
}
]
}
};
}
@@ -202,12 +193,10 @@ ${description || '根据用户要求获取适当的 JSON 字符串。'}
}
})();
const functionChars =
description.length + extractKeys.reduce((sum, item) => sum + item.desc.length, 0);
return {
rawResponse: response?.choices?.[0]?.message?.tool_calls?.[0]?.function?.arguments || '',
charsLength: countMessagesChars(messages) + functionChars,
inputTokens: response.usage?.prompt_tokens || 0,
outputTokens: response.usage?.completion_tokens || 0,
arg
};
}
@@ -249,6 +238,8 @@ Human: ${content}`
stream: false
});
const answer = data.choices?.[0].message?.content || '';
const inputTokens = data.usage?.prompt_tokens || 0;
const outputTokens = data.usage?.completion_tokens || 0;
// parse response
const start = answer.indexOf('{');
@@ -257,7 +248,8 @@ Human: ${content}`
if (start === -1 || end === -1)
return {
rawResponse: answer,
charsLength: countMessagesChars(messages),
inputTokens,
outputTokens,
arg: {}
};
@@ -269,14 +261,15 @@ Human: ${content}`
try {
return {
rawResponse: answer,
charsLength: countMessagesChars(messages),
inputTokens,
outputTokens,
arg: JSON.parse(jsonStr) as Record<string, any>
};
} catch (error) {
return {
rawResponse: answer,
charsLength: countMessagesChars(messages),
inputTokens,
outputTokens,
arg: {}
};
}

View File

@@ -1,16 +1,16 @@
import type { NextApiResponse } from 'next';
import { ChatContextFilter, countMessagesChars } from '@fastgpt/service/core/chat/utils';
import { ChatContextFilter } from '@fastgpt/service/core/chat/utils';
import type { moduleDispatchResType, ChatItemType } from '@fastgpt/global/core/chat/type.d';
import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants';
import { sseResponseEventEnum } from '@fastgpt/service/common/response/constant';
import { textAdaptGptResponse } from '@/utils/adapt';
import { getAIApi } from '@fastgpt/service/core/ai/config';
import type { ChatCompletion, StreamChatType } from '@fastgpt/global/core/ai/type.d';
import { formatModelChars2Points } from '@/service/support/wallet/usage/utils';
import { formatModelPrice2Store } from '@/service/support/wallet/bill/utils';
import type { LLMModelItemType } from '@fastgpt/global/core/ai/model.d';
import { postTextCensor } from '@/service/common/censor';
import { ChatCompletionRequestMessageRoleEnum } from '@fastgpt/global/core/ai/constant';
import type { ModuleDispatchResponse, ModuleItemType } from '@fastgpt/global/core/module/type.d';
import type { ModuleItemType } from '@fastgpt/global/core/module/type.d';
import { countMessagesTokens, sliceMessagesTB } from '@fastgpt/global/common/string/tiktoken';
import { adaptChat2GptMessages } from '@fastgpt/global/core/chat/adapt';
import { Prompt_QuotePromptList, Prompt_QuoteTemplateList } from '@/global/core/prompt/AIChat';
@@ -32,10 +32,11 @@ export type ChatProps = ModuleDispatchProps<
[ModuleInputKeyEnum.aiChatDatasetQuote]?: SearchDataResponseItemType[];
}
>;
export type ChatResponse = ModuleDispatchResponse<{
export type ChatResponse = {
[ModuleOutputKeyEnum.answerText]: string;
[ModuleOutputKeyEnum.responseData]: moduleDispatchResType;
[ModuleOutputKeyEnum.history]: ChatItemType[];
}>;
};
/* request openai chat */
export const dispatchChatCompletion = async (props: ChatProps): Promise<ChatResponse> => {
@@ -45,7 +46,7 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise<ChatResp
detail = false,
user,
histories,
module: { name, outputs },
outputs,
params: {
model,
temperature = 0,
@@ -153,7 +154,7 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise<ChatResp
}
);
const { answerText, completeMessages } = await (async () => {
const { answerText, inputTokens, outputTokens, completeMessages } = await (async () => {
if (stream) {
// sse response
const { answer } = await streamResponse({
@@ -171,6 +172,17 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise<ChatResp
return {
answerText: answer,
inputTokens: countMessagesTokens({
messages: filterMessages
}),
outputTokens: countMessagesTokens({
messages: [
{
obj: ChatRoleEnum.AI,
value: answer
}
]
}),
completeMessages
};
} else {
@@ -184,38 +196,33 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise<ChatResp
return {
answerText: answer,
inputTokens: unStreamResponse.usage?.prompt_tokens || 0,
outputTokens: unStreamResponse.usage?.completion_tokens || 0,
completeMessages
};
}
})();
const charsLength = countMessagesChars(completeMessages);
const { totalPoints, modelName } = formatModelChars2Points({
const { total, modelName } = formatModelPrice2Store({
model,
charsLength,
modelType: ModelTypeEnum.llm
inputLen: inputTokens,
outputLen: outputTokens,
type: ModelTypeEnum.llm
});
return {
answerText,
[ModuleOutputKeyEnum.responseData]: {
totalPoints: user.openaiAccount?.key ? 0 : totalPoints,
responseData: {
price: user.openaiAccount?.key ? 0 : total,
model: modelName,
charsLength,
inputTokens,
outputTokens,
query: `${userChatInput}`,
maxToken: max_tokens,
quoteList: filterQuoteQA,
historyPreview: getHistoryPreview(completeMessages),
contextTotalLen: completeMessages.length
},
[ModuleOutputKeyEnum.moduleDispatchBills]: [
{
moduleName: name,
totalPoints,
model: modelName,
charsLength
}
],
history: completeMessages
};
};
@@ -242,13 +249,30 @@ function filterQuote({
// slice filterSearch
const filterQuoteQA = filterSearchResultsByMaxChars(quoteQA, model.quoteMaxToken);
// filterQuoteQA按collectionId聚合在一起后再按chunkIndex从小到大排序
const sortQuoteQAMap: Record<string, SearchDataResponseItemType[]> = {};
filterQuoteQA.forEach((item) => {
if (sortQuoteQAMap[item.collectionId]) {
sortQuoteQAMap[item.collectionId].push(item);
} else {
sortQuoteQAMap[item.collectionId] = [item];
}
});
const sortQuoteQAList = Object.values(sortQuoteQAMap);
sortQuoteQAList.forEach((qaList) => {
qaList.sort((a, b) => a.chunkIndex - b.chunkIndex);
});
const flatQuoteList = sortQuoteQAList.flat();
const quoteText =
filterQuoteQA.length > 0
? `${filterQuoteQA.map((item, index) => getValue(item, index).trim()).join('\n------\n')}`
flatQuoteList.length > 0
? `${flatQuoteList.map((item, index) => getValue(item, index)).join('\n')}`
: '';
return {
filterQuoteQA: filterQuoteQA,
filterQuoteQA: flatQuoteList,
quoteText
};
}

View File

@@ -1,19 +1,15 @@
import type { moduleDispatchResType } from '@fastgpt/global/core/chat/type.d';
import { formatModelChars2Points } from '@/service/support/wallet/usage/utils';
import { formatModelPrice2Store } from '@/service/support/wallet/bill/utils';
import type { SelectedDatasetType } from '@fastgpt/global/core/module/api.d';
import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
import type {
ModuleDispatchProps,
ModuleDispatchResponse
} from '@fastgpt/global/core/module/type.d';
import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d';
import { ModelTypeEnum, getLLMModel, getVectorModel } from '@/service/core/ai/model';
import { searchDatasetData } from '@/service/core/dataset/data/controller';
import { ModuleInputKeyEnum, ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants';
import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constants';
import { queryExtension } from '@fastgpt/service/core/ai/functions/queryExtension';
import { getHistories } from '../utils';
import { datasetSearchQueryExtension } from '@fastgpt/service/core/dataset/search/utils';
import { ChatModuleBillType } from '@fastgpt/global/support/wallet/bill/type';
import { checkTeamReRankPermission } from '@/service/support/permission/teamLimit';
type DatasetSearchProps = ModuleDispatchProps<{
[ModuleInputKeyEnum.datasetSelectList]: SelectedDatasetType;
@@ -26,11 +22,12 @@ type DatasetSearchProps = ModuleDispatchProps<{
[ModuleInputKeyEnum.datasetSearchExtensionModel]: string;
[ModuleInputKeyEnum.datasetSearchExtensionBg]: string;
}>;
export type DatasetSearchResponse = ModuleDispatchResponse<{
export type DatasetSearchResponse = {
[ModuleOutputKeyEnum.responseData]: moduleDispatchResType;
[ModuleOutputKeyEnum.datasetIsEmpty]?: boolean;
[ModuleOutputKeyEnum.datasetUnEmpty]?: boolean;
[ModuleOutputKeyEnum.datasetQuoteQA]: SearchDataResponseItemType[];
}>;
};
export async function dispatchDatasetSearch(
props: DatasetSearchProps
@@ -38,7 +35,6 @@ export async function dispatchDatasetSearch(
const {
teamId,
histories,
module,
params: {
datasets = [],
similarity,
@@ -77,8 +73,6 @@ export async function dispatchDatasetSearch(
histories: getHistories(6, histories)
});
// console.log(concatQueries, rewriteQuery, aiExtensionResult);
// get vector
const vectorModel = getVectorModel(datasets[0]?.vectorModel?.model);
@@ -97,18 +91,18 @@ export async function dispatchDatasetSearch(
limit,
datasetIds: datasets.map((item) => item.datasetId),
searchMode,
usingReRank: usingReRank && (await checkTeamReRankPermission(teamId))
usingReRank
});
// count bill results
// vector
const { totalPoints, modelName } = formatModelChars2Points({
const { total, modelName } = formatModelPrice2Store({
model: vectorModel.model,
charsLength,
modelType: ModelTypeEnum.vector
inputLen: charsLength,
type: ModelTypeEnum.vector
});
const responseData: moduleDispatchResType & { totalPoints: number } = {
totalPoints,
const responseData: moduleDispatchResType & { price: number } = {
price: total,
query: concatQueries.join('\n'),
model: modelName,
charsLength,
@@ -117,42 +111,28 @@ export async function dispatchDatasetSearch(
searchMode,
searchUsingReRank: searchUsingReRank
};
const moduleDispatchBills: ChatModuleBillType[] = [
{
totalPoints,
moduleName: module.name,
model: modelName,
charsLength
}
];
if (aiExtensionResult) {
const { totalPoints, modelName } = formatModelChars2Points({
const { total, modelName } = formatModelPrice2Store({
model: aiExtensionResult.model,
charsLength: aiExtensionResult.charsLength,
modelType: ModelTypeEnum.llm
inputLen: aiExtensionResult.inputTokens,
outputLen: aiExtensionResult.outputTokens,
type: ModelTypeEnum.llm
});
responseData.totalPoints += totalPoints;
responseData.charsLength = aiExtensionResult.charsLength;
responseData.price += total;
responseData.inputTokens = aiExtensionResult.inputTokens;
responseData.outputTokens = aiExtensionResult.outputTokens;
responseData.extensionModel = modelName;
responseData.extensionResult =
aiExtensionResult.extensionQueries?.join('\n') ||
JSON.stringify(aiExtensionResult.extensionQueries);
moduleDispatchBills.push({
totalPoints,
moduleName: 'core.module.template.Query extension',
model: modelName,
charsLength: aiExtensionResult.charsLength
});
}
return {
isEmpty: searchRes.length === 0 ? true : undefined,
unEmpty: searchRes.length > 0 ? true : undefined,
quoteQA: searchRes,
responseData,
moduleDispatchBills
responseData
};
}

View File

@@ -23,12 +23,11 @@ import { dispatchContentExtract } from './agent/extract';
import { dispatchHttpRequest } from './tools/http';
import { dispatchHttp468Request } from './tools/http468';
import { dispatchAppRequest } from './tools/runApp';
import { dispatchQueryExtension } from './tools/queryExternsion';
import { dispatchCFR } from './tools/cfr';
import { dispatchRunPlugin } from './plugin/run';
import { dispatchPluginInput } from './plugin/runInput';
import { dispatchPluginOutput } from './plugin/runOutput';
import { valueTypeFormat } from './utils';
import { ChatModuleBillType } from '@fastgpt/global/support/wallet/bill/type';
const callbackMap: Record<`${FlowNodeTypeEnum}`, Function> = {
[FlowNodeTypeEnum.historyNode]: dispatchHistory,
@@ -45,7 +44,7 @@ const callbackMap: Record<`${FlowNodeTypeEnum}`, Function> = {
[FlowNodeTypeEnum.pluginModule]: dispatchRunPlugin,
[FlowNodeTypeEnum.pluginInput]: dispatchPluginInput,
[FlowNodeTypeEnum.pluginOutput]: dispatchPluginOutput,
[FlowNodeTypeEnum.queryExtension]: dispatchQueryExtension,
[FlowNodeTypeEnum.cfr]: dispatchCFR,
// none
[FlowNodeTypeEnum.userGuide]: () => Promise.resolve()
@@ -83,19 +82,16 @@ export async function dispatchModules({
// let storeData: Record<string, any> = {}; // after module used
let chatResponse: ChatHistoryItemResType[] = []; // response request and save to database
let chatAnswerText = ''; // AI answer
let chatModuleBills: ChatModuleBillType[] = [];
let runningTime = Date.now();
function pushStore(
{ inputs = [] }: RunningModuleItemType,
{
answerText = '',
responseData,
moduleDispatchBills
responseData
}: {
answerText?: string;
responseData?: ChatHistoryItemResType | ChatHistoryItemResType[];
moduleDispatchBills?: ChatModuleBillType[];
}
) {
const time = Date.now();
@@ -109,9 +105,6 @@ export async function dispatchModules({
});
}
}
if (moduleDispatchBills) {
chatModuleBills = chatModuleBills.concat(moduleDispatchBills);
}
runningTime = time;
const isResponseAnswerText =
@@ -165,7 +158,6 @@ export async function dispatchModules({
const filterModules = nextRunModules.filter((module) => {
if (set.has(module.moduleId)) return false;
set.add(module.moduleId);
``;
return true;
});
@@ -207,7 +199,8 @@ export async function dispatchModules({
user,
stream,
detail,
module,
outputs: module.outputs,
inputs: module.inputs,
params
};
@@ -244,11 +237,10 @@ export async function dispatchModules({
? params[ModuleOutputKeyEnum.userChatInput]
: undefined,
...dispatchRes,
[ModuleOutputKeyEnum.responseData]: formatResponseData,
[ModuleOutputKeyEnum.moduleDispatchBills]:
dispatchRes[ModuleOutputKeyEnum.moduleDispatchBills]
[ModuleOutputKeyEnum.responseData]: formatResponseData
});
}
// start process width initInput
const initModules = runningModules.filter((item) => initRunningModuleType[item.flowType]);
@@ -274,8 +266,7 @@ export async function dispatchModules({
return {
[ModuleOutputKeyEnum.answerText]: chatAnswerText,
[ModuleOutputKeyEnum.responseData]: chatResponse,
[ModuleOutputKeyEnum.moduleDispatchBills]: chatModuleBills
[ModuleOutputKeyEnum.responseData]: chatResponse
};
}

View File

@@ -1,7 +1,4 @@
import type {
ModuleDispatchProps,
ModuleDispatchResponse
} from '@fastgpt/global/core/module/type.d';
import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d';
import { dispatchModules } from '../index';
import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant';
import {
@@ -17,9 +14,10 @@ type RunPluginProps = ModuleDispatchProps<{
[ModuleInputKeyEnum.pluginId]: string;
[key: string]: any;
}>;
type RunPluginResponse = ModuleDispatchResponse<{
type RunPluginResponse = {
[ModuleOutputKeyEnum.answerText]: string;
}>;
[ModuleOutputKeyEnum.responseData]?: moduleDispatchResType;
};
export const dispatchRunPlugin = async (props: RunPluginProps): Promise<RunPluginResponse> => {
const {
@@ -60,7 +58,7 @@ export const dispatchRunPlugin = async (props: RunPluginProps): Promise<RunPlugi
return params;
})();
const { responseData, moduleDispatchBills, answerText } = await dispatchModules({
const { responseData, answerText } = await dispatchModules({
...props,
modules: plugin.modules.map((module) => ({
...module,
@@ -78,9 +76,9 @@ export const dispatchRunPlugin = async (props: RunPluginProps): Promise<RunPlugi
return {
answerText,
// responseData, // debug
[ModuleOutputKeyEnum.responseData]: {
responseData: {
moduleLogo: plugin.avatar,
totalPoints: responseData.reduce((sum, item) => sum + (item.totalPoints || 0), 0),
price: responseData.reduce((sum, item) => sum + (item.price || 0), 0),
runningTime: responseData.reduce((sum, item) => sum + (item.runningTime || 0), 0),
pluginOutput: output?.pluginOutput,
pluginDetail:
@@ -91,14 +89,6 @@ export const dispatchRunPlugin = async (props: RunPluginProps): Promise<RunPlugi
})
: undefined
},
[ModuleOutputKeyEnum.moduleDispatchBills]: [
{
moduleName: plugin.name,
totalPoints: moduleDispatchBills.reduce((sum, item) => sum + (item.totalPoints || 0), 0),
model: plugin.name,
charsLength: 0
}
],
...(output ? output.pluginOutput : {})
};
};

View File

@@ -14,7 +14,7 @@ export const dispatchPluginOutput = (props: PluginOutputProps): PluginOutputResp
return {
responseData: {
totalPoints: 0,
price: 0,
pluginOutput: params
}
};

View File

@@ -0,0 +1,64 @@
import type { ChatItemType, moduleDispatchResType } from '@fastgpt/global/core/chat/type.d';
import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d';
import { ModuleInputKeyEnum, ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants';
import { ModelTypeEnum, getLLMModel } from '@/service/core/ai/model';
import { formatModelPrice2Store } from '@/service/support/wallet/bill/utils';
import { queryCfr } from '@fastgpt/service/core/ai/functions/cfr';
import { getHistories } from '../utils';
type Props = ModuleDispatchProps<{
[ModuleInputKeyEnum.aiModel]: string;
[ModuleInputKeyEnum.aiSystemPrompt]?: string;
[ModuleInputKeyEnum.history]?: ChatItemType[] | number;
[ModuleInputKeyEnum.userChatInput]: string;
}>;
type Response = {
[ModuleOutputKeyEnum.text]: string;
[ModuleOutputKeyEnum.responseData]?: moduleDispatchResType;
};
export const dispatchCFR = async ({
histories,
params: { model, systemPrompt, history, userChatInput }
}: Props): Promise<Response> => {
if (!userChatInput) {
return Promise.reject('Question is empty');
}
// none
// first chat and no system prompt
if (systemPrompt === 'none' || (histories.length === 0 && !systemPrompt)) {
return {
[ModuleOutputKeyEnum.text]: userChatInput
};
}
const cfrModel = getLLMModel(model);
const chatHistories = getHistories(history, histories);
const { cfrQuery, inputTokens, outputTokens } = await queryCfr({
chatBg: systemPrompt,
query: userChatInput,
histories: chatHistories,
model: cfrModel.model
});
const { total, modelName } = formatModelPrice2Store({
model: cfrModel.model,
inputLen: inputTokens,
outputLen: outputTokens,
type: ModelTypeEnum.llm
});
return {
[ModuleOutputKeyEnum.responseData]: {
price: total,
model: modelName,
inputTokens,
outputTokens,
query: userChatInput,
textOutput: cfrQuery
},
[ModuleOutputKeyEnum.text]: cfrQuery
};
};

View File

@@ -1,8 +1,5 @@
import type { moduleDispatchResType } from '@fastgpt/global/core/chat/type.d';
import type {
ModuleDispatchProps,
ModuleDispatchResponse
} from '@fastgpt/global/core/module/type.d';
import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d';
import {
DYNAMIC_INPUT_KEY,
ModuleInputKeyEnum,
@@ -19,10 +16,11 @@ type HttpRequestProps = ModuleDispatchProps<{
[ModuleInputKeyEnum.httpHeaders]: string;
[key: string]: any;
}>;
type HttpResponse = ModuleDispatchResponse<{
type HttpResponse = {
[ModuleOutputKeyEnum.failed]?: boolean;
[ModuleOutputKeyEnum.responseData]: moduleDispatchResType;
[key: string]: any;
}>;
};
const flatDynamicParams = (params: Record<string, any>) => {
const dynamicParams = params[DYNAMIC_INPUT_KEY];
@@ -40,7 +38,7 @@ export const dispatchHttpRequest = async (props: HttpRequestProps): Promise<Http
chatId,
responseChatItemId,
variables,
module: { outputs },
outputs,
params: {
system_httpMethod: httpMethod = 'POST',
system_httpReqUrl: httpReqUrl,
@@ -99,8 +97,8 @@ export const dispatchHttpRequest = async (props: HttpRequestProps): Promise<Http
}
return {
[ModuleOutputKeyEnum.responseData]: {
totalPoints: 0,
responseData: {
price: 0,
body: formatBody,
httpResult: response
},
@@ -111,8 +109,8 @@ export const dispatchHttpRequest = async (props: HttpRequestProps): Promise<Http
return {
[ModuleOutputKeyEnum.failed]: true,
[ModuleOutputKeyEnum.responseData]: {
totalPoints: 0,
responseData: {
price: 0,
body: formatBody,
httpResult: { error }
}

View File

@@ -1,7 +1,5 @@
import type {
ModuleDispatchProps,
ModuleDispatchResponse
} from '@fastgpt/global/core/module/type.d';
import type { moduleDispatchResType } from '@fastgpt/global/core/chat/type.d';
import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d';
import {
DYNAMIC_INPUT_KEY,
ModuleInputKeyEnum,
@@ -26,10 +24,11 @@ type HttpRequestProps = ModuleDispatchProps<{
[DYNAMIC_INPUT_KEY]: Record<string, any>;
[key: string]: any;
}>;
type HttpResponse = ModuleDispatchResponse<{
type HttpResponse = {
[ModuleOutputKeyEnum.failed]?: boolean;
[ModuleOutputKeyEnum.responseData]: moduleDispatchResType;
[key: string]: any;
}>;
};
const UNDEFINED_SIGN = 'UNDEFINED_SIGN';
@@ -39,7 +38,7 @@ export const dispatchHttp468Request = async (props: HttpRequestProps): Promise<H
chatId,
responseChatItemId,
variables,
module: { outputs },
outputs,
histories,
params: {
system_httpMethod: httpMethod = 'POST',
@@ -120,8 +119,8 @@ export const dispatchHttp468Request = async (props: HttpRequestProps): Promise<H
}
return {
[ModuleOutputKeyEnum.responseData]: {
totalPoints: 0,
responseData: {
price: 0,
params: Object.keys(params).length > 0 ? params : undefined,
body: Object.keys(requestBody).length > 0 ? requestBody : undefined,
headers: Object.keys(headers).length > 0 ? headers : undefined,
@@ -132,8 +131,8 @@ export const dispatchHttp468Request = async (props: HttpRequestProps): Promise<H
} catch (error) {
return {
[ModuleOutputKeyEnum.failed]: true,
[ModuleOutputKeyEnum.responseData]: {
totalPoints: 0,
responseData: {
price: 0,
params: Object.keys(params).length > 0 ? params : undefined,
body: Object.keys(requestBody).length > 0 ? requestBody : undefined,
headers: Object.keys(headers).length > 0 ? headers : undefined,

View File

@@ -1,77 +0,0 @@
import type { ChatItemType } from '@fastgpt/global/core/chat/type.d';
import type {
ModuleDispatchProps,
ModuleDispatchResponse
} from '@fastgpt/global/core/module/type.d';
import { ModuleInputKeyEnum, ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants';
import { ModelTypeEnum, getLLMModel } from '@/service/core/ai/model';
import { formatModelChars2Points } from '@/service/support/wallet/usage/utils';
import { queryExtension } from '@fastgpt/service/core/ai/functions/queryExtension';
import { getHistories } from '../utils';
import { hashStr } from '@fastgpt/global/common/string/tools';
type Props = ModuleDispatchProps<{
[ModuleInputKeyEnum.aiModel]: string;
[ModuleInputKeyEnum.aiSystemPrompt]?: string;
[ModuleInputKeyEnum.history]?: ChatItemType[] | number;
[ModuleInputKeyEnum.userChatInput]: string;
}>;
type Response = ModuleDispatchResponse<{
[ModuleOutputKeyEnum.text]: string;
}>;
export const dispatchQueryExtension = async ({
histories,
module,
params: { model, systemPrompt, history, userChatInput }
}: Props): Promise<Response> => {
if (!userChatInput) {
return Promise.reject('Question is empty');
}
const queryExtensionModel = getLLMModel(model);
const chatHistories = getHistories(history, histories);
const { extensionQueries, charsLength } = await queryExtension({
chatBg: systemPrompt,
query: userChatInput,
histories: chatHistories,
model: queryExtensionModel.model
});
extensionQueries.unshift(userChatInput);
const { totalPoints, modelName } = formatModelChars2Points({
model: queryExtensionModel.model,
charsLength,
modelType: ModelTypeEnum.llm
});
const set = new Set<string>();
const filterSameQueries = extensionQueries.filter((item) => {
// 删除所有的标点符号与空格等,只对文本进行比较
const str = hashStr(item.replace(/[^\p{L}\p{N}]/gu, ''));
if (set.has(str)) return false;
set.add(str);
return true;
});
return {
[ModuleOutputKeyEnum.responseData]: {
totalPoints,
model: modelName,
charsLength,
query: userChatInput,
textOutput: JSON.stringify(filterSameQueries)
},
[ModuleOutputKeyEnum.moduleDispatchBills]: [
{
moduleName: module.name,
totalPoints,
model: modelName,
charsLength
}
],
[ModuleOutputKeyEnum.text]: JSON.stringify(filterSameQueries)
};
};

View File

@@ -1,8 +1,5 @@
import type { moduleDispatchResType, ChatItemType } from '@fastgpt/global/core/chat/type.d';
import type {
ModuleDispatchProps,
ModuleDispatchResponse
} from '@fastgpt/global/core/module/type.d';
import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d';
import { SelectAppItemType } from '@fastgpt/global/core/module/type';
import { dispatchModules } from '../index';
import { MongoApp } from '@fastgpt/service/core/app/schema';
@@ -18,10 +15,11 @@ type Props = ModuleDispatchProps<{
[ModuleInputKeyEnum.history]?: ChatItemType[] | number;
app: SelectAppItemType;
}>;
type Response = ModuleDispatchResponse<{
type Response = {
[ModuleOutputKeyEnum.responseData]: moduleDispatchResType[];
[ModuleOutputKeyEnum.answerText]: string;
[ModuleOutputKeyEnum.history]: ChatItemType[];
}>;
};
export const dispatchAppRequest = async (props: Props): Promise<Response> => {
const {
@@ -32,7 +30,6 @@ export const dispatchAppRequest = async (props: Props): Promise<Response> => {
histories,
params: { userChatInput, history, app }
} = props;
let start = Date.now();
if (!userChatInput) {
return Promise.reject('Input is empty');
@@ -59,7 +56,7 @@ export const dispatchAppRequest = async (props: Props): Promise<Response> => {
const chatHistories = getHistories(history, histories);
const { responseData, moduleDispatchBills, answerText } = await dispatchModules({
const { responseData, answerText } = await dispatchModules({
...props,
appId: app.id,
modules: appData.modules,
@@ -81,20 +78,7 @@ export const dispatchAppRequest = async (props: Props): Promise<Response> => {
]);
return {
[ModuleOutputKeyEnum.responseData]: {
moduleLogo: appData.avatar,
query: userChatInput,
textOutput: answerText,
totalPoints: responseData.reduce((sum, item) => sum + (item.totalPoints || 0), 0)
},
[ModuleOutputKeyEnum.moduleDispatchBills]: [
{
moduleName: appData.name,
totalPoints: responseData.reduce((sum, item) => sum + (item.totalPoints || 0), 0),
charsLength: 0,
model: appData.name
}
],
responseData,
answerText: answerText,
history: completeMessages
};