fix: null pointer (#3130)

* fix: null pointer

* perf: not input text

* update doc url
This commit is contained in:
Archer
2024-11-12 18:13:21 +08:00
committed by archer
parent dc8aeefa2a
commit 211061d122
29 changed files with 80 additions and 44 deletions

View File

@@ -17,7 +17,6 @@ import {
Input_Template_History, Input_Template_History,
Input_Template_System_Prompt, Input_Template_System_Prompt,
Input_Template_UserChatInput, Input_Template_UserChatInput,
Input_Template_Text_Quote,
Input_Template_File_Link_Prompt Input_Template_File_Link_Prompt
} from '../../input'; } from '../../input';
import { chatNodeSystemPromptTip, systemPromptTip } from '../../tip'; import { chatNodeSystemPromptTip, systemPromptTip } from '../../tip';
@@ -55,7 +54,7 @@ export const AiChatModule: FlowNodeTemplateType = {
intro: i18nT('workflow:template.ai_chat_intro'), intro: i18nT('workflow:template.ai_chat_intro'),
showStatus: true, showStatus: true,
isTool: true, isTool: true,
courseUrl: '/docs/workflow/modules/ai_chat/', courseUrl: '/docs/guide/workbench/workflow/ai_chat/',
version: '4813', version: '4813',
inputs: [ inputs: [
Input_Template_SettingAiModel, Input_Template_SettingAiModel,

View File

@@ -17,7 +17,7 @@ export const AssignedAnswerModule: FlowNodeTemplateType = {
avatar: 'core/workflow/template/reply', avatar: 'core/workflow/template/reply',
name: i18nT('workflow:assigned_reply'), name: i18nT('workflow:assigned_reply'),
intro: i18nT('workflow:intro_assigned_reply'), intro: i18nT('workflow:intro_assigned_reply'),
courseUrl: '/docs/workflow/modules/reply/', courseUrl: '/docs/guide/workbench/workflow/reply/',
version: '481', version: '481',
isTool: true, isTool: true,
inputs: [ inputs: [

View File

@@ -31,7 +31,7 @@ export const ClassifyQuestionModule: FlowNodeTemplateType = {
intro: i18nT('workflow:intro_question_classification'), intro: i18nT('workflow:intro_question_classification'),
showStatus: true, showStatus: true,
version: '481', version: '481',
courseUrl: '/docs/workflow/modules/question_classify/', courseUrl: '/docs/guide/workbench/workflow/question_classify/',
inputs: [ inputs: [
{ {
...Input_Template_SelectAIModel, ...Input_Template_SelectAIModel,

View File

@@ -26,7 +26,7 @@ export const ContextExtractModule: FlowNodeTemplateType = {
intro: i18nT('workflow:intro_text_content_extraction'), intro: i18nT('workflow:intro_text_content_extraction'),
showStatus: true, showStatus: true,
isTool: true, isTool: true,
courseUrl: '/docs/workflow/modules/content_extract/', courseUrl: '/docs/guide/workbench/workflow/content_extract/',
version: '481', version: '481',
inputs: [ inputs: [
{ {

View File

@@ -17,7 +17,7 @@ export const CustomFeedbackNode: FlowNodeTemplateType = {
avatar: 'core/workflow/template/customFeedback', avatar: 'core/workflow/template/customFeedback',
name: i18nT('workflow:custom_feedback'), name: i18nT('workflow:custom_feedback'),
intro: i18nT('workflow:intro_custom_feedback'), intro: i18nT('workflow:intro_custom_feedback'),
courseUrl: '/docs/workflow/modules/custom_feedback/', courseUrl: '/docs/guide/workbench/workflow/custom_feedback/',
version: '486', version: '486',
inputs: [ inputs: [
{ {

View File

@@ -43,6 +43,7 @@ export const DatasetConcatModule: FlowNodeTemplateType = {
showStatus: false, showStatus: false,
version: '486', version: '486',
courseUrl: '/docs/guide/workbench/workflow/knowledge_base_search_merge/',
inputs: [ inputs: [
{ {
key: NodeInputKeyEnum.datasetMaxTokens, key: NodeInputKeyEnum.datasetMaxTokens,

View File

@@ -29,7 +29,7 @@ export const DatasetSearchModule: FlowNodeTemplateType = {
intro: Dataset_SEARCH_DESC, intro: Dataset_SEARCH_DESC,
showStatus: true, showStatus: true,
isTool: true, isTool: true,
courseUrl: '/docs/workflow/modules/dataset_search/', courseUrl: '/docs/guide/workbench/workflow/dataset_search/',
version: '481', version: '481',
inputs: [ inputs: [
{ {

View File

@@ -27,7 +27,7 @@ export const HttpNode468: FlowNodeTemplateType = {
intro: i18nT('workflow:intro_http_request'), intro: i18nT('workflow:intro_http_request'),
showStatus: true, showStatus: true,
isTool: true, isTool: true,
courseUrl: '/docs/workflow/modules/http/', courseUrl: '/docs/guide/workbench/workflow/http/',
version: '481', version: '481',
inputs: [ inputs: [
{ {

View File

@@ -23,7 +23,7 @@ export const IfElseNode: FlowNodeTemplateType = {
name: i18nT('workflow:condition_checker'), name: i18nT('workflow:condition_checker'),
intro: i18nT('workflow:execute_different_branches_based_on_conditions'), intro: i18nT('workflow:execute_different_branches_based_on_conditions'),
showStatus: true, showStatus: true,
courseUrl: '/docs/workflow/modules/tfswitch/', courseUrl: '/docs/guide/workbench/workflow/tfswitch/',
version: '481', version: '481',
inputs: [ inputs: [
{ {

View File

@@ -25,6 +25,7 @@ export const UserSelectNode: FlowNodeTemplateType = {
intro: i18nT(`app:workflow.user_select_tip`), intro: i18nT(`app:workflow.user_select_tip`),
isTool: true, isTool: true,
version: '489', version: '489',
courseUrl: '/docs/guide/workbench/workflow/user-selection/',
inputs: [ inputs: [
{ {
key: NodeInputKeyEnum.description, key: NodeInputKeyEnum.description,

View File

@@ -32,7 +32,7 @@ export const LafModule: FlowNodeTemplateType = {
intro: i18nT('workflow:intro_laf_function_call'), intro: i18nT('workflow:intro_laf_function_call'),
showStatus: true, showStatus: true,
isTool: true, isTool: true,
courseUrl: '/docs/workflow/modules/laf/', courseUrl: '/docs/guide/workbench/workflow/laf/',
version: '481', version: '481',
inputs: [ inputs: [
{ {

View File

@@ -30,6 +30,7 @@ export const LoopNode: FlowNodeTemplateType = {
intro: i18nT('workflow:intro_loop'), intro: i18nT('workflow:intro_loop'),
showStatus: true, showStatus: true,
version: '4811', version: '4811',
courseUrl: '/docs/guide/workbench/workflow/loop/',
inputs: [ inputs: [
{ {
key: NodeInputKeyEnum.loopInputArray, key: NodeInputKeyEnum.loopInputArray,

View File

@@ -24,7 +24,8 @@ export const ReadFilesNode: FlowNodeTemplateType = {
intro: i18nT('app:workflow.read_files_tip'), intro: i18nT('app:workflow.read_files_tip'),
showStatus: true, showStatus: true,
version: '4812', version: '4812',
isTool: true, isTool: false,
courseUrl: '/docs/guide/course/fileinput/',
inputs: [ inputs: [
{ {
key: NodeInputKeyEnum.fileUrlList, key: NodeInputKeyEnum.fileUrlList,

View File

@@ -26,7 +26,7 @@ export const CodeNode: FlowNodeTemplateType = {
name: i18nT('workflow:code_execution'), name: i18nT('workflow:code_execution'),
intro: i18nT('workflow:execute_a_simple_script_code_usually_for_complex_data_processing'), intro: i18nT('workflow:execute_a_simple_script_code_usually_for_complex_data_processing'),
showStatus: true, showStatus: true,
courseUrl: '/docs/workflow/modules/sandbox/', courseUrl: '/docs/guide/workbench/workflow/sandbox/',
version: '482', version: '482',
inputs: [ inputs: [
{ {

View File

@@ -23,7 +23,7 @@ export const TextEditorNode: FlowNodeTemplateType = {
avatar: 'core/workflow/template/textConcat', avatar: 'core/workflow/template/textConcat',
name: i18nT('workflow:text_concatenation'), name: i18nT('workflow:text_concatenation'),
intro: i18nT('workflow:intro_text_concatenation'), intro: i18nT('workflow:intro_text_concatenation'),
courseUrl: '/docs/workflow/modules/text_editor/', courseUrl: '/docs/guide/workbench/workflow/text_editor/',
version: '4813', version: '4813',
inputs: [ inputs: [
{ {

View File

@@ -32,7 +32,7 @@ export const ToolModule: FlowNodeTemplateType = {
name: i18nT('workflow:template.tool_call'), name: i18nT('workflow:template.tool_call'),
intro: i18nT('workflow:template.tool_call_intro'), intro: i18nT('workflow:template.tool_call_intro'),
showStatus: true, showStatus: true,
courseUrl: '/docs/workflow/modules/tool/', courseUrl: '/docs/guide/workbench/workflow/tool/',
version: '4813', version: '4813',
inputs: [ inputs: [
{ {

View File

@@ -20,6 +20,7 @@ export const VariableUpdateNode: FlowNodeTemplateType = {
showStatus: false, showStatus: false,
isTool: true, isTool: true,
version: '481', version: '481',
courseUrl: '/docs/guide/workbench/workflow/variable_update/',
inputs: [ inputs: [
{ {
key: NodeInputKeyEnum.updateList, key: NodeInputKeyEnum.updateList,

View File

@@ -30,7 +30,7 @@ export const WorkflowStart: FlowNodeTemplateType = {
intro: '', intro: '',
forbidDelete: true, forbidDelete: true,
unique: true, unique: true,
courseUrl: '/docs/workflow/modules/input/', courseUrl: '/docs/guide/workbench/workflow/input/',
version: '481', version: '481',
inputs: [{ ...Input_Template_UserChatInput, toolDescription: i18nT('workflow:user_question') }], inputs: [{ ...Input_Template_UserChatInput, toolDescription: i18nT('workflow:user_question') }],
outputs: [ outputs: [

View File

@@ -101,7 +101,8 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise<
maxFiles: chatConfig?.fileSelectConfig?.maxFiles || 20, maxFiles: chatConfig?.fileSelectConfig?.maxFiles || 20,
teamId, teamId,
fileLinks, fileLinks,
inputFiles: globalFiles inputFiles: globalFiles,
hasReadFilesTool
}); });
const concatenateSystemPrompt = [ const concatenateSystemPrompt = [
@@ -184,7 +185,7 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise<
} }
const lastMessage = adaptMessages[adaptMessages.length - 1]; const lastMessage = adaptMessages[adaptMessages.length - 1];
if (typeof lastMessage.content === 'string') { if (typeof lastMessage?.content === 'string') {
lastMessage.content = replaceVariable(Prompt_Tool_Call, { lastMessage.content = replaceVariable(Prompt_Tool_Call, {
question: lastMessage.content question: lastMessage.content
}); });
@@ -271,7 +272,8 @@ const getMultiInput = async ({
requestOrigin, requestOrigin,
maxFiles, maxFiles,
teamId, teamId,
inputFiles inputFiles,
hasReadFilesTool
}: { }: {
histories: ChatItemType[]; histories: ChatItemType[];
fileLinks?: string[]; fileLinks?: string[];
@@ -279,9 +281,10 @@ const getMultiInput = async ({
maxFiles: number; maxFiles: number;
teamId: string; teamId: string;
inputFiles: UserChatItemValueItemType['file'][]; inputFiles: UserChatItemValueItemType['file'][];
hasReadFilesTool: boolean;
}) => { }) => {
// Not file quote // Not file quote
if (!fileLinks) { if (!fileLinks || hasReadFilesTool) {
return { return {
documentQuoteText: '', documentQuoteText: '',
userFiles: inputFiles userFiles: inputFiles
@@ -323,28 +326,40 @@ const toolCallMessagesAdapt = ({
}: { }: {
userInput: UserChatItemValueItemType[]; userInput: UserChatItemValueItemType[];
skip?: boolean; skip?: boolean;
}) => { }): UserChatItemValueItemType[] => {
if (skip) return userInput; if (skip) return userInput;
const files = userInput.filter((item) => item.type === 'file'); const files = userInput.filter((item) => item.type === 'file');
if (files.length > 0) { if (files.length > 0) {
return userInput.map((item) => { const filesCount = files.filter((file) => file.file?.type === 'file').length;
if (item.type === 'text') { const imgCount = files.filter((file) => file.file?.type === 'image').length;
const filesCount = files.filter((file) => file.file?.type === 'file').length;
const imgCount = files.filter((file) => file.file?.type === 'image').length;
const text = item.text?.content || '';
return { if (userInput.some((item) => item.type === 'text')) {
...item, return userInput.map((item) => {
text: { if (item.type === 'text') {
content: getMultiplePrompt({ fileCount: filesCount, imgCount, question: text }) const text = item.text?.content || '';
}
}; return {
...item,
text: {
content: getMultiplePrompt({ fileCount: filesCount, imgCount, question: text })
}
};
}
return item;
});
}
// Every input is a file
return [
{
type: ChatItemValueTypeEnum.text,
text: {
content: getMultiplePrompt({ fileCount: filesCount, imgCount, question: '' })
}
} }
];
return item;
});
} }
return userInput; return userInput;

View File

@@ -82,7 +82,7 @@ const AIChatSettingsModal = ({
{t('common:core.ai.AI settings')} {t('common:core.ai.AI settings')}
{feConfigs?.docUrl && ( {feConfigs?.docUrl && (
<Link <Link
href={getDocPath('/docs/course/ai_settings/')} href={getDocPath('/docs/guide/course/ai_settings/')}
target={'_blank'} target={'_blank'}
ml={1} ml={1}
textDecoration={'underline'} textDecoration={'underline'}

View File

@@ -146,7 +146,7 @@ const InputGuideConfig = ({
<Flex mt={8} alignItems={'center'}> <Flex mt={8} alignItems={'center'}>
<FormLabel>{chatT('custom_input_guide_url')}</FormLabel> <FormLabel>{chatT('custom_input_guide_url')}</FormLabel>
<Flex <Flex
onClick={() => window.open(getDocPath('/docs/course/chat_input_guide'))} onClick={() => window.open(getDocPath('/docs/guide/course/chat_input_guide/'))}
color={'primary.700'} color={'primary.700'}
alignItems={'center'} alignItems={'center'}
cursor={'pointer'} cursor={'pointer'}

View File

@@ -101,7 +101,7 @@ const LafAccountModal = ({
<Box fontSize={'sm'} color={'myGray.500'}> <Box fontSize={'sm'} color={'myGray.500'}>
<Box>{t('common:support.user.Laf account intro')}</Box> <Box>{t('common:support.user.Laf account intro')}</Box>
<Box textDecoration={'underline'}> <Box textDecoration={'underline'}>
<Link href={getDocPath('/docs/workflow/modules/laf/')} isExternal> <Link href={getDocPath('/docs/guide/workbench/workflow/laf/')} isExternal>
{t('common:support.user.Laf account course')} {t('common:support.user.Laf account course')}
</Link> </Link>
</Box> </Box>

View File

@@ -90,7 +90,10 @@ const FeiShuEditModal = ({
<Box color="myGray.600">{t('publish:feishu_api')}</Box> <Box color="myGray.600">{t('publish:feishu_api')}</Box>
{feConfigs?.docUrl && ( {feConfigs?.docUrl && (
<Link <Link
href={feConfigs.openAPIDocUrl || getDocPath('/docs/course/feishu')} href={
feConfigs.openAPIDocUrl ||
getDocPath('/docs/use-cases/external-integration/feishu/')
}
target={'_blank'} target={'_blank'}
ml={2} ml={2}
color={'primary.500'} color={'primary.500'}

View File

@@ -73,7 +73,10 @@ const FeiShu = ({ appId }: { appId: string }) => {
</Box> </Box>
{feConfigs?.docUrl && ( {feConfigs?.docUrl && (
<Link <Link
href={feConfigs.openAPIDocUrl || getDocPath('/docs/course/feishu')} href={
feConfigs.openAPIDocUrl ||
getDocPath('/docs/use-cases/external-integration/feishu/')
}
target={'_blank'} target={'_blank'}
color={'primary.500'} color={'primary.500'}
fontSize={'sm'} fontSize={'sm'}

View File

@@ -96,7 +96,10 @@ const OffiAccountEditModal = ({
<Box color="myGray.600">{t('publish:official_account.params')}</Box> <Box color="myGray.600">{t('publish:official_account.params')}</Box>
{feConfigs?.docUrl && ( {feConfigs?.docUrl && (
<Link <Link
href={feConfigs.openAPIDocUrl || getDocPath('/docs/course/official_account')} href={
feConfigs.openAPIDocUrl ||
getDocPath('/docs/use-cases/external-integration/official_account/')
}
target={'_blank'} target={'_blank'}
ml={2} ml={2}
color={'primary.500'} color={'primary.500'}

View File

@@ -75,7 +75,10 @@ const OffiAccount = ({ appId }: { appId: string }) => {
{feConfigs?.docUrl && ( {feConfigs?.docUrl && (
<Link <Link
href={feConfigs.openAPIDocUrl || getDocPath('/docs/course/official_account')} href={
feConfigs.openAPIDocUrl ||
getDocPath('/docs/use-cases/external-integration/official_account/')
}
target={'_blank'} target={'_blank'}
ml={2} ml={2}
color={'primary.500'} color={'primary.500'}

View File

@@ -54,7 +54,7 @@ const WebsiteConfigModal = ({
{t('common:core.dataset.website.Config Description')} {t('common:core.dataset.website.Config Description')}
{feConfigs?.docUrl && ( {feConfigs?.docUrl && (
<Link <Link
href={getDocPath('/docs/course/websync')} href={getDocPath('/docs/guide/knowledge_base/websync/')}
target="_blank" target="_blank"
textDecoration={'underline'} textDecoration={'underline'}
fontWeight={'bold'} fontWeight={'bold'}

View File

@@ -80,7 +80,10 @@ const CustomLinkImport = () => {
{t('common:core.dataset.website.Selector')} {t('common:core.dataset.website.Selector')}
<Box color={'myGray.500'} fontSize={'sm'}> <Box color={'myGray.500'} fontSize={'sm'}>
{feConfigs?.docUrl && ( {feConfigs?.docUrl && (
<Link href={getDocPath('/docs/course/websync/#选择器如何使用')} target="_blank"> <Link
href={getDocPath('/docs/guide/knowledge_base/websync/#选择器如何使用')}
target="_blank"
>
{t('common:core.dataset.website.Selector Course')} {t('common:core.dataset.website.Selector Course')}
</Link> </Link>
)} )}

View File

@@ -99,7 +99,9 @@ const InputDataModal = ({
mr={'0.38rem'} mr={'0.38rem'}
color={'myGray.500'} color={'myGray.500'}
ml={1} ml={1}
onClick={() => window.open(getDocPath('/docs/course/dataset_engine'), '_blank')} onClick={() =>
window.open(getDocPath('/docs/guide/knowledge_base/dataset_engine/'), '_blank')
}
_hover={{ _hover={{
color: 'primary.600', color: 'primary.600',
cursor: 'pointer' cursor: 'pointer'