Commit 7a07d8c2 authored by Joel's avatar Joel

feat: tool params

parent 17a67e79
...@@ -19,6 +19,9 @@ import Tooltip from '@/app/components/base/tooltip-plus' ...@@ -19,6 +19,9 @@ import Tooltip from '@/app/components/base/tooltip-plus'
import { HelpCircle } from '@/app/components/base/icons/src/vender/line/general' import { HelpCircle } from '@/app/components/base/icons/src/vender/line/general'
import Radio from '@/app/components/base/radio' import Radio from '@/app/components/base/radio'
type FormProps = { type FormProps = {
className?: string
itemClassName?: string
fieldLabelClassName?: string
value: FormValue value: FormValue
onChange: (val: FormValue) => void onChange: (val: FormValue) => void
formSchemas: CredentialFormSchema[] formSchemas: CredentialFormSchema[]
...@@ -33,6 +36,9 @@ type FormProps = { ...@@ -33,6 +36,9 @@ type FormProps = {
} }
const Form: FC<FormProps> = ({ const Form: FC<FormProps> = ({
className,
itemClassName,
fieldLabelClassName,
value, value,
onChange, onChange,
formSchemas, formSchemas,
...@@ -89,8 +95,8 @@ const Form: FC<FormProps> = ({ ...@@ -89,8 +95,8 @@ const Form: FC<FormProps> = ({
const disabed = readonly || (isEditMode && (variable === '__model_type' || variable === '__model_name')) const disabed = readonly || (isEditMode && (variable === '__model_type' || variable === '__model_name'))
return ( return (
<div key={variable} className='py-3'> <div key={variable} className={cn(itemClassName, 'py-3')}>
<div className='py-2 text-sm text-gray-900'> <div className={cn(fieldLabelClassName, 'py-2 text-sm text-gray-900')}>
{label[language] || label.en_US} {label[language] || label.en_US}
{ {
required && ( required && (
...@@ -130,8 +136,8 @@ const Form: FC<FormProps> = ({ ...@@ -130,8 +136,8 @@ const Form: FC<FormProps> = ({
const disabed = isEditMode && (variable === '__model_type' || variable === '__model_name') const disabed = isEditMode && (variable === '__model_type' || variable === '__model_name')
return ( return (
<div key={variable} className='py-3'> <div key={variable} className={cn(itemClassName, 'py-3')}>
<div className='py-2 text-sm text-gray-900'> <div className={cn(fieldLabelClassName, 'py-2 text-sm text-gray-900')}>
{label[language] || label.en_US} {label[language] || label.en_US}
{ {
required && ( required && (
...@@ -186,8 +192,8 @@ const Form: FC<FormProps> = ({ ...@@ -186,8 +192,8 @@ const Form: FC<FormProps> = ({
return null return null
return ( return (
<div key={variable} className='py-3'> <div key={variable} className={cn(itemClassName, 'py-3')}>
<div className='py-2 text-sm text-gray-900'> <div className={cn(fieldLabelClassName, 'py-2 text-sm text-gray-900')}>
{label[language] || label.en_US} {label[language] || label.en_US}
{ {
...@@ -227,7 +233,7 @@ const Form: FC<FormProps> = ({ ...@@ -227,7 +233,7 @@ const Form: FC<FormProps> = ({
return null return null
return ( return (
<div key={variable} className='py-3'> <div key={variable} className={cn(itemClassName, 'py-3')}>
<div className='flex items-center justify-between py-2 text-sm text-gray-900'> <div className='flex items-center justify-between py-2 text-sm text-gray-900'>
<div className='flex items-center space-x-2'> <div className='flex items-center space-x-2'>
<span>{label[language] || label.en_US}</span> <span>{label[language] || label.en_US}</span>
...@@ -249,7 +255,7 @@ const Form: FC<FormProps> = ({ ...@@ -249,7 +255,7 @@ const Form: FC<FormProps> = ({
} }
return ( return (
<div> <div className={className}>
{ {
formSchemas.map(formSchema => renderField(formSchema)) formSchemas.map(formSchema => renderField(formSchema))
} }
......
...@@ -3,9 +3,11 @@ import React from 'react' ...@@ -3,9 +3,11 @@ import React from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Split from '../_base/components/split' import Split from '../_base/components/split'
import type { ToolNodeType } from './types' import type { ToolNodeType } from './types'
import useConfig from './use-config'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import type { NodePanelProps } from '@/app/components/workflow/types' import type { NodePanelProps } from '@/app/components/workflow/types'
import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form'
const i18nPrefix = 'workflow.nodes.tool' const i18nPrefix = 'workflow.nodes.tool'
...@@ -16,6 +18,13 @@ const Panel: FC<NodePanelProps<ToolNodeType>> = ({ ...@@ -16,6 +18,13 @@ const Panel: FC<NodePanelProps<ToolNodeType>> = ({
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
const {
inputs,
toolSettingSchema,
toolSettingValue,
setToolSettingValue,
} = useConfig(id, data)
return ( return (
<div className='mt-2'> <div className='mt-2'>
{!readOnly && ( {!readOnly && (
...@@ -37,8 +46,21 @@ const Panel: FC<NodePanelProps<ToolNodeType>> = ({ ...@@ -37,8 +46,21 @@ const Panel: FC<NodePanelProps<ToolNodeType>> = ({
> >
inputVars inputVars
</Field> </Field>
</div>
<Split /> <Split />
<Form
className='space-y-4'
itemClassName='!py-0'
fieldLabelClassName='!text-[13px] !font-semibold !text-gray-700 uppercase'
value={toolSettingValue}
onChange={setToolSettingValue}
formSchemas={toolSettingSchema as any}
isEditMode={false}
showOnVariableMap={{}}
validating={false}
inputClassName='!bg-gray-50'
readonly={readOnly}
/>
</div>
</div> </div>
) )
} }
......
import { useCallback, useEffect, useState } from 'react'
import type { ToolNodeType } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { fetchBuiltInToolList, fetchCustomToolList } from '@/service/tools'
import type { Tool } from '@/app/components/tools/types'
import { addDefaultValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
import { CollectionType } from '@/app/components/tools/types'
const useConfig = (id: string, payload: ToolNodeType) => {
const { inputs, setInputs } = useNodeCrud<ToolNodeType>(id, payload)
const { provider_id, provider_type, tool_name, tool_parameters } = inputs
const isBuiltIn = provider_type === CollectionType.builtIn
const [currTool, setCurrTool] = useState<Tool | null>(null)
const formSchemas = currTool ? toolParametersToFormSchemas(currTool.parameters) : []
// use setting
const toolSettingSchema = formSchemas.filter((item: any) => item.form !== 'llm')
const toolSettingValue = (() => {
return addDefaultValue(tool_parameters, toolSettingSchema)
})()
const setToolSettingValue = useCallback((value: Record<string, any>) => {
setInputs({
...inputs,
tool_parameters: value,
})
}, [inputs, setInputs])
// setting when call
const toolInputSchema = formSchemas.filter((item: any) => item.form === 'llm')
useEffect(() => {
(async () => {
const list = isBuiltIn ? await fetchBuiltInToolList(provider_id) : await fetchCustomToolList(provider_id)
const currTool = list.find(tool => tool.name === tool_name)
if (currTool)
setCurrTool(currTool)
})()
}, [provider_id])
return {
inputs,
currTool,
toolSettingSchema,
toolSettingValue,
setToolSettingValue,
}
}
export default useConfig
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment