feat: knowledge pipeline (#25360)
Signed-off-by: -LAN- <laipz8200@outlook.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: jyong <718720800@qq.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: QuantumGhost <obelisk.reg+git@gmail.com> Co-authored-by: lyzno1 <yuanyouhuilyz@gmail.com> Co-authored-by: quicksand <quicksandzn@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: lyzno1 <92089059+lyzno1@users.noreply.github.com> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: Yongtao Huang <yongtaoh2022@gmail.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Hanqing Zhao <sherry9277@gmail.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Harry <xh001x@hotmail.com>
This commit is contained in:
@@ -2,7 +2,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import produce from 'immer'
|
||||
import { useBoolean } from 'ahooks'
|
||||
import { useStore } from '../../store'
|
||||
import { useStore, useWorkflowStore } from '../../store'
|
||||
import type { ToolNodeType, ToolVarInputs } from './types'
|
||||
import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
|
||||
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
|
||||
@@ -21,18 +21,27 @@ import {
|
||||
import { canFindTool } from '@/utils'
|
||||
|
||||
const useConfig = (id: string, payload: ToolNodeType) => {
|
||||
const workflowStore = useWorkflowStore()
|
||||
const { nodesReadOnly: readOnly } = useNodesReadOnly()
|
||||
const { handleFetchAllTools } = useFetchToolsData()
|
||||
const { t } = useTranslation()
|
||||
|
||||
const language = useLanguage()
|
||||
const { inputs, setInputs: doSetInputs } = useNodeCrud<ToolNodeType>(id, payload)
|
||||
const { inputs, setInputs: doSetInputs } = useNodeCrud<ToolNodeType>(
|
||||
id,
|
||||
payload,
|
||||
)
|
||||
/*
|
||||
* tool_configurations: tool setting, not dynamic setting (form type = form)
|
||||
* tool_parameters: tool dynamic setting(form type = llm)
|
||||
* output_schema: tool dynamic output
|
||||
*/
|
||||
const { provider_id, provider_type, tool_name, tool_configurations, output_schema, tool_parameters } = inputs
|
||||
* tool_configurations: tool setting, not dynamic setting (form type = form)
|
||||
* tool_parameters: tool dynamic setting(form type = llm)
|
||||
*/
|
||||
const {
|
||||
provider_id,
|
||||
provider_type,
|
||||
tool_name,
|
||||
tool_configurations,
|
||||
tool_parameters,
|
||||
} = inputs
|
||||
const isBuiltIn = provider_type === CollectionType.builtIn
|
||||
const buildInTools = useStore(s => s.buildInTools)
|
||||
const customTools = useStore(s => s.customTools)
|
||||
@@ -53,102 +62,143 @@ const useConfig = (id: string, payload: ToolNodeType) => {
|
||||
return []
|
||||
}
|
||||
}, [buildInTools, customTools, mcpTools, provider_type, workflowTools])
|
||||
const currCollection = currentTools.find(item => canFindTool(item.id, provider_id))
|
||||
const currCollection = useMemo(() => {
|
||||
return currentTools.find(item => canFindTool(item.id, provider_id))
|
||||
}, [currentTools, provider_id])
|
||||
|
||||
// Auth
|
||||
const needAuth = !!currCollection?.allow_delete
|
||||
const isAuthed = !!currCollection?.is_team_authorization
|
||||
const isShowAuthBtn = isBuiltIn && needAuth && !isAuthed
|
||||
const [showSetAuth, {
|
||||
setTrue: showSetAuthModal,
|
||||
setFalse: hideSetAuthModal,
|
||||
}] = useBoolean(false)
|
||||
const [
|
||||
showSetAuth,
|
||||
{ setTrue: showSetAuthModal, setFalse: hideSetAuthModal },
|
||||
] = useBoolean(false)
|
||||
|
||||
const handleSaveAuth = useCallback(async (value: any) => {
|
||||
await updateBuiltInToolCredential(currCollection?.name as string, value)
|
||||
const handleSaveAuth = useCallback(
|
||||
async (value: any) => {
|
||||
await updateBuiltInToolCredential(currCollection?.name as string, value)
|
||||
|
||||
Toast.notify({
|
||||
type: 'success',
|
||||
message: t('common.api.actionSuccess'),
|
||||
})
|
||||
handleFetchAllTools(provider_type)
|
||||
hideSetAuthModal()
|
||||
}, [currCollection?.name, hideSetAuthModal, t, handleFetchAllTools, provider_type])
|
||||
Toast.notify({
|
||||
type: 'success',
|
||||
message: t('common.api.actionSuccess'),
|
||||
})
|
||||
handleFetchAllTools(provider_type)
|
||||
hideSetAuthModal()
|
||||
},
|
||||
[
|
||||
currCollection?.name,
|
||||
hideSetAuthModal,
|
||||
t,
|
||||
handleFetchAllTools,
|
||||
provider_type,
|
||||
],
|
||||
)
|
||||
|
||||
const currTool = currCollection?.tools.find(tool => tool.name === tool_name)
|
||||
const currTool = useMemo(() => {
|
||||
return currCollection?.tools.find(tool => tool.name === tool_name)
|
||||
}, [currCollection, tool_name])
|
||||
const formSchemas = useMemo(() => {
|
||||
return currTool ? toolParametersToFormSchemas(currTool.parameters) : []
|
||||
}, [currTool])
|
||||
const toolInputVarSchema = formSchemas.filter((item: any) => item.form === 'llm')
|
||||
const toolInputVarSchema = useMemo(() => {
|
||||
return formSchemas.filter((item: any) => item.form === 'llm')
|
||||
}, [formSchemas])
|
||||
// use setting
|
||||
const toolSettingSchema = formSchemas.filter((item: any) => item.form !== 'llm')
|
||||
const hasShouldTransferTypeSettingInput = toolSettingSchema.some(item => item.type === 'boolean' || item.type === 'number-input')
|
||||
const toolSettingSchema = useMemo(() => {
|
||||
return formSchemas.filter((item: any) => item.form !== 'llm')
|
||||
}, [formSchemas])
|
||||
const hasShouldTransferTypeSettingInput = toolSettingSchema.some(
|
||||
item => item.type === 'boolean' || item.type === 'number-input',
|
||||
)
|
||||
|
||||
const setInputs = useCallback((value: ToolNodeType) => {
|
||||
if (!hasShouldTransferTypeSettingInput) {
|
||||
doSetInputs(value)
|
||||
return
|
||||
}
|
||||
const newInputs = produce(value, (draft) => {
|
||||
const newConfig = { ...draft.tool_configurations }
|
||||
Object.keys(draft.tool_configurations).forEach((key) => {
|
||||
const schema = formSchemas.find(item => item.variable === key)
|
||||
const value = newConfig[key]
|
||||
if (schema?.type === 'boolean') {
|
||||
if (typeof value === 'string')
|
||||
newConfig[key] = value === 'true' || value === '1'
|
||||
const setInputs = useCallback(
|
||||
(value: ToolNodeType) => {
|
||||
if (!hasShouldTransferTypeSettingInput) {
|
||||
doSetInputs(value)
|
||||
return
|
||||
}
|
||||
const newInputs = produce(value, (draft) => {
|
||||
const newConfig = { ...draft.tool_configurations }
|
||||
Object.keys(draft.tool_configurations).forEach((key) => {
|
||||
const schema = formSchemas.find(item => item.variable === key)
|
||||
const value = newConfig[key]
|
||||
if (schema?.type === 'boolean') {
|
||||
if (typeof value === 'string')
|
||||
newConfig[key] = value === 'true' || value === '1'
|
||||
|
||||
if (typeof value === 'number')
|
||||
newConfig[key] = value === 1
|
||||
}
|
||||
if (typeof value === 'number') newConfig[key] = value === 1
|
||||
}
|
||||
|
||||
if (schema?.type === 'number-input') {
|
||||
if (typeof value === 'string' && value !== '')
|
||||
newConfig[key] = Number.parseFloat(value)
|
||||
}
|
||||
if (schema?.type === 'number-input') {
|
||||
if (typeof value === 'string' && value !== '')
|
||||
newConfig[key] = Number.parseFloat(value)
|
||||
}
|
||||
})
|
||||
draft.tool_configurations = newConfig
|
||||
})
|
||||
draft.tool_configurations = newConfig
|
||||
})
|
||||
doSetInputs(newInputs)
|
||||
}, [doSetInputs, formSchemas, hasShouldTransferTypeSettingInput])
|
||||
doSetInputs(newInputs)
|
||||
},
|
||||
[doSetInputs, formSchemas, hasShouldTransferTypeSettingInput],
|
||||
)
|
||||
const [notSetDefaultValue, setNotSetDefaultValue] = useState(false)
|
||||
const toolSettingValue = useMemo(() => {
|
||||
if (notSetDefaultValue)
|
||||
return tool_configurations
|
||||
if (notSetDefaultValue) return tool_configurations
|
||||
return getConfiguredValue(tool_configurations, toolSettingSchema)
|
||||
}, [notSetDefaultValue, toolSettingSchema, tool_configurations])
|
||||
const setToolSettingValue = useCallback((value: Record<string, any>) => {
|
||||
setNotSetDefaultValue(true)
|
||||
setInputs({
|
||||
...inputs,
|
||||
tool_configurations: value,
|
||||
})
|
||||
}, [inputs, setInputs])
|
||||
const setToolSettingValue = useCallback(
|
||||
(value: Record<string, any>) => {
|
||||
setNotSetDefaultValue(true)
|
||||
setInputs({
|
||||
...inputs,
|
||||
tool_configurations: value,
|
||||
})
|
||||
},
|
||||
[inputs, setInputs],
|
||||
)
|
||||
|
||||
const formattingParameters = () => {
|
||||
const inputsWithDefaultValue = produce(inputs, (draft) => {
|
||||
if (!draft.tool_configurations || Object.keys(draft.tool_configurations).length === 0)
|
||||
draft.tool_configurations = getConfiguredValue(tool_configurations, toolSettingSchema)
|
||||
if (!draft.tool_parameters || Object.keys(draft.tool_parameters).length === 0)
|
||||
draft.tool_parameters = getConfiguredValue(tool_parameters, toolInputVarSchema)
|
||||
if (
|
||||
!draft.tool_configurations
|
||||
|| Object.keys(draft.tool_configurations).length === 0
|
||||
) {
|
||||
draft.tool_configurations = getConfiguredValue(
|
||||
tool_configurations,
|
||||
toolSettingSchema,
|
||||
)
|
||||
}
|
||||
if (
|
||||
!draft.tool_parameters
|
||||
|| Object.keys(draft.tool_parameters).length === 0
|
||||
) {
|
||||
draft.tool_parameters = getConfiguredValue(
|
||||
tool_parameters,
|
||||
toolInputVarSchema,
|
||||
)
|
||||
}
|
||||
})
|
||||
return inputsWithDefaultValue
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (!currTool)
|
||||
return
|
||||
if (!currTool) return
|
||||
const inputsWithDefaultValue = formattingParameters()
|
||||
const { setControlPromptEditorRerenderKey } = workflowStore.getState()
|
||||
setInputs(inputsWithDefaultValue)
|
||||
setTimeout(() => setControlPromptEditorRerenderKey(Date.now()))
|
||||
}, [currTool])
|
||||
|
||||
// setting when call
|
||||
const setInputVar = useCallback((value: ToolVarInputs) => {
|
||||
setInputs({
|
||||
...inputs,
|
||||
tool_parameters: value,
|
||||
})
|
||||
}, [inputs, setInputs])
|
||||
const setInputVar = useCallback(
|
||||
(value: ToolVarInputs) => {
|
||||
setInputs({
|
||||
...inputs,
|
||||
tool_parameters: value,
|
||||
})
|
||||
},
|
||||
[inputs, setInputs],
|
||||
)
|
||||
|
||||
const isLoading = currTool && (isBuiltIn ? !currCollection : false)
|
||||
|
||||
@@ -174,8 +224,9 @@ const useConfig = (id: string, payload: ToolNodeType) => {
|
||||
|
||||
const outputSchema = useMemo(() => {
|
||||
const res: any[] = []
|
||||
if (!output_schema)
|
||||
return []
|
||||
const output_schema = currTool?.output_schema
|
||||
if (!output_schema || !output_schema.properties) return res
|
||||
|
||||
Object.keys(output_schema.properties).forEach((outputKey) => {
|
||||
const output = output_schema.properties[outputKey]
|
||||
const type = output.type
|
||||
@@ -188,22 +239,35 @@ const useConfig = (id: string, payload: ToolNodeType) => {
|
||||
else {
|
||||
res.push({
|
||||
name: outputKey,
|
||||
type: output.type === 'array'
|
||||
? `Array[${output.items?.type ? output.items.type.slice(0, 1).toLocaleUpperCase() + output.items.type.slice(1) : 'Unknown'}]`
|
||||
: `${output.type ? output.type.slice(0, 1).toLocaleUpperCase() + output.type.slice(1) : 'Unknown'}`,
|
||||
type:
|
||||
output.type === 'array'
|
||||
? `Array[${
|
||||
output.items?.type
|
||||
? output.items.type.slice(0, 1).toLocaleUpperCase()
|
||||
+ output.items.type.slice(1)
|
||||
: 'Unknown'
|
||||
}]`
|
||||
: `${
|
||||
output.type
|
||||
? output.type.slice(0, 1).toLocaleUpperCase()
|
||||
+ output.type.slice(1)
|
||||
: 'Unknown'
|
||||
}`,
|
||||
description: output.description,
|
||||
})
|
||||
}
|
||||
})
|
||||
return res
|
||||
}, [output_schema])
|
||||
}, [currTool])
|
||||
|
||||
const hasObjectOutput = useMemo(() => {
|
||||
if (!output_schema)
|
||||
return false
|
||||
const output_schema = currTool?.output_schema
|
||||
if (!output_schema || !output_schema.properties) return false
|
||||
const properties = output_schema.properties
|
||||
return Object.keys(properties).some(key => properties[key].type === 'object')
|
||||
}, [output_schema])
|
||||
return Object.keys(properties).some(
|
||||
key => properties[key].type === 'object',
|
||||
)
|
||||
}, [currTool])
|
||||
|
||||
return {
|
||||
readOnly,
|
||||
|
||||
Reference in New Issue
Block a user