mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-07-26 16:02:00 +08:00
fix: tool id (#13932)
This commit is contained in:
parent
653f6c2d46
commit
3460c1dfbd
@ -30,6 +30,7 @@ import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-
|
|||||||
import { useFeatures } from '@/app/components/base/features/hooks'
|
import { useFeatures } from '@/app/components/base/features/hooks'
|
||||||
import type { InputForm } from '@/app/components/base/chat/chat/type'
|
import type { InputForm } from '@/app/components/base/chat/chat/type'
|
||||||
import { getLastAnswer } from '@/app/components/base/chat/utils'
|
import { getLastAnswer } from '@/app/components/base/chat/utils'
|
||||||
|
import { canFindTool } from '@/utils'
|
||||||
|
|
||||||
type ChatItemProps = {
|
type ChatItemProps = {
|
||||||
modelAndParameter: ModelAndParameter
|
modelAndParameter: ModelAndParameter
|
||||||
@ -128,7 +129,7 @@ const ChatItem: FC<ChatItemProps> = ({
|
|||||||
const allToolIcons = useMemo(() => {
|
const allToolIcons = useMemo(() => {
|
||||||
const icons: Record<string, any> = {}
|
const icons: Record<string, any> = {}
|
||||||
modelConfig.agentConfig.tools?.forEach((item: any) => {
|
modelConfig.agentConfig.tools?.forEach((item: any) => {
|
||||||
icons[item.tool_name] = collectionList.find((collection: any) => collection.id === item.provider_id)?.icon
|
icons[item.tool_name] = collectionList.find((collection: any) => canFindTool(collection.id, item.provider_id))?.icon
|
||||||
})
|
})
|
||||||
return icons
|
return icons
|
||||||
}, [collectionList, modelConfig.agentConfig.tools])
|
}, [collectionList, modelConfig.agentConfig.tools])
|
||||||
|
@ -26,6 +26,7 @@ import { useStore as useAppStore } from '@/app/components/app/store'
|
|||||||
import { useFeatures } from '@/app/components/base/features/hooks'
|
import { useFeatures } from '@/app/components/base/features/hooks'
|
||||||
import { getLastAnswer, isValidGeneratedAnswer } from '@/app/components/base/chat/utils'
|
import { getLastAnswer, isValidGeneratedAnswer } from '@/app/components/base/chat/utils'
|
||||||
import type { InputForm } from '@/app/components/base/chat/chat/type'
|
import type { InputForm } from '@/app/components/base/chat/chat/type'
|
||||||
|
import { canFindTool } from '@/utils'
|
||||||
|
|
||||||
type DebugWithSingleModelProps = {
|
type DebugWithSingleModelProps = {
|
||||||
checkCanSend?: () => boolean
|
checkCanSend?: () => boolean
|
||||||
@ -134,7 +135,7 @@ const DebugWithSingleModel = forwardRef<DebugWithSingleModelRefType, DebugWithSi
|
|||||||
const allToolIcons = useMemo(() => {
|
const allToolIcons = useMemo(() => {
|
||||||
const icons: Record<string, any> = {}
|
const icons: Record<string, any> = {}
|
||||||
modelConfig.agentConfig.tools?.forEach((item: any) => {
|
modelConfig.agentConfig.tools?.forEach((item: any) => {
|
||||||
icons[item.tool_name] = collectionList.find((collection: any) => collection.id === item.provider_id)?.icon
|
icons[item.tool_name] = collectionList.find((collection: any) => canFindTool(collection.id, item.provider_id))?.icon
|
||||||
})
|
})
|
||||||
return icons
|
return icons
|
||||||
}, [collectionList, modelConfig.agentConfig.tools])
|
}, [collectionList, modelConfig.agentConfig.tools])
|
||||||
|
@ -72,7 +72,10 @@ import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
|
|||||||
import { SupportUploadFileTypes } from '@/app/components/workflow/types'
|
import { SupportUploadFileTypes } from '@/app/components/workflow/types'
|
||||||
import NewFeaturePanel from '@/app/components/base/features/new-feature-panel'
|
import NewFeaturePanel from '@/app/components/base/features/new-feature-panel'
|
||||||
import { fetchFileUploadConfig } from '@/service/common'
|
import { fetchFileUploadConfig } from '@/service/common'
|
||||||
import { correctProvider } from '@/utils'
|
import {
|
||||||
|
correctModelProvider,
|
||||||
|
correctToolProvider,
|
||||||
|
} from '@/utils'
|
||||||
import PluginDependency from '@/app/components/workflow/plugin-dependency'
|
import PluginDependency from '@/app/components/workflow/plugin-dependency'
|
||||||
|
|
||||||
type PublishConfig = {
|
type PublishConfig = {
|
||||||
@ -557,7 +560,7 @@ const Configuration: FC = () => {
|
|||||||
...modelConfig.annotation_reply,
|
...modelConfig.annotation_reply,
|
||||||
embedding_model: {
|
embedding_model: {
|
||||||
...modelConfig.annotation_reply.embedding_model,
|
...modelConfig.annotation_reply.embedding_model,
|
||||||
embedding_provider_name: correctProvider(modelConfig.annotation_reply.embedding_model.embedding_provider_name),
|
embedding_provider_name: correctModelProvider(modelConfig.annotation_reply.embedding_model.embedding_provider_name),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -572,7 +575,7 @@ const Configuration: FC = () => {
|
|||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
modelConfig: {
|
modelConfig: {
|
||||||
provider: correctProvider(model.provider),
|
provider: correctModelProvider(model.provider),
|
||||||
model_id: model.name,
|
model_id: model.name,
|
||||||
mode: model.mode,
|
mode: model.mode,
|
||||||
configs: {
|
configs: {
|
||||||
@ -627,8 +630,8 @@ const Configuration: FC = () => {
|
|||||||
isDeleted: res.deleted_tools?.some((deletedTool: any) => deletedTool.id === tool.id && deletedTool.tool_name === tool.tool_name),
|
isDeleted: res.deleted_tools?.some((deletedTool: any) => deletedTool.id === tool.id && deletedTool.tool_name === tool.tool_name),
|
||||||
notAuthor: collectionList.find(c => tool.provider_id === c.id)?.is_team_authorization === false,
|
notAuthor: collectionList.find(c => tool.provider_id === c.id)?.is_team_authorization === false,
|
||||||
...(tool.provider_type === 'builtin' ? {
|
...(tool.provider_type === 'builtin' ? {
|
||||||
provider_id: correctProvider(tool.provider_name),
|
provider_id: correctToolProvider(tool.provider_name),
|
||||||
provider_name: correctProvider(tool.provider_name),
|
provider_name: correctToolProvider(tool.provider_name),
|
||||||
} : {}),
|
} : {}),
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
@ -653,7 +656,7 @@ const Configuration: FC = () => {
|
|||||||
...(retrievalConfig.reranking_model ? {
|
...(retrievalConfig.reranking_model ? {
|
||||||
reranking_model: {
|
reranking_model: {
|
||||||
...retrievalConfig.reranking_model,
|
...retrievalConfig.reranking_model,
|
||||||
reranking_provider_name: correctProvider(modelConfig.dataset_configs.reranking_model.reranking_provider_name),
|
reranking_provider_name: correctModelProvider(modelConfig.dataset_configs.reranking_model.reranking_provider_name),
|
||||||
},
|
},
|
||||||
} : {}),
|
} : {}),
|
||||||
})
|
})
|
||||||
|
@ -26,6 +26,7 @@ import { CollectionType } from '@/app/components/tools/types'
|
|||||||
import { useGetLanguage } from '@/context/i18n'
|
import { useGetLanguage } from '@/context/i18n'
|
||||||
import type { AgentNodeType } from '../nodes/agent/types'
|
import type { AgentNodeType } from '../nodes/agent/types'
|
||||||
import { useStrategyProviders } from '@/service/use-strategy'
|
import { useStrategyProviders } from '@/service/use-strategy'
|
||||||
|
import { canFindTool } from '@/utils'
|
||||||
|
|
||||||
export const useChecklist = (nodes: Node[], edges: Edge[]) => {
|
export const useChecklist = (nodes: Node[], edges: Edge[]) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
@ -51,7 +52,7 @@ export const useChecklist = (nodes: Node[], edges: Edge[]) => {
|
|||||||
|
|
||||||
moreDataForCheckValid = getToolCheckParams(node.data as ToolNodeType, buildInTools, customTools, workflowTools, language)
|
moreDataForCheckValid = getToolCheckParams(node.data as ToolNodeType, buildInTools, customTools, workflowTools, language)
|
||||||
if (provider_type === CollectionType.builtIn)
|
if (provider_type === CollectionType.builtIn)
|
||||||
toolIcon = buildInTools.find(tool => tool.id === node.data.provider_id)?.icon
|
toolIcon = buildInTools.find(tool => canFindTool(tool.id, node.data.provider_id || ''))?.icon
|
||||||
|
|
||||||
if (provider_type === CollectionType.custom)
|
if (provider_type === CollectionType.custom)
|
||||||
toolIcon = customTools.find(tool => tool.id === node.data.provider_id)?.icon
|
toolIcon = customTools.find(tool => tool.id === node.data.provider_id)?.icon
|
||||||
|
@ -58,6 +58,7 @@ import I18n from '@/context/i18n'
|
|||||||
import { CollectionType } from '@/app/components/tools/types'
|
import { CollectionType } from '@/app/components/tools/types'
|
||||||
import { CUSTOM_ITERATION_START_NODE } from '@/app/components/workflow/nodes/iteration-start/constants'
|
import { CUSTOM_ITERATION_START_NODE } from '@/app/components/workflow/nodes/iteration-start/constants'
|
||||||
import { useWorkflowConfig } from '@/service/use-workflow'
|
import { useWorkflowConfig } from '@/service/use-workflow'
|
||||||
|
import { canFindTool } from '@/utils'
|
||||||
|
|
||||||
export const useIsChatMode = () => {
|
export const useIsChatMode = () => {
|
||||||
const appDetail = useAppStore(s => s.appDetail)
|
const appDetail = useAppStore(s => s.appDetail)
|
||||||
@ -608,11 +609,7 @@ export const useToolIcon = (data: Node['data']) => {
|
|||||||
targetTools = customTools
|
targetTools = customTools
|
||||||
else
|
else
|
||||||
targetTools = workflowTools
|
targetTools = workflowTools
|
||||||
return targetTools.find((toolWithProvider) => {
|
return targetTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.icon
|
||||||
return toolWithProvider.id === data.provider_id
|
|
||||||
|| toolWithProvider.id === `langgenius/${data.provider_id}/${data.provider_id}`
|
|
||||||
|| toolWithProvider.id === `langgenius/${data.provider_id}_tool/${data.provider_id}`
|
|
||||||
})?.icon
|
|
||||||
}
|
}
|
||||||
}, [data, buildInTools, customTools, workflowTools])
|
}, [data, buildInTools, customTools, workflowTools])
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import type { Node } from '@/app/components/workflow/types'
|
|||||||
import { BlockEnum } from '@/app/components/workflow/types'
|
import { BlockEnum } from '@/app/components/workflow/types'
|
||||||
import { useGetLanguage } from '@/context/i18n'
|
import { useGetLanguage } from '@/context/i18n'
|
||||||
import { CollectionType } from '@/app/components/tools/types'
|
import { CollectionType } from '@/app/components/tools/types'
|
||||||
|
import { canFindTool } from '@/utils'
|
||||||
|
|
||||||
type PanelOperatorPopupProps = {
|
type PanelOperatorPopupProps = {
|
||||||
id: string
|
id: string
|
||||||
@ -57,7 +58,7 @@ const PanelOperatorPopup = ({
|
|||||||
return nodesExtraData[data.type].author
|
return nodesExtraData[data.type].author
|
||||||
|
|
||||||
if (data.provider_type === CollectionType.builtIn)
|
if (data.provider_type === CollectionType.builtIn)
|
||||||
return buildInTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
|
return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.author
|
||||||
|
|
||||||
if (data.provider_type === CollectionType.workflow)
|
if (data.provider_type === CollectionType.workflow)
|
||||||
return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
|
return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
|
||||||
@ -70,7 +71,7 @@ const PanelOperatorPopup = ({
|
|||||||
return nodesExtraData[data.type].about
|
return nodesExtraData[data.type].about
|
||||||
|
|
||||||
if (data.provider_type === CollectionType.builtIn)
|
if (data.provider_type === CollectionType.builtIn)
|
||||||
return buildInTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
|
return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.description[language]
|
||||||
|
|
||||||
if (data.provider_type === CollectionType.workflow)
|
if (data.provider_type === CollectionType.workflow)
|
||||||
return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
|
return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
|
||||||
|
@ -14,6 +14,7 @@ import type { ToolParameter } from '@/app/components/tools/types'
|
|||||||
import { CollectionType } from '@/app/components/tools/types'
|
import { CollectionType } from '@/app/components/tools/types'
|
||||||
import type { BlockEnum } from '@/app/components/workflow/types'
|
import type { BlockEnum } from '@/app/components/workflow/types'
|
||||||
import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
|
import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
|
||||||
|
import { canFindTool } from '@/utils'
|
||||||
|
|
||||||
const i18nPrefix = 'workflow.nodes.parameterExtractor'
|
const i18nPrefix = 'workflow.nodes.parameterExtractor'
|
||||||
|
|
||||||
@ -56,7 +57,7 @@ const ImportFromTool: FC<Props> = ({
|
|||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
})()
|
})()
|
||||||
const currCollection = currentTools.find(item => item.id === provider_id)
|
const currCollection = currentTools.find(item => canFindTool(item.id, provider_id))
|
||||||
const currTool = currCollection?.tools.find(tool => tool.name === tool_name)
|
const currTool = currCollection?.tools.find(tool => tool.name === tool_name)
|
||||||
const toExactParams = (currTool?.parameters || []).filter((item: any) => item.form === 'llm')
|
const toExactParams = (currTool?.parameters || []).filter((item: any) => item.form === 'llm')
|
||||||
const formattedParams = toParmExactParams(toExactParams, language)
|
const formattedParams = toParmExactParams(toExactParams, language)
|
||||||
|
@ -18,6 +18,7 @@ import {
|
|||||||
useFetchToolsData,
|
useFetchToolsData,
|
||||||
useNodesReadOnly,
|
useNodesReadOnly,
|
||||||
} from '@/app/components/workflow/hooks'
|
} from '@/app/components/workflow/hooks'
|
||||||
|
import { canFindTool } from '@/utils'
|
||||||
|
|
||||||
const useConfig = (id: string, payload: ToolNodeType) => {
|
const useConfig = (id: string, payload: ToolNodeType) => {
|
||||||
const { nodesReadOnly: readOnly } = useNodesReadOnly()
|
const { nodesReadOnly: readOnly } = useNodesReadOnly()
|
||||||
@ -49,7 +50,7 @@ const useConfig = (id: string, payload: ToolNodeType) => {
|
|||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
})()
|
})()
|
||||||
const currCollection = currentTools.find(item => item.id === provider_id)
|
const currCollection = currentTools.find(item => canFindTool(item.id, provider_id))
|
||||||
|
|
||||||
// Auth
|
// Auth
|
||||||
const needAuth = !!currCollection?.allow_delete
|
const needAuth = !!currCollection?.allow_delete
|
||||||
|
@ -41,7 +41,7 @@ import type { ToolNodeType } from './nodes/tool/types'
|
|||||||
import type { IterationNodeType } from './nodes/iteration/types'
|
import type { IterationNodeType } from './nodes/iteration/types'
|
||||||
import { CollectionType } from '@/app/components/tools/types'
|
import { CollectionType } from '@/app/components/tools/types'
|
||||||
import { toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
|
import { toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
|
||||||
import { correctProvider } from '@/utils'
|
import { canFindTool, correctModelProvider } from '@/utils'
|
||||||
|
|
||||||
const WHITE = 'WHITE'
|
const WHITE = 'WHITE'
|
||||||
const GRAY = 'GRAY'
|
const GRAY = 'GRAY'
|
||||||
@ -284,16 +284,16 @@ export const initialNodes = (originNodes: Node[], originEdges: Edge[]) => {
|
|||||||
|
|
||||||
// legacy provider handle
|
// legacy provider handle
|
||||||
if (node.data.type === BlockEnum.LLM)
|
if (node.data.type === BlockEnum.LLM)
|
||||||
(node as any).data.model.provider = correctProvider((node as any).data.model.provider)
|
(node as any).data.model.provider = correctModelProvider((node as any).data.model.provider)
|
||||||
|
|
||||||
if (node.data.type === BlockEnum.KnowledgeRetrieval && (node as any).data.multiple_retrieval_config.reranking_model)
|
if (node.data.type === BlockEnum.KnowledgeRetrieval && (node as any).data.multiple_retrieval_config.reranking_model)
|
||||||
(node as any).data.multiple_retrieval_config.reranking_model.provider = correctProvider((node as any).data.multiple_retrieval_config.reranking_model.provider)
|
(node as any).data.multiple_retrieval_config.reranking_model.provider = correctModelProvider((node as any).data.multiple_retrieval_config.reranking_model.provider)
|
||||||
|
|
||||||
if (node.data.type === BlockEnum.QuestionClassifier)
|
if (node.data.type === BlockEnum.QuestionClassifier)
|
||||||
(node as any).data.model.provider = correctProvider((node as any).data.model.provider)
|
(node as any).data.model.provider = correctModelProvider((node as any).data.model.provider)
|
||||||
|
|
||||||
if (node.data.type === BlockEnum.ParameterExtractor)
|
if (node.data.type === BlockEnum.ParameterExtractor)
|
||||||
(node as any).data.model.provider = correctProvider((node as any).data.model.provider)
|
(node as any).data.model.provider = correctModelProvider((node as any).data.model.provider)
|
||||||
if (node.data.type === BlockEnum.HttpRequest && !node.data.retry_config) {
|
if (node.data.type === BlockEnum.HttpRequest && !node.data.retry_config) {
|
||||||
node.data.retry_config = {
|
node.data.retry_config = {
|
||||||
retry_enabled: true,
|
retry_enabled: true,
|
||||||
@ -517,7 +517,7 @@ export const getToolCheckParams = (
|
|||||||
const { provider_id, provider_type, tool_name } = toolData
|
const { provider_id, provider_type, tool_name } = toolData
|
||||||
const isBuiltIn = provider_type === CollectionType.builtIn
|
const isBuiltIn = provider_type === CollectionType.builtIn
|
||||||
const currentTools = provider_type === CollectionType.builtIn ? buildInTools : provider_type === CollectionType.custom ? customTools : workflowTools
|
const currentTools = provider_type === CollectionType.builtIn ? buildInTools : provider_type === CollectionType.custom ? customTools : workflowTools
|
||||||
const currCollection = currentTools.find(item => item.id === provider_id)
|
const currCollection = currentTools.find(item => canFindTool(item.id, provider_id))
|
||||||
const currTool = currCollection?.tools.find(tool => tool.name === tool_name)
|
const currTool = currCollection?.tools.find(tool => tool.name === tool_name)
|
||||||
const formSchemas = currTool ? toolParametersToFormSchemas(currTool.parameters) : []
|
const formSchemas = currTool ? toolParametersToFormSchemas(currTool.parameters) : []
|
||||||
const toolInputVarSchema = formSchemas.filter((item: any) => item.form === 'llm')
|
const toolInputVarSchema = formSchemas.filter((item: any) => item.form === 'llm')
|
||||||
|
@ -56,12 +56,34 @@ export async function fetchWithRetry<T = any>(fn: Promise<T>, retries = 3): Prom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const correctProvider = (provider: string) => {
|
export const correctModelProvider = (provider: string) => {
|
||||||
if (!provider)
|
if (!provider)
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
if (provider.includes('/'))
|
if (provider.includes('/'))
|
||||||
return provider
|
return provider
|
||||||
|
|
||||||
|
if (['google'].includes(provider))
|
||||||
|
return 'langgenius/gemini/google'
|
||||||
|
|
||||||
return `langgenius/${provider}/${provider}`
|
return `langgenius/${provider}/${provider}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const correctToolProvider = (provider: string) => {
|
||||||
|
if (!provider)
|
||||||
|
return ''
|
||||||
|
|
||||||
|
if (provider.includes('/'))
|
||||||
|
return provider
|
||||||
|
|
||||||
|
if (['stepfun', 'jina', 'siliconflow'].includes(provider))
|
||||||
|
return `langgenius/${provider}_tool/${provider}`
|
||||||
|
|
||||||
|
return `langgenius/${provider}/${provider}`
|
||||||
|
}
|
||||||
|
|
||||||
|
export const canFindTool = (providerId: string, oldToolId?: string) => {
|
||||||
|
return providerId === oldToolId
|
||||||
|
|| providerId === `langgenius/${oldToolId}/${oldToolId}`
|
||||||
|
|| providerId === `langgenius/${oldToolId}_tool/${oldToolId}`
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user