Skip to content

Commit 97b59ee

Browse files
feat: function
1 parent f193166 commit 97b59ee

File tree

8 files changed

+118
-40
lines changed

8 files changed

+118
-40
lines changed

ui/src/assets/fx/bochaai/detail.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
## 概述
2+
3+
博查工具是一个支持自然语言搜索的 Web Search API,从近百亿网页和生态内容源中搜索高质量世界知识,包括新闻、图片、视频、百科、机酒、学术等.
4+
5+
6+
## 配置
7+
8+
1. 获取API Key 
9+
[博查开放平台](https://open.bochaai.com/overview) 上申请 API 密钥。
10+
![API Key](img/bochaAPI_Key.jpg)
11+
2. 在函数库中配置
12+
在函数库的博查函数面板中,点击 … > 启用参数,填写 API 密钥,并启用博查函数。
13+
![启动参数](img/bocha_setting.jpg)
14+
3. 在应用中使用
15+
在高级编排应用中,点击添加组件->函数库->博查,设置使用参数。
16+
![应用中使用](img/bocha_app_used.jpg)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
## 概述
2+
3+
Google 搜索工具是一个实时 API,可提取搜索引擎结果,提供来自 Google 的结构化数据。它支持各种搜索类型,包括 Web、图像、新闻和地图。
4+
5+
## 配置
6+
7+
1. 创建 Google Custom Search Engine
8+
[Programmable Search Engine]https://programmablesearchengine.google.com/)中 添加 Search Engine
9+
![google 创建引擎](img/google_AddSearchEngine.jpg)
10+
2. 获取cx参数
11+
进入添加引擎,在【基本】菜单中获取搜索引擎的ID,即cx。
12+
![google cx ](img/google_cx.jpg)
13+
3.获取 API Key
14+
打开 https://developers.google.com/custom-search/v1/overview?hl=zh-cn,获取API Key。
15+
![google API Key](img/google_APIKey.jpg)
16+
17+
4. 配置启动参数
18+
在Google搜索函数的启动参数中填写配置以上参数。
19+
![启动参数](img/google_setting.jpg)
20+
21+
5. 在应用中使用
22+
在高级编排应用中,点击添加组件->函数库->博查,设置使用参数。
23+
![应用中使用](img/google_app_used.jpg)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
## 概述
2+
3+
博查工具是一个支持自然语言搜索的 Web Search API,从近百亿网页和生态内容源中搜索高质量世界知识,包括新闻、图片、视频、百科、机酒、学术等.
4+
5+
6+
## 配置
7+
8+
1. 获取API Key 
9+
[博查开放平台](https://open.bochaai.com/overview) 上申请 API 密钥。
10+
![API Key](img/langsearchAPI_Key.jpg)
11+
2. 在函数库中配置
12+
在函数库的博查函数面板中,点击 … > 启用参数,填写 API 密钥,并启用博查函数。
13+
![启动参数](img/langsearch_setting.jpg)
14+
1. 在应用中使用
15+
在高级编排应用中,点击添加组件->函数库->博查,设置使用参数。
16+
![应用中使用](img/langsearch_app_used.jpg)
17+

ui/src/assets/icon_mcp.svg

Lines changed: 4 additions & 0 deletions
Loading

ui/src/views/application-workflow/component/DropdownMenu.vue

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,21 @@
5555
@click.stop="clickNodes(functionLibNode, item, 'function')"
5656
@mousedown.stop="onmousedown(functionLibNode, item, 'function')"
5757
>
58-
<component :is="iconComponent(`function-lib-node-icon`)" class="mr-8" :size="32" />
58+
<AppAvatar
59+
v-if="item.icon != '/ui/favicon.ico'"
60+
shape="square"
61+
:size="32"
62+
style="background: none"
63+
class="mr-8"
64+
>
65+
<img :src="item?.icon || ''" alt="" />
66+
</AppAvatar>
67+
<component
68+
v-else
69+
:is="iconComponent(`function-lib-node-icon`)"
70+
class="mr-8"
71+
:size="32"
72+
/>
5973
<div class="pre-wrap">
6074
<div class="lighter ellipsis-1" :title="item.name">{{ item.name }}</div>
6175
<p>

ui/src/views/function-lib/index.vue

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105
style="background: none"
106106
class="mr-8"
107107
>
108-
<img :src="getImageUrl(item?.icon)" alt="" />
108+
<img :src="item?.icon" alt="" />
109109
</AppAvatar>
110110
<AppAvatar
111111
v-else-if="item?.name"
@@ -218,7 +218,7 @@
218218
style="background: none"
219219
class="mr-8"
220220
>
221-
<img :src="getImageUrl(item?.icon)" alt="" />
221+
<img :src="item?.icon" alt="" />
222222
</AppAvatar>
223223
<AppAvatar
224224
v-else-if="item?.name"
@@ -229,9 +229,7 @@
229229
class="mr-8"
230230
/>
231231
</template>
232-
<div class="status-button">
233-
234-
</div>
232+
<div class="status-button"></div>
235233
<template #footer>
236234
<div class="footer-content flex-between">
237235
<div>{{ $t('common.author') }}: MaxKB</div>
@@ -249,7 +247,10 @@
249247
</div>
250248
<FunctionFormDrawer ref="FunctionFormDrawerRef" @refresh="refresh" :title="title" />
251249
<PermissionDialog ref="PermissionDialogRef" @refresh="refresh" />
252-
<AddInternalFunctionDialog ref="AddInternalFunctionDialogRef" @refresh="confirmAddInternalFunction" />
250+
<AddInternalFunctionDialog
251+
ref="AddInternalFunctionDialogRef"
252+
@refresh="confirmAddInternalFunction"
253+
/>
253254
<InitParamDrawer ref="InitParamDrawerRef" @refresh="refresh" />
254255
<component :is="internalDescComponent" ref="internalDescRef" />
255256
</div>
@@ -271,7 +272,7 @@ import CardBox from '@/components/card-box/index.vue'
271272
import type { Dict } from '@/api/type/common'
272273
import AddInternalFunctionDialog from '@/views/function-lib/component/AddInternalFunctionDialog.vue'
273274
274-
const internalIcons: Dict<any> = import.meta.glob('@/assets/fx/*/*.png', { eager: true })
275+
// const internalIcons: Dict<any> = import.meta.glob('@/assets/fx/*/*.png', { eager: true })
275276
let internalDesc: Dict<any> = import.meta.glob('@/assets/fx/*/index.vue', { eager: true })
276277
const internalDescRef = ref()
277278
const internalDescComponent = ref()
@@ -342,13 +343,6 @@ function openCreateDialog(data?: any) {
342343
}
343344
}
344345
345-
function getImageUrl(name: string) {
346-
if (name.startsWith('/src/assets/fx/')) {
347-
return internalIcons[name]?.default
348-
}
349-
return name
350-
}
351-
352346
function openDescDrawer(row: any) {
353347
const index = row.icon.replace('icon.png', 'index.vue')
354348
internalDescComponent.value = internalDesc[index].default
@@ -362,10 +356,12 @@ function addInternalFunction(data?: any) {
362356
}
363357
364358
function confirmAddInternalFunction(data?: any) {
365-
functionLibApi.addInternalFunction(data.id, {name: data.name}, changeStateloading).then((res) => {
366-
MsgSuccess(t('common.submitSuccess'))
367-
searchHandle()
368-
})
359+
functionLibApi
360+
.addInternalFunction(data.id, { name: data.name }, changeStateloading)
361+
.then((res) => {
362+
MsgSuccess(t('common.submitSuccess'))
363+
searchHandle()
364+
})
369365
}
370366
371367
function searchHandle() {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
2-
<AppAvatar shape="square" class="avatar-blue">
3-
<img src="@/assets/icon_assigner.svg" style="width: 65%" alt="" />
2+
<AppAvatar shape="square" style="background: #34c724">
3+
<img src="@/assets/icon_mcp.svg" style="width: 65%" alt="" />
44
</AppAvatar>
55
</template>
66
<script setup lang="ts"></script>

ui/src/workflow/nodes/mcp-node/index.vue

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
<div class="flex-between">
2626
<span>{{ $t('views.applicationWorkflow.nodes.mcpNode.tool') }}</span>
2727
<el-button type="primary" link @click="getTools()">
28+
<el-icon class="mr-4">
29+
<Plus />
30+
</el-icon>
2831
{{ $t('views.applicationWorkflow.nodes.mcpNode.getTool') }}
2932
</el-button>
3033
</div>
3134
</template>
32-
<el-select
33-
v-model="form_data.mcp_tool"
34-
@change="changeTool"
35-
>
35+
<el-select v-model="form_data.mcp_tool" @change="changeTool">
3636
<el-option
3737
v-for="item in form_data.mcp_tools"
3838
:key="item.value"
@@ -55,8 +55,12 @@
5555
</el-form>
5656
</div>
5757
<h5 class="title-decoration-1 mb-8">
58-
{{ $t('views.applicationWorkflow.nodes.mcpNode.toolParam') }}</h5>
59-
<div class="border-r-4 p-8-12 mb-8 layout-bg lighter" v-if="form_data.tool_params[form_data.params_nested]">
58+
{{ $t('views.applicationWorkflow.nodes.mcpNode.toolParam') }}
59+
</h5>
60+
<div
61+
class="border-r-4 p-8-12 mb-8 layout-bg lighter"
62+
v-if="form_data.tool_params[form_data.params_nested]"
63+
>
6064
<DynamicsForm
6165
v-if="form_data.mcp_tool"
6266
v-model="form_data.tool_params[form_data.params_nested]"
@@ -116,7 +120,6 @@ const form = {
116120
params_nested: ''
117121
}
118122
119-
120123
function submitDialog(val: string) {
121124
set(props.nodeModel.properties.node_data, 'mcp_servers', val)
122125
}
@@ -132,17 +135,23 @@ function getTools() {
132135
MsgError(t('views.applicationWorkflow.nodes.mcpNode.mcpServerTip'))
133136
return
134137
}
135-
applicationApi.getMcpTools({ mcp_servers: form_data.value.mcp_servers }, loading).then((res: any) => {
136-
form_data.value.mcp_tools = res.data
137-
MsgSuccess(t('views.applicationWorkflow.nodes.mcpNode.getToolsSuccess'))
138-
})
138+
applicationApi
139+
.getMcpTools({ mcp_servers: form_data.value.mcp_servers }, loading)
140+
.then((res: any) => {
141+
form_data.value.mcp_tools = res.data
142+
MsgSuccess(t('views.applicationWorkflow.nodes.mcpNode.getToolsSuccess'))
143+
})
139144
}
140145
141146
function changeTool() {
142-
form_data.value.mcp_server = form_data.value.mcp_tools.filter((item: any) => item.name === form_data.value.mcp_tool)[0].server
147+
form_data.value.mcp_server = form_data.value.mcp_tools.filter(
148+
(item: any) => item.name === form_data.value.mcp_tool
149+
)[0].server
143150
// console.log(form_data.value.mcp_server)
144151
145-
const args_schema = form_data.value.mcp_tools.filter((item: any) => item.name === form_data.value.mcp_tool)[0].args_schema
152+
const args_schema = form_data.value.mcp_tools.filter(
153+
(item: any) => item.name === form_data.value.mcp_tool
154+
)[0].args_schema
146155
form_data.value.tool_form_field = []
147156
for (const item in args_schema.properties) {
148157
let params = args_schema.properties[item].properties
@@ -201,7 +210,10 @@ function changeTool() {
201210
//
202211
if (form_data.value.params_nested) {
203212
form_data.value.tool_params = { [form_data.value.params_nested]: {} }
204-
dynamicsFormRef.value?.render(form_data.value.tool_form_field, form_data.value.tool_params[form_data.value.params_nested])
213+
dynamicsFormRef.value?.render(
214+
form_data.value.tool_form_field,
215+
form_data.value.tool_params[form_data.value.params_nested]
216+
)
205217
} else {
206218
form_data.value.tool_params = {}
207219
dynamicsFormRef.value?.render(form_data.value.tool_form_field, form_data.value.tool_params)
@@ -223,14 +235,10 @@ const form_data = computed({
223235
}
224236
})
225237
226-
227238
const replyNodeFormRef = ref()
228239
229240
const validate = async () => {
230-
let ps = [
231-
replyNodeFormRef.value?.validate(),
232-
dynamicsFormRef.value?.validate()
233-
]
241+
let ps = [replyNodeFormRef.value?.validate(), dynamicsFormRef.value?.validate()]
234242
return Promise.all(ps).catch((err: any) => {
235243
return Promise.reject({ node: props.nodeModel, errMessage: err })
236244
})

0 commit comments

Comments
 (0)