App template market (#2337)
* feat: add app template market (#2012) * feat: add app template market * fix * fix * i18n * fix * perf: template market ux * perf: simple mode app ui * perf: tempalte modal ui * perf: tempalte market ui * perf: template position * feat: create app modal * regiter default app * perf: icon * change templates position (#2331) * change templates position * fix * perf: template market ux --------- Co-authored-by: heheer <heheer@sealos.io>
@ -37,6 +37,7 @@ export type FastGPTFeConfigsType = {
|
|||||||
chatbotUrl?: string;
|
chatbotUrl?: string;
|
||||||
openAPIDocUrl?: string;
|
openAPIDocUrl?: string;
|
||||||
systemPluginCourseUrl?: string;
|
systemPluginCourseUrl?: string;
|
||||||
|
appTemplateCourse?: string;
|
||||||
|
|
||||||
systemTitle?: string;
|
systemTitle?: string;
|
||||||
systemDescription?: string;
|
systemDescription?: string;
|
||||||
|
|||||||
@ -29,3 +29,12 @@ export const defaultAppSelectFileConfig: AppFileSelectConfigType = {
|
|||||||
canSelectImg: false,
|
canSelectImg: false,
|
||||||
maxFiles: 10
|
maxFiles: 10
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export enum AppTemplateTypeEnum {
|
||||||
|
recommendation = 'recommendation',
|
||||||
|
writing = 'writing',
|
||||||
|
imageGeneration = 'image-generation',
|
||||||
|
webSearch = 'web-search',
|
||||||
|
roleplay = 'roleplay',
|
||||||
|
officeServices = 'office-services'
|
||||||
|
}
|
||||||
|
|||||||
15
packages/global/core/workflow/type/index.d.ts
vendored
@ -24,7 +24,7 @@ import { FlowNodeTemplateType, StoreNodeItemType } from './node';
|
|||||||
export type WorkflowTemplateBasicType = {
|
export type WorkflowTemplateBasicType = {
|
||||||
nodes: StoreNodeItemType[];
|
nodes: StoreNodeItemType[];
|
||||||
edges: StoreEdgeItemType[];
|
edges: StoreEdgeItemType[];
|
||||||
chatConfigs?: AppChatConfigType;
|
chatConfig?: AppChatConfigType;
|
||||||
};
|
};
|
||||||
export type WorkflowTemplateType = {
|
export type WorkflowTemplateType = {
|
||||||
id: string;
|
id: string;
|
||||||
@ -46,7 +46,18 @@ export type WorkflowTemplateType = {
|
|||||||
|
|
||||||
// template market
|
// template market
|
||||||
export type TemplateMarketItemType = WorkflowTemplateType & {
|
export type TemplateMarketItemType = WorkflowTemplateType & {
|
||||||
tags?: { id: string; label: string }[];
|
tags: string[];
|
||||||
|
type: AppTypeEnum.simple | AppTypeEnum.workflow | AppTypeEnum.plugin;
|
||||||
|
};
|
||||||
|
// template market list
|
||||||
|
export type TemplateMarketListItemType = {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
intro?: string;
|
||||||
|
author?: string;
|
||||||
|
tags: string[];
|
||||||
|
type: AppTypeEnum.simple | AppTypeEnum.workflow | AppTypeEnum.plugin;
|
||||||
|
avatar: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
// system plugin
|
// system plugin
|
||||||
|
|||||||
2
packages/service/type.d.ts
vendored
@ -9,6 +9,7 @@ import {
|
|||||||
import { SubPlanType } from '@fastgpt/global/support/wallet/sub/type';
|
import { SubPlanType } from '@fastgpt/global/support/wallet/sub/type';
|
||||||
import { WorkerNameEnum, WorkerPool } from './worker/utils';
|
import { WorkerNameEnum, WorkerPool } from './worker/utils';
|
||||||
import { Worker } from 'worker_threads';
|
import { Worker } from 'worker_threads';
|
||||||
|
import { TemplateMarketItemType } from '@fastgpt/global/core/workflow/type';
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
var feConfigs: FastGPTFeConfigsType;
|
var feConfigs: FastGPTFeConfigsType;
|
||||||
@ -25,4 +26,5 @@ declare global {
|
|||||||
var systemLoadedGlobalConfig: boolean;
|
var systemLoadedGlobalConfig: boolean;
|
||||||
|
|
||||||
var workerPoll: Record<WorkerNameEnum, WorkerPool>;
|
var workerPoll: Record<WorkerNameEnum, WorkerPool>;
|
||||||
|
var appMarketTemplates: TemplateMarketItemType[];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -61,6 +61,7 @@ export const iconPaths = {
|
|||||||
'common/text/t': () => import('./icons/common/text/t.svg'),
|
'common/text/t': () => import('./icons/common/text/t.svg'),
|
||||||
'common/tickFill': () => import('./icons/common/tickFill.svg'),
|
'common/tickFill': () => import('./icons/common/tickFill.svg'),
|
||||||
'common/trash': () => import('./icons/common/trash.svg'),
|
'common/trash': () => import('./icons/common/trash.svg'),
|
||||||
|
'common/upRightArrowLight': () => import('./icons/common/upRightArrowLight.svg'),
|
||||||
'common/uploadFileFill': () => import('./icons/common/uploadFileFill.svg'),
|
'common/uploadFileFill': () => import('./icons/common/uploadFileFill.svg'),
|
||||||
'common/viewLight': () => import('./icons/common/viewLight.svg'),
|
'common/viewLight': () => import('./icons/common/viewLight.svg'),
|
||||||
'common/voiceLight': () => import('./icons/common/voiceLight.svg'),
|
'common/voiceLight': () => import('./icons/common/voiceLight.svg'),
|
||||||
|
|||||||
@ -1,8 +1,3 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17 16" >
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1694224177076"
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.98468 2.66665C5.40735 2.66665 3.31801 4.75598 3.31801 7.33331C3.31801 9.91064 5.40735 12 7.98468 12C9.24198 12 10.3831 11.5028 11.2223 10.6942C11.2398 10.6714 11.259 10.6495 11.2799 10.6286C11.3008 10.6077 11.3228 10.5885 11.3456 10.5709C12.1541 9.73178 12.6513 8.59061 12.6513 7.33331C12.6513 4.75598 10.562 2.66665 7.98468 2.66665ZM12.6726 11.0784C13.4937 10.052 13.9847 8.74999 13.9847 7.33331C13.9847 4.0196 11.2984 1.33331 7.98468 1.33331C4.67097 1.33331 1.98468 4.0196 1.98468 7.33331C1.98468 10.647 4.67097 13.3333 7.98468 13.3333C9.40136 13.3333 10.7034 12.8423 11.7298 12.0212L14.1799 14.4714C14.4403 14.7317 14.8624 14.7317 15.1228 14.4714C15.3831 14.211 15.3831 13.7889 15.1228 13.5286L12.6726 11.0784Z" />
|
||||||
class="icon" viewBox="0 0 1026 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3984"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink" width="64.125" height="64">
|
|
||||||
<path
|
|
||||||
d="M989.365124 873.455175c21.85764 24.973422 33.760499 46.831061 35.714294 65.567202 1.948078 18.730424-5.271103 37.076377-21.661831 55.026425-18.736141 21.075836-39.416072 31.030616-62.055515 29.858625-22.633727-1.171991-44.491366-10.344968-65.567202-27.513213L679.093265 806.715982c-35.128298 22.633727-72.786383 40.197876-112.989976 52.68673-40.197876 12.488855-82.545355 18.730424-127.036721 18.730424-60.882095 0-117.863745-11.512672-170.940663-34.536586-53.078347-23.029631-99.523509-54.446147-139.331197-94.252406-39.811976-39.811976-71.228492-86.25285-94.252406-139.329768C11.512672 556.93603 0 499.950092 0 439.066568c0-60.883524 11.512672-117.863745 34.542303-170.940663 23.023914-53.078347 54.44043-99.523509 94.252406-139.331197 39.807688-39.811976 86.25285-71.228492 139.331197-94.252406 53.076918-23.029631 110.058568-34.542303 170.940663-34.542303 60.883524 0 117.869462 11.512672 170.94638 34.542303 53.078347 23.023914 99.517792 54.44043 139.329768 94.252406 39.807688 39.807688 71.222775 86.25285 94.252406 139.331197 23.023914 53.076918 34.536586 110.057139 34.536586 170.940663 0 46.054974-6.633185 89.764536-19.903844 131.134403s-32.002511 79.619664-56.198417 114.742246l38.639985 38.639985c18.730424 18.730424 38.439889 38.249797 59.124108 58.543829s39.61188 39.416072 56.784413 57.371837C973.754771 857.448917 984.680017 868.771497 989.365124 873.455175L989.365124 873.455175zM443.751675 731.779995c40.588063 0 78.83786-7.609369 114.742246-22.829535 35.904385-15.224454 67.13081-36.105911 93.66641-62.641511 26.541317-26.541317 47.422774-57.762025 62.641511-93.66641 15.218737-35.910102 22.835252-74.154183 22.835252-114.747963 0-40.589492-7.615086-78.832143-22.835252-114.742246-15.218737-35.905815-36.100194-67.125093-62.641511-93.667839-26.5356-26.5356-57.762025-47.415628-93.66641-62.641511-35.904385-15.218737-74.154183-22.828106-114.742246-22.828106-40.589492 0-78.83929 7.609369-114.743675 22.828106-35.904385 15.225883-67.129381 36.105911-93.66641 62.641511-26.541317 26.542747-47.422774 57.762025-62.641511 93.667839-15.218737 35.910102-22.829535 74.152753-22.829535 114.742246 0 40.59378 7.610798 78.83786 22.829535 114.747963 15.218737 35.904385 36.100194 67.125093 62.641511 93.66641 26.53703 26.5356 57.762025 47.417057 93.66641 62.641511C364.912385 724.170627 403.162183 731.779995 443.751675 731.779995L443.751675 731.779995zM443.751675 731.779995"
|
|
||||||
p-id="3985"></path>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 840 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 24" >
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.07144 6.34314C9.07144 6.89543 9.51916 7.34315 10.0714 7.34314H16.1425L6.53591 16.9497C6.14539 17.3403 6.14539 17.9734 6.53591 18.364C6.92643 18.7545 7.5596 18.7545 7.95012 18.364L17.5567 8.75736L17.5567 14.8284C17.5567 15.3807 18.0044 15.8284 18.5567 15.8284C19.109 15.8284 19.5567 15.3807 19.5567 14.8284L19.5567 6.34314C19.5567 5.79086 19.109 5.34314 18.5567 5.34315H10.0714C9.51916 5.34314 9.07144 5.79086 9.07144 6.34314Z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 553 B |
14
packages/web/components/common/Input/SearchInput/index.tsx
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { InputGroup, Input, InputProps, Flex } from '@chakra-ui/react';
|
||||||
|
import MyIcon from '../../Icon';
|
||||||
|
|
||||||
|
const SearchInput = (props: InputProps) => {
|
||||||
|
return (
|
||||||
|
<Flex alignItems={'center'} position={'relative'}>
|
||||||
|
<Input {...props} />
|
||||||
|
<MyIcon name={'common/searchLight'} w={'1rem'} position={'absolute'} left={2} zIndex={10} />
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SearchInput;
|
||||||
@ -8,10 +8,10 @@ import {
|
|||||||
MenuButton,
|
MenuButton,
|
||||||
MenuItemProps
|
MenuItemProps
|
||||||
} from '@chakra-ui/react';
|
} from '@chakra-ui/react';
|
||||||
import MyIcon from '../Icon';
|
|
||||||
import MyDivider from '../MyDivider';
|
import MyDivider from '../MyDivider';
|
||||||
import type { IconNameType } from '../Icon/type';
|
import type { IconNameType } from '../Icon/type';
|
||||||
import { useSystem } from '../../../hooks/useSystem';
|
import { useSystem } from '../../../hooks/useSystem';
|
||||||
|
import Avatar from '../Avatar';
|
||||||
|
|
||||||
export type MenuItemType = 'primary' | 'danger';
|
export type MenuItemType = 'primary' | 'danger';
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ const MyMenu = ({
|
|||||||
_notLast={{ mb: 0.5 }}
|
_notLast={{ mb: 0.5 }}
|
||||||
{...typeMapStyle[child.type || 'primary']}
|
{...typeMapStyle[child.type || 'primary']}
|
||||||
>
|
>
|
||||||
{!!child.icon && <MyIcon name={child.icon as any} w={iconSize} mr={3} />}
|
{!!child.icon && <Avatar src={child.icon as any} w={iconSize} mr={3} />}
|
||||||
<Box>
|
<Box>
|
||||||
<Box color={child.description ? 'myGray.900' : 'inherit'} fontSize={'sm'}>
|
<Box color={child.description ? 'myGray.900' : 'inherit'} fontSize={'sm'}>
|
||||||
{child.label}
|
{child.label}
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import {
|
|||||||
Box,
|
Box,
|
||||||
Image
|
Image
|
||||||
} from '@chakra-ui/react';
|
} from '@chakra-ui/react';
|
||||||
import MyIcon from '../Icon';
|
|
||||||
import MyBox from '../MyBox';
|
import MyBox from '../MyBox';
|
||||||
import { useSystem } from '../../../hooks/useSystem';
|
import { useSystem } from '../../../hooks/useSystem';
|
||||||
import Avatar from '../Avatar';
|
import Avatar from '../Avatar';
|
||||||
|
|||||||
@ -35,7 +35,8 @@ export default function Editor({
|
|||||||
onBlur,
|
onBlur,
|
||||||
value,
|
value,
|
||||||
placeholder = '',
|
placeholder = '',
|
||||||
isFlow
|
isFlow,
|
||||||
|
bg = 'white'
|
||||||
}: {
|
}: {
|
||||||
h?: number;
|
h?: number;
|
||||||
maxLength?: number;
|
maxLength?: number;
|
||||||
@ -49,6 +50,7 @@ export default function Editor({
|
|||||||
value?: string;
|
value?: string;
|
||||||
placeholder?: string;
|
placeholder?: string;
|
||||||
isFlow?: boolean;
|
isFlow?: boolean;
|
||||||
|
bg?: string;
|
||||||
}) {
|
}) {
|
||||||
const [key, setKey] = useState(getNanoid(6));
|
const [key, setKey] = useState(getNanoid(6));
|
||||||
const [_, startSts] = useTransition();
|
const [_, startSts] = useTransition();
|
||||||
@ -95,6 +97,7 @@ export default function Editor({
|
|||||||
h={`${height}px`}
|
h={`${height}px`}
|
||||||
cursor={'text'}
|
cursor={'text'}
|
||||||
color={'myGray.700'}
|
color={'myGray.700'}
|
||||||
|
bg={focus ? 'white' : bg}
|
||||||
>
|
>
|
||||||
<LexicalComposer initialConfig={initialConfig} key={key}>
|
<LexicalComposer initialConfig={initialConfig} key={key}>
|
||||||
<PlainTextPlugin
|
<PlainTextPlugin
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
border: 1px solid rgb(232, 235, 240);
|
border: 1px solid rgb(232, 235, 240);
|
||||||
border-radius: var(--chakra-radii-md);
|
border-radius: var(--chakra-radii-md);
|
||||||
padding: 8px 12px;
|
padding: 8px 12px;
|
||||||
background: #fff;
|
// background: #fff;
|
||||||
|
|
||||||
font-size: var(--chakra-fontSizes-sm);
|
font-size: var(--chakra-fontSizes-sm);
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
@ -18,7 +18,7 @@
|
|||||||
border: 1px solid var(--chakra-colors-myGray-200);
|
border: 1px solid var(--chakra-colors-myGray-200);
|
||||||
border-radius: var(--chakra-radii-sm);
|
border-radius: var(--chakra-radii-sm);
|
||||||
padding: 6px 8px;
|
padding: 6px 8px;
|
||||||
background: #fff;
|
// background: #fff;
|
||||||
font-size: var(--chakra-fontSizes-sm);
|
font-size: var(--chakra-fontSizes-sm);
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { Button, ModalBody, ModalFooter, useDisclosure } from '@chakra-ui/react';
|
import { Box, Button, ModalBody, ModalFooter, useDisclosure } from '@chakra-ui/react';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { editorStateToText } from './utils';
|
import { editorStateToText } from './utils';
|
||||||
import Editor from './Editor';
|
import Editor from './Editor';
|
||||||
@ -20,7 +20,8 @@ const PromptEditor = ({
|
|||||||
maxLength,
|
maxLength,
|
||||||
placeholder,
|
placeholder,
|
||||||
title,
|
title,
|
||||||
isFlow
|
isFlow,
|
||||||
|
bg = 'white'
|
||||||
}: {
|
}: {
|
||||||
showOpenModal?: boolean;
|
showOpenModal?: boolean;
|
||||||
showResize?: boolean;
|
showResize?: boolean;
|
||||||
@ -34,6 +35,7 @@ const PromptEditor = ({
|
|||||||
placeholder?: string;
|
placeholder?: string;
|
||||||
title?: string;
|
title?: string;
|
||||||
isFlow?: boolean;
|
isFlow?: boolean;
|
||||||
|
bg?: string;
|
||||||
}) => {
|
}) => {
|
||||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@ -62,6 +64,7 @@ const PromptEditor = ({
|
|||||||
onBlur={onBlurInput}
|
onBlur={onBlurInput}
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
isFlow={isFlow}
|
isFlow={isFlow}
|
||||||
|
bg={bg}
|
||||||
/>
|
/>
|
||||||
<MyModal isOpen={isOpen} onClose={onClose} iconSrc="modal/edit" title={title} w={'full'}>
|
<MyModal isOpen={isOpen} onClose={onClose} iconSrc="modal/edit" title={title} w={'full'}>
|
||||||
<ModalBody>
|
<ModalBody>
|
||||||
|
|||||||
@ -18,6 +18,9 @@
|
|||||||
"confirm_delete_folder_tip": "Are you sure to delete this folder? All the following applications and corresponding chat records will be deleted, please confirm!",
|
"confirm_delete_folder_tip": "Are you sure to delete this folder? All the following applications and corresponding chat records will be deleted, please confirm!",
|
||||||
"copy_one_app": "Copy",
|
"copy_one_app": "Copy",
|
||||||
"create_copy_success": "Create copy success",
|
"create_copy_success": "Create copy success",
|
||||||
|
"create_empty_app": "Create default app",
|
||||||
|
"create_empty_plugin": "Create default plugin",
|
||||||
|
"create_empty_workflow": "Create default workflow",
|
||||||
"cron": {
|
"cron": {
|
||||||
"every_day": "Executed every day",
|
"every_day": "Executed every day",
|
||||||
"every_month": "Executed monthly",
|
"every_month": "Executed monthly",
|
||||||
@ -84,6 +87,22 @@
|
|||||||
"template": {
|
"template": {
|
||||||
"simple_robot": "Simple Robot"
|
"simple_robot": "Simple Robot"
|
||||||
},
|
},
|
||||||
|
"templateMarket": {
|
||||||
|
"Search_template": "Search template",
|
||||||
|
"Template_market": "Template market",
|
||||||
|
"Use": "Use",
|
||||||
|
"no_intro": "No intro~",
|
||||||
|
"templateTags": {
|
||||||
|
"Image_generation": "Image generation",
|
||||||
|
"Office_services": "Office searvices",
|
||||||
|
"Roleplay": "Roleplay",
|
||||||
|
"Web_search": "Web search",
|
||||||
|
"Writing": "Writing"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"template_market": "Templates",
|
||||||
|
"template_market_description": "Explore more ways to play in the template market, configuration tutorials and usage guides will help you understand and get started with various applications.",
|
||||||
|
"template_market_empty_data": "No suitable template found",
|
||||||
"time_zone": "Time zone",
|
"time_zone": "Time zone",
|
||||||
"tool_input_param_tip": "Configure related information before the plugin runs properly",
|
"tool_input_param_tip": "Configure related information before the plugin runs properly",
|
||||||
"transition_to_workflow": "Transition to workflow",
|
"transition_to_workflow": "Transition to workflow",
|
||||||
@ -91,7 +110,7 @@
|
|||||||
"transition_to_workflow_create_new_tip": "After converting to workflow, it will not be able to convert back to simple mode, please confirm!",
|
"transition_to_workflow_create_new_tip": "After converting to workflow, it will not be able to convert back to simple mode, please confirm!",
|
||||||
"type": {
|
"type": {
|
||||||
"All": "All",
|
"All": "All",
|
||||||
"Create http plugin tip": "Create plug-ins in batches using OpenAPI schema, compatible with GPTs format.",
|
"Create http plugin tip": "Create plug-ins in batches using OpenAPI schema, compatible with GPTs format",
|
||||||
"Create one plugin tip": "The input and output workflows can be customized",
|
"Create one plugin tip": "The input and output workflows can be customized",
|
||||||
"Create plugin bot": "Create plugin bot",
|
"Create plugin bot": "Create plugin bot",
|
||||||
"Create simple bot": "Create simple bot",
|
"Create simple bot": "Create simple bot",
|
||||||
@ -101,6 +120,7 @@
|
|||||||
"Http plugin": "Http plugin",
|
"Http plugin": "Http plugin",
|
||||||
"Plugin": "Plugin",
|
"Plugin": "Plugin",
|
||||||
"Simple bot": "Simple bot",
|
"Simple bot": "Simple bot",
|
||||||
|
"Template": "Create by template",
|
||||||
"Workflow bot": "Workflow"
|
"Workflow bot": "Workflow"
|
||||||
},
|
},
|
||||||
"upload_file_max_amount": "Max files",
|
"upload_file_max_amount": "Max files",
|
||||||
|
|||||||
@ -271,6 +271,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"confirm_choice": "Confirm selection",
|
"confirm_choice": "Confirm selection",
|
||||||
|
"contribute_app_template": "Contribution template",
|
||||||
"core": {
|
"core": {
|
||||||
"Chat": "Chat",
|
"Chat": "Chat",
|
||||||
"Max Token": "Max token per data",
|
"Max Token": "Max token per data",
|
||||||
@ -1431,5 +1432,6 @@
|
|||||||
},
|
},
|
||||||
"type": "type"
|
"type": "type"
|
||||||
},
|
},
|
||||||
"verification": "verify"
|
"verification": "verify",
|
||||||
|
"xx_search_result": "{{key}} Search results"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,9 @@
|
|||||||
"confirm_delete_folder_tip": "确认删除该文件夹?将会删除它下面所有应用及对应的聊天记录,请确认!",
|
"confirm_delete_folder_tip": "确认删除该文件夹?将会删除它下面所有应用及对应的聊天记录,请确认!",
|
||||||
"copy_one_app": "创建副本",
|
"copy_one_app": "创建副本",
|
||||||
"create_copy_success": "创建副本成功",
|
"create_copy_success": "创建副本成功",
|
||||||
|
"create_empty_app": "创建空白应用",
|
||||||
|
"create_empty_plugin": "创建空白插件",
|
||||||
|
"create_empty_workflow": "创建空白工作流",
|
||||||
"cron": {
|
"cron": {
|
||||||
"every_day": "每天执行",
|
"every_day": "每天执行",
|
||||||
"every_month": "每月执行",
|
"every_month": "每月执行",
|
||||||
@ -84,6 +87,23 @@
|
|||||||
"template": {
|
"template": {
|
||||||
"simple_robot": "简易机器人"
|
"simple_robot": "简易机器人"
|
||||||
},
|
},
|
||||||
|
"templateMarket": {
|
||||||
|
"Search_template": "搜索模板",
|
||||||
|
"Template_market": "模板市场",
|
||||||
|
"Use": "使用",
|
||||||
|
"no_intro": "还没有介绍~",
|
||||||
|
"templateTags": {
|
||||||
|
"Image_generation": "图片生成",
|
||||||
|
"Office_services": "办公服务",
|
||||||
|
"Recommendation": "推荐",
|
||||||
|
"Roleplay": "角色扮演",
|
||||||
|
"Web_search": "联网搜索",
|
||||||
|
"Writing": "文本创作"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"template_market": "模板市场",
|
||||||
|
"template_market_description": "在模板市场探索更多玩法,配置教程与使用引导,带你理解并上手各种应用",
|
||||||
|
"template_market_empty_data": "找不到合适的模板",
|
||||||
"time_zone": "时区",
|
"time_zone": "时区",
|
||||||
"tool_input_param_tip": "该插件正常运行需要配置相关信息",
|
"tool_input_param_tip": "该插件正常运行需要配置相关信息",
|
||||||
"transition_to_workflow": "转成工作流",
|
"transition_to_workflow": "转成工作流",
|
||||||
@ -91,16 +111,18 @@
|
|||||||
"transition_to_workflow_create_new_tip": "转化成工作流后,将无法转化回简易模式,请确认!",
|
"transition_to_workflow_create_new_tip": "转化成工作流后,将无法转化回简易模式,请确认!",
|
||||||
"type": {
|
"type": {
|
||||||
"All": "全部",
|
"All": "全部",
|
||||||
"Create http plugin tip": "通过 OpenAPI Schema 批量创建插件,兼容 GPTs 格式。",
|
"Create http plugin tip": "通过 OpenAPI Schema 批量创建插件,兼容 GPTs 格式",
|
||||||
"Create one plugin tip": "可以自定义输入和输出的工作流,通常用于封装重复使用的工作流",
|
"Create one plugin tip": "可以自定义输入和输出的工作流,通常用于封装重复使用的工作流",
|
||||||
"Create plugin bot": "创建插件",
|
"Create plugin bot": "创建插件",
|
||||||
"Create simple bot": "创建简易应用",
|
"Create simple bot": "创建简易应用",
|
||||||
"Create simple bot tip": "通过填表单形式,创建简单的 AI 应用,适合新手",
|
"Create simple bot tip": "通过填表单形式,创建简单的 AI 应用,适合新手",
|
||||||
|
"Create template tip": "在模板市场探索更多玩法,带你理解并上手各种应用",
|
||||||
"Create workflow bot": "创建工作流",
|
"Create workflow bot": "创建工作流",
|
||||||
"Create workflow tip": "通过低代码的方式,构建逻辑复杂的多轮对话 AI 应用,推荐高级玩家使用",
|
"Create workflow tip": "通过低代码的方式,构建逻辑复杂的多轮对话 AI 应用,推荐高级玩家使用",
|
||||||
"Http plugin": "HTTP 插件",
|
"Http plugin": "HTTP 插件",
|
||||||
"Plugin": "插件",
|
"Plugin": "插件",
|
||||||
"Simple bot": "简易应用",
|
"Simple bot": "简易应用",
|
||||||
|
"Template": "通过模板创建",
|
||||||
"Workflow bot": "工作流"
|
"Workflow bot": "工作流"
|
||||||
},
|
},
|
||||||
"upload_file_max_amount": "最大文件数量",
|
"upload_file_max_amount": "最大文件数量",
|
||||||
|
|||||||
@ -273,6 +273,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"confirm_choice": "确认选择",
|
"confirm_choice": "确认选择",
|
||||||
|
"contribute_app_template": "贡献模板",
|
||||||
"core": {
|
"core": {
|
||||||
"Chat": "对话",
|
"Chat": "对话",
|
||||||
"Max Token": "单条数据上限",
|
"Max Token": "单条数据上限",
|
||||||
@ -359,6 +360,14 @@
|
|||||||
"logs": {
|
"logs": {
|
||||||
"Source And Time": "来源 & 时间"
|
"Source And Time": "来源 & 时间"
|
||||||
},
|
},
|
||||||
|
"more": "查看更多",
|
||||||
|
"navbar": {
|
||||||
|
"External": "外部使用",
|
||||||
|
"Flow mode": "高级编排",
|
||||||
|
"Publish": "发布",
|
||||||
|
"Publish app": "发布应用",
|
||||||
|
"Simple mode": "简易配置"
|
||||||
|
},
|
||||||
"no_app": "还没有应用,快去创建一个吧!",
|
"no_app": "还没有应用,快去创建一个吧!",
|
||||||
"not_published": "未发布",
|
"not_published": "未发布",
|
||||||
"outLink": {
|
"outLink": {
|
||||||
@ -598,7 +607,8 @@
|
|||||||
"success": "开始同步"
|
"success": "开始同步"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"training": {}
|
"training": {
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"data": {
|
"data": {
|
||||||
"Auxiliary Data": "辅助数据",
|
"Auxiliary Data": "辅助数据",
|
||||||
@ -1437,5 +1447,6 @@
|
|||||||
},
|
},
|
||||||
"type": "类型"
|
"type": "类型"
|
||||||
},
|
},
|
||||||
"verification": "验证"
|
"verification": "验证",
|
||||||
|
"xx_search_result": "{{key}} 的搜索结果"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"author": "FastGPT Team",
|
"author": "FastGPT",
|
||||||
"version": "481",
|
"version": "481",
|
||||||
"templateType": "other",
|
"templateType": "other",
|
||||||
"name": "自定义反馈",
|
"name": "自定义反馈",
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"author": "FastGPT Team",
|
"author": "FastGPT",
|
||||||
"version": "481",
|
"version": "481",
|
||||||
"templateType": "tools",
|
"templateType": "tools",
|
||||||
"name": "获取当前时间",
|
"name": "获取当前时间",
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"author": "FastGPT Team",
|
"author": "FastGPT",
|
||||||
"version": "481",
|
"version": "481",
|
||||||
"name": "文本加工",
|
"name": "文本加工",
|
||||||
"avatar": "/imgs/workflow/textEditor.svg",
|
"avatar": "/imgs/workflow/textEditor.svg",
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"author": "FastGPT Team",
|
"author": "FastGPT",
|
||||||
"templateType": "other",
|
"templateType": "other",
|
||||||
"name": "自定义反馈",
|
"name": "自定义反馈",
|
||||||
"avatar": "/imgs/module/customFeedback.svg",
|
"avatar": "/imgs/module/customFeedback.svg",
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"author": "FastGPT Team",
|
"author": "FastGPT",
|
||||||
"templateType": "tools",
|
"templateType": "tools",
|
||||||
"name": "获取当前时间",
|
"name": "获取当前时间",
|
||||||
"avatar": "/imgs/module/getCurrentTime.svg",
|
"avatar": "/imgs/module/getCurrentTime.svg",
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"author": "FastGPT Team",
|
"author": "FastGPT",
|
||||||
"templateType": "tools",
|
"templateType": "tools",
|
||||||
"name": "文本加工",
|
"name": "文本加工",
|
||||||
"avatar": "/imgs/module/textEditor.svg",
|
"avatar": "/imgs/module/textEditor.svg",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"abandon": true,
|
"abandon": true,
|
||||||
"author": "FastGPT Team",
|
"author": "FastGPT",
|
||||||
"templateType": "tools",
|
"templateType": "tools",
|
||||||
"name": "判断器",
|
"name": "判断器",
|
||||||
"avatar": "/imgs/module/tfSwitch.svg",
|
"avatar": "/imgs/module/tfSwitch.svg",
|
||||||
|
|||||||
467
projects/app/public/appMarketTemplates/CQ/template.json
Normal file
@ -0,0 +1,467 @@
|
|||||||
|
{
|
||||||
|
"name": "问题分类 + 知识库",
|
||||||
|
"intro": "先对用户的问题进行分类,再根据不同类型问题,执行不同的操作",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "core/workflow/template/questionClassify",
|
||||||
|
"tags": ["office-services"],
|
||||||
|
"type": "advanced",
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "userGuide",
|
||||||
|
"name": "系统配置",
|
||||||
|
"intro": "可以配置应用的系统参数",
|
||||||
|
"avatar": "core/workflow/template/systemConfig",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.systemConfig",
|
||||||
|
"position": {
|
||||||
|
"x": 531.2422736065552,
|
||||||
|
"y": -486.7611729549753
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "welcomeText",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "core.app.Welcome Text",
|
||||||
|
"value": "你好,我是知识库助手,请不要忘记选择知识库噢~\n[你是谁]\n[如何使用]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "variables",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "core.app.Chat Variable",
|
||||||
|
"value": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "questionGuide",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "core.app.Question Guide",
|
||||||
|
"value": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "tts",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"type": "web"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "whisper",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"open": false,
|
||||||
|
"autoSend": false,
|
||||||
|
"autoTTSResponse": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "scheduleTrigger",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "workflowStartNodeId",
|
||||||
|
"name": "流程开始",
|
||||||
|
"intro": "",
|
||||||
|
"avatar": "core/workflow/template/workflowStart",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.workflowStart",
|
||||||
|
"position": {
|
||||||
|
"x": 558.4082376415505,
|
||||||
|
"y": 123.72387429194112
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "userChatInput",
|
||||||
|
"key": "userChatInput",
|
||||||
|
"label": "core.module.input.label.user question",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "7BdojPlukIQw",
|
||||||
|
"name": "AI 对话",
|
||||||
|
"intro": "AI 大模型对话",
|
||||||
|
"avatar": "core/workflow/template/aiChat",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.chatNode",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 2701.1267277679685,
|
||||||
|
"y": -767.8956312653042
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "model",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.settingLLMModel",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"label": "core.module.input.label.aiModel",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"value": "gpt-4o-mini"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "temperature",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 3,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number",
|
||||||
|
"min": 0,
|
||||||
|
"max": 10,
|
||||||
|
"step": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "maxToken",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 1950,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number",
|
||||||
|
"min": 100,
|
||||||
|
"max": 4000,
|
||||||
|
"step": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "isResponseAnswerText",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": true,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quoteTemplate",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quotePrompt",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "systemPrompt",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.textarea", "FlowNodeInputTypeEnum.reference"],
|
||||||
|
"max": 3000,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "core.ai.Prompt",
|
||||||
|
"description": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"placeholder": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "history",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.numberInput",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.chatHistory",
|
||||||
|
"label": "core.module.input.label.chat history",
|
||||||
|
"required": true,
|
||||||
|
"min": 0,
|
||||||
|
"max": 30,
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题",
|
||||||
|
"value": ["workflowStartNodeId", "userChatInput"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quoteQA",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.settingDatasetQuotePrompt"],
|
||||||
|
"label": "",
|
||||||
|
"debugLabel": "知识库引用",
|
||||||
|
"description": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.datasetQuote",
|
||||||
|
"value": ["MNMMMIjjWyMU", "quoteQA"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "history",
|
||||||
|
"key": "history",
|
||||||
|
"label": "core.module.output.label.New context",
|
||||||
|
"description": "core.module.output.description.New context",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.chatHistory",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "answerText",
|
||||||
|
"key": "answerText",
|
||||||
|
"label": "core.module.output.label.Ai response content",
|
||||||
|
"description": "core.module.output.description.Ai response content",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "rvbo634w3AYj",
|
||||||
|
"name": "问题分类",
|
||||||
|
"intro": "根据用户的历史记录和当前问题判断该次提问的类型。可以添加多组问题类型,下面是一个模板例子:\n类型1: 打招呼\n类型2: 关于商品\"使用\"问题\n类型3: 关于商品\"购买\"问题\n类型4: 其他问题",
|
||||||
|
"avatar": "core/workflow/template/questionClassify",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.classifyQuestion",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1020.9667229609946,
|
||||||
|
"y": -385.0060974413916
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "model",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.selectLLMModel",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"label": "core.module.input.label.aiModel",
|
||||||
|
"required": true,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"llmModelType": "classify",
|
||||||
|
"value": "gpt-4o-mini"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "systemPrompt",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.textarea", "FlowNodeInputTypeEnum.reference"],
|
||||||
|
"max": 3000,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "core.module.input.label.Background",
|
||||||
|
"description": "core.module.input.description.Background",
|
||||||
|
"placeholder": "core.module.input.placeholder.Classify background",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "history",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.numberInput",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.chatHistory",
|
||||||
|
"label": "core.module.input.label.chat history",
|
||||||
|
"required": true,
|
||||||
|
"min": 0,
|
||||||
|
"max": 30,
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"value": ["workflowStartNodeId", "userChatInput"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "agents",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.custom"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"value": "关于电影《星际穿越》的问题",
|
||||||
|
"key": "wqre"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "打招呼、问候等问题",
|
||||||
|
"key": "sdfa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "其他问题",
|
||||||
|
"key": "agex"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "cqResult",
|
||||||
|
"key": "cqResult",
|
||||||
|
"label": "分类结果",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "7kwgL1dVlwG6",
|
||||||
|
"name": "指定回复",
|
||||||
|
"intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
|
||||||
|
"avatar": "core/workflow/template/reply",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.answerNode",
|
||||||
|
"position": {
|
||||||
|
"x": 1874.9167551056487,
|
||||||
|
"y": 434.98431875888207
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "text",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.textarea", "FlowNodeInputTypeEnum.reference"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "core.module.input.label.Response content",
|
||||||
|
"description": "core.module.input.description.Response content",
|
||||||
|
"placeholder": "core.module.input.description.Response content",
|
||||||
|
"selectedTypeIndex": 1,
|
||||||
|
"value": ["rvbo634w3AYj", "cqResult"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "MNMMMIjjWyMU",
|
||||||
|
"name": "知识库搜索",
|
||||||
|
"intro": "调用\"语义检索\"和\"全文检索\"能力,从\"知识库\"中查找可能与问题相关的参考内容",
|
||||||
|
"avatar": "core/workflow/template/datasetSearch",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.datasetSearchNode",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1851.010152279949,
|
||||||
|
"y": -613.3555232387284
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "datasets",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.selectDataset",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"label": "core.module.input.label.Select dataset",
|
||||||
|
"value": [],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.selectDataset",
|
||||||
|
"list": [],
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "similarity",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.selectDatasetParamsModal"],
|
||||||
|
"label": "",
|
||||||
|
"value": 0.4,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "limit",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 1500,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "searchMode",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"value": "embedding"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "usingReRank",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean",
|
||||||
|
"value": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "datasetSearchUsingExtensionQuery",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean",
|
||||||
|
"value": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "datasetSearchExtensionModel",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "datasetSearchExtensionBg",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "需要检索的内容",
|
||||||
|
"value": ["workflowStartNodeId", "userChatInput"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "quoteQA",
|
||||||
|
"key": "quoteQA",
|
||||||
|
"label": "core.module.Dataset quote.label",
|
||||||
|
"description": "特殊数组格式,搜索结果为空时,返回空数组。",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.datasetQuote"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "workflowStartNodeId",
|
||||||
|
"target": "rvbo634w3AYj",
|
||||||
|
"sourceHandle": "workflowStartNodeId-source-right",
|
||||||
|
"targetHandle": "rvbo634w3AYj-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "rvbo634w3AYj",
|
||||||
|
"target": "7kwgL1dVlwG6",
|
||||||
|
"sourceHandle": "rvbo634w3AYj-source-agex",
|
||||||
|
"targetHandle": "7kwgL1dVlwG6-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "rvbo634w3AYj",
|
||||||
|
"target": "MNMMMIjjWyMU",
|
||||||
|
"sourceHandle": "rvbo634w3AYj-source-wqre",
|
||||||
|
"targetHandle": "MNMMMIjjWyMU-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "MNMMMIjjWyMU",
|
||||||
|
"target": "7BdojPlukIQw",
|
||||||
|
"sourceHandle": "MNMMMIjjWyMU-source-right",
|
||||||
|
"targetHandle": "7BdojPlukIQw-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "rvbo634w3AYj",
|
||||||
|
"target": "7kwgL1dVlwG6",
|
||||||
|
"sourceHandle": "rvbo634w3AYj-source-sdfa",
|
||||||
|
"targetHandle": "7kwgL1dVlwG6-target-left"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
@ -0,0 +1,579 @@
|
|||||||
|
{
|
||||||
|
"name": "多轮翻译机器人",
|
||||||
|
"intro": "通过 4 轮翻译,提高翻译英文的质量",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "/appMarketTemplates/TranslateRobot/avatar.svg",
|
||||||
|
"tags": ["office-services"],
|
||||||
|
"type": "advanced",
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "userGuide",
|
||||||
|
"name": "系统配置",
|
||||||
|
"intro": "可以配置应用的系统参数",
|
||||||
|
"avatar": "/imgs/workflow/userGuide.png",
|
||||||
|
"flowNodeType": "userGuide",
|
||||||
|
"position": {
|
||||||
|
"x": 531.2422736065552,
|
||||||
|
"y": -486.7611729549753
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "welcomeText",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "core.app.Welcome Text",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "variables",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"label": "core.app.Chat Variable",
|
||||||
|
"value": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "questionGuide",
|
||||||
|
"valueType": "boolean",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "core.app.Question Guide",
|
||||||
|
"value": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "tts",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"type": "web"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "whisper",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"open": false,
|
||||||
|
"autoSend": false,
|
||||||
|
"autoTTSResponse": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "scheduleTrigger",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"label": "",
|
||||||
|
"value": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "448745",
|
||||||
|
"name": "流程开始",
|
||||||
|
"intro": "",
|
||||||
|
"avatar": "/imgs/workflow/userChatInput.svg",
|
||||||
|
"flowNodeType": "workflowStart",
|
||||||
|
"position": {
|
||||||
|
"x": 558.4082376415505,
|
||||||
|
"y": 123.72387429194112
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["reference", "textarea"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "userChatInput",
|
||||||
|
"key": "userChatInput",
|
||||||
|
"label": "core.module.input.label.user question",
|
||||||
|
"type": "static",
|
||||||
|
"valueType": "string"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "loOvhld2ZTKa",
|
||||||
|
"name": "第一轮翻译",
|
||||||
|
"intro": "AI 大模型对话",
|
||||||
|
"avatar": "/imgs/workflow/AI.png",
|
||||||
|
"flowNodeType": "chatNode",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1748.8252410306534,
|
||||||
|
"y": -245.08260685989214
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "model",
|
||||||
|
"renderTypeList": ["settingLLMModel", "reference"],
|
||||||
|
"label": "core.module.input.label.aiModel",
|
||||||
|
"valueType": "string",
|
||||||
|
"value": "claude-3-5-sonnet-20240620"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "temperature",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 0,
|
||||||
|
"valueType": "number",
|
||||||
|
"min": 0,
|
||||||
|
"max": 10,
|
||||||
|
"step": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "maxToken",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 2000,
|
||||||
|
"valueType": "number",
|
||||||
|
"min": 100,
|
||||||
|
"max": 4000,
|
||||||
|
"step": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "isResponseAnswerText",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": true,
|
||||||
|
"valueType": "boolean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quoteTemplate",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quotePrompt",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "systemPrompt",
|
||||||
|
"renderTypeList": ["textarea", "reference"],
|
||||||
|
"max": 3000,
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "core.ai.Prompt",
|
||||||
|
"description": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"placeholder": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"value": "# Role: 资深英汉翻译专家\n\n## Background:\n你是一位经验丰富的英汉翻译专家,精通英汉互译,尤其擅长将英文文章译成流畅易懂的现代汉语。你曾多次带领团队完成大型翻译项目,译文广受好评。\n\n## Attention:\n- 翻译过程中要始终坚持\"信、达、雅\"的原则,但\"达\"尤为重要\n- 译文要符合现代汉语的表达习惯,通俗易懂,连贯流畅 \n- 避免使用过于文绉绉的表达和晦涩难懂的典故引用\n\n## Profile: \n- Author: 米开朗基杨 \n- Version: 0.2\n- Language: 中文\n- Description: 你是一位资深英汉翻译专家,精通英汉互译。你擅长将英文文章译成地道流畅的现代汉语,表达准确易懂,符合当代中文语言习惯。\n\n## Constraints:\n- 必须严格遵循四轮翻译流程:直译、意译、校审、定稿 \n- 译文要忠实原文,准确无误,不能遗漏或曲解原意\n- 译文应以现代白话文为主,避免过多使用文言文和古典诗词\n- 每一轮翻译前后必须添加【思考】和【翻译】标记\n- 最终译文使用Markdown的代码块呈现\n\n## Goals:\n- 通过四轮翻译流程,将英文原文译成高质量的现代汉语译文 \n- 译文要准确传达原文意思,语言表达力求浅显易懂,朗朗上口\n- 适度使用一些熟语俗语、流行网络用语等,增强译文的亲和力\n- 在直译的基础上,提供至少2个不同风格的意译版本供选择\n\n## Skills:\n- 精通英汉双语,具有扎实的语言功底和丰富的翻译经验\n- 擅长将英语表达习惯转换为地道自然的现代汉语\n- 对当代中文语言的发展变化有敏锐洞察,善于把握语言流行趋势\n\n## Workflow:\n1. 第一轮直译:逐字逐句忠实原文,不遗漏任何信息\n2. 第二轮意译:在直译的基础上用通俗流畅的现代汉语意译原文,至少提供2个不同风格的版本\n3. 第三轮校审:仔细审视译文,消除偏差和欠缺,使译文更加地道易懂 \n4. 第四轮定稿:择优选取,反复修改润色,最终定稿出一个简洁畅达、符合大众阅读习惯的译文\n\n## OutputFormat: \n- 每一轮翻译前用【思考】说明该轮要点\n- 每一轮翻译后用【翻译】呈现译文\n- 在\\`\\`\\`代码块中展示最终定稿译文\n\n## Suggestions:\n- 直译时力求忠实原文,但不要过于拘泥逐字逐句\n- 意译时在准确表达原意的基础上,用最朴实无华的现代汉语来表达 \n- 校审环节重点关注译文是否符合当代汉语表达习惯,是否通俗易懂\n- 定稿时适度采用一些熟语谚语、网络流行语等,使译文更接地气\n- 善于利用中文的灵活性,用不同的表述方式展现同一内容,提高译文的可读性\n\n## Initialization\n作为一名资深英汉翻译专家,你必须严格遵循翻译流程的各项要求。首先请向用户问好,介绍你将带领团队完成翻译任务,力求将英文原文译成通俗易懂的现代汉语。然后简要说明四轮翻译流程,请用户提供英文原文,开始进行翻译工作。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "history",
|
||||||
|
"renderTypeList": ["numberInput", "reference"],
|
||||||
|
"valueType": "chatHistory",
|
||||||
|
"label": "core.module.input.label.chat history",
|
||||||
|
"description": "最多携带多少轮对话记录",
|
||||||
|
"required": true,
|
||||||
|
"min": 0,
|
||||||
|
"max": 50,
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["reference", "textarea"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题",
|
||||||
|
"value": ["gBDvemE4FBhp", "system_text"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quoteQA",
|
||||||
|
"renderTypeList": ["settingDatasetQuotePrompt"],
|
||||||
|
"label": "",
|
||||||
|
"debugLabel": "知识库引用",
|
||||||
|
"description": "",
|
||||||
|
"valueType": "datasetQuote"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "history",
|
||||||
|
"key": "history",
|
||||||
|
"required": true,
|
||||||
|
"label": "core.module.output.label.New context",
|
||||||
|
"description": "core.module.output.description.New context",
|
||||||
|
"valueType": "chatHistory",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "answerText",
|
||||||
|
"key": "answerText",
|
||||||
|
"required": true,
|
||||||
|
"label": "core.module.output.label.Ai response content",
|
||||||
|
"description": "core.module.output.description.Ai response content",
|
||||||
|
"valueType": "string",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "w0oBbQ3YJHye",
|
||||||
|
"name": "代码运行",
|
||||||
|
"intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
|
||||||
|
"avatar": "/imgs/workflow/code.svg",
|
||||||
|
"flowNodeType": "code",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 2522.61682940854,
|
||||||
|
"y": -79.74569750380468
|
||||||
|
},
|
||||||
|
"version": "482",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": ["addInputParam"],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "这些变量会作为代码的运行的输入参数",
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
},
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "codeType",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": "js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "code",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"label": "",
|
||||||
|
"value": "function main({data1}) {\n const codeBlocks = data1.match(/```[\\s\\S]*?```/g);\n\n if (codeBlocks && codeBlocks.length > 0) {\n const lastCodeBlock = codeBlocks[codeBlocks.length - 1];\n const cleanedCodeBlock = lastCodeBlock.replace(/```[a-zA-Z]*|```/g, '').trim();\n \n return {\n result: cleanedCodeBlock\n };\n }\n\n return {\n result: '未截取到代码块内容'\n };\n}\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "data1",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "data1",
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"description": "",
|
||||||
|
"canEdit": true,
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
},
|
||||||
|
"value": ["loOvhld2ZTKa", "answerText"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "system_addOutputParam",
|
||||||
|
"key": "system_addOutputParam",
|
||||||
|
"type": "dynamic",
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"description": "将代码中 return 的对象作为输出,传递给后续的节点"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "system_rawResponse",
|
||||||
|
"key": "system_rawResponse",
|
||||||
|
"label": "完整响应数据",
|
||||||
|
"valueType": "object",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "error",
|
||||||
|
"key": "error",
|
||||||
|
"label": "运行错误",
|
||||||
|
"description": "代码运行错误信息,成功时返回空",
|
||||||
|
"valueType": "object",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "qLUQfhG0ILRX",
|
||||||
|
"type": "dynamic",
|
||||||
|
"key": "result",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "result"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "gR0mkQpJ4Og8",
|
||||||
|
"type": "dynamic",
|
||||||
|
"key": "data2",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "data2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "foO69L5FOmDQ",
|
||||||
|
"name": "指定回复",
|
||||||
|
"intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。",
|
||||||
|
"avatar": "/imgs/workflow/reply.png",
|
||||||
|
"flowNodeType": "answerNode",
|
||||||
|
"position": {
|
||||||
|
"x": 3798.4479531204515,
|
||||||
|
"y": 116.03040242110023
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "text",
|
||||||
|
"renderTypeList": ["textarea", "reference"],
|
||||||
|
"valueType": "any",
|
||||||
|
"required": true,
|
||||||
|
"label": "core.module.input.label.Response content",
|
||||||
|
"description": "core.module.input.description.Response content",
|
||||||
|
"placeholder": "core.module.input.description.Response content",
|
||||||
|
"selectedTypeIndex": 1,
|
||||||
|
"value": ["bcqtxqxE2R6o", "system_text"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "gBDvemE4FBhp",
|
||||||
|
"name": "文本拼接",
|
||||||
|
"intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。",
|
||||||
|
"avatar": "/imgs/workflow/textEditor.svg",
|
||||||
|
"flowNodeType": "textEditor",
|
||||||
|
"position": {
|
||||||
|
"x": 1031.371061396644,
|
||||||
|
"y": 38.65839420088383
|
||||||
|
},
|
||||||
|
"version": "486",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": ["addInputParam"],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "可以引用其他节点的输出,作为文本拼接的变量,通过 {{字段名}} 来引用变量",
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_textareaInput",
|
||||||
|
"renderTypeList": ["textarea"],
|
||||||
|
"valueType": "string",
|
||||||
|
"required": true,
|
||||||
|
"label": "拼接文本",
|
||||||
|
"placeholder": "可通过 {{字段名}} 来引用变量",
|
||||||
|
"value": "原文:\n\"\"\"\n{{q}}\n\"\"\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"valueType": "string",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "q",
|
||||||
|
"label": "q",
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": false
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"value": ["448745", "userChatInput"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "system_text",
|
||||||
|
"key": "system_text",
|
||||||
|
"label": "拼接结果",
|
||||||
|
"type": "static",
|
||||||
|
"valueType": "string"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "bcqtxqxE2R6o",
|
||||||
|
"name": "合并输出结果",
|
||||||
|
"intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。",
|
||||||
|
"avatar": "/imgs/workflow/textEditor.svg",
|
||||||
|
"flowNodeType": "textEditor",
|
||||||
|
"position": {
|
||||||
|
"x": 3113.6227559936665,
|
||||||
|
"y": 12.909197647746709
|
||||||
|
},
|
||||||
|
"version": "486",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": ["addInputParam"],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "可以引用其他节点的输出,作为文本拼接的变量,通过 {{字段名}} 来引用变量",
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_textareaInput",
|
||||||
|
"renderTypeList": ["textarea"],
|
||||||
|
"valueType": "string",
|
||||||
|
"required": true,
|
||||||
|
"label": "拼接文本",
|
||||||
|
"placeholder": "可通过 {{字段名}} 来引用变量",
|
||||||
|
"value": "****** \n\n最终翻译结果如下: \n\n```\n{{result}}\n```"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"valueType": "string",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "result",
|
||||||
|
"label": "result",
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": false
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"value": ["w0oBbQ3YJHye", "qLUQfhG0ILRX"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "system_text",
|
||||||
|
"key": "system_text",
|
||||||
|
"label": "拼接结果",
|
||||||
|
"type": "static",
|
||||||
|
"valueType": "string"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "loOvhld2ZTKa",
|
||||||
|
"target": "w0oBbQ3YJHye",
|
||||||
|
"sourceHandle": "loOvhld2ZTKa-source-right",
|
||||||
|
"targetHandle": "w0oBbQ3YJHye-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "448745",
|
||||||
|
"target": "gBDvemE4FBhp",
|
||||||
|
"sourceHandle": "448745-source-right",
|
||||||
|
"targetHandle": "gBDvemE4FBhp-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "gBDvemE4FBhp",
|
||||||
|
"target": "loOvhld2ZTKa",
|
||||||
|
"sourceHandle": "gBDvemE4FBhp-source-right",
|
||||||
|
"targetHandle": "loOvhld2ZTKa-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "w0oBbQ3YJHye",
|
||||||
|
"target": "bcqtxqxE2R6o",
|
||||||
|
"sourceHandle": "w0oBbQ3YJHye-source-right",
|
||||||
|
"targetHandle": "bcqtxqxE2R6o-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "bcqtxqxE2R6o",
|
||||||
|
"target": "foO69L5FOmDQ",
|
||||||
|
"sourceHandle": "bcqtxqxE2R6o-source-right",
|
||||||
|
"targetHandle": "foO69L5FOmDQ-target-left"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"chatConfig": {
|
||||||
|
"scheduledTriggerConfig": {
|
||||||
|
"cronString": "",
|
||||||
|
"timezone": "Asia/Shanghai",
|
||||||
|
"defaultPrompt": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
262
projects/app/public/appMarketTemplates/chatGuide/template.json
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
{
|
||||||
|
"name": "对话引导 + 变量",
|
||||||
|
"intro": "可以在对话开始发送一段提示,或者让用户填写一些内容,作为本次对话的变量",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "core/workflow/template/systemConfig",
|
||||||
|
"tags": ["office-services"],
|
||||||
|
"type": "simple",
|
||||||
|
"weight": 1,
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "userGuide",
|
||||||
|
"name": "系统配置",
|
||||||
|
"intro": "可以配置应用的系统参数",
|
||||||
|
"avatar": "/imgs/workflow/userGuide.png",
|
||||||
|
"flowNodeType": "userGuide",
|
||||||
|
"position": {
|
||||||
|
"x": 496.57560693988853,
|
||||||
|
"y": -490.7611729549753
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "welcomeText",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "core.app.Welcome Text",
|
||||||
|
"value": "你好,我可以为你翻译各种语言,请告诉我你需要翻译成什么语言?"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "variables",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "core.app.Chat Variable",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"id": "myb3xk",
|
||||||
|
"key": "language",
|
||||||
|
"label": "目标语言",
|
||||||
|
"type": "select",
|
||||||
|
"required": true,
|
||||||
|
"maxLen": 50,
|
||||||
|
"enums": [
|
||||||
|
{
|
||||||
|
"value": "中文"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "英文"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "questionGuide",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "core.app.Question Guide",
|
||||||
|
"value": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "tts",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"type": "web"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "whisper",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"open": false,
|
||||||
|
"autoSend": false,
|
||||||
|
"autoTTSResponse": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "scheduleTrigger",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "448745",
|
||||||
|
"name": "流程开始",
|
||||||
|
"intro": "",
|
||||||
|
"avatar": "/imgs/workflow/userChatInput.svg",
|
||||||
|
"flowNodeType": "workflowStart",
|
||||||
|
"position": {
|
||||||
|
"x": 558.4082376415505,
|
||||||
|
"y": 123.72387429194112
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "userChatInput",
|
||||||
|
"key": "userChatInput",
|
||||||
|
"label": "core.module.input.label.user question",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "loOvhld2ZTKa",
|
||||||
|
"name": "AI 对话",
|
||||||
|
"intro": "AI 大模型对话",
|
||||||
|
"avatar": "/imgs/workflow/AI.png",
|
||||||
|
"flowNodeType": "chatNode",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1097.7317280958762,
|
||||||
|
"y": -244.16014496351386
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "model",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.settingLLMModel",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"label": "core.module.input.label.aiModel",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"value": "gpt-3.5-turbo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "temperature",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 0,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number",
|
||||||
|
"min": 0,
|
||||||
|
"max": 10,
|
||||||
|
"step": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "maxToken",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 2000,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number",
|
||||||
|
"min": 100,
|
||||||
|
"max": 4000,
|
||||||
|
"step": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "isResponseAnswerText",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": true,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quoteTemplate",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quotePrompt",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "systemPrompt",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.textarea", "FlowNodeInputTypeEnum.reference"],
|
||||||
|
"max": 3000,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "core.ai.Prompt",
|
||||||
|
"description": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"placeholder": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"value": "请直接将我的问题翻译成{{language}},不需要回答问题。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "history",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.numberInput",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.chatHistory",
|
||||||
|
"label": "core.module.input.label.chat history",
|
||||||
|
"required": true,
|
||||||
|
"min": 0,
|
||||||
|
"max": 30,
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题",
|
||||||
|
"value": ["448745", "userChatInput"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quoteQA",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.settingDatasetQuotePrompt"],
|
||||||
|
"label": "",
|
||||||
|
"debugLabel": "知识库引用",
|
||||||
|
"description": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.datasetQuote"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "history",
|
||||||
|
"key": "history",
|
||||||
|
"label": "core.module.output.label.New context",
|
||||||
|
"description": "core.module.output.description.New context",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.chatHistory",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "answerText",
|
||||||
|
"key": "answerText",
|
||||||
|
"label": "core.module.output.label.Ai response content",
|
||||||
|
"description": "core.module.output.description.Ai response content",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "448745",
|
||||||
|
"target": "loOvhld2ZTKa",
|
||||||
|
"sourceHandle": "448745-source-right",
|
||||||
|
"targetHandle": "loOvhld2ZTKa-target-left"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"chatConfig": {
|
||||||
|
"welcomeText": "你好,我可以为你翻译各种语言,请告诉我你需要翻译成什么语言?",
|
||||||
|
"scheduledTriggerConfig": {
|
||||||
|
"cronString": "",
|
||||||
|
"timezone": "Asia/Shanghai",
|
||||||
|
"defaultPrompt": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
270
projects/app/public/appMarketTemplates/flux/template.json
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
{
|
||||||
|
"name": "Flux 绘图",
|
||||||
|
"intro": "通过请求 Flux 接口绘图,需要有 api key",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "/appMarketTemplates/flux/avatar.svg",
|
||||||
|
"type": "plugin",
|
||||||
|
"tags": ["image-generation"],
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "pluginInput",
|
||||||
|
"name": "自定义插件输入",
|
||||||
|
"intro": "可以配置插件需要哪些输入,利用这些输入来运行插件",
|
||||||
|
"avatar": "core/workflow/template/workflowStart",
|
||||||
|
"flowNodeType": "pluginInput",
|
||||||
|
"showStatus": false,
|
||||||
|
"position": {
|
||||||
|
"x": 351.2046235980429,
|
||||||
|
"y": -77.41739975794749
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"selectedTypeIndex": 0,
|
||||||
|
"valueType": "string",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "绘图提示词",
|
||||||
|
"label": "绘图提示词",
|
||||||
|
"description": "绘图提示词",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "绘图提示词"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "绘图提示词",
|
||||||
|
"valueType": "string",
|
||||||
|
"key": "绘图提示词",
|
||||||
|
"label": "绘图提示词",
|
||||||
|
"type": "hidden"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "pluginOutput",
|
||||||
|
"name": "自定义插件输出",
|
||||||
|
"intro": "自定义配置外部输出,使用插件时,仅暴露自定义配置的输出",
|
||||||
|
"avatar": "core/workflow/template/pluginOutput",
|
||||||
|
"flowNodeType": "pluginOutput",
|
||||||
|
"showStatus": false,
|
||||||
|
"position": {
|
||||||
|
"x": 1983.6911708285384,
|
||||||
|
"y": -95.86447885674228
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"valueType": "string",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "图片访问链接",
|
||||||
|
"label": "图片访问链接",
|
||||||
|
"description": "",
|
||||||
|
"value": ["tMvel910bnrJ", "pJXgWoTpPoMy"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"valueType": "object",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "error",
|
||||||
|
"label": "错误信息",
|
||||||
|
"description": "",
|
||||||
|
"value": ["tMvel910bnrJ", "error"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "tMvel910bnrJ",
|
||||||
|
"name": "HTTP 请求",
|
||||||
|
"intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)",
|
||||||
|
"avatar": "core/workflow/template/httpRequest",
|
||||||
|
"flowNodeType": "httpRequest468",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1138.1732435351091,
|
||||||
|
"y": -416.6443415407282
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": ["addInputParam"],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "core.module.input.description.HTTP Dynamic Input",
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpMethod",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"value": "POST",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpReqUrl",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Url",
|
||||||
|
"placeholder": "https://api.ai.com/getInventory",
|
||||||
|
"required": false,
|
||||||
|
"value": "https://fal.run/fal-ai/flux-pro"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpHeader",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"key": "Authorization",
|
||||||
|
"type": "string",
|
||||||
|
"value": "Key {{apikey}}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Header",
|
||||||
|
"placeholder": "core.module.input.description.Http Request Header",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpParams",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [],
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpJsonBody",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": "{\n \"prompt\": \"{{prompt}}\",\n \"image_size\": \"landscape_4_3\",\n \"num_inference_steps\": 28,\n \"guidance_scale\": 3.5\n}",
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"valueType": "string",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "prompt",
|
||||||
|
"label": "prompt",
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": true
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"value": ["pluginInput", "绘图提示词"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "error",
|
||||||
|
"key": "error",
|
||||||
|
"label": "请求错误",
|
||||||
|
"description": "HTTP请求错误信息,成功时返回空",
|
||||||
|
"valueType": "object",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "httpRawResponse",
|
||||||
|
"key": "httpRawResponse",
|
||||||
|
"label": "原始响应",
|
||||||
|
"required": true,
|
||||||
|
"description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
|
||||||
|
"valueType": "any",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "system_addOutputParam",
|
||||||
|
"key": "system_addOutputParam",
|
||||||
|
"type": "dynamic",
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"customFieldConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pJXgWoTpPoMy",
|
||||||
|
"valueType": "string",
|
||||||
|
"type": "dynamic",
|
||||||
|
"key": "images[0].url",
|
||||||
|
"label": "images[0].url"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "pluginInput",
|
||||||
|
"target": "tMvel910bnrJ",
|
||||||
|
"sourceHandle": "pluginInput-source-right",
|
||||||
|
"targetHandle": "tMvel910bnrJ-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "tMvel910bnrJ",
|
||||||
|
"target": "pluginOutput",
|
||||||
|
"sourceHandle": "tMvel910bnrJ-source-right",
|
||||||
|
"targetHandle": "pluginOutput-target-left"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
441
projects/app/public/appMarketTemplates/google/template.json
Normal file
@ -0,0 +1,441 @@
|
|||||||
|
{
|
||||||
|
"name": "谷歌搜索",
|
||||||
|
"intro": "通过请求谷歌搜索,查询相关内容作为模型的参考。",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "/appMarketTemplates/google/avatar.svg",
|
||||||
|
"tags": ["recommendation", "web-search"],
|
||||||
|
"type": "advanced",
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "userGuide",
|
||||||
|
"name": "系统配置",
|
||||||
|
"intro": "可以配置应用的系统参数",
|
||||||
|
"avatar": "/imgs/workflow/userGuide.png",
|
||||||
|
"flowNodeType": "userGuide",
|
||||||
|
"position": {
|
||||||
|
"x": 262.2732338817093,
|
||||||
|
"y": -476.00241136598146
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "welcomeText",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "core.app.Welcome Text",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "variables",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"label": "core.app.Chat Variable",
|
||||||
|
"value": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "questionGuide",
|
||||||
|
"valueType": "boolean",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "core.app.Question Guide",
|
||||||
|
"value": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "tts",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"type": "web"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "whisper",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"open": false,
|
||||||
|
"autoSend": false,
|
||||||
|
"autoTTSResponse": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "scheduleTrigger",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"label": "",
|
||||||
|
"value": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "448745",
|
||||||
|
"name": "流程开始",
|
||||||
|
"intro": "",
|
||||||
|
"avatar": "/imgs/workflow/userChatInput.svg",
|
||||||
|
"flowNodeType": "workflowStart",
|
||||||
|
"position": {
|
||||||
|
"x": 295.8944548701009,
|
||||||
|
"y": 110.81336038514848
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["reference", "textarea"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "userChatInput",
|
||||||
|
"key": "userChatInput",
|
||||||
|
"label": "core.module.input.label.user question",
|
||||||
|
"valueType": "string",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "NOgbnBzUwDgT",
|
||||||
|
"name": "工具调用",
|
||||||
|
"intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
|
||||||
|
"avatar": "/imgs/workflow/tool.svg",
|
||||||
|
"flowNodeType": "tools",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1028.8358722416106,
|
||||||
|
"y": -500.8755882990822
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "model",
|
||||||
|
"renderTypeList": ["settingLLMModel", "reference"],
|
||||||
|
"label": "core.module.input.label.aiModel",
|
||||||
|
"valueType": "string",
|
||||||
|
"llmModelType": "all",
|
||||||
|
"value": "FastAI-plus"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "temperature",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 0,
|
||||||
|
"valueType": "number",
|
||||||
|
"min": 0,
|
||||||
|
"max": 10,
|
||||||
|
"step": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "maxToken",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 2000,
|
||||||
|
"valueType": "number",
|
||||||
|
"min": 100,
|
||||||
|
"max": 4000,
|
||||||
|
"step": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "systemPrompt",
|
||||||
|
"renderTypeList": ["textarea", "reference"],
|
||||||
|
"max": 3000,
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "core.ai.Prompt",
|
||||||
|
"description": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"placeholder": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "history",
|
||||||
|
"renderTypeList": ["numberInput", "reference"],
|
||||||
|
"valueType": "chatHistory",
|
||||||
|
"label": "core.module.input.label.chat history",
|
||||||
|
"description": "最多携带多少轮对话记录",
|
||||||
|
"required": true,
|
||||||
|
"min": 0,
|
||||||
|
"max": 30,
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["reference", "textarea"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"value": ["448745", "userChatInput"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "NodeOutputKeyEnum.answerText",
|
||||||
|
"key": "NodeOutputKeyEnum.answerText",
|
||||||
|
"label": "core.module.output.label.Ai response content",
|
||||||
|
"description": "core.module.output.description.Ai response content",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "GMELVPxHfpg5",
|
||||||
|
"name": "HTTP 请求",
|
||||||
|
"intro": "调用谷歌搜索,查询相关内容",
|
||||||
|
"avatar": "/imgs/workflow/http.png",
|
||||||
|
"flowNodeType": "httpRequest468",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1005.4777753640342,
|
||||||
|
"y": 319.4905539380939
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": ["addInputParam"],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "core.module.input.description.HTTP Dynamic Input"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueType": "string",
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"key": "query",
|
||||||
|
"label": "query",
|
||||||
|
"toolDescription": "谷歌搜索检索词",
|
||||||
|
"required": true,
|
||||||
|
"canEdit": true,
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"description": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpMethod",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"value": "GET",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpReqUrl",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Url",
|
||||||
|
"placeholder": "https://api.ai.com/getInventory",
|
||||||
|
"required": false,
|
||||||
|
"value": "https://www.googleapis.com/customsearch/v1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpHeader",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [],
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Header",
|
||||||
|
"placeholder": "core.module.input.description.Http Request Header",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpParams",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"key": "q",
|
||||||
|
"type": "string",
|
||||||
|
"value": "{{query}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "cx",
|
||||||
|
"type": "string",
|
||||||
|
"value": "谷歌搜索cxID"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "key",
|
||||||
|
"type": "string",
|
||||||
|
"value": "谷歌搜索key"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "c2coff",
|
||||||
|
"type": "string",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "start",
|
||||||
|
"type": "string",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "end",
|
||||||
|
"type": "string",
|
||||||
|
"value": "20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "dateRestrict",
|
||||||
|
"type": "string",
|
||||||
|
"value": "m[1]"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpJsonBody",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": "",
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "system_addOutputParam",
|
||||||
|
"key": "system_addOutputParam",
|
||||||
|
"type": "dynamic",
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "httpRawResponse",
|
||||||
|
"key": "httpRawResponse",
|
||||||
|
"label": "原始响应",
|
||||||
|
"description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
|
||||||
|
"valueType": "any",
|
||||||
|
"type": "static",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "M5YmxaYe8em1",
|
||||||
|
"type": "dynamic",
|
||||||
|
"key": "prompt",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "prompt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "poIbrrA8aiR0",
|
||||||
|
"name": "代码运行",
|
||||||
|
"intro": "执行一段简单的脚本代码,通常用于进行复杂的数据处理。",
|
||||||
|
"avatar": "/imgs/workflow/code.svg",
|
||||||
|
"flowNodeType": "code",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1711.805344753384,
|
||||||
|
"y": 650.1023414708576
|
||||||
|
},
|
||||||
|
"version": "482",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": ["addInputParam"],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "这些变量会作为代码的运行的输入参数",
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "data",
|
||||||
|
"valueType": "object",
|
||||||
|
"label": "data",
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"description": "",
|
||||||
|
"canEdit": true,
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
},
|
||||||
|
"value": ["GMELVPxHfpg5", "httpRawResponse"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "codeType",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": "js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "code",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"label": "",
|
||||||
|
"value": "function main({data}){\n const result = data.items.map((item) => ({\n title: item.title,\n link: item.link,\n snippet: item.snippet\n }))\n return { prompt: JSON.stringify(result) }\n}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "system_addOutputParam",
|
||||||
|
"key": "system_addOutputParam",
|
||||||
|
"type": "dynamic",
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
},
|
||||||
|
"description": "将代码中 return 的对象作为输出,传递给后续的节点"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "system_rawResponse",
|
||||||
|
"key": "system_rawResponse",
|
||||||
|
"label": "完整响应数据",
|
||||||
|
"valueType": "object",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "error",
|
||||||
|
"key": "error",
|
||||||
|
"label": "运行错误",
|
||||||
|
"description": "代码运行错误信息,成功时返回空",
|
||||||
|
"valueType": "object",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "qLUQfhG0ILRX",
|
||||||
|
"type": "dynamic",
|
||||||
|
"key": "prompt",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "prompt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "448745",
|
||||||
|
"target": "NOgbnBzUwDgT",
|
||||||
|
"sourceHandle": "448745-source-right",
|
||||||
|
"targetHandle": "NOgbnBzUwDgT-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "NOgbnBzUwDgT",
|
||||||
|
"target": "GMELVPxHfpg5",
|
||||||
|
"sourceHandle": "selectedTools",
|
||||||
|
"targetHandle": "selectedTools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "GMELVPxHfpg5",
|
||||||
|
"target": "poIbrrA8aiR0",
|
||||||
|
"sourceHandle": "GMELVPxHfpg5-source-right",
|
||||||
|
"targetHandle": "poIbrrA8aiR0-target-left"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 6.6 KiB |
@ -0,0 +1,270 @@
|
|||||||
|
{
|
||||||
|
"name": "Dalle3 绘图",
|
||||||
|
"intro": "通过请求 Dalle3 接口绘图,需要有 api key",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "/appMarketTemplates/plugin-dalle/avatar.svg",
|
||||||
|
"type": "plugin",
|
||||||
|
"tags": ["recommendation", "image-generation"],
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "pluginInput",
|
||||||
|
"name": "自定义插件输入",
|
||||||
|
"intro": "可以配置插件需要哪些输入,利用这些输入来运行插件",
|
||||||
|
"avatar": "core/workflow/template/workflowStart",
|
||||||
|
"flowNodeType": "pluginInput",
|
||||||
|
"showStatus": false,
|
||||||
|
"position": {
|
||||||
|
"x": 412.7756423516722,
|
||||||
|
"y": -99.80686112290361
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"selectedTypeIndex": 0,
|
||||||
|
"valueType": "string",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "绘图提示词",
|
||||||
|
"label": "绘图提示词",
|
||||||
|
"description": "绘图提示词",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "绘图提示词"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "绘图提示词",
|
||||||
|
"valueType": "string",
|
||||||
|
"key": "绘图提示词",
|
||||||
|
"label": "绘图提示词",
|
||||||
|
"type": "hidden"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "pluginOutput",
|
||||||
|
"name": "自定义插件输出",
|
||||||
|
"intro": "自定义配置外部输出,使用插件时,仅暴露自定义配置的输出",
|
||||||
|
"avatar": "core/workflow/template/pluginOutput",
|
||||||
|
"flowNodeType": "pluginOutput",
|
||||||
|
"showStatus": false,
|
||||||
|
"position": {
|
||||||
|
"x": 1822.7195641525896,
|
||||||
|
"y": -193.54601587659562
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"valueType": "string",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "图片访问链接",
|
||||||
|
"label": "图片访问链接",
|
||||||
|
"description": "",
|
||||||
|
"value": ["tMvel910bnrJ", "pJXgWoTpPoMy"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"valueType": "object",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "error",
|
||||||
|
"label": "错误信息",
|
||||||
|
"description": "",
|
||||||
|
"value": ["tMvel910bnrJ", "error"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "tMvel910bnrJ",
|
||||||
|
"name": "HTTP 请求",
|
||||||
|
"intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)",
|
||||||
|
"avatar": "core/workflow/template/httpRequest",
|
||||||
|
"flowNodeType": "httpRequest468",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1044.8838211811253,
|
||||||
|
"y": -414.7785530936485
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": ["addInputParam"],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "core.module.input.description.HTTP Dynamic Input",
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpMethod",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"value": "POST",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpReqUrl",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Url",
|
||||||
|
"placeholder": "https://api.ai.com/getInventory",
|
||||||
|
"required": false,
|
||||||
|
"value": "https://api.openai.com/v1/images/generations"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpHeader",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"key": "Authorization",
|
||||||
|
"type": "string",
|
||||||
|
"value": "Bearer {{authorization}}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Header",
|
||||||
|
"placeholder": "core.module.input.description.Http Request Header",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpParams",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [],
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpJsonBody",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": "{\n \"model\": \"dall-e-3\",\n \"prompt\": \"{{prompt}}\",\n \"n\": 1,\n \"size\": \"1024x1024\"\n}",
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"valueType": "string",
|
||||||
|
"canEdit": true,
|
||||||
|
"key": "prompt",
|
||||||
|
"label": "prompt",
|
||||||
|
"customInputConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": true
|
||||||
|
},
|
||||||
|
"required": true,
|
||||||
|
"value": ["pluginInput", "绘图提示词"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "error",
|
||||||
|
"key": "error",
|
||||||
|
"label": "请求错误",
|
||||||
|
"description": "HTTP请求错误信息,成功时返回空",
|
||||||
|
"valueType": "object",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "httpRawResponse",
|
||||||
|
"key": "httpRawResponse",
|
||||||
|
"label": "原始响应",
|
||||||
|
"required": true,
|
||||||
|
"description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
|
||||||
|
"valueType": "any",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "system_addOutputParam",
|
||||||
|
"key": "system_addOutputParam",
|
||||||
|
"type": "dynamic",
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"customFieldConfig": {
|
||||||
|
"selectValueTypeList": [
|
||||||
|
"string",
|
||||||
|
"number",
|
||||||
|
"boolean",
|
||||||
|
"object",
|
||||||
|
"arrayString",
|
||||||
|
"arrayNumber",
|
||||||
|
"arrayBoolean",
|
||||||
|
"arrayObject",
|
||||||
|
"any",
|
||||||
|
"chatHistory",
|
||||||
|
"datasetQuote",
|
||||||
|
"dynamic",
|
||||||
|
"selectApp",
|
||||||
|
"selectDataset"
|
||||||
|
],
|
||||||
|
"showDescription": false,
|
||||||
|
"showDefaultValue": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pJXgWoTpPoMy",
|
||||||
|
"valueType": "string",
|
||||||
|
"type": "dynamic",
|
||||||
|
"key": "data[0].url",
|
||||||
|
"label": "data[0].url"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "pluginInput",
|
||||||
|
"target": "tMvel910bnrJ",
|
||||||
|
"sourceHandle": "pluginInput-source-right",
|
||||||
|
"targetHandle": "tMvel910bnrJ-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "tMvel910bnrJ",
|
||||||
|
"target": "pluginOutput",
|
||||||
|
"sourceHandle": "tMvel910bnrJ-source-right",
|
||||||
|
"targetHandle": "pluginOutput-target-left"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
@ -0,0 +1,234 @@
|
|||||||
|
{
|
||||||
|
"name": "飞书 webhook 插件",
|
||||||
|
"intro": "通过 webhook 给飞书机器人发送一条消息",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "/appMarketTemplates/plugin-feishu/avatar.svg",
|
||||||
|
"type": "plugin",
|
||||||
|
"tags": ["recommendation", "office-services"],
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "pluginInput",
|
||||||
|
"name": "自定义插件输入",
|
||||||
|
"intro": "自定义配置外部输入,使用插件时,仅暴露自定义配置的输入",
|
||||||
|
"avatar": "core/workflow/template/workflowStart",
|
||||||
|
"flowNodeType": "pluginInput",
|
||||||
|
"showStatus": false,
|
||||||
|
"position": {
|
||||||
|
"x": 517.5620777851774,
|
||||||
|
"y": -173.55711888178655
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"inputType": "input",
|
||||||
|
"valueType": "string",
|
||||||
|
"key": "飞书机器人地址",
|
||||||
|
"label": "飞书机器人地址",
|
||||||
|
"description": "",
|
||||||
|
"isToolInput": false,
|
||||||
|
"defaultValue": "",
|
||||||
|
"editField": {
|
||||||
|
"key": true
|
||||||
|
},
|
||||||
|
"dynamicParamDefaultValue": {
|
||||||
|
"inputType": "reference",
|
||||||
|
"valueType": "string",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"renderTypeList": ["input"],
|
||||||
|
"required": true,
|
||||||
|
"canEdit": true,
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "发送的消息",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "发送的消息",
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"required": true,
|
||||||
|
"description": "",
|
||||||
|
"canEdit": true,
|
||||||
|
"value": "",
|
||||||
|
"editField": {
|
||||||
|
"key": true
|
||||||
|
},
|
||||||
|
"dynamicParamDefaultValue": {
|
||||||
|
"inputType": "reference",
|
||||||
|
"valueType": "string",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "mv52BrPVE6bm",
|
||||||
|
"key": "飞书机器人地址",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "飞书机器人地址",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "p0m68Dv5KaIp",
|
||||||
|
"key": "发送的消息",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "发送的消息",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "pluginOutput",
|
||||||
|
"name": "自定义插件输出",
|
||||||
|
"intro": "自定义配置外部输出,使用插件时,仅暴露自定义配置的输出",
|
||||||
|
"avatar": "/imgs/workflow/output.png",
|
||||||
|
"flowNodeType": "pluginOutput",
|
||||||
|
"showStatus": false,
|
||||||
|
"position": {
|
||||||
|
"x": 1668.9410524554828,
|
||||||
|
"y": -153.47815316221283
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "rKBYGQuYefae",
|
||||||
|
"name": "HTTP 请求",
|
||||||
|
"intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)",
|
||||||
|
"avatar": "core/workflow/template/httpRequest",
|
||||||
|
"flowNodeType": "httpRequest468",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1069.7228495148624,
|
||||||
|
"y": -392.26482361861054
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "system_addInputParam",
|
||||||
|
"renderTypeList": ["addInputParam"],
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"required": false,
|
||||||
|
"description": "core.module.input.description.HTTP Dynamic Input"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "text",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "text",
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"description": "",
|
||||||
|
"canEdit": true,
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
},
|
||||||
|
"value": ["pluginInput", "p0m68Dv5KaIp"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "url",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "url",
|
||||||
|
"renderTypeList": ["reference"],
|
||||||
|
"description": "",
|
||||||
|
"canEdit": true,
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
},
|
||||||
|
"value": ["pluginInput", "mv52BrPVE6bm"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpMethod",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"value": "POST",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpReqUrl",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Url",
|
||||||
|
"placeholder": "https://api.ai.com/getInventory",
|
||||||
|
"required": false,
|
||||||
|
"value": "{{url}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpHeader",
|
||||||
|
"renderTypeList": ["custom"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [],
|
||||||
|
"label": "",
|
||||||
|
"description": "core.module.input.description.Http Request Header",
|
||||||
|
"placeholder": "core.module.input.description.Http Request Header",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpParams",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": [],
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "system_httpJsonBody",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"valueType": "any",
|
||||||
|
"value": "{\r\n \"msg_type\": \"text\",\r\n \"content\": {\r\n \"text\": \"{{text}}\"\r\n }\r\n}",
|
||||||
|
"label": "",
|
||||||
|
"required": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "system_addOutputParam",
|
||||||
|
"key": "system_addOutputParam",
|
||||||
|
"type": "dynamic",
|
||||||
|
"valueType": "dynamic",
|
||||||
|
"label": "",
|
||||||
|
"editField": {
|
||||||
|
"key": true,
|
||||||
|
"valueType": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "error",
|
||||||
|
"key": "error",
|
||||||
|
"label": "请求错误",
|
||||||
|
"description": "HTTP请求错误信息,成功时返回空",
|
||||||
|
"valueType": "object",
|
||||||
|
"type": "static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "httpRawResponse",
|
||||||
|
"key": "httpRawResponse",
|
||||||
|
"label": "原始响应",
|
||||||
|
"required": true,
|
||||||
|
"description": "HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。",
|
||||||
|
"valueType": "any",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "pluginInput",
|
||||||
|
"target": "rKBYGQuYefae",
|
||||||
|
"sourceHandle": "pluginInput-source-right",
|
||||||
|
"targetHandle": "rKBYGQuYefae-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "rKBYGQuYefae",
|
||||||
|
"target": "pluginOutput",
|
||||||
|
"sourceHandle": "rKBYGQuYefae-source-right",
|
||||||
|
"targetHandle": "pluginOutput-target-left"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,337 @@
|
|||||||
|
{
|
||||||
|
"name": "知识库+对话引导",
|
||||||
|
"intro": "每次提问时进行一次知识库搜索,将搜索结果注入 LLM 模型进行参考回答",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "core/workflow/template/datasetSearch",
|
||||||
|
"type": "simple",
|
||||||
|
"tags": ["office-services"],
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "userGuide",
|
||||||
|
"name": "系统配置",
|
||||||
|
"intro": "可以配置应用的系统参数",
|
||||||
|
"avatar": "core/workflow/template/systemConfig",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.systemConfig",
|
||||||
|
"position": {
|
||||||
|
"x": 531.2422736065552,
|
||||||
|
"y": -486.7611729549753
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "welcomeText",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "core.app.Welcome Text",
|
||||||
|
"value": "你好,我是知识库助手,请不要忘记选择知识库噢~\n[你是谁]\n[如何使用]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "variables",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "core.app.Chat Variable",
|
||||||
|
"value": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "questionGuide",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "core.app.Question Guide",
|
||||||
|
"value": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "tts",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"type": "web"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "whisper",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": {
|
||||||
|
"open": false,
|
||||||
|
"autoSend": false,
|
||||||
|
"autoTTSResponse": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "scheduleTrigger",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.any",
|
||||||
|
"label": "",
|
||||||
|
"value": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "workflowStartNodeId",
|
||||||
|
"name": "流程开始",
|
||||||
|
"intro": "",
|
||||||
|
"avatar": "core/workflow/template/workflowStart",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.workflowStart",
|
||||||
|
"position": {
|
||||||
|
"x": 558.4082376415505,
|
||||||
|
"y": 123.72387429194112
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "userChatInput",
|
||||||
|
"key": "userChatInput",
|
||||||
|
"label": "core.module.input.label.user question",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "7BdojPlukIQw",
|
||||||
|
"name": "AI 对话",
|
||||||
|
"intro": "AI 大模型对话",
|
||||||
|
"avatar": "core/workflow/template/aiChat",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.chatNode",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1638.509551404687,
|
||||||
|
"y": -341.0428450861567
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "model",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.settingLLMModel",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"label": "core.module.input.label.aiModel",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"value": "gpt-4o-mini"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "temperature",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 3,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number",
|
||||||
|
"min": 0,
|
||||||
|
"max": 10,
|
||||||
|
"step": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "maxToken",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 1950,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number",
|
||||||
|
"min": 100,
|
||||||
|
"max": 4000,
|
||||||
|
"step": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "isResponseAnswerText",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": true,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quoteTemplate",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quotePrompt",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "systemPrompt",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.textarea", "FlowNodeInputTypeEnum.reference"],
|
||||||
|
"max": 3000,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "core.ai.Prompt",
|
||||||
|
"description": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"placeholder": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "history",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.numberInput",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.chatHistory",
|
||||||
|
"label": "core.module.input.label.chat history",
|
||||||
|
"required": true,
|
||||||
|
"min": 0,
|
||||||
|
"max": 30,
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题",
|
||||||
|
"value": ["workflowStartNodeId", "userChatInput"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "quoteQA",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.settingDatasetQuotePrompt"],
|
||||||
|
"label": "",
|
||||||
|
"debugLabel": "知识库引用",
|
||||||
|
"description": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.datasetQuote",
|
||||||
|
"value": ["iKBoX2vIzETU", "quoteQA"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "history",
|
||||||
|
"key": "history",
|
||||||
|
"label": "core.module.output.label.New context",
|
||||||
|
"description": "core.module.output.description.New context",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.chatHistory",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "answerText",
|
||||||
|
"key": "answerText",
|
||||||
|
"label": "core.module.output.label.Ai response content",
|
||||||
|
"description": "core.module.output.description.Ai response content",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "iKBoX2vIzETU",
|
||||||
|
"name": "知识库搜索",
|
||||||
|
"intro": "调用\"语义检索\"和\"全文检索\"能力,从\"知识库\"中查找可能与问题相关的参考内容",
|
||||||
|
"avatar": "core/workflow/template/datasetSearch",
|
||||||
|
"flowNodeType": "FlowNodeTypeEnum.datasetSearchNode",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 918.5901682164496,
|
||||||
|
"y": -227.11542247619582
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "datasets",
|
||||||
|
"renderTypeList": [
|
||||||
|
"FlowNodeInputTypeEnum.selectDataset",
|
||||||
|
"FlowNodeInputTypeEnum.reference"
|
||||||
|
],
|
||||||
|
"label": "core.module.input.label.Select dataset",
|
||||||
|
"value": [],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.selectDataset",
|
||||||
|
"list": [],
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "similarity",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.selectDatasetParamsModal"],
|
||||||
|
"label": "",
|
||||||
|
"value": 0.4,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "limit",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 1500,
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "searchMode",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"value": "embedding"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "usingReRank",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean",
|
||||||
|
"value": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "datasetSearchUsingExtensionQuery",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.boolean",
|
||||||
|
"value": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "datasetSearchExtensionModel",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "datasetSearchExtensionBg",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.hidden"],
|
||||||
|
"label": "",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["FlowNodeInputTypeEnum.reference", "FlowNodeInputTypeEnum.textarea"],
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "需要检索的内容",
|
||||||
|
"value": ["workflowStartNodeId", "userChatInput"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "quoteQA",
|
||||||
|
"key": "quoteQA",
|
||||||
|
"label": "core.module.Dataset quote.label",
|
||||||
|
"type": "FlowNodeOutputTypeEnum.static",
|
||||||
|
"valueType": "WorkflowIOValueTypeEnum.datasetQuote",
|
||||||
|
"description": "特殊数组格式,搜索结果为空时,返回空数组。"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "workflowStartNodeId",
|
||||||
|
"target": "iKBoX2vIzETU",
|
||||||
|
"sourceHandle": "workflowStartNodeId-source-right",
|
||||||
|
"targetHandle": "iKBoX2vIzETU-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "iKBoX2vIzETU",
|
||||||
|
"target": "7BdojPlukIQw",
|
||||||
|
"sourceHandle": "iKBoX2vIzETU-source-right",
|
||||||
|
"targetHandle": "7BdojPlukIQw-target-left"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
1928
projects/app/public/appMarketTemplates/srt-translate/template.json
Normal file
186
projects/app/public/appMarketTemplates/timeBot/template.json
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
{
|
||||||
|
"name": "知道时间的机器人",
|
||||||
|
"intro": "通过挂载时间插件,让模型获取当前最新时间",
|
||||||
|
"author": "Fastgpt",
|
||||||
|
"avatar": "core/workflow/template/getTime",
|
||||||
|
"tags": ["recommendation", "roleplay"],
|
||||||
|
"type": "simple",
|
||||||
|
"weight": 1,
|
||||||
|
"workflow": {
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"nodeId": "userGuide",
|
||||||
|
"name": "系统配置",
|
||||||
|
"intro": "可以配置应用的系统参数",
|
||||||
|
"avatar": "/imgs/workflow/userGuide.png",
|
||||||
|
"flowNodeType": "userGuide",
|
||||||
|
"position": {
|
||||||
|
"x": 531.2422736065552,
|
||||||
|
"y": -486.7611729549753
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [],
|
||||||
|
"outputs": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "workflowStartNodeId",
|
||||||
|
"name": "流程开始",
|
||||||
|
"intro": "",
|
||||||
|
"avatar": "/imgs/workflow/userChatInput.svg",
|
||||||
|
"flowNodeType": "workflowStart",
|
||||||
|
"position": {
|
||||||
|
"x": 558.4082376415505,
|
||||||
|
"y": 123.72387429194112
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["reference", "textarea"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"toolDescription": "用户问题"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "userChatInput",
|
||||||
|
"key": "userChatInput",
|
||||||
|
"label": "core.module.input.label.user question",
|
||||||
|
"valueType": "string",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "jrWPV9",
|
||||||
|
"name": "工具调用",
|
||||||
|
"intro": "通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。",
|
||||||
|
"avatar": "/imgs/workflow/tool.svg",
|
||||||
|
"flowNodeType": "tools",
|
||||||
|
"showStatus": true,
|
||||||
|
"position": {
|
||||||
|
"x": 1062.1738942532802,
|
||||||
|
"y": -223.65033022650476
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"key": "model",
|
||||||
|
"renderTypeList": ["settingLLMModel", "reference"],
|
||||||
|
"label": "core.module.input.label.aiModel",
|
||||||
|
"valueType": "string",
|
||||||
|
"llmModelType": "all",
|
||||||
|
"value": "gpt-3.5-turbo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "temperature",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 0,
|
||||||
|
"valueType": "number",
|
||||||
|
"min": 0,
|
||||||
|
"max": 10,
|
||||||
|
"step": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "maxToken",
|
||||||
|
"renderTypeList": ["hidden"],
|
||||||
|
"label": "",
|
||||||
|
"value": 2000,
|
||||||
|
"valueType": "number",
|
||||||
|
"min": 100,
|
||||||
|
"max": 4000,
|
||||||
|
"step": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "systemPrompt",
|
||||||
|
"renderTypeList": ["textarea", "reference"],
|
||||||
|
"max": 3000,
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "core.ai.Prompt",
|
||||||
|
"description": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"placeholder": "core.app.tip.chatNodeSystemPromptTip",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "history",
|
||||||
|
"renderTypeList": ["numberInput", "reference"],
|
||||||
|
"valueType": "chatHistory",
|
||||||
|
"label": "core.module.input.label.chat history",
|
||||||
|
"description": "最多携带多少轮对话记录",
|
||||||
|
"required": true,
|
||||||
|
"min": 0,
|
||||||
|
"max": 30,
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "userChatInput",
|
||||||
|
"renderTypeList": ["reference", "textarea"],
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "用户问题",
|
||||||
|
"required": true,
|
||||||
|
"value": ["workflowStartNodeId", "userChatInput"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "answerText",
|
||||||
|
"key": "answerText",
|
||||||
|
"label": "core.module.output.label.Ai response content",
|
||||||
|
"description": "core.module.output.description.Ai response content",
|
||||||
|
"valueType": "string",
|
||||||
|
"type": "static"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeId": "zBxjo5",
|
||||||
|
"name": "获取当前时间",
|
||||||
|
"intro": "获取用户当前时区的时间。",
|
||||||
|
"avatar": "/imgs/workflow/getCurrentTime.svg",
|
||||||
|
"flowNodeType": "pluginModule",
|
||||||
|
"showStatus": false,
|
||||||
|
"position": {
|
||||||
|
"x": 1000,
|
||||||
|
"y": 545
|
||||||
|
},
|
||||||
|
"version": "481",
|
||||||
|
"inputs": [],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"id": "time",
|
||||||
|
"type": "static",
|
||||||
|
"key": "time",
|
||||||
|
"valueType": "string",
|
||||||
|
"label": "time",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pluginId": "community-getTime"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "workflowStartNodeId",
|
||||||
|
"target": "jrWPV9",
|
||||||
|
"sourceHandle": "workflowStartNodeId-source-right",
|
||||||
|
"targetHandle": "jrWPV9-target-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "jrWPV9",
|
||||||
|
"target": "zBxjo5",
|
||||||
|
"sourceHandle": "selectedTools",
|
||||||
|
"targetHandle": "selectedTools"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"chatConfig": {
|
||||||
|
"scheduledTriggerConfig": {
|
||||||
|
"cronString": "",
|
||||||
|
"timezone": "Asia/Shanghai",
|
||||||
|
"defaultPrompt": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
41
projects/app/public/imgs/app/templateFill.svg
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<svg viewBox="0 0 24 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_6458_21426)">
|
||||||
|
<rect width="16.9863" height="7.72395" rx="2.5" transform="matrix(0.960903 -0.276886 0.36577 0.930705 2.47949 5.24646)" fill="#E1EAFF"/>
|
||||||
|
</g>
|
||||||
|
<g clip-path="url(#clip1_6458_21426)">
|
||||||
|
<rect width="19.1584" height="7.56066" rx="2.5" transform="matrix(0.992604 -0.121398 0.175115 0.984548 1.91479 4.55225)" fill="#C5D7FF"/>
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter0_dd_6458_21426)">
|
||||||
|
<rect x="2" y="4.22711" width="20" height="15" rx="2.5" fill="url(#paint0_linear_6458_21426)"/>
|
||||||
|
<rect x="4.5" y="6.62494" width="3.125" height="3.125" rx="1" fill="white" fill-opacity="0.8"/>
|
||||||
|
<rect x="4.5" y="11.3469" width="15.625" height="1.25" rx="0.625" fill="white" fill-opacity="0.8"/>
|
||||||
|
<rect x="4.5" y="13.704" width="7.5" height="1.25" rx="0.625" fill="white" fill-opacity="0.8"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="filter0_dd_6458_21426" x="0.75" y="3.60211" width="22.5" height="17.5" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||||
|
<feOffset/>
|
||||||
|
<feGaussianBlur stdDeviation="0.3125"/>
|
||||||
|
<feComposite in2="hardAlpha" operator="out"/>
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.0745098 0 0 0 0 0.2 0 0 0 0 0.419608 0 0 0 0.08 0"/>
|
||||||
|
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6458_21426"/>
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||||
|
<feOffset dy="0.625"/>
|
||||||
|
<feGaussianBlur stdDeviation="0.625"/>
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.0745098 0 0 0 0 0.2 0 0 0 0 0.419608 0 0 0 0.05 0"/>
|
||||||
|
<feBlend mode="normal" in2="effect1_dropShadow_6458_21426" result="effect2_dropShadow_6458_21426"/>
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_6458_21426" result="shape"/>
|
||||||
|
</filter>
|
||||||
|
<linearGradient id="paint0_linear_6458_21426" x1="22" y1="4.93495" x2="2" y2="19.2271" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#94B5FF"/>
|
||||||
|
<stop offset="1" stop-color="#3370FF"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_6458_21426">
|
||||||
|
<rect width="16.9863" height="7.72395" rx="2.5" transform="matrix(0.960903 -0.276886 0.36577 0.930705 2.47949 5.24646)" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clip1_6458_21426">
|
||||||
|
<rect width="19.1584" height="7.56066" rx="2.5" transform="matrix(0.992604 -0.121398 0.175115 0.984548 1.91479 4.55225)" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
@ -15,9 +15,15 @@ type Props = {
|
|||||||
llmModelType?: `${LLMModelTypeEnum}`;
|
llmModelType?: `${LLMModelTypeEnum}`;
|
||||||
defaultData: SettingAIDataType;
|
defaultData: SettingAIDataType;
|
||||||
onChange: (e: SettingAIDataType) => void;
|
onChange: (e: SettingAIDataType) => void;
|
||||||
|
bg?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
const SettingLLMModel = ({ llmModelType = LLMModelTypeEnum.all, defaultData, onChange }: Props) => {
|
const SettingLLMModel = ({
|
||||||
|
llmModelType = LLMModelTypeEnum.all,
|
||||||
|
defaultData,
|
||||||
|
onChange,
|
||||||
|
bg = 'white'
|
||||||
|
}: Props) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { llmModelList } = useSystemStore();
|
const { llmModelList } = useSystemStore();
|
||||||
|
|
||||||
@ -63,6 +69,7 @@ const SettingLLMModel = ({ llmModelType = LLMModelTypeEnum.all, defaultData, onC
|
|||||||
w={'100%'}
|
w={'100%'}
|
||||||
justifyContent={'flex-start'}
|
justifyContent={'flex-start'}
|
||||||
variant={'whiteFlow'}
|
variant={'whiteFlow'}
|
||||||
|
bg={bg}
|
||||||
_active={{
|
_active={{
|
||||||
transform: 'none'
|
transform: 'none'
|
||||||
}}
|
}}
|
||||||
|
|||||||
@ -22,6 +22,7 @@ const WelcomeTextConfig = (props: TextareaProps) => {
|
|||||||
mt={2}
|
mt={2}
|
||||||
rows={6}
|
rows={6}
|
||||||
fontSize={'sm'}
|
fontSize={'sm'}
|
||||||
|
bg={'myGray.50'}
|
||||||
placeholder={t('common:core.app.tip.welcomeTextTip')}
|
placeholder={t('common:core.app.tip.welcomeTextTip')}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -22,10 +22,11 @@ export type CreateAppBody = {
|
|||||||
type?: AppTypeEnum;
|
type?: AppTypeEnum;
|
||||||
modules: AppSchema['modules'];
|
modules: AppSchema['modules'];
|
||||||
edges?: AppSchema['edges'];
|
edges?: AppSchema['edges'];
|
||||||
|
chatConfig?: AppSchema['chatConfig'];
|
||||||
};
|
};
|
||||||
|
|
||||||
async function handler(req: ApiRequestProps<CreateAppBody>) {
|
async function handler(req: ApiRequestProps<CreateAppBody>) {
|
||||||
const { parentId, name, avatar, type, modules, edges } = req.body;
|
const { parentId, name, avatar, type, modules, edges, chatConfig } = req.body;
|
||||||
|
|
||||||
if (!name || !type || !Array.isArray(modules)) {
|
if (!name || !type || !Array.isArray(modules)) {
|
||||||
return Promise.reject(CommonErrEnum.inheritPermissionError);
|
return Promise.reject(CommonErrEnum.inheritPermissionError);
|
||||||
@ -50,6 +51,7 @@ async function handler(req: ApiRequestProps<CreateAppBody>) {
|
|||||||
type,
|
type,
|
||||||
modules,
|
modules,
|
||||||
edges,
|
edges,
|
||||||
|
chatConfig,
|
||||||
teamId,
|
teamId,
|
||||||
tmbId
|
tmbId
|
||||||
});
|
});
|
||||||
@ -67,6 +69,7 @@ export const onCreateApp = async ({
|
|||||||
type,
|
type,
|
||||||
modules,
|
modules,
|
||||||
edges,
|
edges,
|
||||||
|
chatConfig,
|
||||||
teamId,
|
teamId,
|
||||||
tmbId,
|
tmbId,
|
||||||
pluginData,
|
pluginData,
|
||||||
@ -78,6 +81,7 @@ export const onCreateApp = async ({
|
|||||||
type?: AppTypeEnum;
|
type?: AppTypeEnum;
|
||||||
modules?: AppSchema['modules'];
|
modules?: AppSchema['modules'];
|
||||||
edges?: AppSchema['edges'];
|
edges?: AppSchema['edges'];
|
||||||
|
chatConfig?: AppSchema['chatConfig'];
|
||||||
intro?: string;
|
intro?: string;
|
||||||
teamId: string;
|
teamId: string;
|
||||||
tmbId: string;
|
tmbId: string;
|
||||||
@ -96,6 +100,7 @@ export const onCreateApp = async ({
|
|||||||
tmbId,
|
tmbId,
|
||||||
modules,
|
modules,
|
||||||
edges,
|
edges,
|
||||||
|
chatConfig,
|
||||||
type,
|
type,
|
||||||
version: 'v2',
|
version: 'v2',
|
||||||
pluginData,
|
pluginData,
|
||||||
@ -111,7 +116,8 @@ export const onCreateApp = async ({
|
|||||||
{
|
{
|
||||||
appId,
|
appId,
|
||||||
nodes: modules,
|
nodes: modules,
|
||||||
edges
|
edges,
|
||||||
|
chatConfig
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
{ session }
|
{ session }
|
||||||
|
|||||||
21
projects/app/src/pages/api/core/app/template/detail.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
|
import { authCert } from '@fastgpt/service/support/permission/auth/common';
|
||||||
|
import { NextAPI } from '@/service/middleware/entry';
|
||||||
|
import { TemplateMarketItemType } from '@fastgpt/global/core/workflow/type';
|
||||||
|
import { getTemplateMarketItemDetail } from '@/service/core/app/template';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
templateId: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
async function handler(
|
||||||
|
req: NextApiRequest,
|
||||||
|
res: NextApiResponse<any>
|
||||||
|
): Promise<TemplateMarketItemType | undefined> {
|
||||||
|
await authCert({ req, authToken: true });
|
||||||
|
const { templateId } = req.query as Props;
|
||||||
|
|
||||||
|
return getTemplateMarketItemDetail(templateId);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NextAPI(handler);
|
||||||
16
projects/app/src/pages/api/core/app/template/list.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||||
|
import { authCert } from '@fastgpt/service/support/permission/auth/common';
|
||||||
|
import { NextAPI } from '@/service/middleware/entry';
|
||||||
|
import { TemplateMarketListItemType } from '@fastgpt/global/core/workflow/type';
|
||||||
|
import { getTemplateMarketItemList } from '@/service/core/app/template';
|
||||||
|
|
||||||
|
async function handler(
|
||||||
|
req: NextApiRequest,
|
||||||
|
res: NextApiResponse<any>
|
||||||
|
): Promise<TemplateMarketListItemType[]> {
|
||||||
|
await authCert({ req, authToken: true });
|
||||||
|
|
||||||
|
return getTemplateMarketItemList();
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NextAPI(handler);
|
||||||
@ -30,7 +30,6 @@ const Edit = ({
|
|||||||
// show selected dataset
|
// show selected dataset
|
||||||
useMount(() => {
|
useMount(() => {
|
||||||
loadAllDatasets();
|
loadAllDatasets();
|
||||||
|
|
||||||
setAppForm(
|
setAppForm(
|
||||||
appWorkflow2Form({
|
appWorkflow2Form({
|
||||||
nodes: appDetail.modules,
|
nodes: appDetail.modules,
|
||||||
|
|||||||
@ -135,13 +135,14 @@ const EditForm = ({
|
|||||||
<Flex alignItems={'center'}>
|
<Flex alignItems={'center'}>
|
||||||
<MyIcon name={'core/app/simpleMode/ai'} w={'20px'} />
|
<MyIcon name={'core/app/simpleMode/ai'} w={'20px'} />
|
||||||
<FormLabel ml={2} flex={1}>
|
<FormLabel ml={2} flex={1}>
|
||||||
{appT('ai_settings')}
|
{t('app:ai_settings')}
|
||||||
</FormLabel>
|
</FormLabel>
|
||||||
</Flex>
|
</Flex>
|
||||||
<Flex alignItems={'center'} mt={5}>
|
<Flex alignItems={'center'} mt={5}>
|
||||||
<Box {...LabelStyles}>{t('common:core.ai.Model')}</Box>
|
<Box {...LabelStyles}>{t('common:core.ai.Model')}</Box>
|
||||||
<Box flex={'1 0 0'}>
|
<Box flex={'1 0 0'}>
|
||||||
<SettingLLMModel
|
<SettingLLMModel
|
||||||
|
bg="myGray.50"
|
||||||
llmModelType={'all'}
|
llmModelType={'all'}
|
||||||
defaultData={{
|
defaultData={{
|
||||||
model: appForm.aiSettings.model,
|
model: appForm.aiSettings.model,
|
||||||
@ -176,6 +177,7 @@ const EditForm = ({
|
|||||||
<Box mt={1}>
|
<Box mt={1}>
|
||||||
<PromptEditor
|
<PromptEditor
|
||||||
value={appForm.aiSettings.systemPrompt}
|
value={appForm.aiSettings.systemPrompt}
|
||||||
|
bg={'myGray.50'}
|
||||||
onChange={(text) => {
|
onChange={(text) => {
|
||||||
startTst(() => {
|
startTst(() => {
|
||||||
setAppForm((state) => ({
|
setAppForm((state) => ({
|
||||||
|
|||||||
@ -52,7 +52,6 @@ const Header = ({
|
|||||||
|
|
||||||
const isPublished = useMemo(() => {
|
const isPublished = useMemo(() => {
|
||||||
const data = form2AppWorkflow(appForm, t);
|
const data = form2AppWorkflow(appForm, t);
|
||||||
|
|
||||||
return compareWorkflow(
|
return compareWorkflow(
|
||||||
{
|
{
|
||||||
nodes: appDetail.modules,
|
nodes: appDetail.modules,
|
||||||
|
|||||||
@ -1,15 +1,5 @@
|
|||||||
import React, { useCallback, useRef } from 'react';
|
import React, { useCallback, useMemo, useRef } from 'react';
|
||||||
import {
|
import { Box, Flex, Button, ModalFooter, ModalBody, Input, Grid, Card } from '@chakra-ui/react';
|
||||||
Box,
|
|
||||||
Flex,
|
|
||||||
Button,
|
|
||||||
ModalFooter,
|
|
||||||
ModalBody,
|
|
||||||
Input,
|
|
||||||
Grid,
|
|
||||||
useTheme,
|
|
||||||
Card
|
|
||||||
} from '@chakra-ui/react';
|
|
||||||
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
|
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { compressImgFileAndUpload } from '@/web/common/file/controller';
|
import { compressImgFileAndUpload } from '@/web/common/file/controller';
|
||||||
@ -17,8 +7,8 @@ import { getErrText } from '@fastgpt/global/common/error/utils';
|
|||||||
import { useToast } from '@fastgpt/web/hooks/useToast';
|
import { useToast } from '@fastgpt/web/hooks/useToast';
|
||||||
import { postCreateApp } from '@/web/core/app/api';
|
import { postCreateApp } from '@/web/core/app/api';
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import { simpleBotTemplates, workflowTemplates, pluginTemplates } from '@/web/core/app/templates';
|
import { emptyTemplates } from '@/web/core/app/templates';
|
||||||
import { useRequest } from '@fastgpt/web/hooks/useRequest';
|
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
|
||||||
import Avatar from '@fastgpt/web/components/common/Avatar';
|
import Avatar from '@fastgpt/web/components/common/Avatar';
|
||||||
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
|
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
|
||||||
import MyModal from '@fastgpt/web/components/common/MyModal';
|
import MyModal from '@fastgpt/web/components/common/MyModal';
|
||||||
@ -27,20 +17,31 @@ import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'
|
|||||||
import { useContextSelector } from 'use-context-selector';
|
import { useContextSelector } from 'use-context-selector';
|
||||||
import { AppListContext } from './context';
|
import { AppListContext } from './context';
|
||||||
import { AppTypeEnum } from '@fastgpt/global/core/app/constants';
|
import { AppTypeEnum } from '@fastgpt/global/core/app/constants';
|
||||||
import { useI18n } from '@/web/context/I18n';
|
|
||||||
import { useSystem } from '@fastgpt/web/hooks/useSystem';
|
import { useSystem } from '@fastgpt/web/hooks/useSystem';
|
||||||
|
import { ChevronRightIcon } from '@chakra-ui/icons';
|
||||||
|
import MyIcon from '@fastgpt/web/components/common/Icon';
|
||||||
|
import {
|
||||||
|
getTemplateMarketItemDetail,
|
||||||
|
getTemplateMarketItemList
|
||||||
|
} from '@/web/core/app/api/template';
|
||||||
|
|
||||||
type FormType = {
|
type FormType = {
|
||||||
avatar: string;
|
avatar: string;
|
||||||
name: string;
|
name: string;
|
||||||
templateId: string;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type CreateAppType = AppTypeEnum.simple | AppTypeEnum.workflow | AppTypeEnum.plugin;
|
export type CreateAppType = AppTypeEnum.simple | AppTypeEnum.workflow | AppTypeEnum.plugin;
|
||||||
|
|
||||||
const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => void }) => {
|
const CreateModal = ({
|
||||||
|
onClose,
|
||||||
|
type,
|
||||||
|
onOpenTemplateModal
|
||||||
|
}: {
|
||||||
|
type: CreateAppType;
|
||||||
|
onClose: () => void;
|
||||||
|
onOpenTemplateModal: (type: AppTypeEnum) => void;
|
||||||
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { appT } = useI18n();
|
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { parentId, loadMyApps } = useContextSelector(AppListContext, (v) => v);
|
const { parentId, loadMyApps } = useContextSelector(AppListContext, (v) => v);
|
||||||
@ -49,34 +50,39 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
|
|||||||
const typeMap = useRef({
|
const typeMap = useRef({
|
||||||
[AppTypeEnum.simple]: {
|
[AppTypeEnum.simple]: {
|
||||||
icon: 'core/app/simpleBot',
|
icon: 'core/app/simpleBot',
|
||||||
title: appT('type.Create simple bot'),
|
title: t('app:type.Create simple bot'),
|
||||||
avatar: '/imgs/app/avatar/simple.svg',
|
avatar: '/imgs/app/avatar/simple.svg',
|
||||||
templates: simpleBotTemplates
|
emptyCreateText: t('app:create_empty_app')
|
||||||
},
|
},
|
||||||
[AppTypeEnum.workflow]: {
|
[AppTypeEnum.workflow]: {
|
||||||
icon: 'core/app/type/workflowFill',
|
icon: 'core/app/type/workflowFill',
|
||||||
avatar: '/imgs/app/avatar/workflow.svg',
|
avatar: '/imgs/app/avatar/workflow.svg',
|
||||||
title: appT('type.Create workflow bot'),
|
title: t('app:type.Create workflow bot'),
|
||||||
templates: workflowTemplates
|
emptyCreateText: t('app:create_empty_workflow')
|
||||||
},
|
},
|
||||||
[AppTypeEnum.plugin]: {
|
[AppTypeEnum.plugin]: {
|
||||||
icon: 'core/app/type/pluginFill',
|
icon: 'core/app/type/pluginFill',
|
||||||
avatar: '/imgs/app/avatar/plugin.svg',
|
avatar: '/imgs/app/avatar/plugin.svg',
|
||||||
title: appT('type.Create plugin bot'),
|
title: t('app:type.Create plugin bot'),
|
||||||
templates: pluginTemplates
|
emptyCreateText: t('app:create_empty_plugin')
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const typeData = typeMap.current[type];
|
const typeData = typeMap.current[type];
|
||||||
|
|
||||||
|
const { data: templateList = [] } = useRequest2(getTemplateMarketItemList, {
|
||||||
|
manual: false
|
||||||
|
});
|
||||||
|
const filterTemplates = useMemo(() => {
|
||||||
|
return templateList.filter((item) => item.type === type).slice(0, 3);
|
||||||
|
}, [templateList, type]);
|
||||||
|
|
||||||
const { register, setValue, watch, handleSubmit } = useForm<FormType>({
|
const { register, setValue, watch, handleSubmit } = useForm<FormType>({
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
avatar: typeData.avatar,
|
avatar: typeData.avatar,
|
||||||
name: '',
|
name: ''
|
||||||
templateId: typeData.templates[0].id
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const avatar = watch('avatar');
|
const avatar = watch('avatar');
|
||||||
const templateId = watch('templateId');
|
|
||||||
|
|
||||||
const { File, onOpen: onOpenSelectFile } = useSelectFile({
|
const { File, onOpen: onOpenSelectFile } = useSelectFile({
|
||||||
fileType: '.jpg,.png',
|
fileType: '.jpg,.png',
|
||||||
@ -105,21 +111,33 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
|
|||||||
[setValue, t, toast]
|
[setValue, t, toast]
|
||||||
);
|
);
|
||||||
|
|
||||||
const { mutate: onclickCreate, isLoading: creating } = useRequest({
|
const { runAsync: onclickCreate, loading: isCreating } = useRequest2(
|
||||||
mutationFn: async (data: FormType) => {
|
async (data: FormType, templateId?: string) => {
|
||||||
const template = typeData.templates.find((item) => item.id === data.templateId);
|
if (!templateId) {
|
||||||
if (!template) {
|
|
||||||
return Promise.reject(t('common:core.dataset.error.Template does not exist'));
|
|
||||||
}
|
|
||||||
return postCreateApp({
|
return postCreateApp({
|
||||||
parentId,
|
parentId,
|
||||||
avatar: data.avatar || template.avatar,
|
avatar: data.avatar,
|
||||||
name: data.name,
|
name: data.name,
|
||||||
type: template.type,
|
type,
|
||||||
modules: template.modules || [],
|
modules: emptyTemplates[type].nodes,
|
||||||
edges: template.edges || []
|
edges: emptyTemplates[type].edges,
|
||||||
|
chatConfig: emptyTemplates[type].chatConfig
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const templateDetail = await getTemplateMarketItemDetail({ templateId: templateId });
|
||||||
|
|
||||||
|
return postCreateApp({
|
||||||
|
parentId,
|
||||||
|
avatar: data.avatar || templateDetail.avatar,
|
||||||
|
name: data.name,
|
||||||
|
type: templateDetail.type,
|
||||||
|
modules: templateDetail.workflow.nodes || [],
|
||||||
|
edges: templateDetail.workflow.edges || [],
|
||||||
|
chatConfig: templateDetail.workflow.chatConfig
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
{
|
||||||
onSuccess(id: string) {
|
onSuccess(id: string) {
|
||||||
router.push(`/app/detail?appId=${id}`);
|
router.push(`/app/detail?appId=${id}`);
|
||||||
loadMyApps();
|
loadMyApps();
|
||||||
@ -127,7 +145,8 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
|
|||||||
},
|
},
|
||||||
successToast: t('common:common.Create Success'),
|
successToast: t('common:common.Create Success'),
|
||||||
errorToast: t('common:common.Create Failed')
|
errorToast: t('common:common.Create Failed')
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MyModal
|
<MyModal
|
||||||
@ -136,8 +155,10 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
|
|||||||
isOpen
|
isOpen
|
||||||
onClose={onClose}
|
onClose={onClose}
|
||||||
isCentered={!isPc}
|
isCentered={!isPc}
|
||||||
|
maxW={['90vw', '40rem']}
|
||||||
|
isLoading={isCreating}
|
||||||
>
|
>
|
||||||
<ModalBody>
|
<ModalBody px={9} pb={8}>
|
||||||
<Box color={'myGray.800'} fontWeight={'bold'}>
|
<Box color={'myGray.800'} fontWeight={'bold'}>
|
||||||
{t('common:common.Set Name')}
|
{t('common:common.Set Name')}
|
||||||
</Box>
|
</Box>
|
||||||
@ -146,8 +167,8 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
|
|||||||
<Avatar
|
<Avatar
|
||||||
flexShrink={0}
|
flexShrink={0}
|
||||||
src={avatar}
|
src={avatar}
|
||||||
w={['28px', '32px']}
|
w={['28px', '36px']}
|
||||||
h={['28px', '32px']}
|
h={['28px', '36px']}
|
||||||
cursor={'pointer'}
|
cursor={'pointer'}
|
||||||
borderRadius={'md'}
|
borderRadius={'md'}
|
||||||
onClick={onOpenSelectFile}
|
onClick={onOpenSelectFile}
|
||||||
@ -155,7 +176,7 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
|
|||||||
</MyTooltip>
|
</MyTooltip>
|
||||||
<Input
|
<Input
|
||||||
flex={1}
|
flex={1}
|
||||||
ml={4}
|
ml={3}
|
||||||
autoFocus
|
autoFocus
|
||||||
bg={'myWhite.600'}
|
bg={'myWhite.600'}
|
||||||
{...register('name', {
|
{...register('name', {
|
||||||
@ -163,59 +184,111 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
|
|||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
</Flex>
|
</Flex>
|
||||||
<Box mt={[4, 7]} mb={[0, 3]} color={'myGray.800'} fontWeight={'bold'}>
|
<Flex mt={[4, 7]} mb={[0, 3]}>
|
||||||
|
<Box color={'myGray.900'} fontWeight={'bold'} fontSize={'sm'}>
|
||||||
{t('common:core.app.Select app from template')}
|
{t('common:core.app.Select app from template')}
|
||||||
</Box>
|
</Box>
|
||||||
|
<Box flex={1} />
|
||||||
|
<Flex
|
||||||
|
onClick={() => onOpenTemplateModal(type)}
|
||||||
|
alignItems={'center'}
|
||||||
|
cursor={'pointer'}
|
||||||
|
color={'myGray.600'}
|
||||||
|
fontSize={'xs'}
|
||||||
|
_hover={{ color: 'blue.700' }}
|
||||||
|
>
|
||||||
|
{t('common:core.app.more')}
|
||||||
|
<ChevronRightIcon w={4} h={4} />
|
||||||
|
</Flex>
|
||||||
|
</Flex>
|
||||||
<Grid
|
<Grid
|
||||||
userSelect={'none'}
|
userSelect={'none'}
|
||||||
gridTemplateColumns={['repeat(1,1fr)', 'repeat(2,1fr)']}
|
gridTemplateColumns={['repeat(1,1fr)', 'repeat(2,1fr)']}
|
||||||
gridGap={[2, 4]}
|
gridGap={[2, 4]}
|
||||||
>
|
>
|
||||||
{typeData.templates.map((item) => (
|
|
||||||
<Card
|
<Card
|
||||||
key={item.id}
|
borderWidth={'1px'}
|
||||||
border={'base'}
|
|
||||||
p={3}
|
|
||||||
borderRadius={'md'}
|
borderRadius={'md'}
|
||||||
cursor={'pointer'}
|
cursor={'pointer'}
|
||||||
boxShadow={'sm'}
|
boxShadow={'3'}
|
||||||
{...(templateId === item.id
|
display={'flex'}
|
||||||
? {
|
flexDirection={'column'}
|
||||||
bg: 'primary.50',
|
alignItems={'center'}
|
||||||
borderColor: 'primary.500'
|
justifyContent={'center'}
|
||||||
}
|
color={'myGray.500'}
|
||||||
: {
|
borderColor={'myGray.200'}
|
||||||
_hover: {
|
h={'8.25rem'}
|
||||||
boxShadow: 'md'
|
_hover={{
|
||||||
}
|
color: 'primary.700',
|
||||||
})}
|
borderColor: 'primary.300'
|
||||||
onClick={() => {
|
|
||||||
setValue('templateId', item.id);
|
|
||||||
}}
|
}}
|
||||||
|
onClick={handleSubmit((data) => onclickCreate(data))}
|
||||||
|
>
|
||||||
|
<MyIcon name={'common/addLight'} w={'1.5rem'} />
|
||||||
|
<Box fontSize={'sm'} mt={2}>
|
||||||
|
{typeData.emptyCreateText}
|
||||||
|
</Box>
|
||||||
|
</Card>
|
||||||
|
{filterTemplates.map((item) => (
|
||||||
|
<Card
|
||||||
|
key={item.id}
|
||||||
|
p={4}
|
||||||
|
borderRadius={'md'}
|
||||||
|
borderWidth={'1px'}
|
||||||
|
borderColor={'myGray.200'}
|
||||||
|
boxShadow={'3'}
|
||||||
|
h={'8.25rem'}
|
||||||
|
_hover={{
|
||||||
|
borderColor: 'primary.300',
|
||||||
|
'& .buttons': {
|
||||||
|
display: 'flex'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
display={'flex'}
|
||||||
|
flexDirection={'column'}
|
||||||
>
|
>
|
||||||
<Flex alignItems={'center'}>
|
<Flex alignItems={'center'}>
|
||||||
<Avatar src={item.avatar} borderRadius={'sm'} w={'1.5rem'} />
|
<Avatar src={item.avatar} borderRadius={'sm'} w={'1.5rem'} />
|
||||||
<Box ml={3} color={'myGray.900'}>
|
<Box ml={3} color={'myGray.900'} fontWeight={500}>
|
||||||
{t(item.name as any)}
|
{t(item.name as any)}
|
||||||
</Box>
|
</Box>
|
||||||
</Flex>
|
</Flex>
|
||||||
<Box fontSize={'xs'} mt={2} color={'myGray.600'}>
|
<Box fontSize={'xs'} mt={2} color={'myGray.600'} flex={1}>
|
||||||
{t(item.intro as any)}
|
{t(item.intro as any)}
|
||||||
</Box>
|
</Box>
|
||||||
|
<Box w={'full'} fontSize={'mini'}>
|
||||||
|
<Box color={'myGray.500'}>By {item.author}</Box>
|
||||||
|
<Box
|
||||||
|
className="buttons"
|
||||||
|
display={'none'}
|
||||||
|
justifyContent={'center'}
|
||||||
|
alignItems={'center'}
|
||||||
|
position={'absolute'}
|
||||||
|
borderRadius={'lg'}
|
||||||
|
w={'full'}
|
||||||
|
h={'full'}
|
||||||
|
left={0}
|
||||||
|
right={0}
|
||||||
|
bottom={0}
|
||||||
|
height={'40px'}
|
||||||
|
bg={'white'}
|
||||||
|
zIndex={1}
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
variant={'whiteBase'}
|
||||||
|
h={'1.75rem'}
|
||||||
|
borderRadius={'xl'}
|
||||||
|
w={'40%'}
|
||||||
|
onClick={handleSubmit((data) => onclickCreate(data, item.id))}
|
||||||
|
>
|
||||||
|
{t('app:templateMarket.Use')}
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
</Card>
|
</Card>
|
||||||
))}
|
))}
|
||||||
</Grid>
|
</Grid>
|
||||||
</ModalBody>
|
</ModalBody>
|
||||||
|
|
||||||
<ModalFooter>
|
|
||||||
<Button variant={'whiteBase'} mr={3} onClick={onClose}>
|
|
||||||
{t('common:common.Close')}
|
|
||||||
</Button>
|
|
||||||
<Button px={6} isLoading={creating} onClick={handleSubmit((data) => onclickCreate(data))}>
|
|
||||||
{t('common:common.Confirm Create')}
|
|
||||||
</Button>
|
|
||||||
</ModalFooter>
|
|
||||||
|
|
||||||
<File onSelect={onSelectFile} />
|
<File onSelect={onSelectFile} />
|
||||||
</MyModal>
|
</MyModal>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -0,0 +1,452 @@
|
|||||||
|
import {
|
||||||
|
Box,
|
||||||
|
Button,
|
||||||
|
Flex,
|
||||||
|
Grid,
|
||||||
|
HStack,
|
||||||
|
Modal,
|
||||||
|
ModalBody,
|
||||||
|
ModalCloseButton,
|
||||||
|
ModalContent,
|
||||||
|
ModalHeader,
|
||||||
|
ModalOverlay
|
||||||
|
} from '@chakra-ui/react';
|
||||||
|
import Avatar from '@fastgpt/web/components/common/Avatar';
|
||||||
|
import { useCallback, useState } from 'react';
|
||||||
|
import MyBox from '@fastgpt/web/components/common/MyBox';
|
||||||
|
import AppTypeTag from './TypeTag';
|
||||||
|
import { AppTemplateTypeEnum, AppTypeEnum } from '@fastgpt/global/core/app/constants';
|
||||||
|
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
|
||||||
|
import {
|
||||||
|
getTemplateMarketItemDetail,
|
||||||
|
getTemplateMarketItemList
|
||||||
|
} from '@/web/core/app/api/template';
|
||||||
|
import { TemplateMarketListItemType } from '@fastgpt/global/core/workflow/type';
|
||||||
|
import { postCreateApp } from '@/web/core/app/api';
|
||||||
|
import { useContextSelector } from 'use-context-selector';
|
||||||
|
import { AppListContext } from './context';
|
||||||
|
import { useRouter } from 'next/router';
|
||||||
|
import MySelect from '@fastgpt/web/components/common/MySelect';
|
||||||
|
import { useTranslation } from 'next-i18next';
|
||||||
|
import { useSystem } from '@fastgpt/web/hooks/useSystem';
|
||||||
|
import EmptyTip from '@fastgpt/web/components/common/EmptyTip';
|
||||||
|
import SearchInput from '../../../../../../../packages/web/components/common/Input/SearchInput/index';
|
||||||
|
import MyIcon from '@fastgpt/web/components/common/Icon';
|
||||||
|
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
||||||
|
|
||||||
|
type TemplateAppType = AppTypeEnum | 'all';
|
||||||
|
|
||||||
|
const TemplateMarketModal = ({
|
||||||
|
defaultType = 'all',
|
||||||
|
onClose
|
||||||
|
}: {
|
||||||
|
defaultType?: TemplateAppType;
|
||||||
|
onClose: () => void;
|
||||||
|
}) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { feConfigs } = useSystemStore();
|
||||||
|
const templateTags = [
|
||||||
|
{
|
||||||
|
id: AppTemplateTypeEnum.recommendation,
|
||||||
|
label: t('app:templateMarket.templateTags.Recommendation')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: AppTemplateTypeEnum.writing,
|
||||||
|
label: t('app:templateMarket.templateTags.Writing')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: AppTemplateTypeEnum.imageGeneration,
|
||||||
|
label: t('app:templateMarket.templateTags.Image_generation')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: AppTemplateTypeEnum.webSearch,
|
||||||
|
label: t('app:templateMarket.templateTags.Web_search')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: AppTemplateTypeEnum.roleplay,
|
||||||
|
label: t('app:templateMarket.templateTags.Roleplay')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: AppTemplateTypeEnum.officeServices,
|
||||||
|
label: t('app:templateMarket.templateTags.Office_services')
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const { parentId } = useContextSelector(AppListContext, (v) => v);
|
||||||
|
const router = useRouter();
|
||||||
|
const { isPc } = useSystem();
|
||||||
|
|
||||||
|
const [currentTag, setCurrentTag] = useState(templateTags[0].id);
|
||||||
|
const [currentAppType, setCurrentAppType] = useState<TemplateAppType>(defaultType);
|
||||||
|
const [currentSearch, setCurrentSearch] = useState('');
|
||||||
|
|
||||||
|
const { data: templateList = [], loading: isLoadingTemplates } = useRequest2(
|
||||||
|
getTemplateMarketItemList,
|
||||||
|
{
|
||||||
|
manual: false
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const { runAsync: onUseTemplate, loading: isCreating } = useRequest2(
|
||||||
|
async (id: string) => {
|
||||||
|
const templateDetail = await getTemplateMarketItemDetail({ templateId: id });
|
||||||
|
return postCreateApp({
|
||||||
|
parentId,
|
||||||
|
avatar: templateDetail.avatar,
|
||||||
|
name: templateDetail.name,
|
||||||
|
type: templateDetail.type,
|
||||||
|
modules: templateDetail.workflow.nodes || [],
|
||||||
|
edges: templateDetail.workflow.edges || [],
|
||||||
|
chatConfig: templateDetail.workflow.chatConfig
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
onSuccess(id: string) {
|
||||||
|
onClose();
|
||||||
|
router.push(`/app/detail?appId=${id}`);
|
||||||
|
},
|
||||||
|
successToast: t('common:common.Create Success'),
|
||||||
|
errorToast: t('common:common.Create Failed')
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const { run: handleScroll } = useRequest2(
|
||||||
|
async () => {
|
||||||
|
let firstVisibleTitle: any = null;
|
||||||
|
|
||||||
|
templateTags
|
||||||
|
.map((type) => type.id)
|
||||||
|
.forEach((type: string) => {
|
||||||
|
const element = document.getElementById(type);
|
||||||
|
if (!element) return;
|
||||||
|
|
||||||
|
const elementRect = element.getBoundingClientRect();
|
||||||
|
if (elementRect.top <= window.innerHeight && elementRect.bottom >= 0) {
|
||||||
|
if (
|
||||||
|
!firstVisibleTitle ||
|
||||||
|
elementRect.top < firstVisibleTitle.getBoundingClientRect().top
|
||||||
|
) {
|
||||||
|
firstVisibleTitle = element;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (firstVisibleTitle) {
|
||||||
|
setCurrentTag(firstVisibleTitle.id);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
throttleWait: 100
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const TemplateCard = useCallback(
|
||||||
|
({ item }: { item: TemplateMarketListItemType }) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MyBox
|
||||||
|
key={item.id}
|
||||||
|
lineHeight={1.5}
|
||||||
|
h="100%"
|
||||||
|
pt={4}
|
||||||
|
pb={3}
|
||||||
|
px={4}
|
||||||
|
border={'base'}
|
||||||
|
boxShadow={'2'}
|
||||||
|
bg={'white'}
|
||||||
|
borderRadius={'10px'}
|
||||||
|
position={'relative'}
|
||||||
|
display={'flex'}
|
||||||
|
flexDirection={'column'}
|
||||||
|
_hover={{
|
||||||
|
borderColor: 'primary.300',
|
||||||
|
boxShadow: '1.5',
|
||||||
|
'& .buttons': {
|
||||||
|
display: 'flex'
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<HStack>
|
||||||
|
<Avatar src={item.avatar} borderRadius={'sm'} w={'1.5rem'} h={'1.5rem'} />
|
||||||
|
<Box flex={'1 0 0'} color={'myGray.900'} fontWeight={500}>
|
||||||
|
{item.name}
|
||||||
|
</Box>
|
||||||
|
<Box mr={'-1rem'}>
|
||||||
|
<AppTypeTag type={item.type} />
|
||||||
|
</Box>
|
||||||
|
</HStack>
|
||||||
|
<Box
|
||||||
|
flex={['1 0 48px', '1 0 56px']}
|
||||||
|
mt={3}
|
||||||
|
pr={8}
|
||||||
|
textAlign={'justify'}
|
||||||
|
wordBreak={'break-all'}
|
||||||
|
fontSize={'xs'}
|
||||||
|
color={'myGray.500'}
|
||||||
|
>
|
||||||
|
<Box className={'textEllipsis2'}>{item.intro || t('app:templateMarket.no_intro')}</Box>
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
<Box w={'full'} fontSize={'mini'}>
|
||||||
|
<Box color={'myGray.500'}>By {item.author}</Box>
|
||||||
|
<Box
|
||||||
|
className="buttons"
|
||||||
|
display={'none'}
|
||||||
|
justifyContent={'center'}
|
||||||
|
alignItems={'center'}
|
||||||
|
position={'absolute'}
|
||||||
|
borderRadius={'lg'}
|
||||||
|
w={'full'}
|
||||||
|
h={'full'}
|
||||||
|
left={0}
|
||||||
|
right={0}
|
||||||
|
bottom={0}
|
||||||
|
height={'40px'}
|
||||||
|
bg={'white'}
|
||||||
|
zIndex={1}
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
variant={'whiteBase'}
|
||||||
|
h={'1.75rem'}
|
||||||
|
borderRadius={'xl'}
|
||||||
|
w={'40%'}
|
||||||
|
onClick={() => onUseTemplate(item.id)}
|
||||||
|
>
|
||||||
|
{t('app:templateMarket.Use')}
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
</MyBox>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
[onUseTemplate]
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
isOpen={true}
|
||||||
|
onClose={() => onClose && onClose()}
|
||||||
|
autoFocus={false}
|
||||||
|
blockScrollOnMount={false}
|
||||||
|
closeOnOverlayClick={false}
|
||||||
|
isCentered
|
||||||
|
>
|
||||||
|
<ModalOverlay />
|
||||||
|
<ModalContent
|
||||||
|
w={['90vw', '80vw']}
|
||||||
|
maxW={'90vw'}
|
||||||
|
position={'relative'}
|
||||||
|
h={['90vh']}
|
||||||
|
boxShadow={'7'}
|
||||||
|
overflow={'hidden'}
|
||||||
|
>
|
||||||
|
<ModalHeader
|
||||||
|
display={'flex'}
|
||||||
|
alignItems={'center'}
|
||||||
|
py={'10px'}
|
||||||
|
fontSize={'md'}
|
||||||
|
fontWeight={'600'}
|
||||||
|
gap={2}
|
||||||
|
position={'relative'}
|
||||||
|
>
|
||||||
|
<Avatar src={'/imgs/app/templateFill.svg'} w={'2rem'} objectFit={'fill'} />
|
||||||
|
<Box color={'myGray.900'}>{t('app:templateMarket.Template_market')}</Box>
|
||||||
|
|
||||||
|
<Box flex={'1'} />
|
||||||
|
|
||||||
|
<MySelect
|
||||||
|
h={'8'}
|
||||||
|
value={currentAppType}
|
||||||
|
onchange={(value) => {
|
||||||
|
setCurrentAppType(value as AppTypeEnum | 'all');
|
||||||
|
}}
|
||||||
|
bg={'myGray.100'}
|
||||||
|
minW={'7rem'}
|
||||||
|
borderRadius={'sm'}
|
||||||
|
list={[
|
||||||
|
{ label: t('app:type.All'), value: 'all' },
|
||||||
|
{ label: t('app:type.Simple bot'), value: AppTypeEnum.simple },
|
||||||
|
{ label: t('app:type.Workflow bot'), value: AppTypeEnum.workflow },
|
||||||
|
{ label: t('app:type.Plugin'), value: AppTypeEnum.plugin }
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<ModalCloseButton position={'relative'} fontSize={'xs'} top={0} right={0} />
|
||||||
|
|
||||||
|
{isPc && (
|
||||||
|
<Box
|
||||||
|
width="15rem"
|
||||||
|
position={'absolute'}
|
||||||
|
top={'50%'}
|
||||||
|
left={'50%'}
|
||||||
|
transform={'translate(-50%,-50%)'}
|
||||||
|
>
|
||||||
|
<SearchInput
|
||||||
|
pl={7}
|
||||||
|
placeholder={t('app:templateMarket.Search_template')}
|
||||||
|
value={currentSearch}
|
||||||
|
onChange={(e) => setCurrentSearch(e.target.value)}
|
||||||
|
h={8}
|
||||||
|
bg={'myGray.50'}
|
||||||
|
maxLength={20}
|
||||||
|
borderRadius={'sm'}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
</ModalHeader>
|
||||||
|
<MyBox isLoading={isCreating || isLoadingTemplates} flex={'1 0 0'} overflow={'overlay'}>
|
||||||
|
<ModalBody
|
||||||
|
h={'100%'}
|
||||||
|
display={'flex'}
|
||||||
|
bg={'myGray.100'}
|
||||||
|
overflow={'auto'}
|
||||||
|
gap={5}
|
||||||
|
onScroll={handleScroll}
|
||||||
|
px={0}
|
||||||
|
pt={5}
|
||||||
|
>
|
||||||
|
{isPc && (
|
||||||
|
<Flex pl={5} flexDirection={'column'} gap={3}>
|
||||||
|
{templateTags.map((item) => {
|
||||||
|
return (
|
||||||
|
<Box
|
||||||
|
key={item.id}
|
||||||
|
cursor={'pointer'}
|
||||||
|
{...(item.id === currentTag && !currentSearch
|
||||||
|
? {
|
||||||
|
bg: 'primary.1',
|
||||||
|
color: 'primary.600'
|
||||||
|
}
|
||||||
|
: {
|
||||||
|
_hover: { bg: 'primary.1' },
|
||||||
|
color: 'myGray.600'
|
||||||
|
})}
|
||||||
|
w={'9.5rem'}
|
||||||
|
px={4}
|
||||||
|
py={2}
|
||||||
|
rounded={'sm'}
|
||||||
|
fontSize={'sm'}
|
||||||
|
fontWeight={500}
|
||||||
|
onClick={() => {
|
||||||
|
setCurrentTag(item.id);
|
||||||
|
const anchor = document.getElementById(item.id);
|
||||||
|
if (anchor) {
|
||||||
|
anchor.scrollIntoView({ behavior: 'auto', block: 'start' });
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
<Box flex={1} />
|
||||||
|
|
||||||
|
{feConfigs?.appTemplateCourse && (
|
||||||
|
<Flex
|
||||||
|
alignItems={'center'}
|
||||||
|
cursor={'pointer'}
|
||||||
|
_hover={{
|
||||||
|
color: 'primary.600'
|
||||||
|
}}
|
||||||
|
py={2}
|
||||||
|
fontWeight={500}
|
||||||
|
rounded={'sm'}
|
||||||
|
fontSize={'sm'}
|
||||||
|
onClick={() => window.open(feConfigs.appTemplateCourse)}
|
||||||
|
gap={1}
|
||||||
|
>
|
||||||
|
<MyIcon name={'common/upRightArrowLight'} w={'1rem'} />
|
||||||
|
<Box>{t('common:contribute_app_template')}</Box>
|
||||||
|
</Flex>
|
||||||
|
)}
|
||||||
|
</Flex>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<Box pl={[3, 0]} pr={[3, 5]} pt={1} flex={'1'} h={'100%'} overflow={'auto'}>
|
||||||
|
{currentSearch ? (
|
||||||
|
<>
|
||||||
|
<Box fontSize={'lg'} color={'myGray.900'} mb={4}>
|
||||||
|
{t('common:xx_search_result', { key: currentSearch })}
|
||||||
|
</Box>
|
||||||
|
{(() => {
|
||||||
|
const templates = templateList.filter((template) =>
|
||||||
|
`${template.name}${template.intro}`.includes(currentSearch)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (templates.length > 0) {
|
||||||
|
return (
|
||||||
|
<Grid
|
||||||
|
gridTemplateColumns={[
|
||||||
|
'1fr',
|
||||||
|
'repeat(2,1fr)',
|
||||||
|
'repeat(3,1fr)',
|
||||||
|
'repeat(3,1fr)',
|
||||||
|
'repeat(4,1fr)'
|
||||||
|
]}
|
||||||
|
gridGap={4}
|
||||||
|
alignItems={'stretch'}
|
||||||
|
pb={5}
|
||||||
|
>
|
||||||
|
{templates.map((item) => (
|
||||||
|
<TemplateCard key={item.id} item={item} />
|
||||||
|
))}
|
||||||
|
</Grid>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return <EmptyTip text={t('app:template_market_empty_data')} />;
|
||||||
|
})()}
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
{templateTags.map((item) => {
|
||||||
|
const currentTemplates = templateList
|
||||||
|
?.filter((template) => template.tags.includes(item.id))
|
||||||
|
.filter((template) => {
|
||||||
|
if (currentAppType === 'all') return true;
|
||||||
|
return template.type === currentAppType;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (currentTemplates.length === 0) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box key={item.id}>
|
||||||
|
<Box
|
||||||
|
id={item.id}
|
||||||
|
fontSize={['md', 'lg']}
|
||||||
|
color={'myGray.900'}
|
||||||
|
mb={4}
|
||||||
|
fontWeight={500}
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</Box>
|
||||||
|
<Grid
|
||||||
|
gridTemplateColumns={[
|
||||||
|
'1fr',
|
||||||
|
'repeat(2,1fr)',
|
||||||
|
'repeat(3,1fr)',
|
||||||
|
'repeat(3,1fr)',
|
||||||
|
'repeat(4,1fr)'
|
||||||
|
]}
|
||||||
|
gridGap={4}
|
||||||
|
alignItems={'stretch'}
|
||||||
|
pb={5}
|
||||||
|
>
|
||||||
|
{currentTemplates.map((item) => (
|
||||||
|
<TemplateCard key={item.id} item={item} />
|
||||||
|
))}
|
||||||
|
</Grid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Box>
|
||||||
|
</ModalBody>
|
||||||
|
</MyBox>
|
||||||
|
</ModalContent>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default TemplateMarketModal;
|
||||||
@ -45,7 +45,7 @@ const AppTypeTag = ({ type }: { type: AppTypeEnum }) => {
|
|||||||
py={0.5}
|
py={0.5}
|
||||||
pl={2}
|
pl={2}
|
||||||
pr={3}
|
pr={3}
|
||||||
borderLeftRadius={'md'}
|
borderLeftRadius={'sm'}
|
||||||
whiteSpace={'nowrap'}
|
whiteSpace={'nowrap'}
|
||||||
>
|
>
|
||||||
<MyIcon name={data.icon as any} w={'0.8rem'} color={'myGray.500'} />
|
<MyIcon name={data.icon as any} w={'0.8rem'} color={'myGray.500'} />
|
||||||
|
|||||||
@ -42,6 +42,7 @@ import MyBox from '@fastgpt/web/components/common/MyBox';
|
|||||||
import LightRowTabs from '@fastgpt/web/components/common/Tabs/LightRowTabs';
|
import LightRowTabs from '@fastgpt/web/components/common/Tabs/LightRowTabs';
|
||||||
import { useSystem } from '@fastgpt/web/hooks/useSystem';
|
import { useSystem } from '@fastgpt/web/hooks/useSystem';
|
||||||
import MyIcon from '@fastgpt/web/components/common/Icon';
|
import MyIcon from '@fastgpt/web/components/common/Icon';
|
||||||
|
import TemplateMarketModal from './components/TemplateMarketModal';
|
||||||
|
|
||||||
const CreateModal = dynamic(() => import('./components/CreateModal'));
|
const CreateModal = dynamic(() => import('./components/CreateModal'));
|
||||||
const EditFolderModal = dynamic(
|
const EditFolderModal = dynamic(
|
||||||
@ -77,6 +78,7 @@ const MyApps = () => {
|
|||||||
onClose: onCloseCreateHttpPlugin
|
onClose: onCloseCreateHttpPlugin
|
||||||
} = useDisclosure();
|
} = useDisclosure();
|
||||||
const [editFolder, setEditFolder] = useState<EditFolderFormType>();
|
const [editFolder, setEditFolder] = useState<EditFolderFormType>();
|
||||||
|
const [templateModalType, setTemplateModalType] = useState<AppTypeEnum | 'all'>();
|
||||||
|
|
||||||
const { runAsync: onCreateFolder } = useRequest2(postCreateAppFolder, {
|
const { runAsync: onCreateFolder } = useRequest2(postCreateAppFolder, {
|
||||||
onSuccess() {
|
onSuccess() {
|
||||||
@ -145,19 +147,19 @@ const MyApps = () => {
|
|||||||
<LightRowTabs
|
<LightRowTabs
|
||||||
list={[
|
list={[
|
||||||
{
|
{
|
||||||
label: appT('type.All'),
|
label: t('app:type.All'),
|
||||||
value: 'ALL'
|
value: 'ALL'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: appT('type.Simple bot'),
|
label: t('app:type.Simple bot'),
|
||||||
value: AppTypeEnum.simple
|
value: AppTypeEnum.simple
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: appT('type.Workflow bot'),
|
label: t('app:type.Workflow bot'),
|
||||||
value: AppTypeEnum.workflow
|
value: AppTypeEnum.workflow
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: appT('type.Plugin'),
|
label: t('app:type.Plugin'),
|
||||||
value: AppTypeEnum.plugin
|
value: AppTypeEnum.plugin
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
@ -195,30 +197,40 @@ const MyApps = () => {
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
icon: 'core/app/simpleBot',
|
icon: 'core/app/simpleBot',
|
||||||
label: appT('type.Simple bot'),
|
label: t('app:type.Simple bot'),
|
||||||
description: appT('type.Create simple bot tip'),
|
description: t('app:type.Create simple bot tip'),
|
||||||
onClick: () => setCreateAppType(AppTypeEnum.simple)
|
onClick: () => setCreateAppType(AppTypeEnum.simple)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'core/app/type/workflowFill',
|
icon: 'core/app/type/workflowFill',
|
||||||
label: appT('type.Workflow bot'),
|
label: t('app:type.Workflow bot'),
|
||||||
description: appT('type.Create workflow tip'),
|
description: t('app:type.Create workflow tip'),
|
||||||
onClick: () => setCreateAppType(AppTypeEnum.workflow)
|
onClick: () => setCreateAppType(AppTypeEnum.workflow)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'core/app/type/pluginFill',
|
icon: 'core/app/type/pluginFill',
|
||||||
label: appT('type.Plugin'),
|
label: t('app:type.Plugin'),
|
||||||
description: appT('type.Create one plugin tip'),
|
description: t('app:type.Create one plugin tip'),
|
||||||
onClick: () => setCreateAppType(AppTypeEnum.plugin)
|
onClick: () => setCreateAppType(AppTypeEnum.plugin)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: 'core/app/type/httpPluginFill',
|
icon: 'core/app/type/httpPluginFill',
|
||||||
label: appT('type.Http plugin'),
|
label: t('app:type.Http plugin'),
|
||||||
description: appT('type.Create http plugin tip'),
|
description: t('app:type.Create http plugin tip'),
|
||||||
onClick: onOpenCreateHttpPlugin
|
onClick: onOpenCreateHttpPlugin
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
icon: '/imgs/app/templateFill.svg',
|
||||||
|
label: t('app:template_market'),
|
||||||
|
description: t('app:template_market_description'),
|
||||||
|
onClick: () => setTemplateModalType('all')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
@ -306,9 +318,19 @@ const MyApps = () => {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{!!createAppType && (
|
{!!createAppType && (
|
||||||
<CreateModal type={createAppType} onClose={() => setCreateAppType(undefined)} />
|
<CreateModal
|
||||||
|
type={createAppType}
|
||||||
|
onClose={() => setCreateAppType(undefined)}
|
||||||
|
onOpenTemplateModal={setTemplateModalType}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
{isOpenCreateHttpPlugin && <HttpEditModal onClose={onCloseCreateHttpPlugin} />}
|
{isOpenCreateHttpPlugin && <HttpEditModal onClose={onCloseCreateHttpPlugin} />}
|
||||||
|
{!!templateModalType && (
|
||||||
|
<TemplateMarketModal
|
||||||
|
onClose={() => setTemplateModalType(undefined)}
|
||||||
|
defaultType={templateModalType}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -7,9 +7,10 @@ import { useSendCode } from '@/web/support/user/hooks/useSendCode';
|
|||||||
import type { ResLogin } from '@/global/support/api/userRes';
|
import type { ResLogin } from '@/global/support/api/userRes';
|
||||||
import { useToast } from '@fastgpt/web/hooks/useToast';
|
import { useToast } from '@fastgpt/web/hooks/useToast';
|
||||||
import { postCreateApp } from '@/web/core/app/api';
|
import { postCreateApp } from '@/web/core/app/api';
|
||||||
import { defaultAppTemplates } from '@/web/core/app/templates';
|
import { emptyTemplates } from '@/web/core/app/templates';
|
||||||
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
||||||
import { useTranslation } from 'next-i18next';
|
import { useTranslation } from 'next-i18next';
|
||||||
|
import { AppTypeEnum } from '@fastgpt/global/core/app/constants';
|
||||||
interface Props {
|
interface Props {
|
||||||
loginSuccess: (e: ResLogin) => void;
|
loginSuccess: (e: ResLogin) => void;
|
||||||
setPageType: Dispatch<`${LoginPageTypeEnum}`>;
|
setPageType: Dispatch<`${LoginPageTypeEnum}`>;
|
||||||
@ -68,13 +69,13 @@ const RegisterForm = ({ setPageType, loginSuccess }: Props) => {
|
|||||||
});
|
});
|
||||||
// auto register template app
|
// auto register template app
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
defaultAppTemplates.forEach((template) => {
|
Object.entries(emptyTemplates).map(([type, emptyTemplate]) => {
|
||||||
postCreateApp({
|
postCreateApp({
|
||||||
avatar: template.avatar,
|
avatar: emptyTemplate.avatar,
|
||||||
name: t(template.name as any),
|
name: t(emptyTemplate.name as any),
|
||||||
modules: template.modules,
|
modules: emptyTemplate.nodes,
|
||||||
edges: template.edges,
|
edges: emptyTemplate.edges,
|
||||||
type: template.type
|
type: type as AppTypeEnum
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}, 100);
|
}, 100);
|
||||||
|
|||||||
@ -62,6 +62,8 @@ const defaultFeConfigs: FastGPTFeConfigsType = {
|
|||||||
docUrl: 'https://doc.fastgpt.in',
|
docUrl: 'https://doc.fastgpt.in',
|
||||||
openAPIDocUrl: 'https://doc.fastgpt.in/docs/development/openapi',
|
openAPIDocUrl: 'https://doc.fastgpt.in/docs/development/openapi',
|
||||||
systemPluginCourseUrl: 'https://fael3z0zfze.feishu.cn/wiki/ERZnw9R26iRRG0kXZRec6WL9nwh',
|
systemPluginCourseUrl: 'https://fael3z0zfze.feishu.cn/wiki/ERZnw9R26iRRG0kXZRec6WL9nwh',
|
||||||
|
appTemplateCourse:
|
||||||
|
'https://fael3z0zfze.feishu.cn/wiki/CX9wwMGyEi5TL6koiLYcg7U0nWb?fromScene=spaceOverview',
|
||||||
systemTitle: 'FastGPT',
|
systemTitle: 'FastGPT',
|
||||||
concatMd:
|
concatMd:
|
||||||
'项目开源地址: [FastGPT GitHub](https://github.com/labring/FastGPT)\n交流群: ',
|
'项目开源地址: [FastGPT GitHub](https://github.com/labring/FastGPT)\n交流群: ',
|
||||||
|
|||||||
48
projects/app/src/service/core/app/template.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import { isProduction } from '@fastgpt/service/common/system/constants';
|
||||||
|
import { readdirSync, readFileSync } from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
// Get template from memory or file system
|
||||||
|
const loadTemplateMarketItems = async () => {
|
||||||
|
if (isProduction && global.appMarketTemplates) return global.appMarketTemplates;
|
||||||
|
|
||||||
|
const templatesDir = path.join(process.cwd(), 'public', 'appMarketTemplates');
|
||||||
|
const templateNames = readdirSync(templatesDir);
|
||||||
|
|
||||||
|
global.appMarketTemplates = templateNames.map((name) => {
|
||||||
|
try {
|
||||||
|
const filePath = path.join(templatesDir, name, 'template.json');
|
||||||
|
const fileContent = readFileSync(filePath, 'utf-8');
|
||||||
|
const data = JSON.parse(fileContent);
|
||||||
|
return {
|
||||||
|
id: name,
|
||||||
|
...data
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error fetching template ${name}:`, error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
global.appMarketTemplates.sort((a, b) => (b.weight ?? 0) - (a.weight ?? 0));
|
||||||
|
|
||||||
|
return global.appMarketTemplates;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getTemplateMarketItemDetail = async (id: string) => {
|
||||||
|
const templateMarketItems = await loadTemplateMarketItems();
|
||||||
|
return templateMarketItems.find((item) => item.id === id);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getTemplateMarketItemList = async () => {
|
||||||
|
const templateMarketItems = await loadTemplateMarketItems();
|
||||||
|
return templateMarketItems.map((item) => ({
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
avatar: item.avatar,
|
||||||
|
intro: item.intro,
|
||||||
|
author: item.author,
|
||||||
|
tags: item.tags,
|
||||||
|
type: item.type
|
||||||
|
}));
|
||||||
|
};
|
||||||
11
projects/app/src/web/core/app/api/template.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { GET } from '@/web/common/api/request';
|
||||||
|
import {
|
||||||
|
TemplateMarketItemType,
|
||||||
|
TemplateMarketListItemType
|
||||||
|
} from '@fastgpt/global/core/workflow/type';
|
||||||
|
|
||||||
|
export const getTemplateMarketItemList = () =>
|
||||||
|
GET<TemplateMarketListItemType[]>('/core/app/template/list');
|
||||||
|
|
||||||
|
export const getTemplateMarketItemDetail = (data: { templateId: string }) =>
|
||||||
|
GET<TemplateMarketItemType>(`/core/app/template/detail`, data);
|
||||||