fix: Fix style confusion and update markdown file and icon

* fix: Fix style confusion

* fix: Update markdown file and icon
This commit is contained in:
wangdan-fit2cloud 2025-03-26 18:55:39 +08:00 committed by GitHub
parent 1e8e3a90aa
commit 1a57e5897d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
33 changed files with 166 additions and 231 deletions

View File

@ -1,15 +1,16 @@
## 概述
博查工具是一个支持自然语言搜索的 Web Search API从近百亿网页和生态内容源中搜索高质量世界知识包括新闻、图片、视频、百科、机酒、学术等.
博查工具是一个支持自然语言搜索的 Web Search API从近百亿网页和生态内容源中搜索高质量世界知识包括新闻、图片、视频、百科、机酒、学术等。
## 配置
1. 获取API Key 
在[博查开放平台](https://open.bochaai.com/overview) 上申请 API 密钥。
![API Key](/ui/fx/img/bocha_APIKey.jpg)
在[博查开放平台](https://open.bochaai.com/overview) 上申请 API 密钥。
![API Key](/ui/fx/img/bocha_APIKey.jpg)
2. 在函数库中配置
在函数库的博查函数面板中,点击 … > 启用参数,填写 API 密钥,并启用博查函数。
![启动参数](/ui/fx/img/bocha_setting.jpg)
在函数库的博查函数面板中,点击 … > 启用参数,填写 API 密钥,并启用该函数。
![启动参数](/ui/fx/img/bocha_setting.jpg)
3. 在应用中使用
在高级编排应用中,点击添加组件->函数库->博查,设置使用参数。
![应用中使用](/ui/fx/img/bocha_app_used.jpg)
在高级编排应用中,点击添加组件->函数库->博查,设置使用参数。
![应用中使用](/ui/fx/img/bocha_app_used.jpg)

View File

@ -5,18 +5,17 @@ Google 搜索工具是一个实时 API可提取搜索引擎结果提供来
## 配置
1. 创建 Google Custom Search Engine
在[Programmable Search Engine]https://programmablesearchengine.google.com/中 添加 Search Engine
![google 创建引擎](/ui/fx/img/google_AddSearchEngine.jpg)
在[Programmable Search Engine](https://programmablesearchengine.google.com/)中 添加 Search Engine
![google 创建引擎](/ui/fx/img/google_AddSearchEngine.jpg)
2. 获取cx参数
进入添加引擎在【基本】菜单中获取搜索引擎的ID即cx。
![google cx ](/ui/fx/img/google_cx.jpg) 3.获取 API Key
打开 https://developers.google.com/custom-search/v1/overview?hl=zh-cn获取API Key。
![google API Key](/ui/fx/img/google_APIKey.jpg)
3. 配置启动参数
在Google搜索函数的启动参数中填写配置以上参数。
![启动参数](/ui/fx/img/google_setting.jpg)
4. 在应用中使用
在高级编排应用中,点击添加组件->函数库->博查,设置使用参数。
![应用中使用](/ui/fx/img/google_app_used.jpg)
进入添加的引擎详情中在【基本】菜单中获取搜索引擎的ID即cx。
![google cx ](/ui/fx/img/google_cx.jpg)
3.获取 API Key
打开 https://developers.google.com/custom-search/v1/overview?hl=zh-cn 获取API Key。
![google API Key](/ui/fx/img/google_APIKey.jpg)
4. 配置启动参数
在Google 搜索函数的启动参数中填写配置以上参数,并启用该函数。
![启动参数](/ui/fx/img/google_setting.jpg)
5. 在应用中使用
在高级编排应用中,点击添加组件->函数库->Google搜索设置使用参数。
![应用中使用](/ui/fx/img/google_app_used.jpg)

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 KiB

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 587 KiB

After

Width:  |  Height:  |  Size: 596 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 542 KiB

After

Width:  |  Height:  |  Size: 590 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 256 KiB

View File

@ -1,15 +1,17 @@
## 概述
博查工具是一个支持自然语言搜索的 Web Search API从近百亿网页和生态内容源中搜索高质量世界知识包括新闻、图片、视频、百科、机酒、学术等.
LangSearch 是一个提供免费Web Search API和Rerank API的服务支持新闻、图像、视频等内容。它结合了关键词和向量进行混合搜索以提高准确性。
## 配置
1. 获取API Key 
在[博查开放平台](https://open.bochaai.com/overview) 上申请 API 密钥。
![API Key](/ui/fx/img/langsearch_APIKey.jpg)
在[Langsearch](https://langsearch.com/overview) 上申请 API 密钥。
![API Key](/ui/fx/img/langsearchAPI_Key.jpg)
2. 在函数库中配置
在函数库的博查函数面板中,点击 … > 启用参数,填写 API 密钥,并启用博查函数。
![启动参数](/ui/fx/img/langsearch_setting.jpg)
在函数库的LangSearch函数面板中点击 … > 启用参数,填写 API 密钥,并启用该函数。
![启动参数](/ui/fx/img/langsearch_setting.jpg)
3. 在应用中使用
在高级编排应用中,点击添加组件->函数库->博查,设置使用参数。
![应用中使用](/ui/fx/img/langsearch_app_used.jpg)
在高级编排应用中,点击添加组件->函数库->LangSearch设置使用参数。
![应用中使用](/ui/fx/img/langsearch_app_used.jpg)

View File

@ -0,0 +1,14 @@
## 概述
MySQL查询是一个连接MySQL数据库执行SQL查询的工具。
## 配置
 
1. 在函数库中配置启动参数
在函数库的MySQL函数面板中点击 … > 启用参数,填写数据库连接参数,并启用该函数。
![启动参数](/ui/fx/img/MySQL_setting.jpg)
2. 在应用中使用
在高级编排应用中,点击添加组件->函数库->MySQL查询设置查询内容。
![应用中使用](/ui/fx/img/MySQL_app_used.jpg)

View File

@ -0,0 +1,14 @@
## 概述
PostgreSQL查询是一个连接PostgreSQL数据库执行SQL查询的工具。
## 配置
 
1. 在函数库中配置启动参数
在函数库的PostgreSQL函数面板中点击 … > 启用参数,填写数据库连接参数,并启用该函数。
![启动参数](/ui/fx/img/PostgreSQL_setting.jpg)
2. 在应用中使用
在高级编排应用中,点击添加组件->函数库->PostgreSQL查询设置查询内容。
![应用中使用](/ui/fx/img/PostgreSQL_app_used.jpg)

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1742986045279" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16253" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M42.666667 170.666667a42.666667 42.666667 0 0 1 42.666666-42.666667h357.632a42.666667 42.666667 0 0 1 38.144 23.594667L512 213.333333h426.666667a42.666667 42.666667 0 0 1 42.666666 42.666667v597.333333a42.666667 42.666667 0 0 1-42.666666 42.666667H85.333333a42.666667 42.666667 0 0 1-42.666666-42.666667V170.666667z" fill="#FFA53D" p-id="16254"></path><path d="M42.666667 256a42.666667 42.666667 0 0 1 42.666666-42.666667h853.333334a42.666667 42.666667 0 0 1 42.666666 42.666667v597.333333a42.666667 42.666667 0 0 1-42.666666 42.666667H85.333333a42.666667 42.666667 0 0 1-42.666666-42.666667V256z" fill="#FFC60A" p-id="16255"></path></svg>

After

Width:  |  Height:  |  Size: 973 B

View File

@ -1,5 +1,6 @@
<template>
<div class="item-content mb-16 lighter">
<template v-for="(answer_text, index) in answer_text_list" :key="index">
<div class="avatar mr-8" v-if="application.show_avatar">
<img v-if="application.avatar" :src="application.avatar" height="28px" width="28px" />

View File

@ -8,6 +8,7 @@
@touchstart="onTouchStart"
@touchmove="onTouchMove"
@touchend="onTouchEnd"
:disabled="props.disabled"
>
按住说话
</el-button>
@ -47,6 +48,10 @@ const props = defineProps({
start: {
type: Boolean,
default: false
},
disabled: {
type: Boolean,
default: false
}
})
const emit = defineEmits(['TouchStart', 'TouchEnd'])
@ -57,11 +62,19 @@ const dialogVisible = ref(false)
const message = ref('按住说话')
watch(
() => props.time,
(val) => {
if (val && val === 60) {
() => [props.time, props.start],
([time, start]) => {
if (start) {
isTouching.value = true
dialogVisible.value = true
message.value = '松开发送,上滑取消'
if (time === 60) {
dialogVisible.value = false
emit('TouchEnd', isTouching.value)
isTouching.value = false
}
} else {
dialogVisible.value = false
emit('TouchEnd', isTouching.value)
isTouching.value = false
}
}

View File

@ -120,6 +120,7 @@
@TouchEnd="TouchEnd"
:time="recorderTime"
:start="!mediaRecorderStatus"
:disabled="loading"
/>
<el-input
v-else
@ -149,7 +150,12 @@
</el-button>
</span>
<span class="flex align-center" v-else>
<el-button text @click="startRecording" v-if="mediaRecorderStatus">
<el-button
:disabled="loading"
text
@click="startRecording"
v-if="mediaRecorderStatus"
>
<el-icon>
<Microphone />
</el-icon>
@ -166,7 +172,7 @@
</span>
</template>
<template v-if="!startRecorderTime && !recorderLoading">
<template v-if="(!startRecorderTime && !recorderLoading) || mode === 'mobile'">
<span v-if="props.applicationDetails.file_upload_enable" class="flex align-center ml-4">
<el-upload
action="#"
@ -515,7 +521,12 @@ const stopRecording = () => {
//
const uploadRecording = async (audioBlob: Blob) => {
try {
//
if (!props.applicationDetails.stt_autosend) {
isMicrophone.value = false
}
recorderLoading.value = true
const formData = new FormData()
formData.append('file', audioBlob, 'recording.mp3')
applicationApi

View File

@ -17,26 +17,4 @@ defineProps<{
tooltip: string
}>()
</script>
<style lang="scss" scoped>
.aiMode-param-dialog {
padding: 8px 8px 24px 8px;
.el-dialog__header {
padding: 16px 16px 0 16px;
}
.el-dialog__body {
padding: 16px !important;
}
.dialog-max-height {
height: 550px;
}
.custom-slider {
.el-input-number.is-without-controls .el-input__wrapper {
padding: 0 !important;
}
}
}
</style>
<style lang="scss" scoped></style>

View File

@ -34,7 +34,7 @@ export default {
datasetName: {
label: '知识库名称',
placeholder: '请输入知识库名称',
requiredMessage: '请输入应用名称'
requiredMessage: '请输入知识库名称'
},
datasetDescription: {
label: '知识库描述',

View File

@ -33,7 +33,7 @@ export default {
datasetName: {
label: '知識庫名稱',
placeholder: '請輸入知識庫名稱',
requiredMessage: '請輸入應用名稱'
requiredMessage: '請輸入知識庫名稱'
},
datasetDescription: {
label: '知識庫描述',

View File

@ -772,3 +772,22 @@ h5 {
background: #d6e2ff;
line-height: 25px;
}
// 参数设置dialog
.param-dialog {
padding: 8px 8px 24px 8px;
.el-dialog__header {
padding: 16px 16px 0 16px;
}
.el-dialog__body {
padding: 0 !important;
}
.dialog-max-height {
height: 550px;
}
.custom-slider {
.el-input-number.is-without-controls .el-input__wrapper {
padding: 0 !important;
}
}
}

View File

@ -425,5 +425,5 @@
}
.el-tree {
--el-tree-node-content-height: 32px;
--el-tree-node-content-height: 38px;
}

View File

@ -2,7 +2,7 @@
<el-dialog
align-center
:title="$t('common.paramSetting')"
class="aiMode-param-dialog"
class="param-dialog"
v-model="dialogVisible"
style="width: 550px"
append-to-body
@ -89,26 +89,4 @@ const submit = async () => {
defineExpose({ open, reset_default })
</script>
<style lang="scss" scoped>
.aiMode-param-dialog {
padding: 8px 8px 24px 8px;
.el-dialog__header {
padding: 16px 16px 0 16px;
}
.el-dialog__body {
padding: 16px !important;
}
.dialog-max-height {
height: 550px;
}
.custom-slider {
.el-input-number.is-without-controls .el-input__wrapper {
padding: 0 !important;
}
}
}
</style>
<style lang="scss" scoped></style>

View File

@ -144,7 +144,7 @@ const refresh = () => {
defineExpose({ open })
</script>
<style lang="scss" scoped>
<style lang="scss">
.addDataset-dialog {
padding: 0;
.el-dialog__header {

View File

@ -9,13 +9,21 @@
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form label-position="top" ref="paramFormRef" :model="form"
require-asterisk-position="right">
<el-form
label-position="top"
ref="paramFormRef"
:model="form"
require-asterisk-position="right"
>
<el-form-item label="MCP" prop="mcp_enable">
<el-switch v-model="form.mcp_enable" />
</el-form-item>
<el-form-item v-if="form.mcp_enable" label="MCP Server Config" prop="mcp_servers"
:rules="[{ required: true, message: $t('common.required') }]">
<el-form-item
v-if="form.mcp_enable"
label="MCP Server Config"
prop="mcp_servers"
:rules="[{ required: true, message: $t('common.required') }]"
>
<el-input
v-model="form.mcp_servers"
:rows="6"
@ -49,7 +57,6 @@ const mcpServerJson = `{
}
}`
const form = ref<any>({
mcp_servers: '',
mcp_enable: false
@ -82,26 +89,4 @@ const submit = () => {
defineExpose({ open })
</script>
<style lang="scss" scoped>
.param-dialog {
padding: 8px 8px 24px 8px;
.el-dialog__header {
padding: 16px 16px 0 16px;
}
.el-dialog__body {
padding: 0 !important;
}
.dialog-max-height {
height: 560px;
}
.custom-slider {
.el-input-number.is-without-controls .el-input__wrapper {
padding: 0 !important;
}
}
}
</style>
<style lang="scss" scoped></style>

View File

@ -326,22 +326,6 @@ function changeHandle(val: string) {
defineExpose({ open })
</script>
<style lang="scss" scoped>
.param-dialog {
padding: 8px 8px 24px 8px;
.el-dialog__header {
padding: 16px 16px 0 16px;
}
.el-dialog__body {
padding: 0 !important;
}
.dialog-max-height {
height: 560px;
}
.custom-slider {
.el-input-number.is-without-controls .el-input__wrapper {
padding: 0 !important;
}
}
}
<style lang="scss">
</style>

View File

@ -84,26 +84,4 @@ const submit = () => {
defineExpose({ open })
</script>
<style lang="scss" scoped>
.param-dialog {
padding: 8px 8px 24px 8px;
.el-dialog__header {
padding: 16px 16px 0 16px;
}
.el-dialog__body {
padding: 0 !important;
}
.dialog-max-height {
height: 560px;
}
.custom-slider {
.el-input-number.is-without-controls .el-input__wrapper {
padding: 0 !important;
}
}
}
</style>
<style lang="scss" scoped></style>

View File

@ -2,9 +2,9 @@
<el-dialog
align-center
:title="$t('common.paramSetting')"
class="aiMode-param-dialog"
v-model="dialogVisible"
style="width: 550px"
class="param-dialog"
append-to-body
:close-on-click-modal="false"
:close-on-press-escape="false"
@ -25,7 +25,6 @@
<el-button @click="testPlay" :loading="playLoading">
<AppIcon iconName="app-video-play" class="mr-4"></AppIcon>
{{ $t('views.application.applicationForm.form.voicePlay.listeningTest') }}
</el-button>
</span>
<span class="dialog-footer p-16">
@ -77,15 +76,17 @@ const open = (model_id: string, application_id?: string, model_setting_data?: an
api.then((ok) => {
model_form_field.value = ok.data
const resp = ok.data
.map((item: any) => ({ [item.field]: item.show_default_value !== false ? item.default_value : undefined }))
.map((item: any) => ({
[item.field]: item.show_default_value !== false ? item.default_value : undefined
}))
.reduce((x, y) => ({ ...x, ...y }), {})
//
if (model_setting_data) {
Object.keys(model_setting_data).forEach(key => {
Object.keys(model_setting_data).forEach((key) => {
if (!(key in resp)) {
delete model_setting_data[key];
delete model_setting_data[key]
}
});
})
}
model_setting_data = { ...resp, ...model_setting_data }
//
@ -99,7 +100,9 @@ const reset_default = (model_id: string, application_id?: string) => {
api.then((ok) => {
model_form_field.value = ok.data
const model_setting_data = ok.data
.map((item) => ({ [item.field]: item.show_default_value !== false ? item.default_value : undefined }))
.map((item) => ({
[item.field]: item.show_default_value !== false ? item.default_value : undefined
}))
.reduce((x, y) => ({ ...x, ...y }), {})
emit('refresh', model_setting_data)
@ -149,26 +152,4 @@ const testPlay = () => {
defineExpose({ open, reset_default })
</script>
<style lang="scss" scoped>
.aiMode-param-dialog {
padding: 8px 8px 24px 8px;
.el-dialog__header {
padding: 16px 16px 0 16px;
}
.el-dialog__body {
padding: 16px !important;
}
.dialog-max-height {
height: 550px;
}
.custom-slider {
.el-input-number.is-without-controls .el-input__wrapper {
padding: 0 !important;
}
}
}
</style>
<style lang="scss" scoped></style>

View File

@ -53,30 +53,25 @@
>
<template #default="{ node, data }">
<div class="custom-tree-node flex align-center lighter">
<el-icon v-if="data.type === 'folder'">
<FolderOpened />
</el-icon>
<el-icon v-else-if="data.type === 'docx'">
<Document />
</el-icon>
<el-icon class="xlsx-icon" v-else-if="data.type === 'sheet'">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- 文件轮廓 -->
<path
d="M5 3H14L19 8V19C19 20.1 18.1 21 17 21H5C3.9 21 3 20.1 3 19V5C3 3.9 3.9 3 5 3Z"
fill="white"
stroke="currentColor"
stroke-width="1.2"
/>
<!-- 放大后的 X 符号占比提升30% -->
<path
d="M7 9L17 19M17 9L7 19"
stroke="currentColor"
stroke-width="2.5"
stroke-linecap="round"
/>
</svg>
</el-icon>
<img
src="@/assets/fileType/file-icon.svg"
alt=""
height="20"
v-if="data.type === 'folder'"
/>
<img
src="@/assets/fileType/docx-icon.svg"
alt=""
height="22"
v-else-if="data.type === 'docx'"
/>
<img
src="@/assets/fileType/xlsx-icon.svg"
alt=""
height="22"
v-else-if="data.type === 'sheet'"
/>
<span class="ml-4">{{ node.label }}</span>
</div>
</template>
@ -99,6 +94,7 @@
import { ref, reactive, computed, onUnmounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { MsgConfirm, MsgSuccess } from '@/utils/message'
import { getImgUrl } from '@/utils/utils'
import { t } from '@/locales'
import type Node from 'element-plus/es/components/tree/src/model/node'
import dataset from '@/api/dataset'

View File

@ -16,7 +16,7 @@
require-asterisk-position="right"
>
<el-form-item prop="name">
<el-input v-model="form.name"></el-input>
<el-input v-model="form.name" maxlength="64" show-word-limit></el-input>
</el-form-item>
</el-form>
<template #footer>

View File

@ -43,9 +43,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
:label="$t('views.application.applicationForm.dialog.topReferences')"
>
<el-form-item :label="$t('views.application.applicationForm.dialog.topReferences')">
<el-input-number
v-model="form.top_n"
:min="1"
@ -125,22 +123,4 @@ const submit = () => {
defineExpose({ open })
</script>
<style lang="scss" scoped>
.param-dialog {
padding: 8px 8px 24px 8px;
.el-dialog__header {
padding: 16px 16px 0 16px;
}
.el-dialog__body {
padding: 0 !important;
}
.dialog-max-height {
height: 550px;
}
.custom-slider {
.el-input-number.is-without-controls .el-input__wrapper {
padding: 0 !important;
}
}
}
</style>
<style lang="scss"></style>