mirror of
https://github.com/langgenius/dify.git
synced 2026-05-06 02:18:08 +08:00
agent node legacy data fomatting
This commit is contained in:
@ -23,7 +23,7 @@ import Textarea from '@/app/components/base/textarea'
|
|||||||
import Divider from '@/app/components/base/divider'
|
import Divider from '@/app/components/base/divider'
|
||||||
import TabSlider from '@/app/components/base/tab-slider-plain'
|
import TabSlider from '@/app/components/base/tab-slider-plain'
|
||||||
import ReasoningConfigForm from '@/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form'
|
import ReasoningConfigForm from '@/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form'
|
||||||
import { generateFormValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
|
import { generateFormValue, getPlainValue, getStructureValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
|
||||||
|
|
||||||
import { useAppContext } from '@/context/app-context'
|
import { useAppContext } from '@/context/app-context'
|
||||||
import {
|
import {
|
||||||
@ -172,9 +172,10 @@ const ToolSelector: FC<Props> = ({
|
|||||||
const paramsFormSchemas = useMemo(() => toolParametersToFormSchemas(currentToolParams), [currentToolParams])
|
const paramsFormSchemas = useMemo(() => toolParametersToFormSchemas(currentToolParams), [currentToolParams])
|
||||||
|
|
||||||
const handleSettingsFormChange = (v: Record<string, any>) => {
|
const handleSettingsFormChange = (v: Record<string, any>) => {
|
||||||
|
const newValue = getStructureValue(v)
|
||||||
const toolValue = {
|
const toolValue = {
|
||||||
...value,
|
...value,
|
||||||
settings: v,
|
settings: newValue,
|
||||||
}
|
}
|
||||||
onSelect(toolValue as any)
|
onSelect(toolValue as any)
|
||||||
}
|
}
|
||||||
@ -402,7 +403,7 @@ const ToolSelector: FC<Props> = ({
|
|||||||
readOnly={false}
|
readOnly={false}
|
||||||
nodeId={nodeId}
|
nodeId={nodeId}
|
||||||
schema={settingsFormSchemas as any}
|
schema={settingsFormSchemas as any}
|
||||||
value={value?.settings || {}}
|
value={getPlainValue(value?.settings || {})}
|
||||||
onChange={handleSettingsFormChange}
|
onChange={handleSettingsFormChange}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
import type { ToolCredential, ToolParameter } from '../types'
|
import type { ToolCredential, ToolParameter } from '../types'
|
||||||
|
import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
|
||||||
|
import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
|
||||||
|
|
||||||
export const toType = (type: string) => {
|
export const toType = (type: string) => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'string':
|
case 'string':
|
||||||
@ -110,6 +113,26 @@ export const generateFormValue = (value: Record<string, any>, formSchemas: { var
|
|||||||
return newValues
|
return newValues
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const getPlainValue = (value: Record<string, any>) => {
|
||||||
|
const plainValue = { ...value }
|
||||||
|
Object.keys(plainValue).forEach((key) => {
|
||||||
|
plainValue[key] = {
|
||||||
|
...value[key].value,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return plainValue
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getStructureValue = (value: Record<string, any>) => {
|
||||||
|
const newValue = { ...value } as any
|
||||||
|
Object.keys(newValue).forEach((key) => {
|
||||||
|
newValue[key] = {
|
||||||
|
value: value[key],
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return newValue
|
||||||
|
}
|
||||||
|
|
||||||
export const getConfiguredValue = (value: Record<string, any>, formSchemas: { variable: string; type: string; default?: any }[]) => {
|
export const getConfiguredValue = (value: Record<string, any>, formSchemas: { variable: string; type: string; default?: any }[]) => {
|
||||||
const newValues = { ...value }
|
const newValues = { ...value }
|
||||||
formSchemas.forEach((formSchema) => {
|
formSchemas.forEach((formSchema) => {
|
||||||
@ -125,3 +148,49 @@ export const getConfiguredValue = (value: Record<string, any>, formSchemas: { va
|
|||||||
})
|
})
|
||||||
return newValues
|
return newValues
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getVarKindType = (type: FormTypeEnum) => {
|
||||||
|
if (type === FormTypeEnum.file || type === FormTypeEnum.files)
|
||||||
|
return VarKindType.variable
|
||||||
|
if (type === FormTypeEnum.select || type === FormTypeEnum.boolean || type === FormTypeEnum.textNumber)
|
||||||
|
return VarKindType.constant
|
||||||
|
if (type === FormTypeEnum.textInput || type === FormTypeEnum.secretInput)
|
||||||
|
return VarKindType.mixed
|
||||||
|
}
|
||||||
|
|
||||||
|
export const generateAgentToolValue = (value: Record<string, any>, formSchemas: { variable: string; default?: any; type: string }[], isReasoning = false) => {
|
||||||
|
const newValues = {} as any
|
||||||
|
if (!isReasoning) {
|
||||||
|
formSchemas.forEach((formSchema) => {
|
||||||
|
const itemValue = value[formSchema.variable]
|
||||||
|
newValues[formSchema.variable] = {
|
||||||
|
value: {
|
||||||
|
type: 'constant',
|
||||||
|
value: itemValue.value,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
newValues[formSchema.variable].value = correctInitialData(formSchema.type, newValues[formSchema.variable].value, itemValue.value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
formSchemas.forEach((formSchema) => {
|
||||||
|
const itemValue = value[formSchema.variable]
|
||||||
|
if (itemValue.auto === 1) {
|
||||||
|
newValues[formSchema.variable] = {
|
||||||
|
auto: 1,
|
||||||
|
value: null,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newValues[formSchema.variable] = {
|
||||||
|
auto: 0,
|
||||||
|
value: itemValue.value || {
|
||||||
|
type: getVarKindType(formSchema.type as FormTypeEnum),
|
||||||
|
value: null,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return newValues
|
||||||
|
}
|
||||||
|
|||||||
@ -152,7 +152,7 @@ const FormInputItem: FC<Props> = ({
|
|||||||
[variable]: {
|
[variable]: {
|
||||||
...varInput,
|
...varInput,
|
||||||
type: getVarKindType(),
|
type: getVarKindType(),
|
||||||
value: newValue,
|
value: isNumber ? Number.parseFloat(newValue) : newValue,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import {
|
|||||||
useIsChatMode,
|
useIsChatMode,
|
||||||
useNodesReadOnly,
|
useNodesReadOnly,
|
||||||
} from '@/app/components/workflow/hooks'
|
} from '@/app/components/workflow/hooks'
|
||||||
import { useCallback, useMemo } from 'react'
|
import { useCallback, useEffect, useMemo } from 'react'
|
||||||
import { type ToolVarInputs, VarType } from '../tool/types'
|
import { type ToolVarInputs, VarType } from '../tool/types'
|
||||||
import { useCheckInstalled, useFetchPluginsInMarketPlaceByIds } from '@/service/use-plugins'
|
import { useCheckInstalled, useFetchPluginsInMarketPlaceByIds } from '@/service/use-plugins'
|
||||||
import type { Memory, Var } from '../../types'
|
import type { Memory, Var } from '../../types'
|
||||||
@ -15,6 +15,8 @@ import { VarType as VarKindType } from '../../types'
|
|||||||
import useAvailableVarList from '../_base/hooks/use-available-var-list'
|
import useAvailableVarList from '../_base/hooks/use-available-var-list'
|
||||||
import produce from 'immer'
|
import produce from 'immer'
|
||||||
import { isSupportMCP } from '@/utils/plugin-version-feature'
|
import { isSupportMCP } from '@/utils/plugin-version-feature'
|
||||||
|
import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
|
||||||
|
import { generateAgentToolValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
|
||||||
|
|
||||||
export type StrategyStatus = {
|
export type StrategyStatus = {
|
||||||
plugin: {
|
plugin: {
|
||||||
@ -87,11 +89,12 @@ const useConfig = (id: string, payload: AgentNodeType) => {
|
|||||||
})
|
})
|
||||||
const formData = useMemo(() => {
|
const formData = useMemo(() => {
|
||||||
const paramNameList = (currentStrategy?.parameters || []).map(item => item.name)
|
const paramNameList = (currentStrategy?.parameters || []).map(item => item.name)
|
||||||
return Object.fromEntries(
|
const res = Object.fromEntries(
|
||||||
Object.entries(inputs.agent_parameters || {}).filter(([name]) => paramNameList.includes(name)).map(([key, value]) => {
|
Object.entries(inputs.agent_parameters || {}).filter(([name]) => paramNameList.includes(name)).map(([key, value]) => {
|
||||||
return [key, value.value]
|
return [key, value.value]
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
return res
|
||||||
}, [inputs.agent_parameters, currentStrategy?.parameters])
|
}, [inputs.agent_parameters, currentStrategy?.parameters])
|
||||||
const onFormChange = (value: Record<string, any>) => {
|
const onFormChange = (value: Record<string, any>) => {
|
||||||
const res: ToolVarInputs = {}
|
const res: ToolVarInputs = {}
|
||||||
@ -107,6 +110,42 @@ const useConfig = (id: string, payload: AgentNodeType) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const formattingToolData = (data: any) => {
|
||||||
|
const settingValues = generateAgentToolValue(data.settings, toolParametersToFormSchemas(data.schemas.filter((param: { form: string }) => param.form !== 'llm') as any))
|
||||||
|
const paramValues = generateAgentToolValue(data.parameters, toolParametersToFormSchemas(data.schemas.filter((param: { form: string }) => param.form === 'llm') as any), true)
|
||||||
|
const res = produce(data, (draft: any) => {
|
||||||
|
draft.settings = settingValues
|
||||||
|
draft.parameters = paramValues
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
const formattingLegacyData = () => {
|
||||||
|
if (inputs.version)
|
||||||
|
return inputs
|
||||||
|
const newData = produce(inputs, (draft) => {
|
||||||
|
const schemas = currentStrategy?.parameters || []
|
||||||
|
Object.keys(draft.agent_parameters || {}).forEach((key) => {
|
||||||
|
const targetSchema = schemas.find(schema => schema.name === key)
|
||||||
|
if (targetSchema?.type === FormTypeEnum.toolSelector)
|
||||||
|
draft.agent_parameters![key].value = formattingToolData(draft.agent_parameters![key].value)
|
||||||
|
if (targetSchema?.type === FormTypeEnum.multiToolSelector)
|
||||||
|
draft.agent_parameters![key].value = draft.agent_parameters![key].value.map((tool: any) => formattingToolData(tool))
|
||||||
|
})
|
||||||
|
draft.version = '2'
|
||||||
|
})
|
||||||
|
return newData
|
||||||
|
}
|
||||||
|
|
||||||
|
// formatting legacy data
|
||||||
|
useEffect(() => {
|
||||||
|
if (!currentStrategy)
|
||||||
|
return
|
||||||
|
const newData = formattingLegacyData()
|
||||||
|
setInputs(newData)
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [currentStrategy])
|
||||||
|
|
||||||
// vars
|
// vars
|
||||||
|
|
||||||
const filterMemoryPromptVar = useCallback((varPayload: Var) => {
|
const filterMemoryPromptVar = useCallback((varPayload: Var) => {
|
||||||
|
|||||||
@ -27,7 +27,6 @@ import type { QuestionClassifierNodeType } from '../nodes/question-classifier/ty
|
|||||||
import type { IfElseNodeType } from '../nodes/if-else/types'
|
import type { IfElseNodeType } from '../nodes/if-else/types'
|
||||||
import { branchNameCorrect } from '../nodes/if-else/utils'
|
import { branchNameCorrect } from '../nodes/if-else/utils'
|
||||||
import type { IterationNodeType } from '../nodes/iteration/types'
|
import type { IterationNodeType } from '../nodes/iteration/types'
|
||||||
import type { AgentNodeType } from '../nodes/agent/types'
|
|
||||||
import type { LoopNodeType } from '../nodes/loop/types'
|
import type { LoopNodeType } from '../nodes/loop/types'
|
||||||
import type { ToolNodeType } from '../nodes/tool/types'
|
import type { ToolNodeType } from '../nodes/tool/types'
|
||||||
import {
|
import {
|
||||||
@ -305,13 +304,6 @@ export const initialNodes = (originNodes: Node[], originEdges: Edge[]) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.data.type === BlockEnum.Agent && !(node as Node<AgentNodeType>).data.version) {
|
|
||||||
// TODO: formatting legacy agent node data
|
|
||||||
// (node as Node<ToolNodeType>).data.version = '2'
|
|
||||||
// const toolData = (node as Node<AgentNodeType>).data.agent_parameters?.tool
|
|
||||||
// const multipleTools = (node as Node<AgentNodeType>).data.agent_parameters?.multiple_tools
|
|
||||||
}
|
|
||||||
|
|
||||||
return node
|
return node
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user