mirror of
http://112.124.100.131/huang.ze/ebiz-dify-ai.git
synced 2025-12-09 02:46:52 +08:00
feat: workflow new nodes (#4683)
Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Patryk Garstecki <patryk20120@yahoo.pl> Co-authored-by: Sebastian.W <thiner@gmail.com> Co-authored-by: 呆萌闷油瓶 <253605712@qq.com> Co-authored-by: takatost <takatost@users.noreply.github.com> Co-authored-by: rechardwang <wh_goodjob@163.com> Co-authored-by: Nite Knite <nkCoding@gmail.com> Co-authored-by: Chenhe Gu <guchenhe@gmail.com> Co-authored-by: Joshua <138381132+joshua20231026@users.noreply.github.com> Co-authored-by: Weaxs <459312872@qq.com> Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com> Co-authored-by: leejoo0 <81673835+leejoo0@users.noreply.github.com> Co-authored-by: JzoNg <jzongcode@gmail.com> Co-authored-by: sino <sino2322@gmail.com> Co-authored-by: Vikey Chen <vikeytk@gmail.com> Co-authored-by: wanghl <Wang-HL@users.noreply.github.com> Co-authored-by: Haolin Wang-汪皓临 <haolin.wang@atlaslovestravel.com> Co-authored-by: Zixuan Cheng <61724187+Theysua@users.noreply.github.com> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: Bowen Liang <bowenliang@apache.org> Co-authored-by: Bowen Liang <liangbowen@gf.com.cn> Co-authored-by: fanghongtai <42790567+fanghongtai@users.noreply.github.com> Co-authored-by: wxfanghongtai <wxfanghongtai@gf.com.cn> Co-authored-by: Matri <qjp@bithuman.io> Co-authored-by: Benjamin <benjaminx@gmail.com>
This commit is contained in:
@@ -3,6 +3,9 @@ import Toast from '@/app/components/base/toast'
|
||||
import type { AnnotationReply, MessageEnd, MessageReplace, ThoughtItem } from '@/app/components/app/chat/type'
|
||||
import type { VisionFile } from '@/types/app'
|
||||
import type {
|
||||
IterationFinishedResponse,
|
||||
IterationNextedResponse,
|
||||
IterationStartedResponse,
|
||||
NodeFinishedResponse,
|
||||
NodeStartedResponse,
|
||||
TextChunkResponse,
|
||||
@@ -52,6 +55,9 @@ export type IOnWorkflowStarted = (workflowStarted: WorkflowStartedResponse) => v
|
||||
export type IOnWorkflowFinished = (workflowFinished: WorkflowFinishedResponse) => void
|
||||
export type IOnNodeStarted = (nodeStarted: NodeStartedResponse) => void
|
||||
export type IOnNodeFinished = (nodeFinished: NodeFinishedResponse) => void
|
||||
export type IOnIterationStarted = (workflowStarted: IterationStartedResponse) => void
|
||||
export type IOnIterationNexted = (workflowStarted: IterationNextedResponse) => void
|
||||
export type IOnIterationFinished = (workflowFinished: IterationFinishedResponse) => void
|
||||
export type IOnTextChunk = (textChunk: TextChunkResponse) => void
|
||||
export type IOnTextReplace = (textReplace: TextReplaceResponse) => void
|
||||
|
||||
@@ -74,6 +80,9 @@ export type IOtherOptions = {
|
||||
onWorkflowFinished?: IOnWorkflowFinished
|
||||
onNodeStarted?: IOnNodeStarted
|
||||
onNodeFinished?: IOnNodeFinished
|
||||
onIterationStart?: IOnIterationStarted
|
||||
onIterationNext?: IOnIterationNexted
|
||||
onIterationFinish?: IOnIterationFinished
|
||||
onTextChunk?: IOnTextChunk
|
||||
onTextReplace?: IOnTextReplace
|
||||
}
|
||||
@@ -122,6 +131,9 @@ const handleStream = (
|
||||
onWorkflowFinished?: IOnWorkflowFinished,
|
||||
onNodeStarted?: IOnNodeStarted,
|
||||
onNodeFinished?: IOnNodeFinished,
|
||||
onIterationStart?: IOnIterationStarted,
|
||||
onIterationNext?: IOnIterationNexted,
|
||||
onIterationFinish?: IOnIterationFinished,
|
||||
onTextChunk?: IOnTextChunk,
|
||||
onTextReplace?: IOnTextReplace,
|
||||
) => {
|
||||
@@ -200,6 +212,15 @@ const handleStream = (
|
||||
else if (bufferObj.event === 'node_finished') {
|
||||
onNodeFinished?.(bufferObj as NodeFinishedResponse)
|
||||
}
|
||||
else if (bufferObj.event === 'iteration_started') {
|
||||
onIterationStart?.(bufferObj as IterationStartedResponse)
|
||||
}
|
||||
else if (bufferObj.event === 'iteration_next') {
|
||||
onIterationNext?.(bufferObj as IterationNextedResponse)
|
||||
}
|
||||
else if (bufferObj.event === 'iteration_completed') {
|
||||
onIterationFinish?.(bufferObj as IterationFinishedResponse)
|
||||
}
|
||||
else if (bufferObj.event === 'text_chunk') {
|
||||
onTextChunk?.(bufferObj as TextChunkResponse)
|
||||
}
|
||||
@@ -450,6 +471,9 @@ export const ssePost = (
|
||||
onWorkflowFinished,
|
||||
onNodeStarted,
|
||||
onNodeFinished,
|
||||
onIterationStart,
|
||||
onIterationNext,
|
||||
onIterationFinish,
|
||||
onTextChunk,
|
||||
onTextReplace,
|
||||
onError,
|
||||
@@ -503,7 +527,7 @@ export const ssePost = (
|
||||
return
|
||||
}
|
||||
onData?.(str, isFirstMessage, moreInfo)
|
||||
}, onCompleted, onThought, onMessageEnd, onMessageReplace, onFile, onWorkflowStarted, onWorkflowFinished, onNodeStarted, onNodeFinished, onTextChunk, onTextReplace)
|
||||
}, onCompleted, onThought, onMessageEnd, onMessageReplace, onFile, onWorkflowStarted, onWorkflowFinished, onNodeStarted, onNodeFinished, onIterationStart, onIterationNext, onIterationFinish, onTextChunk, onTextReplace)
|
||||
}).catch((e) => {
|
||||
if (e.toString() !== 'AbortError: The user aborted a request.')
|
||||
Toast.notify({ type: 'error', message: e })
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { IOnCompleted, IOnData, IOnError, IOnFile, IOnMessageEnd, IOnMessageReplace, IOnNodeFinished, IOnNodeStarted, IOnTextChunk, IOnTextReplace, IOnThought, IOnWorkflowFinished, IOnWorkflowStarted } from './base'
|
||||
import type { IOnCompleted, IOnData, IOnError, IOnFile, IOnIterationFinished, IOnIterationNexted, IOnIterationStarted, IOnMessageEnd, IOnMessageReplace, IOnNodeFinished, IOnNodeStarted, IOnTextChunk, IOnTextReplace, IOnThought, IOnWorkflowFinished, IOnWorkflowStarted } from './base'
|
||||
import {
|
||||
del as consoleDel, get as consoleGet, patch as consolePatch, post as consolePost,
|
||||
delPublic as del, getPublic as get, patchPublic as patch, postPublic as post, ssePost,
|
||||
@@ -73,6 +73,9 @@ export const sendWorkflowMessage = async (
|
||||
onNodeStarted,
|
||||
onNodeFinished,
|
||||
onWorkflowFinished,
|
||||
onIterationStart,
|
||||
onIterationNext,
|
||||
onIterationFinish,
|
||||
onTextChunk,
|
||||
onTextReplace,
|
||||
}: {
|
||||
@@ -80,6 +83,9 @@ export const sendWorkflowMessage = async (
|
||||
onNodeStarted: IOnNodeStarted
|
||||
onNodeFinished: IOnNodeFinished
|
||||
onWorkflowFinished: IOnWorkflowFinished
|
||||
onIterationStart: IOnIterationStarted
|
||||
onIterationNext: IOnIterationNexted
|
||||
onIterationFinish: IOnIterationFinished
|
||||
onTextChunk: IOnTextChunk
|
||||
onTextReplace: IOnTextReplace
|
||||
},
|
||||
@@ -91,7 +97,7 @@ export const sendWorkflowMessage = async (
|
||||
...body,
|
||||
response_mode: 'streaming',
|
||||
},
|
||||
}, { onNodeStarted, onWorkflowStarted, onWorkflowFinished, isPublicAPI: !isInstalledApp, onNodeFinished, onTextChunk, onTextReplace })
|
||||
}, { onNodeStarted, onWorkflowStarted, onWorkflowFinished, isPublicAPI: !isInstalledApp, onNodeFinished, onIterationStart, onIterationNext, onIterationFinish, onTextChunk, onTextReplace })
|
||||
}
|
||||
|
||||
export const fetchAppInfo = async () => {
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
import { get, post } from './base'
|
||||
import type { Collection, CustomCollectionBackend, CustomParamSchema, Tool, ToolCredential } from '@/app/components/tools/types'
|
||||
import type {
|
||||
Collection,
|
||||
CustomCollectionBackend,
|
||||
CustomParamSchema,
|
||||
Tool,
|
||||
ToolCredential,
|
||||
WorkflowToolProviderRequest,
|
||||
WorkflowToolProviderResponse,
|
||||
} from '@/app/components/tools/types'
|
||||
import type { ToolWithProvider } from '@/app/components/workflow/types'
|
||||
import type { Label } from '@/app/components/tools/labels/constant'
|
||||
|
||||
export const fetchCollectionList = () => {
|
||||
return get<Collection[]>('/workspaces/current/tool-providers')
|
||||
@@ -18,6 +27,10 @@ export const fetchModelToolList = (collectionName: string) => {
|
||||
return get<Tool[]>(`/workspaces/current/tool-provider/model/tools?provider=${collectionName}`)
|
||||
}
|
||||
|
||||
export const fetchWorkflowToolList = (appID: string) => {
|
||||
return get<Tool[]>(`/workspaces/current/tool-provider/workflow/tools?workflow_tool_id=${appID}`)
|
||||
}
|
||||
|
||||
export const fetchBuiltInToolCredentialSchema = (collectionName: string) => {
|
||||
return get<ToolCredential[]>(`/workspaces/current/tool-provider/builtin/${collectionName}/credentials_schema`)
|
||||
}
|
||||
@@ -98,3 +111,42 @@ export const fetchAllBuiltInTools = () => {
|
||||
export const fetchAllCustomTools = () => {
|
||||
return get<ToolWithProvider[]>('/workspaces/current/tools/api')
|
||||
}
|
||||
|
||||
export const fetchAllWorkflowTools = () => {
|
||||
return get<ToolWithProvider[]>('/workspaces/current/tools/workflow')
|
||||
}
|
||||
|
||||
export const fetchLabelList = () => {
|
||||
return get<Label[]>('/workspaces/current/tool-labels')
|
||||
}
|
||||
|
||||
export const createWorkflowToolProvider = (payload: WorkflowToolProviderRequest & { workflow_app_id: string }) => {
|
||||
return post('/workspaces/current/tool-provider/workflow/create', {
|
||||
body: { ...payload },
|
||||
})
|
||||
}
|
||||
|
||||
export const saveWorkflowToolProvider = (payload: WorkflowToolProviderRequest & Partial<{
|
||||
workflow_app_id: string
|
||||
workflow_tool_id: string
|
||||
}>) => {
|
||||
return post('/workspaces/current/tool-provider/workflow/update', {
|
||||
body: { ...payload },
|
||||
})
|
||||
}
|
||||
|
||||
export const fetchWorkflowToolDetailByAppID = (appID: string) => {
|
||||
return get<WorkflowToolProviderResponse>(`/workspaces/current/tool-provider/workflow/get?workflow_app_id=${appID}`)
|
||||
}
|
||||
|
||||
export const fetchWorkflowToolDetail = (toolID: string) => {
|
||||
return get<WorkflowToolProviderResponse>(`/workspaces/current/tool-provider/workflow/get?workflow_tool_id=${toolID}`)
|
||||
}
|
||||
|
||||
export const deleteWorkflowTool = (toolID: string) => {
|
||||
return post('/workspaces/current/tool-provider/workflow/delete', {
|
||||
body: {
|
||||
workflow_tool_id: toolID,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -33,6 +33,10 @@ export const singleNodeRun = (appId: string, nodeId: string, params: object) =>
|
||||
return post(`apps/${appId}/workflows/draft/nodes/${nodeId}/run`, { body: params })
|
||||
}
|
||||
|
||||
export const getIterationSingleNodeRunUrl = (isChatFlow: boolean, appId: string, nodeId: string) => {
|
||||
return `apps/${appId}/${isChatFlow ? 'advanced-chat/' : ''}workflows/draft/iteration/nodes/${nodeId}/run`
|
||||
}
|
||||
|
||||
export const publishWorkflow = (url: string) => {
|
||||
return post<CommonResponse & { created_at: number }>(url)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user