mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-21 11:43:56 +00:00
Concat textinput to input type (#2963)
* perf: toast position * concat textinput to input
This commit is contained in:
@@ -9,13 +9,16 @@ weight: 812
|
||||
|
||||
## 更新说明
|
||||
|
||||
1. 新增 - 全局变量支持数字类型,并且支持配置默认值和部分输入框参数。
|
||||
2. 新增 - FE_DOMAIN 环境变量,配置该环境变量后,上传文件/图片会补全后缀后得到完整地址。(可解决 docx 文件图片链接,有时会无法被模型识别问题)
|
||||
3. 新增 - 工具调用支持交互模式
|
||||
4. 新增 - Debug 模式支持输入全局变量
|
||||
5. 新增 - chat openapi 文档
|
||||
6. 新增 - wiki 搜索插件
|
||||
7. 新增 - Cookie 隐私协议提示
|
||||
8. 修复 - 文件后缀判断,去除 query 影响。
|
||||
9. 修复 - AI 响应为空时,会造成 LLM 历史记录合并。
|
||||
10. 修复 - 用户交互节点未阻塞流程。
|
||||
1. 新增 - 全局变量支持数字类型,支持配置默认值和部分输入框参数。
|
||||
2. 新增 - 插件自定义输入,文本输入框、数字输入框、选择框、开关,默认都支持作为变量引用。
|
||||
3. 新增 - FE_DOMAIN 环境变量,配置该环境变量后,上传文件/图片会补全后缀后得到完整地址。(可解决 docx 文件图片链接,有时会无法被模型识别问题)
|
||||
4. 新增 - 工具调用支持交互模式
|
||||
5. 新增 - Debug 模式支持输入全局变量
|
||||
6. 新增 - chat OpenAPI 文档
|
||||
7. 新增 - wiki 搜索插件
|
||||
8. 新增 - Google 搜索插件
|
||||
9. 新增 - 数据库连接和操作插件
|
||||
10. 新增 - Cookie 隐私协议提示
|
||||
11. 修复 - 文件后缀判断,去除 query 影响。
|
||||
12. 修复 - AI 响应为空时,会造成 LLM 历史记录合并。
|
||||
13. 修复 - 用户交互节点未阻塞流程。
|
||||
|
@@ -267,7 +267,6 @@ export enum NodeOutputKeyEnum {
|
||||
export enum VariableInputEnum {
|
||||
input = 'input',
|
||||
textarea = 'textarea',
|
||||
textInput = 'textInput',
|
||||
numberInput = 'numberInput',
|
||||
select = 'select',
|
||||
custom = 'custom'
|
||||
@@ -284,7 +283,7 @@ export const variableMap: Record<
|
||||
> = {
|
||||
[VariableInputEnum.input]: {
|
||||
icon: 'core/workflow/inputType/input',
|
||||
label: i18nT('common:core.workflow.inputType.input'),
|
||||
label: i18nT('common:core.workflow.inputType.textInput'),
|
||||
value: VariableInputEnum.input,
|
||||
defaultValueType: WorkflowIOValueTypeEnum.string
|
||||
},
|
||||
@@ -295,12 +294,6 @@ export const variableMap: Record<
|
||||
defaultValueType: WorkflowIOValueTypeEnum.string,
|
||||
description: i18nT('app:variable.textarea_type_desc')
|
||||
},
|
||||
[VariableInputEnum.textInput]: {
|
||||
icon: 'core/workflow/inputType/input',
|
||||
label: i18nT('common:core.workflow.inputType.textInput'),
|
||||
value: VariableInputEnum.textInput,
|
||||
defaultValueType: WorkflowIOValueTypeEnum.string
|
||||
},
|
||||
[VariableInputEnum.numberInput]: {
|
||||
icon: 'core/workflow/inputType/numberInput',
|
||||
label: i18nT('common:core.workflow.inputType.number input'),
|
||||
|
@@ -1,8 +1,9 @@
|
||||
import { WorkflowIOValueTypeEnum } from '../constants';
|
||||
import { i18nT } from '../../../../web/i18n/utils';
|
||||
export enum FlowNodeInputTypeEnum { // render ui
|
||||
textInput = 'textInput',
|
||||
reference = 'reference', // reference to other node output
|
||||
input = 'input', // one line input
|
||||
textarea = 'textarea',
|
||||
numberInput = 'numberInput',
|
||||
switch = 'switch', // true/false
|
||||
select = 'select',
|
||||
@@ -26,11 +27,7 @@ export enum FlowNodeInputTypeEnum { // render ui
|
||||
settingDatasetQuotePrompt = 'settingDatasetQuotePrompt',
|
||||
|
||||
hidden = 'hidden',
|
||||
custom = 'custom',
|
||||
|
||||
// deprecated
|
||||
input = 'input', // one line input
|
||||
textarea = 'textarea'
|
||||
custom = 'custom'
|
||||
}
|
||||
export const FlowNodeInputMap: Record<
|
||||
FlowNodeInputTypeEnum,
|
||||
@@ -38,9 +35,6 @@ export const FlowNodeInputMap: Record<
|
||||
icon: string;
|
||||
}
|
||||
> = {
|
||||
[FlowNodeInputTypeEnum.textInput]: {
|
||||
icon: 'core/workflow/inputType/input'
|
||||
},
|
||||
[FlowNodeInputTypeEnum.reference]: {
|
||||
icon: 'core/workflow/inputType/reference'
|
||||
},
|
||||
|
@@ -230,10 +230,6 @@ export const appData2FlowNodeIO = ({
|
||||
FlowNodeInputTypeEnum.textarea,
|
||||
FlowNodeInputTypeEnum.reference
|
||||
],
|
||||
[VariableInputEnum.textInput]: [
|
||||
FlowNodeInputTypeEnum.textInput,
|
||||
FlowNodeInputTypeEnum.reference
|
||||
],
|
||||
[VariableInputEnum.numberInput]: [FlowNodeInputTypeEnum.numberInput],
|
||||
[VariableInputEnum.select]: [FlowNodeInputTypeEnum.select],
|
||||
[VariableInputEnum.custom]: [
|
||||
|
@@ -60,11 +60,10 @@ const main = async ({
|
||||
// 使用类型断言来处理错误
|
||||
if (error instanceof Error) {
|
||||
console.error('Database query error:', error.message);
|
||||
throw new Error(error.message);
|
||||
} else {
|
||||
console.error('Database query error:', error);
|
||||
throw new Error('An unknown error occurred');
|
||||
return Promise.reject(error.message);
|
||||
}
|
||||
console.error('Database query error:', error);
|
||||
return Promise.reject('An unknown error occurred');
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -152,8 +152,8 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise<
|
||||
} = await (async () => {
|
||||
const adaptMessages = chats2GPTMessages({
|
||||
messages,
|
||||
reserveId: false,
|
||||
reserveTool: !!toolModel.toolChoice
|
||||
reserveId: false
|
||||
// reserveTool: !!toolModel.toolChoice
|
||||
});
|
||||
|
||||
if (toolModel.toolChoice) {
|
||||
|
@@ -36,11 +36,6 @@ const NodeInputSelect = ({
|
||||
icon: FlowNodeInputMap[FlowNodeInputTypeEnum.input].icon,
|
||||
title: t('common:core.workflow.inputType.Manual input')
|
||||
},
|
||||
{
|
||||
type: FlowNodeInputTypeEnum.textInput,
|
||||
icon: FlowNodeInputMap[FlowNodeInputTypeEnum.input].icon,
|
||||
title: t('common:core.workflow.inputType.Manual input')
|
||||
},
|
||||
{
|
||||
type: FlowNodeInputTypeEnum.numberInput,
|
||||
icon: FlowNodeInputMap[FlowNodeInputTypeEnum.numberInput].icon,
|
||||
|
@@ -36,7 +36,7 @@ export const defaultVariable: VariableItemType = {
|
||||
id: nanoid(),
|
||||
key: '',
|
||||
label: '',
|
||||
type: VariableInputEnum.textInput,
|
||||
type: VariableInputEnum.input,
|
||||
description: '',
|
||||
required: true,
|
||||
valueType: WorkflowIOValueTypeEnum.string
|
||||
@@ -73,10 +73,7 @@ const VariableEdit = ({
|
||||
const inputTypeList = useMemo(
|
||||
() =>
|
||||
Object.values(variableMap)
|
||||
.filter(
|
||||
(item) =>
|
||||
item.value !== VariableInputEnum.input && item.value !== VariableInputEnum.textarea
|
||||
)
|
||||
.filter((item) => item.value !== VariableInputEnum.textarea)
|
||||
.map((item) => ({
|
||||
icon: item.icon,
|
||||
label: t(item.label as any),
|
||||
|
@@ -60,12 +60,13 @@ export const VariableInputItem = ({
|
||||
{item.description && <QuestionTip ml={1} label={item.description} />}
|
||||
</Box>
|
||||
{item.type === VariableInputEnum.input && (
|
||||
<Input
|
||||
maxLength={item.maxLength || 4000}
|
||||
<PromptEditor
|
||||
value={item.defaultValue}
|
||||
onChange={(e) => setValue(item.key, e)}
|
||||
bg={'myGray.50'}
|
||||
{...register(item.key, {
|
||||
required: item.required
|
||||
})}
|
||||
minH={40}
|
||||
maxH={150}
|
||||
showOpenModal={false}
|
||||
/>
|
||||
)}
|
||||
{item.type === VariableInputEnum.textarea && (
|
||||
@@ -78,16 +79,7 @@ export const VariableInputItem = ({
|
||||
maxLength={item.maxLength || 4000}
|
||||
/>
|
||||
)}
|
||||
{item.type === VariableInputEnum.textInput && (
|
||||
<PromptEditor
|
||||
value={item.defaultValue}
|
||||
onChange={(e) => setValue(item.key, e)}
|
||||
bg={'myGray.50'}
|
||||
minH={50}
|
||||
maxH={150}
|
||||
showOpenModal={false}
|
||||
/>
|
||||
)}
|
||||
|
||||
{item.type === VariableInputEnum.select && (
|
||||
<Controller
|
||||
key={item.key}
|
||||
|
@@ -221,13 +221,12 @@ const RenderUserFormInteractive = React.memo(function RenderFormInput({
|
||||
{input.description && <QuestionTip ml={1} label={input.description} />}
|
||||
</Flex>
|
||||
{input.type === FlowNodeInputTypeEnum.input && (
|
||||
<Input
|
||||
bg={'white'}
|
||||
maxLength={input.maxLength}
|
||||
isDisabled={interactive.params.submitted}
|
||||
{...register(input.label, {
|
||||
required: input.required
|
||||
})}
|
||||
<PromptEditor
|
||||
value={input.value}
|
||||
onChange={(e) => setValue(input.label, e)}
|
||||
minH={40}
|
||||
maxH={100}
|
||||
showOpenModal={false}
|
||||
/>
|
||||
)}
|
||||
{input.type === FlowNodeInputTypeEnum.textarea && (
|
||||
@@ -241,15 +240,6 @@ const RenderUserFormInteractive = React.memo(function RenderFormInput({
|
||||
maxLength={input.maxLength || 4000}
|
||||
/>
|
||||
)}
|
||||
{input.type === FlowNodeInputTypeEnum.textInput && (
|
||||
<PromptEditor
|
||||
value={input.value}
|
||||
onChange={(e) => setValue(input.label, e)}
|
||||
minH={40}
|
||||
maxH={100}
|
||||
showOpenModal={false}
|
||||
/>
|
||||
)}
|
||||
{input.type === FlowNodeInputTypeEnum.numberInput && (
|
||||
<NumberInput
|
||||
step={1}
|
||||
|
@@ -27,7 +27,7 @@ const SaveButton = ({
|
||||
const [isSave, setIsSave] = useState(false);
|
||||
const { toast } = useToast({
|
||||
containerStyle: {
|
||||
mt: 20,
|
||||
mt: '60px',
|
||||
fontSize: 'sm'
|
||||
}
|
||||
});
|
||||
|
@@ -22,7 +22,7 @@ const SaveAndPublishModal = ({
|
||||
const { t } = useTranslation();
|
||||
const { toast } = useToast({
|
||||
containerStyle: {
|
||||
mt: 20,
|
||||
mt: '60px',
|
||||
fontSize: 'sm'
|
||||
}
|
||||
});
|
||||
|
@@ -11,7 +11,7 @@ import { useToast } from '@fastgpt/web/hooks/useToast';
|
||||
import InputTypeConfig from '../NodePluginIO/InputTypeConfig';
|
||||
|
||||
export const defaultFormInput: UserInputFormItemType = {
|
||||
type: FlowNodeInputTypeEnum.textInput,
|
||||
type: FlowNodeInputTypeEnum.input,
|
||||
key: '',
|
||||
label: '',
|
||||
description: '',
|
||||
@@ -55,7 +55,7 @@ const InputFormEditModal = ({
|
||||
{
|
||||
icon: 'core/workflow/inputType/input',
|
||||
label: t('common:core.workflow.inputType.textInput'),
|
||||
value: FlowNodeInputTypeEnum.textInput,
|
||||
value: FlowNodeInputTypeEnum.input,
|
||||
defaultValueType: WorkflowIOValueTypeEnum.string
|
||||
},
|
||||
{
|
||||
|
@@ -55,7 +55,7 @@ const FieldEditModal = ({
|
||||
{
|
||||
icon: 'core/workflow/inputType/input',
|
||||
label: t('common:core.workflow.inputType.textInput'),
|
||||
value: FlowNodeInputTypeEnum.textInput,
|
||||
value: FlowNodeInputTypeEnum.input,
|
||||
defaultValueType: WorkflowIOValueTypeEnum.string
|
||||
},
|
||||
{
|
||||
|
@@ -137,7 +137,7 @@ const InputTypeConfig = ({
|
||||
}, [inputType]);
|
||||
|
||||
const showMaxLenInput = useMemo(() => {
|
||||
const list = [FlowNodeInputTypeEnum.textInput];
|
||||
const list = [FlowNodeInputTypeEnum.input];
|
||||
return list.includes(inputType as FlowNodeInputTypeEnum);
|
||||
}, [inputType]);
|
||||
|
||||
@@ -148,7 +148,7 @@ const InputTypeConfig = ({
|
||||
|
||||
const showDefaultValue = useMemo(() => {
|
||||
const list = [
|
||||
FlowNodeInputTypeEnum.textInput,
|
||||
FlowNodeInputTypeEnum.input,
|
||||
FlowNodeInputTypeEnum.JSONEditor,
|
||||
FlowNodeInputTypeEnum.numberInput,
|
||||
FlowNodeInputTypeEnum.switch,
|
||||
@@ -323,7 +323,7 @@ const InputTypeConfig = ({
|
||||
</NumberInputStepper>
|
||||
</NumberInput>
|
||||
)}
|
||||
{inputType === FlowNodeInputTypeEnum.textInput && (
|
||||
{inputType === FlowNodeInputTypeEnum.input && (
|
||||
<PromptEditor
|
||||
value={defaultValue}
|
||||
onChange={(e) => {
|
||||
|
@@ -28,10 +28,6 @@ const RenderList: {
|
||||
types: [FlowNodeInputTypeEnum.switch],
|
||||
Component: dynamic(() => import('./templates/Switch'))
|
||||
},
|
||||
{
|
||||
types: [FlowNodeInputTypeEnum.textInput],
|
||||
Component: dynamic(() => import('./templates/TextInput'))
|
||||
},
|
||||
{
|
||||
types: [FlowNodeInputTypeEnum.selectApp],
|
||||
Component: dynamic(() => import('./templates/SelectApp'))
|
||||
|
@@ -10,9 +10,7 @@ import { getEditorVariables } from '../../../../../utils';
|
||||
|
||||
const TextInputRender = ({ inputs = [], item, nodeId }: RenderInputProps) => {
|
||||
const { t } = useTranslation();
|
||||
const nodeList = useContextSelector(WorkflowContext, (v) => v.nodeList);
|
||||
const edges = useContextSelector(WorkflowContext, (v) => v.edges);
|
||||
const onChangeNode = useContextSelector(WorkflowContext, (v) => v.onChangeNode);
|
||||
const { nodeList, edges, onChangeNode } = useContextSelector(WorkflowContext, (v) => v);
|
||||
|
||||
const { appDetail } = useContextSelector(AppContext, (v) => v);
|
||||
|
||||
@@ -51,7 +49,7 @@ const TextInputRender = ({ inputs = [], item, nodeId }: RenderInputProps) => {
|
||||
maxLength={item.maxLength}
|
||||
minH={40}
|
||||
maxH={120}
|
||||
placeholder={t((item.placeholder as any) || '')}
|
||||
placeholder={t(item.placeholder as any)}
|
||||
value={item.value}
|
||||
onChange={onChange}
|
||||
isFlow={true}
|
||||
|
Reference in New Issue
Block a user