Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
53d431d
feat: Virtualized tree
wangdan-fit2cloud Apr 21, 2026
63724a3
feat: Drag and drop virtual tree
shaohuzhang1 Apr 22, 2026
e348e46
feat: Open the first level directory by default
shaohuzhang1 Apr 22, 2026
4ae5bda
feat: Change file name
shaohuzhang1 Apr 22, 2026
5cdb4c4
perf: tree filter
wangdan-fit2cloud Apr 22, 2026
5e613f4
fix: virtualized
wangdan-fit2cloud Apr 22, 2026
deafc60
fix: Fix the parsing error of `image_id`
wangliang181230 Apr 15, 2026
b1260b7
fix: Fix null pointer exception (#5113)
wangliang181230 Apr 16, 2026
b3803dd
feat: enhance request payload handling for AI messages with tool calls
liuruibin Apr 15, 2026
a9c0976
fix: update position handling in drag-and-drop functionality
liuruibin Apr 16, 2026
d97f94d
fix: update package versions for langchain-core, langchain-google-gen…
liuruibin Apr 16, 2026
cd2e15e
fix: update pypdf package version to 6.10.2
liuruibin Apr 16, 2026
1d5b087
fix: Fix the parameter issue of the `str.format(...)` method (#5119)
wangliang181230 Apr 16, 2026
8e85474
build(deps): bump langchain-openai in the pip group across 1 directory
dependabot[bot] Apr 17, 2026
33b1cc7
fix: update langchain-openai package version to 1.1.14
liuruibin Apr 17, 2026
15430d5
feat: Supports tree selector (#5122)
shaohuzhang1 Apr 17, 2026
793cd80
fix: PDF preview of XSS attack (#5123)
shaohuzhang1 Apr 17, 2026
9241554
feat: Add style attribute to markdown rendering a tag (#5124)
shaohuzhang1 Apr 17, 2026
17d7546
feat: Copy and paste cross page canvas nodes (#5125)
shaohuzhang1 Apr 17, 2026
39cc440
fix: enhance image URL handling in response processing for multiple f…
wxg0103 Apr 17, 2026
6c4fb23
fix: update default docker image tag to v2.9.0-dev
liuruibin Apr 20, 2026
92d845a
fix: Knowledge search node not real remove
zhanweizhang7 Apr 20, 2026
e6ee3c3
fix: standardize formatting and improve error handling in model param…
wxg0103 Apr 21, 2026
eaf93a7
fix: add base_url parameter to various model classes and update initi…
wxg0103 Apr 21, 2026
c0be8f0
feat: Resource dependency and resource dependent dialog view
zhanweizhang7 Apr 21, 2026
dcc9fe4
feat: Support node disabling and enabling (#5135)
shaohuzhang1 Apr 21, 2026
7cac2fa
fix: enhance text_to_speech method to support additional models and h…
wxg0103 Apr 21, 2026
c0b40c3
feat: add MiniMax model provider with LLM and TTS support
octo-patch Mar 14, 2026
28ca431
feat: upgrade MiniMax default model to M2.7
Mar 18, 2026
28ababa
fix: refactor voice selection and audio settings in TTS model parameters
wxg0103 Apr 21, 2026
aea839f
fix: update default voice_id to Chinese (Mandarin)_Lyrical_Voice in t…
wxg0103 Apr 21, 2026
11d9372
fix: Whether to call the model after deleting the default parameters …
shaohuzhang1 Apr 21, 2026
925fb23
build(deps): bump python-dotenv in the pip group across 1 directory
dependabot[bot] Apr 21, 2026
2e8fb48
feat: add long term memory fields and settings to application model
liuruibin Apr 20, 2026
8ec02ff
fix: Fix the issues of `raise exception` (#5130)
wangliang181230 Apr 22, 2026
391b61d
feat: Mapping resource list
zhanweizhang7 Apr 22, 2026
9f24886
fix: Fix null pointer exception (#5136)
wangliang181230 Apr 22, 2026
e8bf16c
feat: Add regex to clean up content in long term memory extraction
liuruibin Apr 22, 2026
111f689
fix: add copilot-instructions.md to .gitignore
liuruibin Apr 22, 2026
a20fe65
perf: tree style
wangdan-fit2cloud Apr 22, 2026
5ef3132
refactor: streamline long term memory extraction scheduling
liuruibin Apr 22, 2026
9736278
fix: add api_base field to model credentials and update validation logic
wxg0103 Apr 22, 2026
d15f02d
perf: Model select item display
zhanweizhang7 Apr 22, 2026
912e46b
fix: update schedule_extract_long_term_memory function parameters
liuruibin Apr 22, 2026
5fad265
fix: clean up formatting and improve tooltip display in index.vue
wxg0103 Apr 22, 2026
2266332
perf: long-term memory translation
wangdan-fit2cloud Apr 22, 2026
a5033b2
chore: update volcengine-python-sdk version to 5.0.24 in pyproject.toml
wxg0103 Apr 22, 2026
f3b61ca
fix: remove popper-class from el-tooltip components in index.vue
wxg0103 Apr 22, 2026
031143c
fix: add popper-class to el-tooltip components for improved styling i…
wxg0103 Apr 22, 2026
6c52312
fix: update API base URL and ensure reasoning_split is set in extra_body
wxg0103 Apr 23, 2026
4d1a892
fix: adjust history chat record check to allow for more than one entr…
liuruibin Apr 23, 2026
7f27b82
fix: disable dropdown items for unpublished entries
liuruibin Apr 23, 2026
2ddd3a9
feat: Canvas pasting follows the mouse, fixing the problem of duplica…
shaohuzhang1 Apr 23, 2026
1c46a34
fix: virtualized tree
wangdan-fit2cloud Apr 23, 2026
849ef37
Potential fix for pull request finding 'Unused variable, import, func…
wangdan-fit2cloud Apr 23, 2026
c005998
Potential fix for pull request finding 'Unused variable, import, func…
wangdan-fit2cloud Apr 23, 2026
7170e15
Merge branch 'v2' into virtualized-tree@v2
wangdan-fit2cloud Apr 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,8 @@ def execute(self, message_list: List[BaseMessage],
mcp_output_enable=True,
**kwargs):
chat_model = get_model_instance_by_model_workspace_id(model_id, workspace_id,
**(model_params_setting or {})) if model_id is not None else None
**(
model_params_setting or {})) if model_id is not None else None
if stream:
return self.execute_stream(message_list, chat_id, problem_text, post_response_handler, chat_model,
paragraph_list,
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<svg t="1776929669814" class="icon" viewBox="0 0 1169 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4810" width="100%" height="100%"><path d="M474.173841 470.682521V847.403039c-25.441562 127.572805-194.68465 94.674371-195.416638 2.192962-0.802986-116.24 0-231.750012 0-347.113027V368.697276c0-16.740712-3.654937-29.973484-18.275685-40.428305-28.512509-21.346633-62.725921 3.728936-63.456908 34.507407-1.608972 41.305289-0.804986 81.733594-1.608973 122.453893 0 32.167446 0 63.384909 0.730988 95.478357C175.164986 722.025196 3.947932 698.5576 0 581.512614V483.5493c0-32.021449 62.725921-39.551319 59.655973 8.406855-2.046965 23.759591-0.731987 48.25117-1.535973 71.791765-0.729987 42.036277 63.530907 70.32879 78.663646 1.607972 0.730987-56.658025 0.730987-113.31605 0.730988-170.486067 0-71.644767 20.32365-129.984763 96.282343-135.39467 32.898434-2.92395 54.757058 10.819814 75.738697 34.579405 8.042862 8.407855 27.049535 35.092396 27.781522 64.115897 0 26.75754 0.729987 53.368082 0.729987 80.418616 0 53.367082-0.729987 107.028158-0.729987 160.39724 0 34.579405 0.729987 68.792816 0.729987 102.568235 0 42.841263 0 86.267516-0.729987 129.180778-0.730987 55.78104 67.111845 54.977054 78.005658-0.876985 0-65.796868 0.729987-130.78875 0.729987-196.585618 0-162.078211-0.729987-324.157422-0.729987-486.163634 0-16.814711-2.33996-63.456908 6.579886-80.417617C469.274925-48.744541 613.003452 1.625592 614.319429 97.176948c2.777952 195.781631 0 393.756225 0.730988 589.975848 0 68.062829-55.269049 53.44208-58.338996 26.830538 0-204.188487 0-409.180959 0.729987-613.07745-2.703953-51.175119-78.589648-44.229239-82.976572-7.529871-1.461975 42.109275-0.729987 84.950538-1.461975 126.987815v250.025698h0.730987l0.511992 0.292995z" fill="#D4367A" p-id="4811"></path><path d="M696.347018 467.684573v276.638239-652.848766c24.709575-128.44779 193.880664-95.038365 194.611651-2.484957 0.803986 115.437014 0 231.677014 0.803986 347.040028 0 44.303238 0 88.752473-0.730987 133.055711 0 17.545698 4.312926 29.900486 19.007673 41.159292 27.780522 20.835641 61.921935-3.654937 63.456908-34.945399 1.535974-40.501303 0.731987-81.002606 0.731987-122.527892v-94.893367c21.200635-141.315568 191.906698-117.847972 195.488637-0.803986V711.645375c0 32.166447-61.994933 39.769316-59.216981-8.334857 1.680971-24.490579 0-304.930753 0.876985-329.49433 1.461975-41.305289-63.602906-70.402789-78.663647-0.876985v169.609081c0 72.66875-20.396649 130.057762-97.013331 136.271656-72.228757 1.680971-101.253258-48.25117-103.593217-98.695302V237.250538c0-43.645249 0-86.266516 0.731987-129.107779 0.729987-55.78004-67.112845-55.78004-78.663646 0.804986v767.626792c0 16.667713 2.33996 63.383909-5.921898 80.417616-47.300186 115.363015-191.7607 64.918883-193.076678-30.559474v-90.871437c3.582938-61.190947 55.269049-46.643197 57.609009-20.762642V922.631744c2.777952 51.321117 78.663646 45.107224 82.245585 7.602869 1.534974-42.109275 1.534974-84.146552 1.534973-127.059813V467.757571h-0.219996v-0.072998z" fill="#ED6D48" p-id="4812"></path></svg>
<svg t="1776929669814" class="icon" viewBox="0 0 1169 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4810" width="100%" height="100%"><path d="M474.173841 470.682521V847.403039c-25.441562 127.572805-194.68465 94.674371-195.416638 2.192962-0.802986-116.24 0-231.750012 0-347.113027V368.697276c0-16.740712-3.654937-29.973484-18.275685-40.428305-28.512509-21.346633-62.725921 3.728936-63.456908 34.507407-1.608972 41.305289-0.804986 81.733594-1.608973 122.453893 0 32.167446 0 63.384909 0.730988 95.478357C175.164986 722.025196 3.947932 698.5576 0 581.512614V483.5493c0-32.021449 62.725921-39.551319 59.655973 8.406855-2.046965 23.759591-0.731987 48.25117-1.535973 71.791765-0.729987 42.036277 63.530907 70.32879 78.663646 1.607972 0.730987-56.658025 0.730987-113.31605 0.730988-170.486067 0-71.644767 20.32365-129.984763 96.282343-135.39467 32.898434-2.92395 54.757058 10.819814 75.738697 34.579405 8.042862 8.407855 27.049535 35.092396 27.781522 64.115897 0 26.75754 0.729987 53.368082 0.729987 80.418616 0 53.367082-0.729987 107.028158-0.729987 160.39724 0 34.579405 0.729987 68.792816 0.729987 102.568235 0 42.841263 0 86.267516-0.729987 129.180778-0.730987 55.78104 67.111845 54.977054 78.005658-0.876985 0-65.796868 0.729987-130.78875 0.729987-196.585618 0-162.078211-0.729987-324.157422-0.729987-486.163634 0-16.814711-2.33996-63.456908 6.579886-80.417617C469.274925-48.744541 613.003452 1.625592 614.319429 97.176948c2.777952 195.781631 0 393.756225 0.730988 589.975848 0 68.062829-55.269049 53.44208-58.338996 26.830538 0-204.188487 0-409.180959 0.729987-613.07745-2.703953-51.175119-78.589648-44.229239-82.976572-7.529871-1.461975 42.109275-0.729987 84.950538-1.461975 126.987815v250.025698h0.730987l0.511992 0.292995z" fill="#D4367A" p-id="4811"></path><path d="M696.347018 467.684573v276.638239-652.848766c24.709575-128.44779 193.880664-95.038365 194.611651-2.484957 0.803986 115.437014 0 231.677014 0.803986 347.040028 0 44.303238 0 88.752473-0.730987 133.055711 0 17.545698 4.312926 29.900486 19.007673 41.159292 27.780522 20.835641 61.921935-3.654937 63.456908-34.945399 1.535974-40.501303 0.731987-81.002606 0.731987-122.527892v-94.893367c21.200635-141.315568 191.906698-117.847972 195.488637-0.803986V711.645375c0 32.166447-61.994933 39.769316-59.216981-8.334857 1.680971-24.490579 0-304.930753 0.876985-329.49433 1.461975-41.305289-63.602906-70.402789-78.663647-0.876985v169.609081c0 72.66875-20.396649 130.057762-97.013331 136.271656-72.228757 1.680971-101.253258-48.25117-103.593217-98.695302V237.250538c0-43.645249 0-86.266516 0.731987-129.107779 0.729987-55.78004-67.112845-55.78004-78.663646 0.804986v767.626792c0 16.667713 2.33996 63.383909-5.921898 80.417616-47.300186 115.363015-191.7607 64.918883-193.076678-30.559474v-90.871437c3.582938-61.190947 55.269049-46.643197 57.609009-20.762642V922.631744c2.777952 51.321117 78.663646 45.107224 82.245585 7.602869 1.534974-42.109275 1.534974-84.146552 1.534973-127.059813V467.757571h-0.219996v-0.072998z" fill="#ED6D48" p-id="4812"></path></svg>
1 change: 1 addition & 0 deletions ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-python": "^6.2.1",
"@codemirror/theme-one-dark": "^6.1.2",
"@he-tree/vue": "^2.10.5",
"@logicflow/core": "^1.2.27",
"@logicflow/extension": "^1.2.27",
"@vavt/cm-extension": "^1.9.1",
Expand Down
2 changes: 1 addition & 1 deletion ui/src/components/folder-tree/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
:class="
showShared && hasPermission(EditionConst.IS_EE, 'OR')
? 'tree-height-shared'
: 'tree-height '
: 'tree-height'
"
:style="treeStyle"
ref="treeRef"
Expand Down
154 changes: 154 additions & 0 deletions ui/src/components/folder-virtualized-tree/CreateFolderDialog.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<template>
<el-dialog
:title="title"
v-model="dialogVisible"
width="720"
append-to-body
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form
ref="FolderFormRef"
:rules="rules"
:model="folderForm"
label-position="top"
require-asterisk-position="right"
@submit.prevent
>
<el-form-item :label="$t('common.name')" prop="name">
<el-input
v-model="folderForm.name"
:placeholder="$t('components.folder.folderNamePlaceholder')"
maxlength="64"
show-word-limit
@blur="folderForm.name = folderForm.name.trim()"
/>
</el-form-item>
<el-form-item :label="$t('common.desc')" prop="desc">
<el-input
v-model="folderForm.desc"
type="textarea"
:placeholder="$t('common.descPlaceholder')"
maxlength="128"
show-word-limit
:autosize="{ minRows: 3 }"
@blur="folderForm.desc = folderForm.desc.trim()"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click.prevent="dialogVisible = false" :loading="loading">
{{ $t('common.cancel') }}
</el-button>
<el-button type="primary" @click="submitHandle" :disabled="loading" :loading="loading">
{{ isEdit ? $t('common.confirm') : $t('common.add') }}
</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, watch, reactive } from 'vue'
import folderApi from '@/api/workspace/folder'
import { MsgSuccess, MsgAlert } from '@/utils/message'
import { t } from '@/locales'
import useStore from '@/stores'
const { user, tool, knowledge, folder } = useStore()
const emit = defineEmits(['refresh'])

const props = defineProps({
title: {
type: String,
default: t('components.folder.addFolder'),
},
})

const FolderFormRef = ref()

const loading = ref(false)
const dialogVisible = ref<boolean>(false)
const sourceType = ref<any>('')
const isEdit = ref<boolean>(false)
const editId = ref<string>('')

const folderForm = ref<any>({
name: '',
desc: '',
parent_id: '',
})

const rules = reactive({
name: [
{
required: true,
message: t('components.folder.folderNamePlaceholder'),
trigger: 'blur',
},
],
})

watch(dialogVisible, (bool) => {
if (!bool) {
sourceType.value = ''
folderForm.value = {
name: '',
desc: '',
parent_id: '',
}
isEdit.value = false
FolderFormRef.value.resetFields()
}
})

const open = (source: string, id: string, data?: any) => {
sourceType.value = source
if (data) {
// 编辑当前id
editId.value = data.id
folderForm.value.name = data.name
folderForm.value.desc = data.desc
folderForm.value.parent_id = data.parent_id
isEdit.value = true
} else {
// 给当前id添加子id
folderForm.value.parent_id = id
}
dialogVisible.value = true
}

const submitHandle = async () => {
await FolderFormRef.value.validate((valid: any) => {
if (valid) {
if (isEdit.value) {
folderApi
.putFolder(editId.value, sourceType.value, folderForm.value, loading)
.then((res) => {
MsgSuccess(t('common.editSuccess'))
emit('refresh')
dialogVisible.value = false
})
} else {
folderApi.postFolder(sourceType.value, folderForm.value, loading).then((res) => {
return user.profile().then(() => {
MsgSuccess(t('common.createSuccess'))
folder.setCurrentFolder(res.data)
folder.asyncGetFolder(sourceType.value, {}, 'workspace', loading)
clearData()
emit('refresh')
dialogVisible.value = false
})
})
}
}
})
}

function clearData() {
tool.setToolList([])
knowledge.setKnowledgeList([])
}

defineExpose({ open })
</script>
<style lang="scss" scoped></style>
191 changes: 191 additions & 0 deletions ui/src/components/folder-virtualized-tree/MoveToDialog.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
<template>
<el-dialog
:title="$t('common.moveTo')"
v-model="dialogVisible"
append-to-body
:close-on-click-modal="false"
:close-on-press-escape="false"
align-center
>
<folder-tree
ref="treeRef"
:source="source"
:data="folderList"
:default-expanded-keys="[currentNodeKey]"
:canOperation="false"
class="move-to-dialog-tree"
@handleNodeClick="folderClickHandle"
/>
<template #footer>
<span class="dialog-footer">
<el-button @click.prevent="dialogVisible = false" :loading="loading">
{{ $t('common.cancel') }}
</el-button>
<el-button
type="primary"
@click="submitHandle"
:loading="loading"
:disabled="!selectForderId || selectForderId === folder?.currentFolder?.id"
>
{{ $t('common.confirm') }}
</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, watch, reactive } from 'vue'
import folderApi from '@/api/workspace/folder'
import { MsgError, MsgSuccess } from '@/utils/message'
import { t } from '@/locales'
import useStore from '@/stores'
import { SourceTypeEnum } from '@/enums/common'
import KnowledgeApi from '@/api/knowledge/knowledge'
import ApplicationApi from '@/api/application/application'
import ToolApi from '@/api/tool/tool'
const { folder } = useStore()
const emit = defineEmits(['refresh'])

const props = defineProps({
source: {
type: String,
default: '',
},
})

const treeRef = ref()
const loading = ref(false)
const dialogVisible = ref(false)
const folderList = ref<any[]>([])
const detail = ref<any>(null) // 保存交互所需信息:批量操作是id_list
const selectForderId = ref<any>('')
const currentNodeKey = ref<string>('')
const isBatch = ref(false)

watch(dialogVisible, (bool) => {
if (!bool) {
detail.value = null
selectForderId.value = ''
folderList.value = []
currentNodeKey.value = ''
treeRef.value?.clearCurrentKey()
}
})

const isFolder = ref<boolean>(false)

const open = (data: any, is_folder?: any) => {
detail.value = data
isBatch.value = data?.id_list
isFolder.value = is_folder
getFolder()
dialogVisible.value = true
}

function getFolder() {
const params = {}
folder.asyncGetFolder(props.source, params, 'workspace', loading).then((res: any) => {
folderList.value = res.data
if (folderList.value?.length > 0) {
currentNodeKey.value = folderList.value[0]?.id
} else {
currentNodeKey.value = ''
}
})
}

function folderClickHandle(item: any) {
selectForderId.value = item.id
}

const submitHandle = async () => {
if (selectForderId.value) {
const obj = {
...detail.value,
folder_id: selectForderId.value,
}
if (isFolder.value) {
const folder_obj = {
...detail.value,
parent_id: selectForderId.value,
}
folderApi
.putFolder(detail.value.id, detail.value.folder_type, folder_obj, loading)
.then(() => {
MsgSuccess(t('common.saveSuccess'))
emit('refresh')
dialogVisible.value = false
})
} else if (props.source === SourceTypeEnum.KNOWLEDGE) {
if (isBatch.value) {
KnowledgeApi.putMulMoveKnowledge(obj, loading).then(() => {
MsgSuccess(t('common.saveSuccess'))
emit('refresh')
dialogVisible.value = false
})
} else {
if (detail.value.type === 2) {
KnowledgeApi.putLarkKnowledge(detail.value.id, obj, loading).then(() => {
MsgSuccess(t('common.saveSuccess'))
emit('refresh', detail.value)
dialogVisible.value = false
})
} else {
KnowledgeApi.putKnowledge(detail.value.id, obj, loading).then(() => {
MsgSuccess(t('common.saveSuccess'))
emit('refresh', detail.value)
dialogVisible.value = false
})
}
}
} else if (props.source === SourceTypeEnum.TOOL) {
if (isBatch.value) {
ToolApi.putMulMoveTool(obj, loading).then(() => {
MsgSuccess(t('common.saveSuccess'))
emit('refresh')
dialogVisible.value = false
})
} else {
ToolApi.putTool(detail.value.id, obj, loading).then(() => {
MsgSuccess(t('common.saveSuccess'))
emit('refresh', detail.value)
dialogVisible.value = false
})
}
} else if (props.source === SourceTypeEnum.APPLICATION) {
if (isBatch.value) {
ApplicationApi.putMulMoveApplication(obj, loading).then(() => {
MsgSuccess(t('common.saveSuccess'))
emit('refresh')
dialogVisible.value = false
})
} else {
ApplicationApi.moveApplication(detail.value.id, obj.folder_id, loading).then((res) => {
MsgSuccess(t('common.saveSuccess'))
emit('refresh', detail.value)
dialogVisible.value = false
})
}
}
} else {
MsgError(t('components.folder.requiredMessage'))
}
}

defineExpose({ open })
</script>
<style lang="scss" scoped>
.move-to-dialog-tree {
:deep(.el-input) {
padding: 0 !important;
margin-bottom: 8px;
}
:deep(.el-scrollbar) {
border: 1px solid var(--el-border-color-light);
border-radius: 6px;
}
:deep(.el-tree) {
height: calc(100vh - 320px) !important;
}
}
</style>
Loading
Loading