Skip to content

Commit 85ce238

Browse files
Test completion v2 (#4438)
* add v2 completions (#4364) * add v2 completions * completion config * config version * fix * frontend * doc * fix * fix: completions v2 api --------- Co-authored-by: heheer <[email protected]>
1 parent e4c4941 commit 85ce238

File tree

10 files changed

+1139
-39
lines changed

10 files changed

+1139
-39
lines changed

docSite/content/zh-cn/docs/development/openapi/chat.md

Lines changed: 435 additions & 3 deletions
Large diffs are not rendered by default.

packages/global/core/workflow/runtime/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export enum SseResponseEventEnum {
55
answer = 'answer', // animation stream
66
fastAnswer = 'fastAnswer', // direct answer text, not animation
77
flowNodeStatus = 'flowNodeStatus', // update node status
8+
flowNodeResponse = 'flowNodeResponse', // node response
89

910
toolCall = 'toolCall', // tool start
1011
toolParams = 'toolParams', // tool params return

packages/global/core/workflow/runtime/type.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export type ChatDispatchProps = {
5959
isToolCall?: boolean;
6060
workflowStreamResponse?: WorkflowResponseType;
6161
workflowDispatchDeep?: number;
62+
version?: 'v1' | 'v2';
6263
};
6364

6465
export type ModuleDispatchProps<T> = ChatDispatchProps & {

packages/service/core/workflow/dispatch/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export async function dispatchWorkFlow(data: Props): Promise<DispatchFlowRespons
130130
timezone,
131131
externalProvider,
132132
stream = false,
133+
version = 'v1',
133134
...props
134135
} = data;
135136

@@ -626,6 +627,21 @@ export async function dispatchWorkFlow(data: Props): Promise<DispatchFlowRespons
626627
};
627628
})();
628629

630+
// Response node response
631+
if (
632+
version === 'v2' &&
633+
!props.isToolCall &&
634+
!props.runningAppInfo.isChildApp &&
635+
formatResponseData
636+
) {
637+
props.workflowStreamResponse?.({
638+
event: SseResponseEventEnum.flowNodeResponse,
639+
data: {
640+
...formatResponseData
641+
}
642+
});
643+
}
644+
629645
// Add output default value
630646
node.outputs.forEach((item) => {
631647
if (!item.required) return;

packages/service/core/workflow/dispatch/utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ export const getWorkflowResponseWrite = ({
5353
[SseResponseEventEnum.toolCall]: 1,
5454
[SseResponseEventEnum.toolParams]: 1,
5555
[SseResponseEventEnum.toolResponse]: 1,
56-
[SseResponseEventEnum.updateVariables]: 1
56+
[SseResponseEventEnum.updateVariables]: 1,
57+
[SseResponseEventEnum.flowNodeResponse]: 1
5758
};
5859
if (!detail && detailEvent[event]) return;
5960

projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ const ChatBox = ({
219219
tool,
220220
interactive,
221221
autoTTSResponse,
222-
variables
222+
variables,
223+
nodeResponse
223224
}: generatingMessageProps & { autoTTSResponse?: boolean }) => {
224225
setChatRecords((state) =>
225226
state.map((item, index) => {
@@ -232,7 +233,14 @@ const ChatBox = ({
232233
JSON.stringify(item.value[item.value.length - 1])
233234
);
234235

235-
if (event === SseResponseEventEnum.flowNodeStatus && status) {
236+
if (event === SseResponseEventEnum.flowNodeResponse && nodeResponse) {
237+
return {
238+
...item,
239+
responseData: item.responseData
240+
? [...item.responseData, nodeResponse]
241+
: [nodeResponse]
242+
};
243+
} else if (event === SseResponseEventEnum.flowNodeStatus && status) {
236244
return {
237245
...item,
238246
status,
@@ -518,36 +526,34 @@ const ChatBox = ({
518526
reserveTool: true
519527
});
520528

521-
const {
522-
responseData,
523-
responseText,
524-
isNewChat = false
525-
} = await onStartChat({
529+
const { responseText } = await onStartChat({
526530
messages, // 保证最后一条是 Human 的消息
527531
responseChatItemId: responseChatId,
528532
controller: abortSignal,
529533
generatingMessage: (e) => generatingMessage({ ...e, autoTTSResponse }),
530534
variables: requestVariables
531535
});
532-
if (responseData?.[responseData.length - 1]?.error) {
533-
toast({
534-
title: t(responseData[responseData.length - 1].error?.message),
535-
status: 'error'
536-
});
537-
}
538536

539537
// Set last chat finish status
540538
let newChatHistories: ChatSiteItemType[] = [];
541539
setChatRecords((state) => {
542540
newChatHistories = state.map((item, index) => {
543541
if (index !== state.length - 1) return item;
542+
543+
// Check node response error
544+
const responseData = mergeChatResponseData(item.responseData || []);
545+
if (responseData[responseData.length - 1]?.error) {
546+
toast({
547+
title: t(responseData[responseData.length - 1].error?.message),
548+
status: 'error'
549+
});
550+
}
551+
544552
return {
545553
...item,
546554
status: ChatStatusEnum.finish,
547555
time: new Date(),
548-
responseData: item.responseData
549-
? mergeChatResponseData([...item.responseData, ...responseData])
550-
: responseData
556+
responseData
551557
};
552558
});
553559
return newChatHistories;
@@ -567,7 +573,7 @@ const ChatBox = ({
567573
} catch (err: any) {
568574
console.log(err);
569575
toast({
570-
title: t(getErrText(err, 'core.chat.error.Chat error') as any),
576+
title: t(getErrText(err, t('common:core.chat.error.Chat error') as any)),
571577
status: 'error',
572578
duration: 5000,
573579
isClosable: true

projects/app/src/components/core/chat/ChatContainer/type.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { StreamResponseType } from '@/web/common/api/fetch';
22
import { ChatCompletionMessageParam } from '@fastgpt/global/core/ai/type';
3-
import { ChatSiteItemType, ToolModuleResponseItemType } from '@fastgpt/global/core/chat/type';
3+
import {
4+
ChatHistoryItemResType,
5+
ChatSiteItemType,
6+
ToolModuleResponseItemType
7+
} from '@fastgpt/global/core/chat/type';
48
import { WorkflowInteractiveResponseType } from '@fastgpt/global/core/workflow/template/system/interactive/type';
59

610
export type generatingMessageProps = {
@@ -12,6 +16,7 @@ export type generatingMessageProps = {
1216
tool?: ToolModuleResponseItemType;
1317
interactive?: WorkflowInteractiveResponseType;
1418
variables?: Record<string, any>;
19+
nodeResponse?: ChatHistoryItemResType;
1520
};
1621

1722
export type StartChatFnProps = {

projects/app/src/pages/api/core/chat/chatTest.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
182182
histories: newHistories,
183183
stream: true,
184184
maxRunTimes: WORKFLOW_MAX_RUN_TIMES,
185-
workflowStreamResponse: workflowResponseWrite
185+
workflowStreamResponse: workflowResponseWrite,
186+
version: 'v2'
186187
});
187188

188189
workflowResponseWrite({
@@ -197,11 +198,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
197198
event: SseResponseEventEnum.answer,
198199
data: '[DONE]'
199200
});
200-
responseWrite({
201-
res,
202-
event: SseResponseEventEnum.flowResponses,
203-
data: JSON.stringify(flowResponses)
204-
});
205201

206202
// save chat
207203
const isInteractiveRequest = !!getLastInteractiveValue(histories);

0 commit comments

Comments
 (0)