4.8 preview (#1288)

* Revert "lafAccount add pat & re request when token invalid (#76)" (#77)

This reverts commit 83d85dfe37adcaef4833385ea52ee79fd84720be.

* perf: workflow ux

* system config

* Newflow (#89)

* docs: Add doc for Xinference (#1266)

Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>

* Revert "lafAccount add pat & re request when token invalid (#76)" (#77)

This reverts commit 83d85dfe37adcaef4833385ea52ee79fd84720be.

* perf: workflow ux

* system config

* Revert "lafAccount add pat & re request when token invalid (#76)" (#77)

This reverts commit 83d85dfe37adcaef4833385ea52ee79fd84720be.

* Revert "lafAccount add pat & re request when token invalid (#76)" (#77)

This reverts commit 83d85dfe37adcaef4833385ea52ee79fd84720be.

* Revert "lafAccount add pat & re request when token invalid (#76)" (#77)

This reverts commit 83d85dfe37adcaef4833385ea52ee79fd84720be.

* rename code

* move code

* update flow

* input type selector

* perf: workflow runtime

* feat: node adapt newflow

* feat: adapt plugin

* feat: 360 connection

* check workflow

* perf: flow 性能

* change plugin input type (#81)

* change plugin input type

* plugin label mode

* perf: nodecard

* debug

* perf: debug ui

* connection ui

* change workflow ui (#82)

* feat: workflow debug

* adapt openAPI for new workflow (#83)

* adapt openAPI for new workflow

* i18n

* perf: plugin debug

* plugin input ui

* delete

* perf: global variable select

* fix rebase

* perf: workflow performance

* feat: input render type icon

* input icon

* adapt flow (#84)

* adapt newflow

* temp

* temp

* fix

* feat: app schedule trigger

* feat: app schedule trigger

* perf: schedule ui

* feat: ioslatevm run js code

* perf: workflow varialbe table ui

* feat: adapt simple mode

* feat: adapt input params

* output

* feat: adapt tamplate

* fix: ts

* add if-else module (#86)

* perf: worker

* if else node

* perf: tiktoken worker

* fix: ts

* perf: tiktoken

* fix if-else node (#87)

* fix if-else node

* type

* fix

* perf: audio render

* perf: Parallel worker

* log

* perf: if else node

* adapt plugin

* prompt

* perf: reference ui

* reference ui

* handle ux

* template ui and plugin tool

* adapt v1 workflow

* adapt v1 workflow completions

* perf: time variables

* feat: workflow keyboard shortcuts

* adapt v1 workflow

* update workflow example doc (#88)

* fix: simple mode select tool

---------

Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
Co-authored-by: Carson Yang <yangchuansheng33@gmail.com>
Co-authored-by: heheer <71265218+newfish-cmyk@users.noreply.github.com>

* doc

* perf: extract node

* extra node field

* update plugin version

* doc

* variable

* change doc & fix prompt editor (#90)

* fold workflow code

* value type label

---------

Signed-off-by: Carson Yang <yangchuansheng33@gmail.com>
Co-authored-by: Carson Yang <yangchuansheng33@gmail.com>
Co-authored-by: heheer <71265218+newfish-cmyk@users.noreply.github.com>
This commit is contained in:
Archer
2024-04-25 17:51:20 +08:00
committed by GitHub
parent b08d81f887
commit 439c819ff1
505 changed files with 23570 additions and 18215 deletions

View File

@@ -5,6 +5,7 @@ import { checkInvalidDatasetFiles, checkInvalidDatasetData, checkInvalidVector }
import { checkTimerLock } from '@fastgpt/service/common/system/timerLock/utils';
import { TimerIdEnum } from '@fastgpt/service/common/system/timerLock/constants';
import { addHours } from 'date-fns';
import { getScheduleTriggerApp } from '@/service/core/app/utils';
const setTrainingQueueCron = () => {
setCron('*/1 * * * *', () => {
@@ -54,8 +55,22 @@ const clearInvalidDataCron = () => {
});
};
const scheduleTriggerAppCron = () => {
setCron('0 */1 * * *', async () => {
if (
await checkTimerLock({
timerId: TimerIdEnum.scheduleTriggerApp,
lockMinuted: 59
})
) {
getScheduleTriggerApp();
}
});
};
export const startCron = () => {
setTrainingQueueCron();
setClearTmpUploadFilesCron();
clearInvalidDataCron();
scheduleTriggerAppCron();
};

View File

@@ -1,4 +1,3 @@
import { getTikTokenEnc } from '@fastgpt/global/common/string/tiktoken';
import { initHttpAgent } from '@fastgpt/service/common/middle/httpAgent';
import { existsSync, readFileSync } from 'fs';
@@ -32,7 +31,5 @@ export function initGlobal() {
global.communityPlugins = [];
global.qaQueueLen = global.qaQueueLen ?? 0;
global.vectorQueueLen = global.vectorQueueLen ?? 0;
// init tikToken
getTikTokenEnc();
initHttpAgent();
}

View File

@@ -1,12 +0,0 @@
import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant';
import type { ModuleItemType } from '@fastgpt/global/core/module/type.d';
export const getChatModelNameListByModules = (modules: ModuleItemType[]): string[] => {
const chatModules = modules.filter((item) => item.flowType === FlowNodeTypeEnum.chatNode);
return chatModules
.map((item) => {
const model = item.inputs.find((input) => input.key === 'model')?.value;
return global.llmModels.find((item) => item.model === model)?.name || '';
})
.filter(Boolean);
};

View File

@@ -0,0 +1,56 @@
import { getUserChatInfoAndAuthTeamPoints } from '@/service/support/permission/auth/team';
import { getNextTimeByCronStringAndTimezone } from '@fastgpt/global/common/string/time';
import { delay } from '@fastgpt/global/common/system/utils';
import {
getDefaultEntryNodeIds,
initWorkflowEdgeStatus,
storeNodes2RuntimeNodes
} from '@fastgpt/global/core/workflow/runtime/utils';
import { addLog } from '@fastgpt/service/common/system/log';
import { MongoApp } from '@fastgpt/service/core/app/schema';
import { dispatchWorkFlow } from '@fastgpt/service/core/workflow/dispatch';
export const getScheduleTriggerApp = async () => {
// 1. Find all the app
const apps = await MongoApp.find({
scheduledTriggerConfig: { $ne: null },
scheduledTriggerNextTime: { $lte: new Date() }
});
// 2. Run apps
await Promise.allSettled(
apps.map(async (app) => {
if (!app.scheduledTriggerConfig) return;
// random delay 0 ~ 60s
await delay(Math.floor(Math.random() * 60 * 1000));
const { user } = await getUserChatInfoAndAuthTeamPoints(app.tmbId);
try {
await dispatchWorkFlow({
user,
mode: 'chat',
teamId: String(app.teamId),
tmbId: String(app.tmbId),
appId: String(app._id),
runtimeNodes: storeNodes2RuntimeNodes(app.modules, getDefaultEntryNodeIds(app.modules)),
runtimeEdges: initWorkflowEdgeStatus(app.edges),
variables: {
userChatInput: app.scheduledTriggerConfig?.defaultPrompt
},
histories: [],
stream: false,
detail: false,
maxRunTimes: 200
});
} catch (error) {
addLog.error('Schedule trigger error', error);
}
// update next time
app.scheduledTriggerNextTime = getNextTimeByCronStringAndTimezone(app.scheduledTriggerConfig);
await app.save();
return;
})
);
};

View File

@@ -0,0 +1,12 @@
import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant';
import type { StoreNodeItemType } from '@fastgpt/global/core/workflow/type/index.d';
export const getChatModelNameListByModules = (modules: StoreNodeItemType[]): string[] => {
const chatModules = modules.filter((item) => item.flowNodeType === FlowNodeTypeEnum.chatNode);
return chatModules
.map((item) => {
const model = item.inputs.find((input) => input.key === 'model')?.value;
return global.llmModels.find((item) => item.model === model)?.name || '';
})
.filter(Boolean);
};

View File

@@ -12,7 +12,7 @@ import { getLLMModel } from '@fastgpt/service/core/ai/model';
import { checkTeamAiPointsAndLock } from './utils';
import { checkInvalidChunkAndLock } from '@fastgpt/service/core/dataset/training/utils';
import { addMinutes } from 'date-fns';
import { countGptMessagesTokens } from '@fastgpt/global/common/string/tiktoken';
import { countGptMessagesTokens } from '@fastgpt/service/common/string/tiktoken/index';
import { pushDataListToTrainingQueueByCollectionId } from '@fastgpt/service/core/dataset/training/controller';
const reduceQueue = () => {
@@ -148,7 +148,7 @@ ${replaceVariable(Prompt_AgentQA.fixedText, { text })}`;
pushQAUsage({
teamId: data.teamId,
tmbId: data.tmbId,
tokens: countGptMessagesTokens(messages),
tokens: await countGptMessagesTokens(messages),
billId: data.billId,
model
});

View File

@@ -8,13 +8,15 @@ import { ChatNodeUsageType } from '@fastgpt/global/support/wallet/bill/type';
export const pushChatUsage = ({
appName,
appId,
pluginId,
teamId,
tmbId,
source,
flowUsages
}: {
appName: string;
appId: string;
appId?: string;
pluginId?: string;
teamId: string;
tmbId: string;
source: `${UsageSourceEnum}`;
@@ -27,6 +29,7 @@ export const pushChatUsage = ({
tmbId,
appName,
appId,
pluginId,
totalPoints,
source,
list: flowUsages.map((item) => ({
@@ -64,7 +67,7 @@ export const pushQAUsage = async ({
modelType: ModelTypeEnum.llm,
tokens
});
console.log(tokens, '----');
concatUsage({
billId,
teamId,

View File

@@ -17,7 +17,7 @@ type Props = {
teamId: string;
tmbId: string;
variables?: Record<string, any>;
updateUseTime: boolean;
isUpdateUseTime: boolean;
source: `${ChatSourceEnum}`;
shareId?: string;
outLinkUid?: string;
@@ -31,7 +31,7 @@ export async function saveChat({
teamId,
tmbId,
variables,
updateUseTime,
isUpdateUseTime,
source,
shareId,
outLinkUid,
@@ -91,8 +91,8 @@ export async function saveChat({
}
});
if (updateUseTime && source === ChatSourceEnum.online) {
MongoApp.findByIdAndUpdate(appId, {
if (isUpdateUseTime) {
await MongoApp.findByIdAndUpdate(appId, {
updateTime: new Date()
});
}