feat: init knowledge workflow

This commit is contained in:
shaohuzhang1 2025-11-03 18:08:47 +08:00 committed by CaptainB
parent 806393f28c
commit de93d5daca
33 changed files with 3487 additions and 602 deletions

View File

@ -16,6 +16,7 @@ import chatLog from './chat-log'
import chatUser from './chat-user'
import operateLog from './operate-log'
import shared from './shared'
import knowledgeWorkflow from './knowledge-workflow'
export default {
login,
model,
@ -34,5 +35,6 @@ export default {
chatLog,
chatUser,
operateLog,
shared
shared,
knowledgeWorkflow,
}

View File

@ -0,0 +1,479 @@
export default {
node: 'Node',
nodeName: 'Node Name',
baseComponent: 'Basic',
nodeSetting: 'Node Settings',
workflow: 'Workflow',
searchBar: {
placeholder: 'Search by name',
},
info: {
previewVersion: 'Preview Version:',
saveTime: 'Last Saved:',
},
setting: {
restoreVersion: 'Restore Previous Version"',
restoreCurrentVersion: 'Restore to This Version',
addComponent: 'Add',
releaseHistory: 'Release History',
autoSave: 'Auto Save',
latestRelease: 'Latest Release',
copyParam: 'Copy Parameters',
debug: 'Run',
exit: 'Exit',
exitSave: 'Save & Exit',
},
tip: {
noData: 'No related results found',
nameMessage: 'Name cannot be empty!',
onlyRight: 'Connections can only be made from the right anchor',
notRecyclable: 'Loop connections are not allowed',
onlyLeft: 'Connections can only be made to the left anchor',
applicationNodeError: 'This application is unavailable',
toolNodeError: 'This tool node is unavailable',
repeatedNodeError: 'A node with this name already exists',
cannotCopy: 'Cannot be copied',
copyError: 'Node already copied',
paramErrorMessage: 'Parameter already exists: ',
saveMessage: 'Current changes have not been saved. Save before exiting?',
},
delete: {
confirmTitle: 'Confirm to delete this node?',
deleteMessage: 'This node cannot be deleted',
},
control: {
zoomOut: 'Zoom Out',
zoomIn: 'Zoom In',
fitView: 'Fit to Screen',
retract: 'Collapse All',
extend: 'Expand All',
beautify: 'Auto-Arrange',
},
variable: {
global: 'Global Variable',
Referencing: 'Referenced Variable',
ReferencingRequired: 'Referenced variable is required',
ReferencingError: 'Invalid referenced variable',
NoReferencing: 'Referenced variable does not exist',
placeholder: 'Please select a variable',
inputPlaceholder: 'Please enter variable',
loop: 'Loop Variable',
},
condition: {
title: 'Execution Condition',
front: 'Precondition',
AND: 'All',
OR: 'Any',
text: 'After the connected node is executed, execute the current node',
},
validate: {
startNodeRequired: 'Start node is required',
startNodeOnly: 'Only one start node is allowed',
baseNodeRequired: 'Base information node is required',
baseNodeOnly: 'Only one base information node is allowed',
notInWorkFlowNode: 'Node not in workflow',
noNextNode: 'Next node does not exist',
nodeUnavailable: 'Node unavailable',
needConnect1: 'The branch of the node needs to be connected',
cannotEndNode: 'This node cannot be used as an end node',
loopNodeBreakNodeRequired: 'Wireless loop must have a Break node',
},
nodes: {
classify: {
aiCapability: 'AI capability',
businessLogic: 'Business logic',
other: 'Other',
dataProcessing: 'Data Processing',
},
startNode: {
label: 'Start',
question: 'User Question',
currentTime: 'Current Time',
},
baseNode: {
label: 'Base Information',
appName: {
label: 'App Name',
},
appDescription: {
label: 'App Description',
},
fileUpload: {
label: 'File Upload',
tooltip: 'When enabled, the Q&A page will display a file upload button.',
},
FileUploadSetting: {
title: 'File Upload Settings',
maxFiles: 'Maximum number of files per upload',
fileLimit: 'Maximum size per file (MB)',
fileUploadType: {
label: 'File types allowed for upload',
documentText: 'Requires "Document Content Extraction" node to parse document content',
imageText: 'Requires "Image Understanding" node to parse image content',
videoText: 'Requires "Video Understanding" node to parse video content',
audioText: 'Requires "Speech-to-Text" node to parse audio content',
},
},
},
aiChatNode: {
label: 'AI Chat',
text: 'Chat with an AI model',
answer: 'AI Content',
returnContent: {
label: 'Return Content',
tooltip: `If turned off, the content of this node will not be output to the user.
If you want the user to see the output of this node, please turn on the switch.`,
},
defaultPrompt: 'Known Information',
think: 'Thinking Process',
historyMessage: 'Historical chat records',
},
searchKnowledgeNode: {
label: 'Knowledge Retrieval',
text: 'Allows you to query text content related to user questions from the Knowledge',
paragraph_list: 'List of retrieved segments',
is_hit_handling_method_list: 'List of segments that meet direct response criteria',
result: 'Search Result',
directly_return: 'Content of segments that meet direct response criteria',
searchParam: 'Retrieval Parameters',
searchQuestion: {
label: 'Question',
placeholder: 'Please select a search question',
requiredMessage: 'Please select a search question',
},
},
searchDocumentNode: {
label: 'Document Tag Retrieval',
text: 'Search for documents that meet the conditions based on the document label within the specified search scope',
selectKnowledge: 'Search Scope',
searchSetting: 'Search Settings',
custom: 'Manual',
customTooltip: 'Manually set tag filtering conditions',
auto: 'Automatic',
autoTooltip: 'Automatically filter setting tag conditions based on the search question',
document_list: 'Document List',
knowledge_list: 'Knowledge Base List',
result: 'Search Results',
searchParam: 'Search Parameters',
select_variable: 'Select Variable',
valueMessage: `Value or {name} `,
showKnowledge: {
label: 'Results are displayed in the knowledge source',
requiredMessage: 'Please set parameters',
},
searchQuestion: {
label: 'Search Question',
placeholder: 'Please select a search question',
requiredMessage: 'Please select a search question',
},
},
questionNode: {
label: 'Question Optimization',
text: 'Optimize and improve the current question based on historical chat records to better match knowledge segments',
result: 'Optimized Question Result',
systemDefault: `#Role
You are a master of problem optimization, adept at accurately inferring user intentions based on context and optimizing the questions raised by users.
##Skills
###Skill 1: Optimizing Problems
2. Receive user input questions.
3. Carefully analyze the meaning of the problem based on the context.
4. Output optimized problems.
##Limitations:
-Only return the optimized problem without any additional explanation or clarification.
-Ensure that the optimized problem accurately reflects the original problem intent and does not alter the original intention.`,
},
conditionNode: {
label: 'Conditional Branch',
text: 'Trigger different nodes based on conditions',
branch_name: 'Branch Name',
conditions: {
label: 'Conditions',
info: 'Meets the following',
requiredMessage: 'Please select conditions',
},
valueMessage: 'Please enter a value',
addCondition: 'Add Condition',
addBranch: 'Add Branch',
},
replyNode: {
label: 'Specified Reply',
text: 'Specify reply content, referenced variables will be converted to strings for output',
replyContent: 'Reply Content',
},
rerankerNode: {
label: 'Multi-path Recall',
text: 'Use a re-ranking model to refine retrieval results from multiple knowledge sources',
result_list: 'Re-ranked Results List',
result: 'Re-ranking Result',
rerankerContent: {
label: 'Re-ranking Content',
requiredMessage: 'Please select re-ranking content',
},
higher: 'Higher',
ScoreTooltip: 'The higher the Score, the stronger the relevance.',
max_paragraph_char_number: 'Maximum Character',
reranker_model: {
label: 'Rerank',
placeholder: 'Please select a rerank',
},
},
formNode: {
label: 'Form Input',
text: 'Collect user input during Q&A and use it in subsequent processes',
form_content_format1: 'Hello, please fill out the form below:',
form_content_format2: 'Click the [Submit] button after filling it out.',
form_data: 'All Form Content',
formContent: {
label: 'Form Output Content',
requiredMessage:
'Please set the output content of this node, { form } is a placeholder for the form.',
tooltip: 'Define the output content of this node. { form } is a placeholder for the form',
},
formAllContent: 'All Form Content',
formSetting: 'Form Configuration',
},
documentExtractNode: {
label: 'Document Content Extraction',
text: 'Extract content from documents',
content: 'Document Content',
},
imageUnderstandNode: {
label: 'Image Understanding',
text: 'Analyze images to identify objects, scenes, and provide answers',
answer: 'AI Content',
model: {
label: 'Vision Model',
requiredMessage: 'Please select a vision model',
},
image: {
label: 'Select Image',
requiredMessage: 'Please select an image',
},
},
variableAssignNode: {
label: 'Variable Assign',
text: 'Update the value of the global variable',
assign: 'Set Value',
},
variableAggregationNode: {
label: 'Variable Aggregation',
text: 'Aggregate variables of each group according to the aggregation strategy',
Strategy: 'Aggregation Strategy',
placeholder: 'Return the first non-null value of each group',
placeholder1: 'Return the set of variables for each group',
group: {
noneError: 'Name cannot be empty',
dupError: 'Name cannot be duplicated',
},
addGroup: 'Add Group',
editGroup: 'Edit Group',
},
mcpNode: {
label: 'MCP Node',
text: 'Call external MCP services to process data',
getToolsSuccess: 'Tools fetched successfully',
getTool: 'Fetch Tools',
toolParam: 'Tool Parameters',
mcpServerTip: 'Please enter MCP server configuration in JSON format',
mcpToolTip: 'Please select a tool',
configLabel: 'MCP Server Config (Only SSE/Streamable HTTP calls are supported)',
reference: 'Reference MCP',
},
imageGenerateNode: {
label: 'Image Generation',
text: 'Generate images based on provided text content',
answer: 'AI Content',
model: {
label: 'Image Generation Model',
requiredMessage: 'Please select an image generation model',
},
prompt: {
label: 'Positive Prompt',
tooltip: 'Describe elements and visual features you want in the generated image',
},
negative_prompt: {
label: 'Negative Prompt',
tooltip: 'Describe elements you want to exclude from the generated image',
placeholder:
'Please describe content you do not want to generate, such as color, bloody content',
},
},
textToVideoGenerate: {
label: 'Text-to-Video',
text: 'Generate video based on provided text content',
answer: 'AI Response Content',
model: {
label: 'Text-to-Video Model',
requiredMessage: 'Please select a text-to-video model',
},
prompt: {
label: 'Prompt (Positive)',
tooltip:
'Positive prompt, used to describe elements and visual features expected in the generated video',
},
negative_prompt: {
label: 'Prompt (Negative)',
tooltip:
"Negative prompt, used to describe content you don't want to see in the video, which can restrict the video generation",
placeholder:
"Please describe video content you don't want to generate, such as: colors, bloody content",
},
},
imageToVideoGenerate: {
label: 'Image-to-Video',
text: 'Generate video based on provided images',
answer: 'AI Response Content',
model: {
label: 'Image-to-Video Model',
requiredMessage: 'Please select an image-to-video model',
},
prompt: {
label: 'Prompt (Positive)',
tooltip:
'Positive prompt, used to describe elements and visual features expected in the generated video',
},
negative_prompt: {
label: 'Prompt (Negative)',
tooltip:
"Negative prompt, used to describe content you don't want to see in the video, which can restrict the video generation",
placeholder:
"Please describe video content you don't want to generate, such as: colors, bloody content",
},
first_frame: {
label: 'First Frame Image',
requiredMessage: 'Please select the first frame image',
},
last_frame: {
label: 'Last Frame Image',
requiredMessage: 'Please select the last frame image',
},
},
speechToTextNode: {
label: 'Speech2Text',
text: 'Convert audio to text through speech recognition model',
stt_model: {
label: 'Speech Recognition Model',
},
audio: {
label: 'Select Audio File',
placeholder: 'Please select an audio file',
},
},
textToSpeechNode: {
label: 'TTS',
text: 'Convert text to audio through speech synthesis model',
tts_model: {
label: 'Speech Synthesis Model',
},
content: {
label: 'Select Text Content',
},
},
toolNode: {
label: 'Custom Tool',
text: 'Execute custom scripts to achieve data processing',
},
intentNode: {
label: 'IntentNode',
text: 'Match user questions with user-defined intent classifications',
other: 'other',
error2: 'Repeated intent',
placeholder: 'Please choose a classification option',
classify: {
label: 'Intent classify',
placeholder: 'Please input',
},
input: {
label: 'Input',
},
},
applicationNode: {
label: 'APP Node',
},
loopNode: {
label: 'Loop Node',
text: 'Repeat a series of tasks by setting the number of loops and logic',
loopType: {
label: 'Loop Type',
requiredMessage: 'Please select a loop type',
arrayLoop: 'Array Loop',
numberLoop: 'Loop for Specified Times',
infiniteLoop: 'Infinite Loop',
},
loopNumber: {
label: 'Loop Number',
requiredMessage: 'Please enter the number of loops',
},
loopArray: {
label: 'Circular Array',
requiredMessage: 'Circular Array is required',
placeholder: 'Please select a circular array',
},
loopSetting: 'Loop Settings',
loopDetail: 'Loop Details',
},
loopStartNode: {
label: 'Loop Start',
loopIndex: 'Index',
loopItem: 'Loop Element',
},
loopBodyNode: {
label: 'Loop Body',
text: 'Loop Body',
},
loopContinueNode: {
label: 'Continue',
text: 'Used to terminate the current loop and proceed to the next one.',
isContinue: 'Continue',
},
loopBreakNode: {
label: 'Break',
text: 'Terminate the current loop and exit the loop body',
isBreak: 'Break',
},
variableSplittingNode: {
label: 'Variable Splitting',
text: 'By configuring JSON Path expressions, parse and split the input JSON format variable',
result: 'Result',
splitVariables: 'Split Variables',
inputVariables: 'Input Variable',
addVariables: 'Add Variables',
editVariables: 'Edit Variables',
variableListPlaceholder: 'Please add split variables',
expression: {
label: 'Expression',
placeholder: 'Please enter expression',
tooltip: 'Please use JSON Path expressions to split variables, e.g.: $.store.book',
},
},
parameterExtractionNode: {
label: 'Parameter Extraction',
text: 'Use AI models to extract structured parameters',
extractParameters: {
label: 'Extract Parameters',
variableListPlaceholder: 'Please add extraction parameters',
parameterType: 'Parameter Type',
},
},
},
compare: {
is_null: 'Is null',
is_not_null: 'Is not null',
contain: 'Contains',
not_contain: 'Does not contain',
eq: 'Equal to',
ge: 'Greater than or equal to',
gt: 'Greater than',
le: 'Less than or equal to',
lt: 'Less than',
len_eq: 'Length equal to',
len_ge: 'Length greater than or equal to',
len_gt: 'Length greater than',
len_le: 'Length less than or equal to',
len_lt: 'Length less than',
},
SystemPromptPlaceholder: 'System Prompt, can reference variables in the system, such as',
UserPromptPlaceholder: 'User Prompt, can reference variables in the system, such as',
}

View File

@ -6,6 +6,9 @@ export default {
searchBar: {
placeholder: 'Search by name',
},
operation: {
publish: 'Publish',
},
setting: {
vectorization: 'Vectorization',
sync: 'Sync',

View File

@ -16,6 +16,7 @@ import chatLog from './chat-log'
import chatUser from './chat-user'
import operateLog from './operate-log'
import shared from './shared'
import knowledgeWorkflow from './knowledge-workflow'
export default {
login,
model,
@ -34,5 +35,6 @@ export default {
chatLog,
chatUser,
operateLog,
shared
shared,
knowledgeWorkflow,
}

View File

@ -0,0 +1,492 @@
export default {
node: '节点',
nodeName: '节点名称',
baseComponent: '基础组件',
nodeSetting: '节点设置',
workflow: '工作流',
searchBar: {
placeholder: '按名称搜索',
},
info: {
previewVersion: '预览版本:',
saveTime: '保存时间:',
},
setting: {
restoreVersion: '恢复版本',
restoreCurrentVersion: '恢复此版本',
addComponent: '添加组件',
releaseHistory: '发布历史',
autoSave: '自动保存',
latestRelease: '最近发布',
copyParam: '复制参数',
debug: '调试',
exit: '直接退出',
exitSave: '保存并退出',
},
tip: {
noData: '没有找到相关结果',
nameMessage: '名字不能为空!',
onlyRight: '只允许从右边的锚点连出',
notRecyclable: '不可循环连线',
onlyLeft: '只允许连接左边的锚点',
applicationNodeError: '该应用不可用',
toolNodeError: '该工具不可用',
repeatedNodeError: '节点名称已存在!',
cannotCopy: '不能被复制',
copyError: '已复制节点',
paramErrorMessage: '参数已存在: ',
saveMessage: '当前的更改尚未保存,是否保存后退出?',
},
delete: {
confirmTitle: '确定删除该节点?',
deleteMessage: '节点不允许删除',
},
control: {
zoomOut: '缩小',
zoomIn: '放大',
fitView: '适应',
retract: '收起全部节点',
extend: '展开全部节点',
beautify: '一键美化',
},
variable: {
global: '全局变量',
chat: '会话变量',
Referencing: '引用变量',
ReferencingRequired: '引用变量必填',
ReferencingError: '引用变量错误',
NoReferencing: '不存在的引用变量',
placeholder: '请选择变量',
inputPlaceholder: '请输入变量',
loop: '循环变量',
},
condition: {
title: '执行条件',
front: '前置',
AND: '所有',
OR: '任一',
text: '连线节点执行完,执行当前节点',
},
validate: {
startNodeRequired: '开始节点必填',
startNodeOnly: '开始节点只能有一个',
baseNodeRequired: '基本信息节点必填',
baseNodeOnly: '基本信息节点只能有一个',
notInWorkFlowNode: '未在流程中的节点',
noNextNode: '不存在的下一个节点',
nodeUnavailable: '节点不可用',
needConnect1: '节点的',
needConnect2: '分支需要连接',
cannotEndNode: '节点不能当做结束节点',
loopNodeBreakNodeRequired: '无限循环 必须存在 Break 节点',
},
nodes: {
classify: {
aiCapability: 'AI能力',
businessLogic: '业务逻辑',
other: '其他',
dataProcessing: '数据处理',
},
startNode: {
label: '开始',
question: '用户问题',
currentTime: '当前时间',
},
baseNode: {
label: '基本信息',
appName: {
label: '应用名称',
},
appDescription: {
label: '应用描述',
},
fileUpload: {
label: '文件上传',
tooltip: '开启后,问答页面会显示上传文件的按钮。',
},
FileUploadSetting: {
title: '文件上传设置',
maxFiles: '单次上传最多文件数',
fileLimit: '每个文件最大MB',
fileUploadType: {
label: '上传的文件类型',
documentText: '需要使用“文档内容提取”节点解析文档内容',
imageText: '需要使用“视觉模型”节点解析图片内容',
audioText: '需要使用“语音转文本”节点解析音频内容',
videoText: '需要使用“视频理解”节点解析视频内容',
otherText: '需要自行解析该类型文件',
},
},
},
aiChatNode: {
label: 'AI 对话',
text: '与 AI 大模型进行对话',
answer: 'AI 回答内容',
returnContent: {
label: '返回内容',
tooltip: `关闭后该节点的内容则不输出给用户。
`,
},
defaultPrompt: '已知信息',
think: '思考过程',
historyMessage: '历史聊天记录',
},
searchKnowledgeNode: {
label: '知识库检索',
text: '关联知识库,查找与问题相关的分段',
paragraph_list: '检索结果的分段列表',
is_hit_handling_method_list: '满足直接回答的分段列表',
result: '检索结果',
directly_return: '满足直接回答的分段内容',
searchParam: '检索参数',
showKnowledge: {
label: '结果显示在知识来源中',
requiredMessage: '请设置参数',
},
searchQuestion: {
label: '检索问题',
placeholder: '请选择检索问题',
requiredMessage: '请选择检索问题',
},
},
searchDocumentNode: {
label: '文档标签检索',
text: '从设定的检索范围中,根据文档标签检索出满足条件的文档',
selectKnowledge: '检索范围',
searchSetting: '检索设置',
custom: '手动',
customTooltip: '手动设置标签过滤条件',
auto: '自动',
autoTooltip: '根据检索问题自动匹配文档标签',
document_list: '文档列表',
knowledge_list: '知识库列表',
result: '检索结果',
searchParam: '检索参数',
select_variable: '选择变量',
valueMessage: `值或{name}`,
showKnowledge: {
label: '结果显示在知识来源中',
requiredMessage: '请设置参数',
},
searchQuestion: {
label: '检索问题',
placeholder: '请选择检索问题',
requiredMessage: '请选择检索问题',
},
},
questionNode: {
label: '问题优化',
text: '根据历史聊天记录优化完善当前问题,更利于匹配知识库分段',
result: '问题优化结果',
systemDefault: `# 角色
##
### 1: 优化问题
2.
3.
4.
## :
-
- `,
},
conditionNode: {
label: '判断器',
text: '根据不同条件执行不同的节点',
branch_name: '分支名称',
conditions: {
label: '条件',
info: '符合以下',
requiredMessage: '请选择条件',
},
valueMessage: '请输入值',
addCondition: '添加条件',
addBranch: '添加分支',
},
replyNode: {
label: '指定回复',
text: '指定回复内容,引用变量会转换为字符串进行输出',
replyContent: '回复内容',
},
rerankerNode: {
label: '多路召回',
text: '使用重排模型对多个知识库的检索结果进行二次召回',
result_list: '重排结果列表',
result: '重排结果',
rerankerContent: {
label: '重排内容',
requiredMessage: '请选择重排内容',
},
higher: '高于',
ScoreTooltip: 'Score越高相关性越强。',
max_paragraph_char_number: '最大引用字符数',
reranker_model: {
label: '重排模型',
placeholder: '请选择重排模型',
},
},
formNode: {
label: '表单收集',
text: '在问答过程中用于收集用户信息,可以根据收集到表单数据执行后续流程',
form_content_format1: '你好,请先填写下面表单内容:',
form_content_format2: '填写后请点击【提交】按钮进行提交。',
form_data: '表单全部内容',
formContent: {
label: '表单输出内容',
requiredMessage: '请表单输出内容',
tooltip: '设置执行该节点输出的内容,{ form } 为表单的占位符。',
},
formAllContent: '表单全部内容',
formSetting: '表单配置',
},
documentExtractNode: {
label: '文档内容提取',
text: '提取文档中的内容',
content: '文档内容',
},
imageUnderstandNode: {
label: '图片理解',
text: '识别出图片中的对象、场景等信息回答用户问题',
answer: 'AI 回答内容',
model: {
label: '视觉模型',
requiredMessage: '请选择视觉模型',
},
image: {
label: '选择图片',
requiredMessage: '请选择图片',
},
},
variableAggregationNode: {
label: '变量聚合',
text: '按聚合策略聚合每组的变量',
Strategy: '聚合策略',
placeholder: '返回每组的第一个非空值',
placeholder1: '返回每组变量的集合',
group: {
noneError: '名称不能为空',
dupError: '名称不能重复',
},
addGroup: '添加分组',
editGroup: '编辑分组',
},
variableAssignNode: {
label: '变量赋值',
text: '更新全局变量的值',
assign: '赋值',
},
mcpNode: {
label: 'MCP 调用',
text: '通过SSE/Streamable HTTP方式执行MCP服务中的工具',
getToolsSuccess: '获取工具成功',
getTool: '获取工具',
toolParam: '工具参数',
mcpServerTip: '请输入JSON格式的MCP服务器配置',
mcpToolTip: '请选择工具',
configLabel: 'MCP Server Config (仅支持SSE/Streamable HTTP调用方式)',
reference: '引用MCP',
},
imageGenerateNode: {
label: '图片生成',
text: '根据提供的文本内容生成图片',
answer: 'AI 回答内容',
model: {
label: '图片生成模型',
requiredMessage: '请选择图片生成模型',
},
prompt: {
label: '提示词(正向)',
tooltip: '正向提示词,用来描述生成图像中期望包含的元素和视觉特点',
},
negative_prompt: {
label: '提示词(负向)',
tooltip: '反向提示词,用来描述不希望在画面中看到的内容,可以对画面进行限制。',
placeholder: '请描述不想生成的图片内容,比如:颜色、血腥内容',
},
},
textToVideoGenerate: {
label: '文生视频',
text: '根据提供的文本内容生成视频',
answer: 'AI 回答内容',
model: {
label: '文生视频模型',
requiredMessage: '请选择文生视频模型',
},
prompt: {
label: '提示词(正向)',
tooltip: '正向提示词,用来描述生成视频中期望包含的元素和视觉特点',
},
negative_prompt: {
label: '提示词(负向)',
tooltip: '反向提示词,用来描述不希望在视频中看到的内容,可以对视频进行限制。',
placeholder: '请描述不想生成的视频内容,比如:颜色、血腥内容',
},
},
videoUnderstandNode: {
label: '视频理解',
text: '识别出视频中的对象、场景等信息回答用户问题',
answer: 'AI 回答内容',
model: {
label: '视觉模型',
requiredMessage: '请选择视觉模型',
},
image: {
label: '选择视频',
requiredMessage: '请选择视频',
},
},
imageToVideoGenerate: {
label: '图生视频',
text: '根据提供的图片生成视频',
answer: 'AI 回答内容',
model: {
label: '图生视频模型',
requiredMessage: '请选择图生视频模型',
},
prompt: {
label: '提示词(正向)',
tooltip: '正向提示词,用来描述生成视频中期望包含的元素和视觉特点',
},
negative_prompt: {
label: '提示词(负向)',
tooltip: '反向提示词,用来描述不希望在视频中看到的内容,可以对视频进行限制。',
placeholder: '请描述不想生成的视频内容,比如:颜色、血腥内容',
},
first_frame: {
label: '首帧图片',
requiredMessage: '请选择首帧图片',
},
last_frame: {
label: '尾帧图片',
requiredMessage: '请选择尾帧图片',
},
},
speechToTextNode: {
label: '语音转文本',
text: '将音频通过语音识别模型转换为文本',
stt_model: {
label: '语音识别模型',
},
audio: {
label: '选择语音文件',
placeholder: '请选择语音文件',
},
},
textToSpeechNode: {
label: '文本转语音',
text: '将文本通过语音合成模型转换为音频',
tts_model: {
label: '语音合成模型',
},
content: {
label: '选择文本内容',
},
},
toolNode: {
label: '自定义工具',
text: '通过执行自定义脚本,实现数据处理',
},
intentNode: {
label: '意图识别',
text: '将用户问题与用户预设的意图分类进行匹配',
other: '其他',
error2: '意图重复',
placeholder: '请选择分类项',
classify: {
label: '意图分类',
placeholder: '请输入',
},
input: {
label: '输入',
},
},
applicationNode: {
label: '应用节点',
},
loopNode: {
label: '循环节点',
text: '通过设置循环次数和逻辑,重复执行一系列任务',
loopType: {
label: '循环类型',
requiredMessage: '请选择循环类型',
arrayLoop: '数组循环',
numberLoop: '指定次数循环',
infiniteLoop: '无限循环',
},
loopNumber: {
label: '循环次数',
requiredMessage: '循环次数必填',
},
loopArray: {
label: '循环数组',
requiredMessage: '循环数组必填',
placeholder: '请选择循环数组',
},
loopSetting: '循环设置',
loopDetail: '循环详情',
},
loopStartNode: {
label: '循环开始',
loopIndex: '下标',
loopItem: '循环元素',
},
loopBodyNode: {
label: '循环体',
text: '循环体',
},
loopContinueNode: {
label: 'Continue',
text: '用于终止当前循环,执行下次循环',
isContinue: 'Continue',
},
loopBreakNode: {
label: 'Break',
text: '终止当前循环,跳出循环体',
isBreak: 'Break',
},
variableSplittingNode: {
label: '变量拆分',
text: '通过配置JSON Path 表达式,对输入的 JSON 格式变量进行解析和拆分',
splitVariables: '拆分变量',
inputVariables: '输入变量',
addVariables: '添加变量',
editVariables: '编辑变量',
variableListPlaceholder: '请添加拆分变量',
expression: {
label: '表达式',
placeholder: '请输入表达式',
tooltip: '请使用JSON Path 表达式拆分变量,例如:$.store.book',
},
},
parameterExtractionNode: {
label: '参数提取',
text: '利用 AI 模型提取结构化参数',
extractParameters: {
label: '提取参数',
variableListPlaceholder: '请添加提取参数',
parameterType: '参数类型',
},
},
},
compare: {
is_null: '为空',
is_not_null: '不为空',
contain: '包含',
not_contain: '不包含',
eq: '等于',
ge: '大于等于',
gt: '大于',
le: '小于等于',
lt: '小于',
len_eq: '长度等于',
len_ge: '长度大于等于',
len_gt: '长度大于',
len_le: '长度小于等于',
len_lt: '长度小于',
is_true: '为真',
is_not_true: '不为真',
},
SystemPromptPlaceholder: '系统提示词,可以引用系统中的变量:如',
UserPromptPlaceholder: '用户提示词,可以引用系统中的变量:如',
}

View File

@ -6,6 +6,9 @@ export default {
vectorization: '向量化',
sync: '同步',
},
operation: {
publish: '发布',
},
tip: {
professionalMessage: '社区版最多支持 50 个知识库,如需拥有更多知识库,请升级为专业版。',
syncSuccess: '同步任务发送成功',

View File

@ -16,6 +16,7 @@ import applicationWorkflow from './application-workflow'
import login from './login'
import operateLog from './operate-log'
import shared from './shared'
import knowledgeWorkflow from './knowledge-workflow'
export default {
application,
applicationOverview,
@ -34,5 +35,6 @@ export default {
role,
workspace,
chatUser,
shared
shared,
knowledgeWorkflow,
}

View File

@ -0,0 +1,465 @@
export default {
node: '節點',
nodeName: '節點名稱',
baseComponent: '基礎組件',
nodeSetting: '節點設置',
workflow: '工作流',
searchBar: {
placeholder: '按名稱搜索',
},
info: {
previewVersion: '預覽版本:',
saveTime: '保存時間:',
},
setting: {
restoreVersion: '恢復版本',
restoreCurrentVersion: '恢復此版本',
addComponent: '添加組件',
releaseHistory: '發布歷史',
autoSave: '自動保存',
latestRelease: '最近發布',
copyParam: '複製參數',
debug: '調試',
exit: '直接退出',
exitSave: '保存並退出',
},
tip: {
noData: '沒有找到相關結果',
nameMessage: '名字不能為空!',
onlyRight: '只允許從右邊的錨點連出',
notRecyclable: '不可循環連線',
onlyLeft: '只允許連接左邊的錨點',
applicationNodeError: '該應用不可用',
toolNodeError: '該函數不可用',
repeatedNodeError: '節點名稱已存在!',
cannotCopy: '不能被複製',
copyError: '已複製節點',
paramErrorMessage: '參數已存在: ',
saveMessage: '當前修改未保存,是否保存後退出?',
},
delete: {
confirmTitle: '確定刪除該節點?',
deleteMessage: '節點不允許刪除',
},
control: {
zoomOut: '縮小',
zoomIn: '放大',
fitView: '適應',
retract: '收起全部節點',
extend: '展開全部節點',
beautify: '一鍵美化',
},
variable: {
global: '全局變量',
Referencing: '引用變量',
ReferencingRequired: '引用變量必填',
ReferencingError: '引用變量錯誤',
NoReferencing: '不存在的引用變量',
placeholder: '請選擇變量',
inputPlaceholder: '請輸入變量',
loop: '循環變量',
},
condition: {
title: '執行條件',
front: '前置',
AND: '所有',
OR: '任一',
text: '連線節點執行完,執行當前節點',
},
validate: {
startNodeRequired: '開始節點必填',
startNodeOnly: '開始節點只能有一個',
baseNodeRequired: '基本信息節點必填',
baseNodeOnly: '基本信息節點只能有一個',
notInWorkFlowNode: '未在流程中的節點',
noNextNode: '不存在的下一個節點',
nodeUnavailable: '節點不可用',
needConnect1: '節點的',
needConnect2: '分支需要連接',
cannotEndNode: '節點不能當做結束節點',
loopNodeBreakNodeRequired: '無限循環必須存在Break節點',
},
nodes: {
classify: {
aiCapability: 'AI能力',
businessLogic: '業務邏輯',
other: '其他',
dataProcessing: '數據處理',
},
startNode: {
label: '開始',
question: '用戶問題',
currentTime: '當前時間',
},
baseNode: {
label: '基本信息',
appName: {
label: '應用名稱',
},
appDescription: {
label: '應用描述',
},
fileUpload: {
label: '文件上傳',
tooltip: '開啟後,問答頁面會顯示上傳文件的按鈕。',
},
FileUploadSetting: {
title: '文件上傳設置',
maxFiles: '單次上傳最多文件數',
fileLimit: '每個文件最大MB',
fileUploadType: {
label: '上傳的文件類型',
documentText: '需要使用「文檔內容提取」節點解析文檔內容',
imageText: '需要使用「圖片理解」節點解析圖片內容',
videoText: '需要使用「視頻理解」節點解析視頻內容',
audioText: '需要使用「語音轉文本」節點解析音頻內容',
},
},
},
aiChatNode: {
label: 'AI 對話',
text: '與 AI 大模型進行對話',
answer: 'AI 回答內容',
returnContent: {
label: '返回內容',
tooltip: `關閉後該節點的內容則不輸出給用戶。
`,
},
defaultPrompt: '已知信息',
think: '思考過程',
historyMessage: '歷史聊天記錄',
},
searchKnowledgeNode: {
label: '知識庫檢索',
text: '關聯知識庫,查找與問題相關的分段',
paragraph_list: '檢索結果的分段列表',
is_hit_handling_method_list: '滿足直接回答的分段列表',
result: '檢索結果',
directly_return: '滿足直接回答的分段內容',
searchParam: '檢索參數',
searchQuestion: {
label: '檢索問題',
placeholder: '請選擇檢索問題',
requiredMessage: '請選擇檢索問題',
},
},
searchDocumentNode: {
label: '文檔標籤檢索',
text: '從設定的檢索範圍中,根據文檔標籤檢索出符合條件的文檔',
selectKnowledge: '檢索範圍',
searchSetting: '檢索設定',
custom: '手動',
customTooltip: '手動設置標籤過濾條件',
auto: '自動',
autoTooltip: '根據檢索問題自動匹配文檔標簽',
document_list: '文件清單',
knowledge_list: '知識庫列表',
result: '檢索結果',
searchParam: '檢索參數',
select_variable: '選擇變數',
valueMessage: `值或{name}`,
showKnowledge: {
label: '結果顯示在知識來源',
requiredMessage: '請設定參數',
},
searchQuestion: {
label: '檢索問題',
placeholder: '請選擇檢索問題',
requiredMessage: '請選擇檢索問題',
},
},
questionNode: {
label: '問題優化',
text: '根據歷史聊天記錄優化完善當前問題,更利於匹配知識庫分段',
result: '問題優化結果',
systemDefault: `# 角色
##
### 1: 優化問題
2.
3.
4.
## :
-
- `,
},
conditionNode: {
label: '判斷器',
text: '根據不同條件執行不同的節點',
branch_name: '分支名稱',
conditions: {
label: '條件',
info: '符合以下',
requiredMessage: '請選擇條件',
},
valueMessage: '請輸入值',
addCondition: '添加條件',
addBranch: '添加分支',
},
replyNode: {
label: '指定回覆',
text: '指定回覆內容,引用變量會轉換為字符串進行輸出',
replyContent: '回覆內容',
},
rerankerNode: {
label: '多路召回',
text: '使用重排模型對多個知識庫的檢索結果進行二次召回',
result_list: '重排結果列表',
result: '重排結果',
rerankerContent: {
label: '重排內容',
requiredMessage: '請選擇重排內容',
},
higher: '高於',
ScoreTooltip: 'Score越高相關性越強。',
max_paragraph_char_number: '最大引用字符數',
reranker_model: {
label: '重排模型',
placeholder: '請選擇重排模型',
},
},
formNode: {
label: '表單收集',
text: '在問答過程中用於收集用戶信息,可以根據收集到表單數據執行後續流程',
form_content_format1: '你好,請先填寫下面表單內容:',
form_content_format2: '填寫後請點擊【提交】按鈕進行提交。',
form_data: '表單全部內容',
formContent: {
label: '表單輸出內容',
requiredMessage: '請表單輸出內容',
tooltip: '設置執行該節點輸出的內容,{ form } 為表單的佔位符。',
},
formAllContent: '表單全部內容',
formSetting: '表單配置',
},
documentExtractNode: {
label: '文檔內容提取',
text: '提取文檔中的內容',
content: '文檔內容',
},
imageUnderstandNode: {
label: '圖片理解',
text: '識別出圖片中的物件、場景等信息回答用戶問題',
answer: 'AI 回答內容',
model: {
label: '視覺模型',
requiredMessage: '請選擇視覺模型',
},
image: {
label: '選擇圖片',
requiredMessage: '請選擇圖片',
},
},
variableAssignNode: {
label: '變數賦值',
text: '更新全域變數的值',
assign: '賦值',
},
variableAggregationNode: {
label: '變量聚合',
text: '按聚合策略聚合每組的變量',
Strategy: '聚合策略',
placeholder: '返回每組的第一個非空值',
placeholder1: '返回每組變量的集合',
group: {
noneError: '名稱不能為空',
dupError: '名稱不能重複',
},
addGroup: '添加分組',
editGroup: '編輯分組',
},
mcpNode: {
label: 'MCP 調用',
text: '通過SSE/Streamable HTTP方式執行MCP服務中的工具',
getToolsSuccess: '獲取工具成功',
getTool: '獲取工具',
toolParam: '工具參數',
mcpServerTip: '請輸入JSON格式的MCP服務器配置',
mcpToolTip: '請選擇工具',
configLabel: 'MCP Server Config (僅支持SSE/Streamable HTTP調用方式)',
reference: '引用MCP',
},
imageGenerateNode: {
label: '圖片生成',
text: '根據提供的文本內容生成圖片',
answer: 'AI 回答內容',
model: {
label: '圖片生成模型',
requiredMessage: '請選擇圖片生成模型',
},
prompt: {
label: '提示詞(正向)',
tooltip: '正向提示詞,用來描述生成圖像中期望包含的元素和視覺特點',
},
negative_prompt: {
label: '提示詞(負向)',
tooltip: '反向提示詞,用來描述不希望在畫面中看到的內容,可以對畫面進行限制。',
placeholder: '請描述不想生成的圖片內容,比如:顏色、血腥內容',
},
},
textToVideoGenerate: {
label: '文生影片',
text: '根據提供的文字內容生成影片',
answer: 'AI 回答內容',
model: {
label: '文生影片模型',
requiredMessage: '請選擇文生影片模型',
},
prompt: {
label: '提示詞(正向)',
tooltip: '正向提示詞,用來描述生成影片中期望包含的元素和視覺特點',
},
negative_prompt: {
label: '提示詞(負向)',
tooltip: '反向提示詞,用來描述不希望在影片中看到的內容,可以對影片進行限制。',
placeholder: '請描述不想生成的影片內容,例如:顏色、血腥內容',
},
},
imageToVideoGenerate: {
label: '圖生影片',
text: '根據提供的圖片生成影片',
answer: 'AI 回答內容',
model: {
label: '圖生影片模型',
requiredMessage: '請選擇圖生影片模型',
},
prompt: {
label: '提示詞(正向)',
tooltip: '正向提示詞,用來描述生成影片中期望包含的元素和視覺特點',
},
negative_prompt: {
label: '提示詞(負向)',
tooltip: '反向提示詞,用來描述不希望在影片中看到的內容,可以對影片進行限制。',
placeholder: '請描述不想生成的影片內容,例如:顏色、血腥內容',
},
first_frame: {
label: '首幀圖片',
requiredMessage: '請選擇首幀圖片',
},
last_frame: {
label: '尾幀圖片',
requiredMessage: '請選擇尾幀圖片',
},
},
speechToTextNode: {
label: '語音轉文本',
text: '將音頻通過語音識別模型轉換為文本',
stt_model: {
label: '語音識別模型',
},
audio: {
label: '選擇語音文件',
placeholder: '請選擇語音文件',
},
},
textToSpeechNode: {
label: '文本轉語音',
text: '將文本通過語音合成模型轉換為音頻',
tts_model: {
label: '語音合成模型',
},
content: {
label: '選擇文本內容',
},
},
toolNode: {
label: '自定義工具',
text: '通過執行自定義腳本,實現數據處理',
},
intentNode: {
label: '意圖識別',
text: '將用戶問題與用戶預設的意圖分類進行匹配',
other: '其他',
error2: '意圖重複',
placeholder: '請選擇分類項',
classify: {
label: '意圖分類',
placeholder: '請輸入',
},
input: {
label: '輸入',
},
},
applicationNode: {
label: '應用節點',
},
loopNode: {
label: '循環節點',
text: '通過設置循環次數和邏輯,重複執行一系列任務',
loopType: {
label: '循環類型',
requiredMessage: '請選擇循環類型',
arrayLoop: '數組循環',
numberLoop: '指定次數循環',
infiniteLoop: '無限循環',
},
loopNumber: {
label: '循環次數',
requiredMessage: '請填寫循環次數',
},
loopArray: {
label: '循環數組',
requiredMessage: '循環數組必填',
placeholder: '請選擇循環數組',
},
loopSetting: '循環設置',
loopDetail: '循環詳情',
},
loopStartNode: {
label: '循環開始',
loopIndex: '下標',
loopItem: '循環元素',
},
loopBodyNode: { label: '循環體', text: '循環體' },
loopContinueNode: {
label: 'Continue',
text: '用於終止當前循環,執行下次循環',
isContinue: 'Continue',
},
loopBreakNode: { label: 'Break', text: '終止當前循環,跳出循環體', isBreak: 'Break' },
variableSplittingNode: {
label: '變量拆分',
text: '通過配置 JSON Path 表達式,對輸入的 JSON 格式變量進行解析和拆分',
result: '結果',
splitVariables: '拆分變量',
inputVariables: '輸入變量',
addVariables: '添加變量',
editVariables: '編輯變量',
variableListPlaceholder: '請添加折開變數',
expression: {
label: '表達式',
placeholder: '請輸入表達式',
tooltip: '請使用JSON Path 表達式拆分變量,例如:$.store.book',
},
},
parameterExtractionNode: {
label: '參數提取',
text: '利用 AI 模型提取結構化參數',
extractParameters: {
label: '提取參數',
variableListPlaceholder: '請添加選取參數',
parameterType: '參數類型',
},
},
},
compare: {
is_null: '為空',
is_not_null: '不為空',
contain: '包含',
not_contain: '不包含',
eq: '等於',
ge: '大於等於',
gt: '大於',
le: '小於等於',
lt: '小於',
len_eq: '長度等於',
len_ge: '長度大於等於',
len_gt: '長度大於',
len_le: '長度小於等於',
len_lt: '長度小於',
},
SystemPromptPlaceholder: '系統提示詞,可以引用系統中的變量:如',
UserPromptPlaceholder: '用戶提示詞,可以引用系統中的變量:如',
}

View File

@ -6,6 +6,9 @@ export default {
searchBar: {
placeholder: '按名稱搜尋',
},
operation: {
publish: '發佈',
},
setting: {
vectorization: '向量化',
sync: '同步',

View File

@ -3,235 +3,61 @@ import { ComplexPermission } from '@/utils/permission/type'
import { EditionConst, PermissionConst, RoleConst } from '@/utils/permission/data'
const share = {
is_share: () => false,
create: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_CREATE
],
'OR'
),
sync: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_SYNC
],
'OR'
),
vector: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_VECTOR
],
'OR'
),
generate: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_GENERATE
],
'OR'
),
edit: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_EDIT
],
'OR'
),
export: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_EXPORT
],
'OR'
),
delete: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DELETE
],
'OR'
),
doc_read: () => false,
doc_create: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_CREATE
],
'OR'
),
doc_vector: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_VECTOR
],
'OR'
),
doc_generate: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_GENERATE
],
'OR'
),
doc_migrate: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_MIGRATE
],
'OR'
),
doc_edit: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_EDIT
],
'OR'
),
doc_sync: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_SYNC
],
'OR'
),
doc_delete: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_DELETE
],
'OR'
),
doc_export: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_EXPORT
],
'OR'
),
doc_download: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_DOWNLOAD_SOURCE_FILE
],
'OR'
),
doc_tag: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_TAG
],
'OR'
),
doc_replace: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_REPLACE
],
'OR'
),
problem_create: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_PROBLEM_CREATE
],
'OR'
),
knowledge_chat_user_read: () => false,
knowledge_chat_user_edit: () =>
hasPermission(
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_EDIT
],
'OR'
),
problem_read: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_PROBLEM_READ
],
'OR'
),
problem_relate: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_PROBLEM_RELATE
],
'OR'
),
problem_delete: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_PROBLEM_DELETE
],
'OR'
),
problem_edit: () =>
hasPermission (
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_PROBLEM_EDIT
],
'OR'
),
tag_read: () =>
hasPermission(
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_TAG_READ
],
'OR',
),
tag_create: () =>
hasPermission(
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_TAG_CREATE
],
'OR',
),
tag_edit: () =>
hasPermission(
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_TAG_EDIT
],
'OR',
),
tag_delete: () =>
hasPermission(
[
RoleConst.ADMIN,
PermissionConst.SHARED_KNOWLEDGE_TAG_DELETE
],
'OR',
),
create: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_CREATE], 'OR'),
sync: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_SYNC], 'OR'),
vector: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_VECTOR], 'OR'),
generate: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_GENERATE], 'OR'),
edit: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_EDIT], 'OR'),
export: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_EXPORT], 'OR'),
delete: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DELETE], 'OR'),
chat_user_edit: () =>false,
doc_read: () => false,
doc_create: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_CREATE], 'OR'),
doc_vector: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_VECTOR], 'OR'),
doc_generate: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_GENERATE], 'OR'),
doc_migrate: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_MIGRATE], 'OR'),
doc_edit: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_EDIT], 'OR'),
doc_sync: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_SYNC], 'OR'),
doc_delete: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_DELETE], 'OR'),
doc_export: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_EXPORT], 'OR'),
doc_download: () =>
hasPermission(
[RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_DOWNLOAD_SOURCE_FILE],
'OR',
),
doc_tag: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_TAG], 'OR'),
doc_replace: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_REPLACE], 'OR'),
problem_create: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_CREATE], 'OR'),
knowledge_chat_user_read: () => false,
knowledge_chat_user_edit: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_EDIT], 'OR'),
problem_read: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_READ], 'OR'),
problem_relate: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_RELATE], 'OR'),
problem_delete: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_DELETE], 'OR'),
problem_edit: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_EDIT], 'OR'),
tag_read: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_TAG_READ], 'OR'),
tag_create: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_TAG_CREATE], 'OR'),
tag_edit: () => hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_TAG_EDIT], 'OR'),
tag_delete: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_TAG_DELETE], 'OR'),
chat_user_edit: () => false,
auth: () => false,
folderRead: () => false,
@ -241,5 +67,6 @@ const share = {
folderAuth: () => false,
folderDelete: () => false,
hit_test: () => false,
debug: (source_id: string) => true,
}
export default share

View File

@ -12,7 +12,7 @@ const workspaceShare = {
delete: () => false,
auth: () => false,
doc_read: () => false,
doc_read: () => false,
doc_create: () => false,
doc_vector: () => false,
doc_generate: () => false,
@ -32,13 +32,13 @@ const workspaceShare = {
tag_create: () => false,
tag_delete: () => false,
tag_edit: () => false,
problem_read: () => false,
problem_create: () => false,
problem_relate: () => false,
problem_delete: () => false,
problem_edit: () => false,
chat_user_edit: () =>false,
chat_user_edit: () => false,
folderRead: () => false,
folderManage: () => false,
@ -47,6 +47,7 @@ const workspaceShare = {
folderAuth: () => false,
folderDelete: () => false,
hit_test: () => false,
debug: (source_id: string) => true,
}
export default workspaceShare

View File

@ -5,9 +5,14 @@ const workspace = {
is_share: () =>
hasPermission(
new ComplexPermission(
[RoleConst.USER.getWorkspaceRole,RoleConst.WORKSPACE_MANAGE.getWorkspaceRole],
[PermissionConst.KNOWLEDGE_READ.getWorkspacePermission,PermissionConst.KNOWLEDGE_READ.getWorkspacePermissionWorkspaceManageRole],
[EditionConst.IS_EE],'OR'),
[RoleConst.USER.getWorkspaceRole, RoleConst.WORKSPACE_MANAGE.getWorkspaceRole],
[
PermissionConst.KNOWLEDGE_READ.getWorkspacePermission,
PermissionConst.KNOWLEDGE_READ.getWorkspacePermissionWorkspaceManageRole,
],
[EditionConst.IS_EE],
'OR',
),
'OR',
),
create: () =>
@ -20,350 +25,540 @@ const workspace = {
],
'OR',
),
folderRead: (folder_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],[],'AND'),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_READ.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_READ.getWorkspacePermissionWorkspaceManageRole,
],
'OR'
),
folderManage: () => true,
folderAuth: (folder_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],[],'AND'),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_EDIT.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_RESOURCE_AUTHORIZATION.getWorkspacePermissionWorkspaceManageRole,
],
'OR'
),
folderCreate: (folder_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],[],'AND'),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_EDIT.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_CREATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR'
),
folderDelete: (folder_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],[],'AND'),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_EDIT.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_DELETE.getWorkspacePermissionWorkspaceManageRole,
],
'OR'
),
folderEdit: (folder_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],[],'AND'),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_EDIT.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermissionWorkspaceManageRole,
],
'OR'
),
sync: (source_id:string) =>
folderRead: (folder_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_READ.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_READ.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
folderManage: () => true,
folderAuth: (folder_id: string) =>
hasPermission(
[
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_EDIT.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_RESOURCE_AUTHORIZATION.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
folderCreate: (folder_id: string) =>
hasPermission(
[
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_EDIT.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_CREATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
folderDelete: (folder_id: string) =>
hasPermission(
[
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_EDIT.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_DELETE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
folderEdit: (folder_id: string) =>
hasPermission(
[
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(folder_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_FOLDER_EDIT.getKnowledgeWorkspaceResourcePermission(folder_id),
PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
sync: (source_id: string) =>
hasPermission(
[
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_SYNC.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_SYNC.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
vector: (source_id:string) =>
vector: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_VECTOR.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_VECTOR.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
generate: (source_id:string) =>
generate: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_GENERATE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_GENERATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
edit: (source_id:string) =>
edit: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_EDIT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
auth: (source_id:string) =>
auth: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_RESOURCE_AUTHORIZATION.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_RESOURCE_AUTHORIZATION.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_RESOURCE_AUTHORIZATION.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
export: (source_id:string) =>
export: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_EXPORT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_EXPORT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
delete: (source_id:string) =>
delete: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DELETE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DELETE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_read: () => false,
doc_create: (source_id:string) =>
doc_read: () => false,
doc_create: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_CREATE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_CREATE.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_DOCUMENT_CREATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_vector: (source_id:string) =>
doc_vector: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_DOCUMENT_VECTOR.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_generate: (source_id:string) =>
doc_generate: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_GENERATE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_GENERATE.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_DOCUMENT_GENERATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_migrate: (source_id:string) =>
doc_migrate: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_MIGRATE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_MIGRATE.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_DOCUMENT_MIGRATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_edit: (source_id:string) =>
doc_edit: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_EDIT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_EDIT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_sync: (source_id:string) =>
doc_sync: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_SYNC.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_SYNC.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_delete: (source_id:string) =>
doc_delete: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_DELETE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_DELETE.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_DOCUMENT_DELETE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_export: (source_id:string) =>
doc_export: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_EXPORT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_EXPORT.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_DOCUMENT_EXPORT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_download: (source_id:string) =>
doc_download: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_DOWNLOAD_SOURCE_FILE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_DOWNLOAD_SOURCE_FILE.getWorkspacePermissionWorkspaceManageRole,
PermissionConst.KNOWLEDGE_DOCUMENT_DOWNLOAD_SOURCE_FILE.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_DOCUMENT_DOWNLOAD_SOURCE_FILE
.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_tag: (source_id:string) =>
),
doc_tag: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_TAG.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_TAG.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
doc_replace: (source_id:string) =>
doc_replace: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_DOCUMENT_REPLACE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_DOCUMENT_REPLACE.getKnowledgeWorkspaceResourcePermission(
source_id,
),
PermissionConst.KNOWLEDGE_DOCUMENT_REPLACE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
knowledge_chat_user_read: (source_id:string) => false,
knowledge_chat_user_edit: (source_id:string) =>
knowledge_chat_user_read: (source_id: string) => false,
knowledge_chat_user_edit: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_CHAT_USER_EDIT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_CHAT_USER_EDIT.getWorkspacePermissionWorkspaceManageRole,
]
,'OR'
],
'OR',
),
problem_read: (source_id:string) =>
problem_read: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_PROBLEM_READ.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_PROBLEM_READ.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
problem_create: (source_id:string) =>
),
problem_create: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_PROBLEM_CREATE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_PROBLEM_CREATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
problem_relate: (source_id:string) =>
problem_relate: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_PROBLEM_RELATE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_PROBLEM_RELATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
problem_delete: (source_id:string) =>
problem_delete: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_PROBLEM_DELETE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_PROBLEM_DELETE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
problem_edit: (source_id:string) =>
problem_edit: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_PROBLEM_EDIT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_PROBLEM_EDIT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
tag_read: (source_id:string) =>
tag_read: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_TAG_READ.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_TAG_READ.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
tag_create: (source_id:string) =>
tag_create: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_TAG_CREATE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_TAG_CREATE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
tag_edit: (source_id:string) =>
tag_edit: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_TAG_EDIT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_TAG_EDIT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
tag_delete: (source_id:string) =>
tag_delete: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_TAG_DELETE.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_TAG_DELETE.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
chat_user_edit: (source_id:string) =>
chat_user_edit: (source_id: string) =>
hasPermission(
[
new ComplexPermission([RoleConst.USER],[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],[],'AND'),
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_CHAT_USER_EDIT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_CHAT_USER_EDIT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
hit_test: () => false,
debug: (source_id: string) => true,
hit_test: () => false,
}
export default workspace

View File

@ -23,15 +23,28 @@ const DocumentRouter = {
permission: [
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return new ComplexPermission([RoleConst.USER], [PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(to ? to.params.id : '',)], [], 'AND') }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return new ComplexPermission(
[RoleConst.USER],
[
PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
),
],
[],
'AND',
)
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') { }
else {
} else if (to.params.folderId == 'resource-management') {
} else {
return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole()
}
},
@ -39,8 +52,8 @@ const DocumentRouter = {
const to: any = get_next_route()
if (to.params.folderId == 'shared') {
return PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_READ
} else if (to.params.folderId == 'resource-management') { }
else {
} else if (to.params.folderId == 'resource-management') {
} else {
return PermissionConst.KNOWLEDGE_DOCUMENT_READ.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
)
@ -48,15 +61,22 @@ const DocumentRouter = {
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else {
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return PermissionConst.KNOWLEDGE_DOCUMENT_READ.getWorkspacePermissionWorkspaceManageRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'share') {
return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_DOCUMENT_READ.getWorkspacePermission()], [], 'AND')
return new ComplexPermission(
[RoleConst.EXTENDS_USER.getWorkspaceRole()],
[PermissionConst.KNOWLEDGE_DOCUMENT_READ.getWorkspacePermission()],
[],
'AND',
)
}
},
() => {
@ -67,16 +87,36 @@ const DocumentRouter = {
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return RoleConst.ADMIN }
if (to.params.folderId == 'resource-management') {
return RoleConst.ADMIN
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return PermissionConst.RESOURCE_KNOWLEDGE_DOCUMENT_READ }
if (to.params.folderId == 'resource-management') {
return PermissionConst.RESOURCE_KNOWLEDGE_DOCUMENT_READ
}
},
],
},
component: () => import('@/views/document/index.vue'),
},
{
path: 'setting',
name: 'knowledge-setting',
meta: {
title: '知识库工作流',
icon: 'app-problems',
activeMenu: '/knowledge',
sameRoute: 'knowledge',
},
redirect: (menu: any) => {
const from = 'workspace'
console.log(`/knowledge/${from}/${menu.params.id}/workflow`)
return `/knowledge/${from}/${menu.params.id}/workflow`
},
component: () => import('@/views/knowledge/index.vue'),
},
{
path: 'problem',
name: 'Problem',
@ -91,18 +131,37 @@ const DocumentRouter = {
permission: [
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return new ComplexPermission([RoleConst.USER], [PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(to ? to.params.id : '',)], [], 'AND') }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return new ComplexPermission(
[RoleConst.USER],
[
PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
),
],
[],
'AND',
)
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole() }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return PermissionConst.SHARED_KNOWLEDGE_PROBLEM_READ } else if (to.params.folderId == 'resource-management') { }
else {
if (to.params.folderId == 'shared') {
return PermissionConst.SHARED_KNOWLEDGE_PROBLEM_READ
} else if (to.params.folderId == 'resource-management') {
} else {
return PermissionConst.KNOWLEDGE_PROBLEM_READ.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
)
@ -110,13 +169,22 @@ const DocumentRouter = {
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return PermissionConst.KNOWLEDGE_PROBLEM_READ.getWorkspacePermissionWorkspaceManageRole() }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return PermissionConst.KNOWLEDGE_PROBLEM_READ.getWorkspacePermissionWorkspaceManageRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'share') {
return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_PROBLEM_READ.getWorkspacePermission()], [], 'AND')
return new ComplexPermission(
[RoleConst.EXTENDS_USER.getWorkspaceRole()],
[PermissionConst.KNOWLEDGE_PROBLEM_READ.getWorkspacePermission()],
[],
'AND',
)
}
},
() => {
@ -127,11 +195,15 @@ const DocumentRouter = {
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return RoleConst.ADMIN }
if (to.params.folderId == 'resource-management') {
return RoleConst.ADMIN
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return PermissionConst.RESOURCE_KNOWLEDGE_PROBLEM_READ }
if (to.params.folderId == 'resource-management') {
return PermissionConst.RESOURCE_KNOWLEDGE_PROBLEM_READ
}
},
],
},
@ -150,18 +222,37 @@ const DocumentRouter = {
permission: [
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return new ComplexPermission([RoleConst.USER], [PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(to ? to.params.id : '',)], [], 'AND') }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return new ComplexPermission(
[RoleConst.USER],
[
PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
),
],
[],
'AND',
)
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole() }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return PermissionConst.SHARED_KNOWLEDGE_HIT_TEST_READ } else if (to.params.folderId == 'resource-management') { }
else {
if (to.params.folderId == 'shared') {
return PermissionConst.SHARED_KNOWLEDGE_HIT_TEST_READ
} else if (to.params.folderId == 'resource-management') {
} else {
return PermissionConst.KNOWLEDGE_HIT_TEST_READ.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
)
@ -169,13 +260,22 @@ const DocumentRouter = {
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return PermissionConst.KNOWLEDGE_HIT_TEST_READ.getWorkspacePermissionWorkspaceManageRole() }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return PermissionConst.KNOWLEDGE_HIT_TEST_READ.getWorkspacePermissionWorkspaceManageRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'share') {
return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_HIT_TEST_READ.getWorkspacePermission()], [], 'AND')
return new ComplexPermission(
[RoleConst.EXTENDS_USER.getWorkspaceRole()],
[PermissionConst.KNOWLEDGE_HIT_TEST_READ.getWorkspacePermission()],
[],
'AND',
)
}
},
() => {
@ -186,11 +286,15 @@ const DocumentRouter = {
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return RoleConst.ADMIN }
if (to.params.folderId == 'resource-management') {
return RoleConst.ADMIN
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return PermissionConst.RESOURCE_KNOWLEDGE_HIT_TEST }
if (to.params.folderId == 'resource-management') {
return PermissionConst.RESOURCE_KNOWLEDGE_HIT_TEST
}
},
],
},
@ -208,61 +312,96 @@ const DocumentRouter = {
parentName: 'KnowledgeDetail',
resourceType: SourceTypeEnum.KNOWLEDGE,
group: 'KnowledgeDetail',
permission: [new ComplexPermission([RoleConst.ADMIN,
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') { return RoleConst.ADMIN }
else {
return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole()
}
},], [
permission: [
new ComplexPermission(
[
RoleConst.ADMIN,
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
return RoleConst.ADMIN
} else {
return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole()
}
},
],
[
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') {
return PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_READ
} else if (to.params.folderId == 'resource-management') {
return PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ
} else {
return PermissionConst.KNOWLEDGE_CHAT_USER_READ.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
)
}
},
() => {
const to: any = get_next_route()
if (to.params.folder_id == 'shared') {
return PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_READ
} else if (to.params.folderId == 'resource-management') {
return PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ
} else {
return PermissionConst.KNOWLEDGE_CHAT_USER_READ.getWorkspacePermissionWorkspaceManageRole()
}
},
],
[EditionConst.IS_EE, EditionConst.IS_PE],
'OR',
),
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') {
return PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_READ
} else if (to.params.folderId == 'resource-management') { return PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ }
else {
return PermissionConst.KNOWLEDGE_CHAT_USER_READ.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return new ComplexPermission(
[RoleConst.USER],
[
PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
),
],
[EditionConst.IS_EE, EditionConst.IS_PE],
'AND',
)
}
},
() => {
const to: any = get_next_route()
if (to.params.folder_id == 'shared') {
return PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_READ
} else if (to.params.folderId == 'resource-management') { return PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ }
else { return PermissionConst.KNOWLEDGE_CHAT_USER_READ.getWorkspacePermissionWorkspaceManageRole() }
if (to.params.folderId == 'share') {
return new ComplexPermission(
[RoleConst.EXTENDS_USER.getWorkspaceRole()],
[PermissionConst.KNOWLEDGE_CHAT_USER_READ.getWorkspacePermission()],
[],
'AND',
)
}
},
], [EditionConst.IS_EE, EditionConst.IS_PE], 'OR'),
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return new ComplexPermission([RoleConst.USER], [PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(to ? to.params.id : '',)], [EditionConst.IS_EE, EditionConst.IS_PE], 'AND') }
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'share') {
return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_CHAT_USER_READ.getWorkspacePermission()], [], 'AND')
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'share') {
return RoleConst.USER.getWorkspaceRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return RoleConst.ADMIN }
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ }
},
]
() => {
const to: any = get_next_route()
if (to.params.folderId == 'share') {
return RoleConst.USER.getWorkspaceRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') {
return RoleConst.ADMIN
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') {
return PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ
}
},
],
},
component: () => import('@/views/chat-user/index.vue'),
},
@ -280,18 +419,37 @@ const DocumentRouter = {
permission: [
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return new ComplexPermission([RoleConst.USER], [PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(to ? to.params.id : '',)], [], 'AND') }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return new ComplexPermission(
[RoleConst.USER],
[
PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
),
],
[],
'AND',
)
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole() }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return RoleConst.WORKSPACE_MANAGE.getWorkspaceRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return PermissionConst.SHARED_KNOWLEDGE_EDIT } else if (to.params.folderId == 'resource-management') { }
else {
if (to.params.folderId == 'shared') {
return PermissionConst.SHARED_KNOWLEDGE_EDIT
} else if (to.params.folderId == 'resource-management') {
} else {
return PermissionConst.KNOWLEDGE_EDIT.getKnowledgeWorkspaceResourcePermission(
to ? to.params.id : '',
)
@ -299,13 +457,22 @@ const DocumentRouter = {
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'shared') { return RoleConst.ADMIN } else if (to.params.folderId == 'resource-management') { }
else { return PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermissionWorkspaceManageRole() }
if (to.params.folderId == 'shared') {
return RoleConst.ADMIN
} else if (to.params.folderId == 'resource-management') {
} else {
return PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermissionWorkspaceManageRole()
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'share') {
return new ComplexPermission([RoleConst.EXTENDS_USER.getWorkspaceRole()], [PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermission()], [], 'AND')
return new ComplexPermission(
[RoleConst.EXTENDS_USER.getWorkspaceRole()],
[PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermission()],
[],
'AND',
)
}
},
() => {
@ -316,11 +483,15 @@ const DocumentRouter = {
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return RoleConst.ADMIN }
if (to.params.folderId == 'resource-management') {
return RoleConst.ADMIN
}
},
() => {
const to: any = get_next_route()
if (to.params.folderId == 'resource-management') { return PermissionConst.RESOURCE_KNOWLEDGE_EDIT }
if (to.params.folderId == 'resource-management') {
return PermissionConst.RESOURCE_KNOWLEDGE_EDIT
}
},
],
},

View File

@ -36,6 +36,13 @@ export const routes: Array<RouteRecordRaw> = [
meta: { activeMenu: '/application' },
component: () => import('@/views/application-workflow/index.vue'),
},
// 高级编排
{
path: '/knowledge/:from/:id/workflow',
name: 'KnowledgeWorkflow',
meta: { activeMenu: '/knowledge' },
component: () => import('@/views/knowledge-workflow/index.vue'),
},
// 对话
{
path: '/chat/:accessToken',

View File

@ -159,7 +159,7 @@ import { ComplexPermission } from '@/utils/permission/type'
import { EditionConst, PermissionConst, RoleConst } from '@/utils/permission/data'
import permissionMap from '@/permission'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
provide('getApplicationDetail', () => detail)
provide('getResourceDetail', () => detail)
const { theme } = useStore()
const router = useRouter()
const route = useRoute()

View File

@ -0,0 +1,350 @@
<template>
<div v-show="show" class="workflow-dropdown-menu border border-r-6 white-bg" :style="{ width: activeName === 'base' ? '400px':'640px' }">
<el-tabs v-model="activeName" class="workflow-dropdown-tabs" @tab-change="handleClick">
<div
v-show="activeName === 'base'"
style="display: flex; width: 100%; justify-content: center"
class="mb-12 mt-12"
>
<el-input
v-model="search_text"
class="mr-12 ml-12"
:placeholder="$t('views.applicationWorkflow.searchBar.placeholder')"
>
<template #suffix>
<el-icon class="el-input__icon">
<search />
</el-icon>
</template>
</el-input>
</div>
<el-tab-pane :label="$t('views.applicationWorkflow.baseComponent')" name="base">
<el-scrollbar height="400">
<div v-if="filter_menu_nodes.length > 0">
<template v-for="(node, index) in filter_menu_nodes" :key="index">
<el-text type="info" size="small" class="color-secondary ml-12">{{
node.label
}}</el-text>
<div class="flex-wrap" style="gap: 12px; padding: 12px">
<template v-for="(item, index) in node.list" :key="index">
<el-popover placement="right" :width="280" :show-after="500">
<template #reference>
<div
class="list-item flex align-center border border-r-6 p-8-12 cursor"
style="width: calc(50% - 6px)"
@click.stop="clickNodes(item)"
@mousedown.stop="onmousedown(item)"
>
<component
:is="iconComponent(`${item.type}-icon`)"
class="mr-8"
:size="20"
/>
<div class="lighter">{{ item.label }}</div>
</div>
</template>
<template #default>
<div class="flex align-center mb-8">
<component
:is="iconComponent(`${item.type}-icon`)"
class="mr-8"
:size="32"
/>
<div class="lighter color-text-primary">{{ item.label }}</div>
</div>
<el-text type="info" size="small" class="color-secondary lighter">{{
item.text
}}</el-text>
</template>
</el-popover>
</template>
</div>
</template>
</div>
<div v-else class="ml-16 mt-8">
<el-text type="info">{{ $t('views.applicationWorkflow.tip.noData') }}</el-text>
</div>
</el-scrollbar>
</el-tab-pane>
<!-- 工具 -->
<el-tab-pane :label="$t('views.tool.title')" name="tool">
<LayoutContainer>
<template #left>
<div class="p-8">
<folder-tree
:source="SourceTypeEnum.TOOL"
:data="toolTreeData"
:currentNodeKey="folder.currentFolder?.id"
@handleNodeClick="folderClickHandle"
:shareTitle="$t('views.shared.shared_tool')"
:showShared="permissionPrecise['is_share']()"
:canOperation="false"
/>
</div>
</template>
<el-scrollbar height="450">
<NodeContent
:list="toolList"
@clickNodes="(val: any) => clickNodes(toolLibNode, val, 'tool')"
@onmousedown="(val: any) => onmousedown(toolLibNode, val, 'tool')"
/>
</el-scrollbar>
</LayoutContainer>
</el-tab-pane>
<!-- 应用 -->
<el-tab-pane :label="$t('views.application.title')" name="application">
<LayoutContainer>
<template #left>
<div class="p-8">
<folder-tree
:source="SourceTypeEnum.APPLICATION"
:data="applicationTreeData"
:currentNodeKey="folder.currentFolder?.id"
@handleNodeClick="folderClickHandle"
:canOperation="false"
/>
</div>
</template>
<el-scrollbar height="450">
<NodeContent
:list="applicationList"
@clickNodes="(val: any) => clickNodes(applicationNode, val, 'application')"
@onmousedown="(val: any) => onmousedown(applicationNode, val, 'application')"
/>
</el-scrollbar>
</LayoutContainer>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, computed, inject } from 'vue'
import { getMenuNodes, toolLibNode, applicationNode } from '@/workflow/common/data'
import { iconComponent } from '@/workflow/icons/utils'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import { isWorkFlow } from '@/utils/application'
import useStore from '@/stores'
import NodeContent from './NodeContent.vue'
import { SourceTypeEnum } from '@/enums/common'
import permissionMap from '@/permission'
import { useRoute } from 'vue-router'
import { WorkflowMode } from '@/enums/application'
const workflowModel = inject('workflowMode') as WorkflowMode
const route = useRoute()
const { user, folder } = useStore()
const menuNodes = getMenuNodes(workflowModel || WorkflowMode.Application)
const search_text = ref<string>('')
const props = defineProps({
show: {
type: Boolean,
default: false,
},
id: {
type: String,
default: '',
},
workflowRef: Object,
})
const emit = defineEmits(['clickNodes', 'onmousedown'])
const apiType = computed(() => {
if (route.path.includes('resource-management')) {
return 'systemManage'
} else {
return 'workspace'
}
})
const permissionPrecise = computed(() => {
return permissionMap['tool'][apiType.value]
})
const loading = ref(false)
const activeName = ref('base')
const filter_menu_nodes = computed(() => {
if (!search_text.value) return menuNodes || []
const searchTerm = search_text.value.toLowerCase()
return (menuNodes || []).reduce((result: any[], item) => {
const filteredList = item.list.filter((listItem) =>
listItem.label.toLowerCase().includes(searchTerm),
)
if (filteredList.length) {
result.push({ ...item, list: filteredList })
}
return result
}, [])
})
function clickNodes(item: any, data?: any, type?: string) {
if (data) {
item['properties']['stepName'] = data.name
if (type == 'tool') {
item['properties']['node_data'] = {
...data,
tool_lib_id: data.id,
input_field_list: data.input_field_list.map((field: any) => ({
...field,
value: field.source == 'reference' ? [] : '',
})),
}
}
if (type == 'application') {
item['properties']['node_data'] = {
name: data.name,
icon: data.icon,
application_id: data.id,
}
}
}
props.workflowRef?.addNode(item)
emit('clickNodes', item)
}
function onmousedown(item: any, data?: any, type?: string) {
if (data) {
item['properties']['stepName'] = data.name
if (type == 'tool') {
item['properties']['node_data'] = {
...data,
tool_lib_id: data.id,
input_field_list: data.input_field_list.map((field: any) => ({
...field,
value: field.source == 'reference' ? [] : '',
})),
}
}
if (type == 'application') {
if (isWorkFlow(data.type)) {
const nodeData = data.work_flow.nodes[0].properties.node_data
const fileUploadSetting = nodeData.file_upload_setting
item['properties']['node_data'] = {
name: data.name,
icon: data.icon,
application_id: data.id,
}
} else {
item['properties']['node_data'] = {
name: data.name,
icon: data.icon,
application_id: data.id,
}
}
}
}
props.workflowRef?.onmousedown(item)
emit('onmousedown', item)
}
const toolTreeData = ref<any[]>([])
const toolList = ref<any[]>([])
async function getToolFolder() {
const res: any = await folder.asyncGetFolder(SourceTypeEnum.TOOL, {}, loading)
toolTreeData.value = res.data
folder.setCurrentFolder(res.data?.[0] || {})
}
async function getToolList() {
const res = await loadSharedApi({
type: 'tool',
isShared: folder.currentFolder?.id === 'share',
systemType: 'workspace',
}).getToolList({
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
tool_type: 'CUSTOM',
})
toolList.value = res.data?.tools || res.data || []
toolList.value = toolList.value?.filter((item: any) => item.is_active)
}
const applicationTreeData = ref<any[]>([])
const applicationList = ref<any[]>([])
function getApplicationFolder() {
folder.asyncGetFolder(SourceTypeEnum.APPLICATION, {}, loading).then((res: any) => {
applicationTreeData.value = res.data
folder.setCurrentFolder(res.data?.[0] || {})
})
}
async function getApplicationList() {
const res = await loadSharedApi({
type: 'application',
systemType: 'workspace',
}).getAllApplication({
folder_id: folder.currentFolder?.id || user.getWorkspaceId(),
})
applicationList.value = res.data.filter(
(item: any) => item.resource_type === 'application' && item.id !== props.id && item.is_publish,
)
}
function folderClickHandle(row: any) {
folder.setCurrentFolder(row)
if (activeName.value === 'tool') {
getToolList()
} else {
getApplicationList()
}
}
async function handleClick(val: string) {
console.log(val)
if (val === 'tool') {
await getToolFolder()
getToolList()
} else if (val === 'application') {
getApplicationFolder()
getApplicationList()
}
}
onMounted(() => {})
</script>
<style lang="scss" scoped>
.workflow-dropdown-menu {
-moz-user-select: none; /* Firefox */
-webkit-user-select: none; /* WebKit内核 */
-ms-user-select: none; /* IE10及以后 */
-khtml-user-select: none; /* 早期浏览器 */
-o-user-select: none; /* Opera */
user-select: none; /* CSS3属性 */
position: absolute;
top: 49px;
right: 16px;
z-index: 99;
width: 600px;
box-shadow: 0px 4px 8px 0px var(--app-text-color-light-1);
padding-bottom: 8px;
.title {
padding: 12px 12px 4px;
}
.workflow-dropdown-item {
&:hover {
background: var(--app-text-color-light-1);
}
}
.list-item {
box-sizing: border-box;
&:hover {
border-color: var(--el-color-primary);
}
}
:deep(.el-tabs__header) {
margin-bottom: 0;
}
:deep(.tree-height) {
height: 400px;
}
}
</style>

View File

@ -0,0 +1,122 @@
<template>
<el-input
v-model.trim="filterText"
:placeholder="$t('common.search')"
prefix-icon="Search"
clearable
style="padding: 12px 12px 0 12px"
/>
<div class="list flex-wrap">
<template v-if="filterList.length">
<el-popover
v-for="item in filterList"
:key="item.id"
placement="right"
:width="280"
:show-after="500"
>
<template #reference>
<div
class="list-item flex align-center border border-r-6 p-8-12 cursor"
style="width: calc(50% - 6px)"
@click.stop="emit('clickNodes', item)"
@mousedown.stop="emit('onmousedown', item)"
>
<el-avatar
v-if="isAppIcon(item?.icon)"
shape="square"
:size="20"
style="background: none"
>
<img :src="resetUrl(item?.icon, resetUrl('./favicon.ico'))" alt="" />
</el-avatar>
<el-avatar v-else class="avatar-green" shape="square" :size="20">
<img src="@/assets/workflow/icon_tool.svg" style="width: 58%" alt="" />
</el-avatar>
<span class="ml-8 ellipsis" :title="item.name">{{ item.name }}</span>
</div>
</template>
<template #default>
<div class="flex-between">
<div class="flex align-center">
<el-avatar
v-if="isAppIcon(item?.icon)"
shape="square"
:size="20"
style="background: none"
>
<img :src="resetUrl(item?.icon, resetUrl('./favicon.ico'))" alt="" />
</el-avatar>
<el-avatar v-else class="avatar-green" shape="square" :size="20">
<img src="@/assets/workflow/icon_tool.svg" style="width: 58%" alt="" />
</el-avatar>
<span class="font-medium ml-8 break-all" :title="item.name">{{ item.name }}</span>
</div>
<div v-if="item.type" class="status-tag" style="margin-left: auto">
<el-tag class="warning-tag" v-if="isWorkFlow(item.type)">
{{ $t('views.application.workflow') }}
</el-tag>
<el-tag class="blue-tag" v-else>
{{ $t('views.application.simple') }}
</el-tag>
</div>
</div>
<el-text type="info" size="small" class="mt-4">{{ item.desc }}</el-text>
</template>
</el-popover>
</template>
<el-empty v-else :description="$t('common.noData')" />
</div>
</template>
<script setup lang="ts">
import { watch, ref } from 'vue'
import { isAppIcon, resetUrl } from '@/utils/common'
import { isWorkFlow } from '@/utils/application'
const props = defineProps<{
list: any[]
}>()
const emit = defineEmits<{
(e: 'clickNodes', item: any): void
(e: 'onmousedown', item: any): void
}>()
const filterText = ref('')
const filterList = ref<any[]>([])
function filter(list: any[], filterText: string) {
if (!filterText.length) {
return list
}
return list.filter((v: any) => v.name.toLowerCase().includes(filterText.toLowerCase()))
}
watch([() => filterText.value, () => props.list], () => {
filterList.value = filter(props.list, filterText.value)
})
</script>
<style lang="scss" scoped>
.list {
cursor: default;
padding: 12px;
gap: 12px;
box-sizing: border-box;
.list-item {
background-color: #ffffff;
box-sizing: border-box;
&:hover {
border-color: var(--el-color-primary);
}
}
.el-empty {
margin: 0 auto;
}
}
</style>

View File

@ -0,0 +1,157 @@
<template>
<div class="workflow-publish-history border-l white-bg">
<h4 class="border-b p-16-24">{{ $t('views.applicationWorkflow.setting.releaseHistory') }}</h4>
<div class="list-height pt-0">
<el-scrollbar>
<div class="p-8 pt-0">
<common-list
:data="LogData"
class="mt-8"
v-loading="loading"
@click="clickListHandle"
@mouseenter="mouseenter"
@mouseleave="mouseId = ''"
>
<template #default="{ row, index }">
<div class="flex-between">
<div style="max-width: 80%">
<h5 :class="index === 0 ? 'primary' : ''" class="flex align-center">
<ReadWrite
@change="editName($event, row)"
:data="row.name || datetimeFormat(row.update_time)"
trigger="manual"
:write="row.writeStatus"
@close="closeWrite(row)"
/>
<el-tag v-if="index === 0" class="default-tag ml-4">{{
$t('views.applicationWorkflow.setting.latestRelease')
}}</el-tag>
</h5>
<el-text type="info" class="color-secondary flex align-center mt-8">
<el-avatar :size="20" class="avatar-grey mr-4">
<el-icon><UserFilled /></el-icon>
</el-avatar>
{{ row.publish_user_name }}
</el-text>
</div>
<div @click.stop v-show="mouseId === row.id">
<el-dropdown trigger="click" :teleported="false">
<el-button text>
<AppIcon iconName="app-more"></AppIcon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click.stop="openEditVersion(row)">
<AppIcon iconName="app-edit" class="color-secondary"></AppIcon>
{{ $t('common.edit') }}
</el-dropdown-item>
<el-dropdown-item @click="refreshVersion(row)">
<el-icon class="color-secondary"><RefreshLeft /></el-icon>
{{ $t('views.applicationWorkflow.setting.restoreCurrentVersion') }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</template>
<template #empty>
<div class="text-center">
<el-text type="info"> {{ $t('chat.noHistory') }}</el-text>
</div>
</template>
</common-list>
</div>
</el-scrollbar>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, computed } from 'vue'
import { useRoute } from 'vue-router'
import { datetimeFormat } from '@/utils/time'
import { MsgSuccess, MsgError } from '@/utils/message'
import { t } from '@/locales'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const route = useRoute()
const {
params: { id },
} = route as any
const apiType = computed(() => {
if (route.path.includes('resource-management')) {
return 'systemManage'
} else {
return 'workspace'
}
})
const emit = defineEmits(['click', 'refreshVersion'])
const loading = ref(false)
const LogData = ref<any[]>([])
const mouseId = ref('')
function mouseenter(row: any) {
mouseId.value = row.id
}
function clickListHandle(item: any) {
emit('click', item)
}
function refreshVersion(item: any) {
emit('refreshVersion', item)
}
function openEditVersion(item: any) {
item['writeStatus'] = true
}
function closeWrite(item: any) {
item['writeStatus'] = false
}
function editName(val: string, item: any) {
if (val) {
const obj = {
name: val,
}
loadSharedApi({ type: 'workflowVersion', systemType: apiType.value })
.putWorkFlowVersion(id as string, item.id, obj, loading)
.then(() => {
MsgSuccess(t('common.modifySuccess'))
item['writeStatus'] = false
getList()
})
} else {
MsgError(t('views.applicationWorkflow.tip.nameMessage'))
}
}
function getList() {
loadSharedApi({ type: 'workflowVersion', systemType: apiType.value })
.getWorkFlowVersion(id, loading)
.then((res: any) => {
LogData.value = res.data
})
}
onMounted(() => {
getList()
})
</script>
<style lang="scss" scoped>
.workflow-publish-history {
width: 320px;
position: absolute;
right: 0;
top: 57px;
height: calc(100vh - 57px);
z-index: 9;
.list-height {
height: calc(100vh - 120px);
}
}
</style>

View File

@ -0,0 +1,605 @@
<template>
<div class="knowledge-workflow" v-loading="loading">
<div class="header border-b flex-between p-12-24 white-bg">
<div class="flex align-center">
<back-button @click="back"></back-button>
<h4 class="ellipsis" style="max-width: 300px" :title="detail?.name">{{ detail?.name }}</h4>
<div v-if="showHistory && disablePublic">
<el-text type="info" class="ml-16 color-secondary"
>{{ $t('views.knowledgeWorkflow.info.previewVersion') }}
{{ currentVersion.name || datetimeFormat(currentVersion.update_time) }}</el-text
>
</div>
<el-text type="info" class="ml-16 color-secondary" v-else-if="saveTime"
>{{ $t('views.knowledgeWorkflow.info.saveTime') }}{{ datetimeFormat(saveTime) }}</el-text
>
</div>
<div v-if="showHistory && disablePublic">
<el-button type="primary" class="mr-8" @click="refreshVersion()">
{{ $t('views.knowledgeWorkflow.setting.restoreVersion') }}
</el-button>
<el-divider direction="vertical" />
<el-button text @click="closeHistory">
<el-icon>
<Close />
</el-icon>
</el-button>
</div>
<div v-else>
<el-button @click="showPopover = !showPopover">
<AppIcon iconName="app-add-outlined" class="mr-4" />
{{ $t('views.knowledgeWorkflow.setting.addComponent') }}
</el-button>
<el-button @click="clickShowDebug" :disabled="showDebug" v-if="permissionPrecise.debug(id)">
<AppIcon iconName="app-debug-outlined" class="mr-4"></AppIcon>
{{ $t('views.knowledgeWorkflow.setting.debug') }}
</el-button>
<el-button @click="saveknowledge(true)">
<AppIcon iconName="app-save-outlined" class="mr-4"></AppIcon>
{{ $t('common.save') }}
</el-button>
<el-button type="primary" @click="publish">
{{ $t('views.knowledge.operation.publish') }}
</el-button>
<el-dropdown trigger="click">
<el-button text @click.stop class="ml-8 mt-4">
<AppIcon iconName="app-more" class="rotate-90"></AppIcon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<a :href="shareUrl" target="_blank">
<el-dropdown-item>
<AppIcon iconName="app-create-chat" class="color-secondary"></AppIcon>
{{ $t('views.knowledge.operation.toChat') }}
</el-dropdown-item>
</a>
<el-dropdown-item @click="openHistory">
<AppIcon iconName="app-history-outlined" class="color-secondary"></AppIcon>
{{ $t('views.knowledgeWorkflow.setting.releaseHistory') }}
</el-dropdown-item>
<el-dropdown-item>
<AppIcon iconName="app-save-outlined" class="color-secondary"></AppIcon>
{{ $t('views.knowledgeWorkflow.setting.autoSave') }}
<div class="ml-4">
<el-switch size="small" v-model="isSave" @change="changeSave" />
</div>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
<!-- 下拉框 -->
<el-collapse-transition>
<DropdownMenu
:show="showPopover"
:id="id"
v-click-outside="clickoutside"
@clickNodes="clickNodes"
@onmousedown="onmousedown"
:workflowRef="workflowRef"
/>
</el-collapse-transition>
<!-- 主画布 -->
<div class="workflow-main" ref="workflowMainRef">
<workflow ref="workflowRef" v-if="detail" :data="detail?.work_flow" />
</div>
<!-- 调试 -->
<el-collapse-transition>
<div class="workflow-debug-container" :class="enlarge ? 'enlarge' : ''" v-if="showDebug">
<div class="workflow-debug-header" :class="!isDefaultTheme ? 'custom-header' : ''">
<div class="flex-between">
<div class="flex align-center">
<div class="mr-12 ml-24 flex">
<el-avatar
v-if="isAppIcon(detail?.icon)"
shape="square"
:size="32"
style="background: none"
>
<img :src="resetUrl(detail?.icon)" alt="" />
</el-avatar>
<LogoIcon v-else height="32px" />
</div>
<h4 class="ellipsis" style="max-width: 270px" :title="detail?.name">
{{ detail?.name || $t('views.knowledge.form.appName.label') }}
</h4>
</div>
<div class="mr-16">
<el-button link @click="enlarge = !enlarge">
<AppIcon
:iconName="enlarge ? 'app-minify' : 'app-magnify'"
class="color-secondary"
style="font-size: 20px"
>
</AppIcon>
</el-button>
<el-button link @click="showDebug = false">
<el-icon :size="20" class="color-secondary">
<Close />
</el-icon>
</el-button>
</div>
</div>
</div>
<div class="scrollbar-height">
<AiChat :knowledge-details="detail" :type="'debug-ai-chat'"></AiChat>
</div>
</div>
</el-collapse-transition>
<!-- 发布历史 -->
<PublishHistory
v-if="showHistory"
@click="checkVersion"
v-click-outside="clickoutsideHistory"
@refreshVersion="refreshVersion"
/>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, onBeforeUnmount, computed, nextTick, provide } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import type { Action } from 'element-plus'
import Workflow from '@/workflow/index.vue'
import DropdownMenu from '@/views/knowledge-workflow/component/DropdownMenu.vue'
import PublishHistory from '@/views/knowledge-workflow/component/PublishHistory.vue'
import { isAppIcon, resetUrl } from '@/utils/common'
import { MsgSuccess, MsgError, MsgConfirm } from '@/utils/message'
import { datetimeFormat } from '@/utils/time'
import { mapToUrlParams } from '@/utils/application'
import useStore from '@/stores'
import { WorkFlowInstance } from '@/workflow/common/validate'
import { hasPermission } from '@/utils/permission'
import { t } from '@/locales'
import { ComplexPermission } from '@/utils/permission/type'
import { EditionConst, PermissionConst, RoleConst } from '@/utils/permission/data'
import permissionMap from '@/permission'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
provide('getResourceDetail', () => detail)
provide('workflowMode', 'application')
const { theme } = useStore()
const router = useRouter()
const route = useRoute()
const {
params: { id, from },
} = route as any
const apiType = computed(() => {
if (route.path.includes('resource-management')) {
return 'systemManage'
} else {
return 'workspace'
}
})
const permissionPrecise = computed(() => {
return permissionMap['knowledge'][apiType.value]
})
const isDefaultTheme = computed(() => {
return theme.isDefaultTheme()
})
let interval: any
const workflowRef = ref()
const workflowMainRef = ref()
const loading = ref(false)
const detail = ref<any>(null)
const showPopover = ref(false)
const showDebug = ref(false)
const enlarge = ref(false)
const saveTime = ref<any>('')
const isSave = ref(false)
const showHistory = ref(false)
const disablePublic = ref(false)
const currentVersion = ref<any>({})
const cloneWorkFlow = ref(null)
const apiInputParams = ref([])
const urlParams = computed(() =>
mapToUrlParams(apiInputParams.value) ? '?' + mapToUrlParams(apiInputParams.value) : '',
)
const shareUrl = computed(
() => `${window.location.origin}/chat/` + detail.value?.access_token + urlParams.value,
)
function back() {
if (JSON.stringify(cloneWorkFlow.value) !== JSON.stringify(getGraphData())) {
MsgConfirm(t('common.tip'), t('views.knowledgeWorkflow.tip.saveMessage'), {
confirmButtonText: t('views.knowledgeWorkflow.setting.exitSave'),
cancelButtonText: t('views.knowledgeWorkflow.setting.exit'),
distinguishCancelAndClose: true,
})
.then(() => {
saveknowledge(true, true)
})
.catch((action: Action) => {
if (action === 'cancel') {
go()
}
})
} else {
go()
}
}
function clickoutsideHistory() {
if (!disablePublic.value) {
showHistory.value = false
disablePublic.value = false
}
}
function refreshVersion(item?: any) {
if (item) {
renderGraphData(item)
}
showHistory.value = false
disablePublic.value = false
}
function checkVersion(item: any) {
disablePublic.value = true
currentVersion.value = item
renderGraphData(item)
closeInterval()
}
function renderGraphData(item: any) {
item.work_flow['nodes'].map((v: any) => {
v['properties']['noRender'] = true
})
detail.value.work_flow = item.work_flow
saveTime.value = item?.update_time
workflowRef.value?.clearGraphData()
nextTick(() => {
workflowRef.value?.render(item.work_flow)
})
}
function closeHistory() {
getDetail()
if (isSave.value) {
initInterval()
}
showHistory.value = false
disablePublic.value = false
}
function openHistory() {
showHistory.value = true
}
function changeSave(bool: boolean) {
if (bool) {
initInterval()
} else {
closeInterval()
}
localStorage.setItem('workflowAutoSave', bool.toString())
}
function clickNodes(item: any) {
showPopover.value = false
}
function onmousedown(item: any) {
showPopover.value = false
}
function clickoutside() {
showPopover.value = false
}
const publish = () => {
workflowRef.value
?.validate()
.then(() => {
const workflow = getGraphData()
const workflowInstance = new WorkFlowInstance(workflow)
try {
workflowInstance.is_valid()
} catch (e: any) {
MsgError(e.toString())
return
}
loadSharedApi({ type: 'knowledge', systemType: apiType.value })
.putknowledge(id, { work_flow: workflow }, loading)
.then(() => {
return loadSharedApi({ type: 'knowledge', systemType: apiType.value }).publish(
id,
{},
loading,
)
})
.then((ok: any) => {
detail.value.name = ok.data.name
ok.data.work_flow?.nodes
?.filter((v: any) => v.id === 'base-node')
.map((v: any) => {
apiInputParams.value = v.properties.api_input_field_list
? v.properties.api_input_field_list.map((v: any) => {
return {
name: v.variable,
value: v.default_value,
}
})
: v.properties.input_field_list
? v.properties.input_field_list
.filter((v: any) => v.assignment_method === 'api_input')
.map((v: any) => {
return {
name: v.variable,
value: v.default_value,
}
})
: []
})
MsgSuccess(t('views.knowledge.tip.publishSuccess'))
})
.catch((res: any) => {
const node = res.node
const err_message = res.errMessage
if (typeof err_message == 'string') {
MsgError(
res.node.properties?.stepName +
` ${t('views.knowledgeWorkflow.node').toLowerCase()} ` +
err_message.toLowerCase(),
)
} else {
const keys = Object.keys(err_message)
MsgError(
node.properties?.stepName +
` ${t('views.knowledgeWorkflow.node').toLowerCase()} ` +
err_message[keys[0]]?.[0]?.message.toLowerCase(),
)
}
})
})
.catch((res: any) => {
const node = res.node
const err_message = res.errMessage
if (typeof err_message == 'string') {
MsgError(
res.node.properties?.stepName + ` ${t('views.knowledgeWorkflow.node')}` + err_message,
)
} else {
const keys = Object.keys(err_message)
MsgError(
node.properties?.stepName +
` ${t('views.knowledgeWorkflow.node')}` +
err_message[keys[0]]?.[0]?.message,
)
}
})
}
const clickShowDebug = () => {
workflowRef.value
?.validate()
.then(() => {
const graphData = getGraphData()
const workflow = new WorkFlowInstance(graphData)
try {
workflow.is_valid()
detail.value = {
...detail.value,
type: 'WORK_FLOW',
...workflow.get_base_node()?.properties.node_data,
work_flow: getGraphData(),
}
showDebug.value = true
} catch (e: any) {
MsgError(e.toString())
}
})
.catch((res: any) => {
const node = res.node
const err_message = res.errMessage
if (typeof err_message == 'string') {
MsgError(
res.node.properties?.stepName + ` ${t('views.knowledgeWorkflow.node')}` + err_message,
)
} else {
const keys = Object.keys(err_message)
MsgError(
node.properties?.stepName +
` ${t('views.knowledgeWorkflow.node')}` +
err_message[keys[0]]?.[0]?.message,
)
}
})
}
function getGraphData() {
return workflowRef.value?.getGraphData()
}
function getDetail() {
loadSharedApi({ type: 'knowledge', systemType: apiType.value })
.getKnowledgeDetail(id)
.then((res: any) => {
let workspace = res.data?.work_flow
if (!workspace) {
workspace = {}
}
detail.value = res.data
detail.value.stt_model_id = res.data.stt_model
detail.value.tts_model_id = res.data.tts_model
detail.value.tts_type = res.data.tts_type
saveTime.value = res.data?.update_time
detail.value.work_flow?.nodes
?.filter((v: any) => v.id === 'base-node')
.map((v: any) => {
apiInputParams.value = v.properties.api_input_field_list
? v.properties.api_input_field_list.map((v: any) => {
return {
name: v.variable,
value: v.default_value,
}
})
: v.properties.input_field_list
? v.properties.input_field_list
.filter((v: any) => v.assignment_method === 'api_input')
.map((v: any) => {
return {
name: v.variable,
value: v.default_value,
}
})
: []
})
workflowRef.value?.clearGraphData()
nextTick(() => {
workflowRef.value?.render(detail.value.work_flow)
cloneWorkFlow.value = getGraphData()
})
//
if (hasPermission([EditionConst.IS_EE, EditionConst.IS_PE], 'OR')) {
loadSharedApi({ type: 'knowledge', systemType: apiType.value })
.getknowledgeSetting(id)
.then((ok: any) => {
detail.value = { ...detail.value, ...ok.data }
})
}
})
}
function saveknowledge(bool?: boolean, back?: boolean) {
const obj = {
work_flow: getGraphData(),
}
loading.value = back || false
loadSharedApi({ type: 'knowledge', systemType: apiType.value })
.putKnowledge(id, obj)
.then(() => {
saveTime.value = new Date()
if (bool) {
cloneWorkFlow.value = getGraphData()
MsgSuccess(t('common.saveSuccess'))
if (back) {
go()
}
}
})
.catch(() => {
loading.value = false
})
}
const go = () => {
if (route.path.includes('workspace')) {
return router.push({ path: get_route() })
} else {
return router.push({ path: get_resource_management_route() })
}
}
const get_resource_management_route = () => {
return `/knowledge/${from}/${id}/WORK_FLOW/document`
}
const get_route = () => {
return `/knowledge/${id}/${from}/document`
}
/**
* 定时保存
*/
const initInterval = () => {
interval = setInterval(() => {
saveknowledge()
}, 60000)
}
/**
* 关闭定时
*/
const closeInterval = () => {
if (interval) {
clearInterval(interval)
}
}
onMounted(() => {
getDetail()
const workflowAutoSave = localStorage.getItem('workflowAutoSave')
isSave.value = workflowAutoSave === 'true' ? true : false
//
if (isSave.value) {
initInterval()
}
})
onBeforeUnmount(() => {
//
closeInterval()
workflowRef.value?.clearGraphData()
})
</script>
<style lang="scss">
.knowledge-workflow {
background: var(--app-layout-bg-color);
height: 100%;
.workflow-main {
height: calc(100vh - 62px);
box-sizing: border-box;
}
.workflow-dropdown-tabs {
.el-tabs__nav-wrap {
padding: 0 16px;
}
}
}
.workflow-debug-container {
z-index: 2000;
position: relative;
border-radius: 8px;
border: 1px solid #ffffff;
background: var(--dialog-bg-gradient-color);
box-shadow: 0px 4px 8px 0px var(--app-text-color-light-1);
position: fixed;
bottom: 16px;
right: 16px;
overflow: hidden;
width: 460px;
height: 680px;
.workflow-debug-header {
background: var(--app-header-bg-color);
height: var(--app-header-height);
line-height: var(--app-header-height);
box-sizing: border-box;
border-bottom: 1px solid var(--el-border-color);
}
.scrollbar-height {
height: calc(100% - var(--app-header-height) - 24px);
padding-top: 24px;
}
&.enlarge {
width: 50% !important;
height: 100% !important;
bottom: 0 !important;
right: 0 !important;
}
.chat-width {
max-width: 100% !important;
margin: 0 auto;
}
}
@media only screen and (max-height: 680px) {
.workflow-debug-container {
height: 600px;
}
}
</style>

View File

@ -335,7 +335,7 @@ import { useRoute } from 'vue-router'
import { resetUrl } from '@/utils/common'
import { relatedObject } from '@/utils/array.ts'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -431,14 +431,14 @@ const validate = () => {
})
}
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'LLM',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'LLM',
@ -522,7 +522,7 @@ function getToolSelectOptions() {
? {
scope: 'WORKSPACE',
tool_type: 'CUSTOM',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
scope: 'WORKSPACE',
@ -545,7 +545,7 @@ function getMcpToolSelectOptions() {
? {
scope: 'WORKSPACE',
tool_type: 'MCP',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
scope: 'WORKSPACE',

View File

@ -179,7 +179,7 @@ import FileUploadSettingDialog from '@/workflow/nodes/base-node/component/FileUp
import ChatFieldTable from './component/ChatFieldTable.vue'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -261,13 +261,13 @@ const validate = () => {
})
}
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSTTModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'STT',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'STT',
@ -284,7 +284,7 @@ function getTTSModel() {
apiType.value === 'systemManage'
? {
model_type: 'TTS',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'TTS',

View File

@ -161,7 +161,7 @@ import AIModeParamSettingDialog from '@/views/application/component/AIModeParamS
import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -226,13 +226,13 @@ const form_data = computed({
},
})
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'TTI',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'TTI',

View File

@ -16,7 +16,9 @@
prop="model_id"
:rules="{
required: true,
message: $t('views.applicationWorkflow.nodes.imageToVideoGenerate.model.requiredMessage'),
message: $t(
'views.applicationWorkflow.nodes.imageToVideoGenerate.model.requiredMessage',
),
trigger: 'change',
}"
>
@ -24,8 +26,7 @@
<div class="flex-between w-full">
<div>
<span
>{{
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.model.label')
>{{ $t('views.applicationWorkflow.nodes.imageToVideoGenerate.model.label')
}}<span class="color-danger">*</span></span
>
</div>
@ -69,14 +70,13 @@
<div class="flex align-center">
<div class="mr-4">
<span
>{{
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.prompt.label')
>{{ $t('views.applicationWorkflow.nodes.imageToVideoGenerate.prompt.label')
}}<span class="color-danger">*</span></span
>
</div>
<el-tooltip effect="dark" placement="right" popper-class="max-w-200">
<template #content
>{{ $t('views.applicationWorkflow.nodes.imageToVideoGenerate.prompt.tooltip') }}
>{{ $t('views.applicationWorkflow.nodes.imageToVideoGenerate.prompt.tooltip') }}
</template>
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
</el-tooltip>
@ -103,13 +103,15 @@
<div class="flex align-center">
<div class="mr-4">
<span>{{
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.negative_prompt.label')
}}</span>
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.negative_prompt.label')
}}</span>
</div>
<el-tooltip effect="dark" placement="right" popper-class="max-w-200">
<template #content
>{{
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.negative_prompt.tooltip')
>{{
$t(
'views.applicationWorkflow.nodes.imageToVideoGenerate.negative_prompt.tooltip',
)
}}
</template>
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
@ -118,7 +120,9 @@
</template>
<MdEditorMagnify
@wheel="wheel"
:title="$t('views.applicationWorkflow.nodes.imageToVideoGenerate.negative_prompt.label')"
:title="
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.negative_prompt.label')
"
v-model="form_data.negative_prompt"
:placeholder="
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.negative_prompt.placeholder')
@ -139,8 +143,7 @@
}"
>
<template #label
>{{
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.first_frame.label')
>{{ $t('views.applicationWorkflow.nodes.imageToVideoGenerate.first_frame.label')
}}<span class="color-danger">*</span></template
>
<NodeCascader
@ -165,11 +168,8 @@
}"
>
<template #label
>{{
$t('views.applicationWorkflow.nodes.imageToVideoGenerate.last_frame.label')
}}
</template
>
>{{ $t('views.applicationWorkflow.nodes.imageToVideoGenerate.last_frame.label') }}
</template>
<NodeCascader
ref="nodeCascaderRef"
:nodeModel="nodeModel"
@ -189,8 +189,8 @@
<div class="flex align-center">
<div class="mr-4">
<span>{{
$t('views.applicationWorkflow.nodes.aiChatNode.returnContent.label')
}}</span>
$t('views.applicationWorkflow.nodes.aiChatNode.returnContent.label')
}}</span>
</div>
<el-tooltip effect="dark" placement="right" popper-class="max-w-200">
<template #content>
@ -200,30 +200,30 @@
</el-tooltip>
</div>
</template>
<el-switch size="small" v-model="form_data.is_result"/>
<el-switch size="small" v-model="form_data.is_result" />
</el-form-item>
</el-form>
</el-card>
<AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshParam"/>
<AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshParam" />
</NodeContainer>
</template>
<script setup lang="ts">
import NodeContainer from '@/workflow/common/NodeContainer.vue'
import {computed, nextTick, onMounted, ref, inject} from 'vue'
import {groupBy, set} from 'lodash'
import type {FormInstance} from 'element-plus'
import { computed, nextTick, onMounted, ref, inject } from 'vue'
import { groupBy, set } from 'lodash'
import type { FormInstance } from 'element-plus'
import AIModeParamSettingDialog from '@/views/application/component/AIModeParamSettingDialog.vue'
import {t} from '@/locales'
import {useRoute} from 'vue-router'
import {loadSharedApi} from '@/utils/dynamics-api/shared-api'
import NodeCascader from "@/workflow/common/NodeCascader.vue";
import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import NodeCascader from '@/workflow/common/NodeCascader.vue'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
params: {id},
params: { id },
} = route as any
const apiType = computed(() => {
@ -241,7 +241,7 @@ const AIModeParamSettingDialogRef = ref<InstanceType<typeof AIModeParamSettingDi
const aiChatNodeFormRef = ref<FormInstance>()
const validate = () => {
return aiChatNodeFormRef.value?.validate().catch((err) => {
return Promise.reject({node: props.nodeModel, errMessage: err})
return Promise.reject({ node: props.nodeModel, errMessage: err })
})
}
@ -285,19 +285,19 @@ const form_data = computed({
},
})
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'ITV',
workspace_id: application.value?.workspace_id,
}
model_type: 'ITV',
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'ITV',
}
loadSharedApi({type: 'model', systemType: apiType.value})
model_type: 'ITV',
}
loadSharedApi({ type: 'model', systemType: apiType.value })
.getSelectModelList(obj)
.then((res: any) => {
modelOptions.value = groupBy(res?.data, 'provider')

View File

@ -26,8 +26,7 @@
<div class="flex-between w-full">
<div>
<span
>{{
t('views.applicationWorkflow.nodes.imageUnderstandNode.model.label')
>{{ t('views.applicationWorkflow.nodes.imageUnderstandNode.model.label')
}}<span class="color-danger">*</span></span
>
</div>
@ -100,8 +99,7 @@
<div class="flex align-center">
<div class="mr-4">
<span
>{{
$t('views.application.form.prompt.label')
>{{ $t('views.application.form.prompt.label')
}}<span class="color-danger">*</span></span
>
</div>
@ -125,8 +123,8 @@
<div class="flex-between">
<div>{{ $t('views.application.form.historyRecord.label') }}</div>
<el-select v-model="form_data.dialogue_type" type="small" style="width: 100px">
<el-option :label="$t('views.applicationWorkflow.node')" value="NODE"/>
<el-option :label="$t('views.applicationWorkflow.workflow')" value="WORKFLOW"/>
<el-option :label="$t('views.applicationWorkflow.node')" value="NODE" />
<el-option :label="$t('views.applicationWorkflow.workflow')" value="WORKFLOW" />
</el-select>
</div>
</template>
@ -152,8 +150,7 @@
}"
>
<template #label
>{{
$t('views.applicationWorkflow.nodes.imageUnderstandNode.image.label')
>{{ $t('views.applicationWorkflow.nodes.imageUnderstandNode.image.label')
}}<span class="color-danger">*</span></template
>
<NodeCascader
@ -174,8 +171,8 @@
<div class="flex align-center">
<div class="mr-4">
<span>{{
$t('views.applicationWorkflow.nodes.aiChatNode.returnContent.label')
}}</span>
$t('views.applicationWorkflow.nodes.aiChatNode.returnContent.label')
}}</span>
</div>
<el-tooltip effect="dark" placement="right" popper-class="max-w-200">
<template #content>
@ -185,32 +182,32 @@
</el-tooltip>
</div>
</template>
<el-switch size="small" v-model="form_data.is_result"/>
<el-switch size="small" v-model="form_data.is_result" />
</el-form-item>
</el-form>
</el-card>
<AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshParam"/>
<GeneratePromptDialog @replace="replace" ref="GeneratePromptDialogRef"/>
<AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshParam" />
<GeneratePromptDialog @replace="replace" ref="GeneratePromptDialogRef" />
</NodeContainer>
</template>
<script setup lang="ts">
import NodeContainer from '@/workflow/common/NodeContainer.vue'
import {computed, onMounted, ref, inject} from 'vue'
import {groupBy, set} from 'lodash'
import { computed, onMounted, ref, inject } from 'vue'
import { groupBy, set } from 'lodash'
import NodeCascader from '@/workflow/common/NodeCascader.vue'
import type {FormInstance} from 'element-plus'
import type { FormInstance } from 'element-plus'
import AIModeParamSettingDialog from '@/views/application/component/AIModeParamSettingDialog.vue'
import {t} from '@/locales'
import {useRoute} from 'vue-router'
import {loadSharedApi} from '@/utils/dynamics-api/shared-api'
import GeneratePromptDialog from "@/views/application/component/GeneratePromptDialog.vue";
import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import GeneratePromptDialog from '@/views/application/component/GeneratePromptDialog.vue'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
params: {id},
params: { id },
} = route as any
const apiType = computed(() => {
@ -232,7 +229,7 @@ const validate = () => {
nodeCascaderRef.value ? nodeCascaderRef.value.validate() : Promise.resolve(''),
aiChatNodeFormRef.value?.validate(),
]).catch((err: any) => {
return Promise.reject({node: props.nodeModel, errMessage: err})
return Promise.reject({ node: props.nodeModel, errMessage: err })
})
}
@ -274,19 +271,19 @@ const form_data = computed({
},
})
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'IMAGE',
workspace_id: application.value?.workspace_id,
}
model_type: 'IMAGE',
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'IMAGE',
}
loadSharedApi({type: 'model', systemType: apiType.value})
model_type: 'IMAGE',
}
loadSharedApi({ type: 'model', systemType: apiType.value })
.getSelectModelList(obj)
.then((res: any) => {
modelOptions.value = groupBy(res?.data, 'provider')

View File

@ -158,7 +158,7 @@ import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { randomId } from '@/utils/common'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -343,13 +343,13 @@ const validate = () => {
})
}
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'LLM',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'LLM',

View File

@ -130,7 +130,11 @@
<template #label>
<div class="flex-between">
<div>
<TooltipLabel v-if="item.label.attrs.tooltip" :label="item.label" :tooltip="item.label.attrs.tooltip" />
<TooltipLabel
v-if="item.label.attrs.tooltip"
:label="item.label"
:tooltip="item.label.attrs.tooltip"
/>
<span v-else>{{ item.label.label }}</span>
<span v-if="item.required" class="color-danger">*</span>
</div>
@ -200,7 +204,11 @@
<template #label>
<div class="flex-between">
<div>
<TooltipLabel v-if="item.label.attrs.tooltip" :label="item.label" :tooltip="item.label.attrs.tooltip" />
<TooltipLabel
v-if="item.label.attrs.tooltip"
:label="item.label"
:tooltip="item.label.attrs.tooltip"
/>
<span v-else>{{ item.label.label }}</span>
<span v-if="item.required" class="color-danger">*</span>
</div>
@ -271,8 +279,8 @@ const route = useRoute()
const {
params: { id },
} = route as any
const getApplicationDetail = inject('getApplicationDetail') as any
const applicationDetail = getApplicationDetail()
const getResourceDetail = inject('getResourceDetail') as any
const resource = getResourceDetail()
const apiType = computed(() => {
if (route.path.includes('resource-management')) {
@ -571,7 +579,7 @@ function getMcpToolSelectOptions() {
? {
scope: 'WORKSPACE',
tool_type: 'MCP',
workspace_id: applicationDetail.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
scope: 'WORKSPACE',

View File

@ -105,7 +105,7 @@ import ParametersFieldTable from '@/workflow/nodes/parameter-extraction-node/com
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import { set, groupBy } from 'lodash'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const props = defineProps<{ nodeModel: any }>()
const AIModeParamSettingDialogRef = ref<InstanceType<typeof AIModeParamSettingDialog>>()
const route = useRoute()
@ -120,7 +120,7 @@ const openAIParamSettingDialog = (modelId: string) => {
function refreshParam(data: any) {
set(props.nodeModel.properties.node_data, 'model_params_setting', data)
}
const application = getApplicationDetail()
const resource = getResourceDetail()
const modelOptions = ref<any>(null)
const wheel = (e: any) => {
if (e.ctrlKey === true) {
@ -143,7 +143,7 @@ function getSelectModel() {
apiType.value === 'systemManage'
? {
model_type: 'LLM',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'LLM',

View File

@ -155,7 +155,7 @@ import { isLastNode } from '@/workflow/common/data'
import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -240,13 +240,13 @@ const validate = () => {
})
}
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'LLM',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'LLM',

View File

@ -187,7 +187,7 @@ import ParamSettingDialog from './ParamSettingDialog.vue'
import { ref, computed, onMounted, inject } from 'vue'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -252,13 +252,13 @@ function refreshParam(data: any) {
set(props.nodeModel.properties.node_data, 'reranker_setting', data)
}
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'RERANKER',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'RERANKER',

View File

@ -116,7 +116,7 @@ import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import STTModeParamSettingDialog from '@/views/application/component/STTModelParamSettingDialog.vue'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -135,7 +135,6 @@ const props = defineProps<{ nodeModel: any }>()
const modelOptions = ref<any>(null)
const STTModeParamSettingDialogRef = ref<InstanceType<typeof STTModeParamSettingDialog>>()
const aiChatNodeFormRef = ref<FormInstance>()
const nodeCascaderRef = ref()
const validate = () => {
@ -178,18 +177,13 @@ const form_data = computed({
},
})
const openSTTParamSettingDialog = () => {
const model_id = form_data.value.stt_model_id
if (!model_id) {
MsgSuccess(t('views.application.form.voiceInput.requiredMessage'))
return
}
STTModeParamSettingDialogRef.value?.open(
model_id,
id,
form_data.value.model_params_setting,
)
STTModeParamSettingDialogRef.value?.open(model_id, id, form_data.value.model_params_setting)
}
const refreshSTTForm = (data: any) => {
@ -204,13 +198,13 @@ function sttModelChange(model_id: string) {
}
}
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'STT',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'STT',

View File

@ -115,7 +115,7 @@ import { MsgSuccess } from '@/utils/message'
import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -177,13 +177,13 @@ const form_data = computed({
},
})
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'TTS',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'TTS',

View File

@ -16,7 +16,9 @@
prop="model_id"
:rules="{
required: true,
message: $t('views.applicationWorkflow.nodes.textToVideoGenerate.model.requiredMessage'),
message: $t(
'views.applicationWorkflow.nodes.textToVideoGenerate.model.requiredMessage',
),
trigger: 'change',
}"
>
@ -43,7 +45,7 @@
<ModelSelect
@change="model_change"
@wheel="wheel"
@focus="getSelectModel"
@focus="getSelectModel"
:teleported="false"
v-model="form_data.model_id"
:placeholder="
@ -107,7 +109,9 @@
<el-tooltip effect="dark" placement="right" popper-class="max-w-200">
<template #content
>{{
$t('views.applicationWorkflow.nodes.textToVideoGenerate.negative_prompt.tooltip')
$t(
'views.applicationWorkflow.nodes.textToVideoGenerate.negative_prompt.tooltip',
)
}}
</template>
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
@ -161,7 +165,7 @@ import AIModeParamSettingDialog from '@/views/application/component/AIModeParamS
import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
@ -225,13 +229,13 @@ const form_data = computed({
},
})
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'TTV',
workspace_id: application.value?.workspace_id,
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'TTV',

View File

@ -26,8 +26,7 @@
<div class="flex-between w-full">
<div>
<span
>{{
t('views.applicationWorkflow.nodes.videoUnderstandNode.model.label')
>{{ t('views.applicationWorkflow.nodes.videoUnderstandNode.model.label')
}}<span class="color-danger">*</span></span
>
</div>
@ -100,8 +99,7 @@
<div class="flex align-center">
<div class="mr-4">
<span
>{{
$t('views.application.form.prompt.label')
>{{ $t('views.application.form.prompt.label')
}}<span class="color-danger">*</span></span
>
</div>
@ -110,7 +108,6 @@
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
</el-tooltip>
</div>
</template>
<MdEditorMagnify
@wheel="wheel"
@ -126,8 +123,8 @@
<div class="flex-between">
<div>{{ $t('views.application.form.historyRecord.label') }}</div>
<el-select v-model="form_data.dialogue_type" type="small" style="width: 100px">
<el-option :label="$t('views.applicationWorkflow.node')" value="NODE"/>
<el-option :label="$t('views.applicationWorkflow.workflow')" value="WORKFLOW"/>
<el-option :label="$t('views.applicationWorkflow.node')" value="NODE" />
<el-option :label="$t('views.applicationWorkflow.workflow')" value="WORKFLOW" />
</el-select>
</div>
</template>
@ -153,8 +150,7 @@
}"
>
<template #label
>{{
$t('views.applicationWorkflow.nodes.videoUnderstandNode.image.label')
>{{ $t('views.applicationWorkflow.nodes.videoUnderstandNode.image.label')
}}<span class="color-danger">*</span></template
>
<NodeCascader
@ -175,8 +171,8 @@
<div class="flex align-center">
<div class="mr-4">
<span>{{
$t('views.applicationWorkflow.nodes.aiChatNode.returnContent.label')
}}</span>
$t('views.applicationWorkflow.nodes.aiChatNode.returnContent.label')
}}</span>
</div>
<el-tooltip effect="dark" placement="right" popper-class="max-w-200">
<template #content>
@ -186,32 +182,32 @@
</el-tooltip>
</div>
</template>
<el-switch size="small" v-model="form_data.is_result"/>
<el-switch size="small" v-model="form_data.is_result" />
</el-form-item>
</el-form>
</el-card>
<AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshParam"/>
<GeneratePromptDialog @replace="replace" ref="GeneratePromptDialogRef"/>
<AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshParam" />
<GeneratePromptDialog @replace="replace" ref="GeneratePromptDialogRef" />
</NodeContainer>
</template>
<script setup lang="ts">
import NodeContainer from '@/workflow/common/NodeContainer.vue'
import {computed, onMounted, ref, inject} from 'vue'
import {groupBy, set} from 'lodash'
import { computed, onMounted, ref, inject } from 'vue'
import { groupBy, set } from 'lodash'
import NodeCascader from '@/workflow/common/NodeCascader.vue'
import type {FormInstance} from 'element-plus'
import type { FormInstance } from 'element-plus'
import AIModeParamSettingDialog from '@/views/application/component/AIModeParamSettingDialog.vue'
import {t} from '@/locales'
import {useRoute} from 'vue-router'
import {loadSharedApi} from '@/utils/dynamics-api/shared-api'
import GeneratePromptDialog from "@/views/application/component/GeneratePromptDialog.vue";
import { t } from '@/locales'
import { useRoute } from 'vue-router'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import GeneratePromptDialog from '@/views/application/component/GeneratePromptDialog.vue'
const getApplicationDetail = inject('getApplicationDetail') as any
const getResourceDetail = inject('getResourceDetail') as any
const route = useRoute()
const {
params: {id},
params: { id },
} = route as any
const apiType = computed(() => {
@ -233,7 +229,7 @@ const validate = () => {
nodeCascaderRef.value ? nodeCascaderRef.value.validate() : Promise.resolve(''),
aiChatNodeFormRef.value?.validate(),
]).catch((err: any) => {
return Promise.reject({node: props.nodeModel, errMessage: err})
return Promise.reject({ node: props.nodeModel, errMessage: err })
})
}
@ -275,19 +271,19 @@ const form_data = computed({
},
})
const application = getApplicationDetail()
const resource = getResourceDetail()
function getSelectModel() {
const obj =
apiType.value === 'systemManage'
? {
model_type: 'IMAGE',
workspace_id: application.value?.workspace_id,
}
model_type: 'IMAGE',
workspace_id: resource.value?.workspace_id,
}
: {
model_type: 'IMAGE',
}
loadSharedApi({type: 'model', systemType: apiType.value})
model_type: 'IMAGE',
}
loadSharedApi({ type: 'model', systemType: apiType.value })
.getSelectModelList(obj)
.then((res: any) => {
modelOptions.value = groupBy(res?.data, 'provider')