From 96d36c070616b7e7d48f096f5bc42a57dddaaf6a Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Wed, 7 May 2025 21:56:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AF=8C=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=99=A8=EF=BC=8C=E6=94=AF=E6=8C=81=E5=9C=A8?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=AF=B9=E6=8F=90=E8=AF=8D=E5=92=8C?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E8=BF=9B=E8=A1=8C=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7 +- .../src/components/k-rich-textarea/index.vue | 126 --------- .../k-rich-textarea/textarea.dto.ts | 17 -- .../main-panel/chat/{ => chat-box}/chat.ts | 22 ++ .../main-panel/chat/chat-box/index.vue | 204 +++++++++++++++ .../{ => chat-box}/options/context-length.vue | 0 .../chat/{ => chat-box}/options/model.vue | 0 .../chat/chat-box/options/prompt.vue | 114 ++++++++ .../chat/chat-box/options/resource.vue | 116 +++++++++ .../chat/{ => chat-box}/options/setting.vue | 11 +- .../{ => chat-box}/options/system-prompt.ts | 0 .../{ => chat-box}/options/system-prompt.vue | 0 .../{ => chat-box}/options/temperature.vue | 0 .../chat/{ => chat-box}/options/tool-use.vue | 2 +- .../chat/{ => chat-box}/options/websearch.vue | 0 .../chat/chat-box/prompt-chat-item.vue | 42 +++ .../chat/chat-box/resource-chat-item.vue | 168 ++++++++++++ .../chat/chat-box/rich-textarea.vue | 243 ++++++++++++++++++ .../main-panel/chat/{ => core}/task-loop.ts | 4 +- .../main-panel/chat/{ => core}/usage.ts | 2 +- .../src/components/main-panel/chat/index.vue | 190 ++------------ .../main-panel/chat/message/assistant.vue | 2 +- .../main-panel/chat/message/message-meta.vue | 2 +- .../main-panel/chat/message/streaming-box.vue | 2 +- .../chat/message/toolcall-result-item.vue | 12 +- .../main-panel/chat/message/toolcall.vue | 4 +- .../main-panel/chat/options/prompt.vue | 81 ------ .../main-panel/chat/options/resource.vue | 42 --- .../main-panel/prompt/prompt-logger.vue | 2 +- .../main-panel/resource/resouce-reader.vue | 73 +++--- .../resource/resource-list-templates.vue | 19 +- .../main-panel/resource/resource-list.vue | 23 +- .../main-panel/resource/resource-logger.vue | 4 +- .../main-panel/tool/tool-executor.vue | 3 - renderer/src/components/sidebar/connected.vue | 4 +- renderer/src/hook/type.ts | 3 + renderer/src/hook/util.ts | 6 + renderer/src/views/setting/api.ts | 4 +- renderer/src/views/setting/llm.ts | 2 +- servers/main.py | 10 + service/src/mcp/ocr.controller.ts | 18 ++ service/tabs.锦恢的 MCP Server.json | 60 ++--- 42 files changed, 1106 insertions(+), 538 deletions(-) delete mode 100644 renderer/src/components/k-rich-textarea/index.vue delete mode 100644 renderer/src/components/k-rich-textarea/textarea.dto.ts rename renderer/src/components/main-panel/chat/{ => chat-box}/chat.ts (87%) create mode 100644 renderer/src/components/main-panel/chat/chat-box/index.vue rename renderer/src/components/main-panel/chat/{ => chat-box}/options/context-length.vue (100%) rename renderer/src/components/main-panel/chat/{ => chat-box}/options/model.vue (100%) create mode 100644 renderer/src/components/main-panel/chat/chat-box/options/prompt.vue create mode 100644 renderer/src/components/main-panel/chat/chat-box/options/resource.vue rename renderer/src/components/main-panel/chat/{ => chat-box}/options/setting.vue (94%) rename renderer/src/components/main-panel/chat/{ => chat-box}/options/system-prompt.ts (100%) rename renderer/src/components/main-panel/chat/{ => chat-box}/options/system-prompt.vue (100%) rename renderer/src/components/main-panel/chat/{ => chat-box}/options/temperature.vue (100%) rename renderer/src/components/main-panel/chat/{ => chat-box}/options/tool-use.vue (97%) rename renderer/src/components/main-panel/chat/{ => chat-box}/options/websearch.vue (100%) create mode 100644 renderer/src/components/main-panel/chat/chat-box/prompt-chat-item.vue create mode 100644 renderer/src/components/main-panel/chat/chat-box/resource-chat-item.vue create mode 100644 renderer/src/components/main-panel/chat/chat-box/rich-textarea.vue rename renderer/src/components/main-panel/chat/{ => core}/task-loop.ts (99%) rename renderer/src/components/main-panel/chat/{ => core}/usage.ts (96%) delete mode 100644 renderer/src/components/main-panel/chat/options/prompt.vue delete mode 100644 renderer/src/components/main-panel/chat/options/resource.vue diff --git a/CHANGELOG.md b/CHANGELOG.md index f07eb8a..6d016fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,10 @@ # Change Log ## [main] 0.0.7 -- 优化页面布局,使得调试内容更加紧凑 -- 扩大默认的上下文长度 -- 增加「通用选项」,用于设置mcp服务器的最大的等待时间 +- 优化页面布局,使得调试窗口可以显示更多内容 +- 扩大默认的上下文长度 10 -> 20 +- 增加「通用选项」 -> 「MCP工具最长调用时间 (sec)」 +- 支持富文本输入框,现在可以将 prompt 和 resource 嵌入到输入框中 进行 大规模 prompt engineering 调试工作了 ## [main] 0.0.6 - 修复部分因为服务器名称特殊字符而导致的保存实效的错误 diff --git a/renderer/src/components/k-rich-textarea/index.vue b/renderer/src/components/k-rich-textarea/index.vue deleted file mode 100644 index 9a306ab..0000000 --- a/renderer/src/components/k-rich-textarea/index.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - - \ No newline at end of file diff --git a/renderer/src/components/k-rich-textarea/textarea.dto.ts b/renderer/src/components/k-rich-textarea/textarea.dto.ts deleted file mode 100644 index 2274508..0000000 --- a/renderer/src/components/k-rich-textarea/textarea.dto.ts +++ /dev/null @@ -1,17 +0,0 @@ - -interface PromptTextItem { - type: 'prompt' - text: string -} - -interface ResourceTextItem { - type: 'resource' - text: string -} - -interface TextItem { - type: 'text' - text: string -} - -export type RichTextItem = PromptTextItem | ResourceTextItem | TextItem; \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/chat.ts b/renderer/src/components/main-panel/chat/chat-box/chat.ts similarity index 87% rename from renderer/src/components/main-panel/chat/chat.ts rename to renderer/src/components/main-panel/chat/chat-box/chat.ts index 8e5348c..a3b9f77 100644 --- a/renderer/src/components/main-panel/chat/chat.ts +++ b/renderer/src/components/main-panel/chat/chat-box/chat.ts @@ -76,6 +76,23 @@ export interface ToolCall { } } +interface PromptTextItem { + type: 'prompt' + text: string +} + +interface ResourceTextItem { + type: 'resource' + text: string +} + +interface TextItem { + type: 'text' + text: string +} + +export type RichTextItem = PromptTextItem | ResourceTextItem | TextItem; + export const allTools = ref([]); export interface IRenderMessage { @@ -105,3 +122,8 @@ export function getToolSchema(enableTools: EnableToolItem[]) { } return toolsSchema; } + +export interface EditorContext { + editor: Ref; + [key: string]: any; +} \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/chat-box/index.vue b/renderer/src/components/main-panel/chat/chat-box/index.vue new file mode 100644 index 0000000..64c7313 --- /dev/null +++ b/renderer/src/components/main-panel/chat/chat-box/index.vue @@ -0,0 +1,204 @@ + + + + + \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/options/context-length.vue b/renderer/src/components/main-panel/chat/chat-box/options/context-length.vue similarity index 100% rename from renderer/src/components/main-panel/chat/options/context-length.vue rename to renderer/src/components/main-panel/chat/chat-box/options/context-length.vue diff --git a/renderer/src/components/main-panel/chat/options/model.vue b/renderer/src/components/main-panel/chat/chat-box/options/model.vue similarity index 100% rename from renderer/src/components/main-panel/chat/options/model.vue rename to renderer/src/components/main-panel/chat/chat-box/options/model.vue diff --git a/renderer/src/components/main-panel/chat/chat-box/options/prompt.vue b/renderer/src/components/main-panel/chat/chat-box/options/prompt.vue new file mode 100644 index 0000000..6c4f1d9 --- /dev/null +++ b/renderer/src/components/main-panel/chat/chat-box/options/prompt.vue @@ -0,0 +1,114 @@ + + + + + \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/chat-box/options/resource.vue b/renderer/src/components/main-panel/chat/chat-box/options/resource.vue new file mode 100644 index 0000000..66a9953 --- /dev/null +++ b/renderer/src/components/main-panel/chat/chat-box/options/resource.vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/options/setting.vue b/renderer/src/components/main-panel/chat/chat-box/options/setting.vue similarity index 94% rename from renderer/src/components/main-panel/chat/options/setting.vue rename to renderer/src/components/main-panel/chat/chat-box/options/setting.vue index 8bcfa21..c5a83c0 100644 --- a/renderer/src/components/main-panel/chat/options/setting.vue +++ b/renderer/src/components/main-panel/chat/chat-box/options/setting.vue @@ -3,7 +3,8 @@ - + + @@ -11,15 +12,16 @@ + + \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/chat-box/resource-chat-item.vue b/renderer/src/components/main-panel/chat/chat-box/resource-chat-item.vue new file mode 100644 index 0000000..19df3b8 --- /dev/null +++ b/renderer/src/components/main-panel/chat/chat-box/resource-chat-item.vue @@ -0,0 +1,168 @@ + + + + + \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/chat-box/rich-textarea.vue b/renderer/src/components/main-panel/chat/chat-box/rich-textarea.vue new file mode 100644 index 0000000..b0913cb --- /dev/null +++ b/renderer/src/components/main-panel/chat/chat-box/rich-textarea.vue @@ -0,0 +1,243 @@ + + + + + \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/task-loop.ts b/renderer/src/components/main-panel/chat/core/task-loop.ts similarity index 99% rename from renderer/src/components/main-panel/chat/task-loop.ts rename to renderer/src/components/main-panel/chat/core/task-loop.ts index 048e2da..87bb65b 100644 --- a/renderer/src/components/main-panel/chat/task-loop.ts +++ b/renderer/src/components/main-panel/chat/core/task-loop.ts @@ -1,9 +1,9 @@ /* eslint-disable */ import { Ref } from "vue"; -import { ToolCall, ChatStorage, getToolSchema, MessageState } from "./chat"; +import { ToolCall, ChatStorage, getToolSchema, MessageState } from "../chat-box/chat"; import { useMessageBridge } from "@/api/message-bridge"; import type { OpenAI } from 'openai'; -import { callTool } from "../tool/tools"; +import { callTool } from "../../tool/tools"; import { llmManager, llms } from "@/views/setting/llm"; import { pinkLog, redLog } from "@/views/setting/util"; import { ElMessage } from "element-plus"; diff --git a/renderer/src/components/main-panel/chat/usage.ts b/renderer/src/components/main-panel/chat/core/usage.ts similarity index 96% rename from renderer/src/components/main-panel/chat/usage.ts rename to renderer/src/components/main-panel/chat/core/usage.ts index 8552c8f..a6b51d2 100644 --- a/renderer/src/components/main-panel/chat/usage.ts +++ b/renderer/src/components/main-panel/chat/core/usage.ts @@ -1,4 +1,4 @@ -import { IExtraInfo } from "./chat"; +import { IExtraInfo } from "../chat-box/chat"; export interface UsageStatistic { input: number; diff --git a/renderer/src/components/main-panel/chat/index.vue b/renderer/src/components/main-panel/chat/index.vue index 6e1d4eb..72f7dff 100644 --- a/renderer/src/components/main-panel/chat/index.vue +++ b/renderer/src/components/main-panel/chat/index.vue @@ -40,52 +40,29 @@
{{ t('press-and-run') }} - -
-
-
-
- - - - - - - - -
-
-
+ @@ -387,67 +298,6 @@ onUnmounted(() => { margin-top: 5px; } -.chat-footer { - padding: 16px; - border-top: 1px solid var(--el-border-color); - flex-shrink: 0; - position: absolute; - height: fit-content !important; - bottom: 0; - width: 100%; -} - -.input-area { - max-width: 800px; - margin: 0 auto; - position: relative; -} - -.input-wrapper { - position: relative; -} - -.chat-input { - padding-right: 80px; -} - -.chat-input textarea { - border-radius: .5em; -} - -.send-button { - position: absolute !important; - right: 8px !important; - bottom: 8px !important; - height: auto; - padding: 8px 12px; - font-size: 20px; - border-radius: 1.2em !important; -} - -:deep(.chat-settings) { - position: absolute; - left: 0; - bottom: 0px; - z-index: 1; -} - -.typing-cursor { - animation: blink 1s infinite; -} - -@keyframes blink { - - 0%, - 100% { - opacity: 1; - } - - 50% { - opacity: 0; - } -} - .message-text p, .message-text h3, .message-text ol, diff --git a/renderer/src/components/main-panel/chat/message/assistant.vue b/renderer/src/components/main-panel/chat/message/assistant.vue index b548d25..792bd7e 100644 --- a/renderer/src/components/main-panel/chat/message/assistant.vue +++ b/renderer/src/components/main-panel/chat/message/assistant.vue @@ -8,7 +8,7 @@ - - \ No newline at end of file diff --git a/renderer/src/components/main-panel/chat/options/resource.vue b/renderer/src/components/main-panel/chat/options/resource.vue deleted file mode 100644 index aa48d5b..0000000 --- a/renderer/src/components/main-panel/chat/options/resource.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - \ No newline at end of file diff --git a/renderer/src/components/main-panel/prompt/prompt-logger.vue b/renderer/src/components/main-panel/prompt/prompt-logger.vue index d72c7c2..78e0ac7 100644 --- a/renderer/src/components/main-panel/prompt/prompt-logger.vue +++ b/renderer/src/components/main-panel/prompt/prompt-logger.vue @@ -13,7 +13,7 @@ /> - +
- + + :placeholder="param.placeholder || `请输入${param.name}`" @keydown.enter.prevent="handleSubmit" /> - + :placeholder="param.placeholder || `请输入${param.name}`" @keydown.enter.prevent="handleSubmit" /> + @@ -31,7 +29,7 @@ diff --git a/renderer/src/components/main-panel/resource/resource-list-templates.vue b/renderer/src/components/main-panel/resource/resource-list-templates.vue index 804adf3..9246abf 100644 --- a/renderer/src/components/main-panel/resource/resource-list-templates.vue +++ b/renderer/src/components/main-panel/resource/resource-list-templates.vue @@ -12,7 +12,7 @@
import { useMessageBridge } from '@/api/message-bridge'; import { CasualRestAPI, ResourceTemplate, ResourceTemplatesListResponse } from '@/hook/type'; -import { onMounted, onUnmounted, defineProps, ref } from 'vue'; +import { onMounted, onUnmounted, defineProps, ref, reactive } from 'vue'; import { useI18n } from 'vue-i18n'; import { resourcesManager, ResourceStorage } from './resources'; import { tabs } from '../panel'; @@ -47,8 +47,19 @@ const props = defineProps({ } }); -const tab = tabs.content[props.tabId]; -const tabStorage = tab.storage as ResourceStorage; +let tabStorage: ResourceStorage; + +if (props.tabId >= 0) { + const tab = tabs.content[props.tabId]; + tabStorage = tab.storage as ResourceStorage; +} else { + tabStorage = reactive({ + currentType:'template', + currentResourceName: '', + formData: {}, + lastResourceReadResponse: undefined + }); +} function reloadResources(option: { first: boolean }) { bridge.postMessage({ diff --git a/renderer/src/components/main-panel/resource/resource-list.vue b/renderer/src/components/main-panel/resource/resource-list.vue index 8dfb4c1..9ea9815 100644 --- a/renderer/src/components/main-panel/resource/resource-list.vue +++ b/renderer/src/components/main-panel/resource/resource-list.vue @@ -12,7 +12,7 @@
import { useMessageBridge } from '@/api/message-bridge'; import { CasualRestAPI, Resources, ResourcesListResponse } from '@/hook/type'; -import { onMounted, onUnmounted, defineProps, ref } from 'vue'; +import { onMounted, onUnmounted, defineProps, defineEmits, reactive } from 'vue'; import { useI18n } from 'vue-i18n'; import { resourcesManager, ResourceStorage } from './resources'; import { tabs } from '../panel'; @@ -44,8 +44,21 @@ const props = defineProps({ } }); -const tab = tabs.content[props.tabId]; -const tabStorage = tab.storage as ResourceStorage; +const emits = defineEmits([ 'resource-selected' ]); + +let tabStorage: ResourceStorage; + +if (props.tabId >= 0) { + const tab = tabs.content[props.tabId]; + tabStorage = tab.storage as ResourceStorage; +} else { + tabStorage = reactive({ + currentType:'resource', + currentResourceName: '', + formData: {}, + lastResourceReadResponse: undefined + }); +} function reloadResources(option: { first: boolean }) { bridge.postMessage({ @@ -66,6 +79,8 @@ function handleClick(resource: Resources) { tabStorage.currentType = 'resource'; tabStorage.currentResourceName = resource.name; tabStorage.lastResourceReadResponse = undefined; + + emits('resource-selected', resource); } let commandCancel: (() => void); diff --git a/renderer/src/components/main-panel/resource/resource-logger.vue b/renderer/src/components/main-panel/resource/resource-logger.vue index acdcadf..29b86f7 100644 --- a/renderer/src/components/main-panel/resource/resource-logger.vue +++ b/renderer/src/components/main-panel/resource/resource-logger.vue @@ -13,7 +13,7 @@ /> - +
{ .resource-logger .output-content { border-radius: .5em; padding: 15px; - min-height: 300px; + min-height: 600px; height: fit-content; font-family: var(--code-font-family); white-space: pre-wrap; diff --git a/renderer/src/components/main-panel/tool/tool-executor.vue b/renderer/src/components/main-panel/tool/tool-executor.vue index 2c1b025..97e3d1e 100644 --- a/renderer/src/components/main-panel/tool/tool-executor.vue +++ b/renderer/src/components/main-panel/tool/tool-executor.vue @@ -167,9 +167,6 @@ watch(() => tabStorage.currentToolName, () => { margin-bottom: 15px; } -.tool-executor-container { - -} .tool-executor-container .el-switch .el-switch__action { background-color: var(--main-color); diff --git a/renderer/src/components/sidebar/connected.vue b/renderer/src/components/sidebar/connected.vue index 1c4ccd6..681aa65 100644 --- a/renderer/src/components/sidebar/connected.vue +++ b/renderer/src/components/sidebar/connected.vue @@ -149,7 +149,9 @@ function toggleConnectionPanel() { display: flex; align-items: center; justify-content: center; - white-space: wrap; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; background-color: #f39a6d; padding: 5px 12px; border-radius: .5em; diff --git a/renderer/src/hook/type.ts b/renderer/src/hook/type.ts index 74a5069..1967de9 100644 --- a/renderer/src/hook/type.ts +++ b/renderer/src/hook/type.ts @@ -65,6 +65,9 @@ export interface Resources { uri: string; name: string; mimeType: string; + text?: string; + blob?: string; + [key: string]: any; } export interface ResourceTemplatesListResponse { diff --git a/renderer/src/hook/util.ts b/renderer/src/hook/util.ts index 78a8bda..584121b 100644 --- a/renderer/src/hook/util.ts +++ b/renderer/src/hook/util.ts @@ -70,6 +70,12 @@ export async function getBlobUrlByFilename(filename: string) { } export function getImageBlobUrlByBase64(base64String: string, mimeType: string, cacheKey?: string) { + + // 检查缓存中是否存在该文件 + if (cacheKey && blobUrlCache.has(cacheKey)) { + return blobUrlCache.get(cacheKey); + } + const byteCharacters = atob(base64String); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { diff --git a/renderer/src/views/setting/api.ts b/renderer/src/views/setting/api.ts index aedde22..dcc075c 100644 --- a/renderer/src/views/setting/api.ts +++ b/renderer/src/views/setting/api.ts @@ -1,5 +1,5 @@ -import { ChatStorage } from '@/components/main-panel/chat/chat'; -import { TaskLoop } from '@/components/main-panel/chat/task-loop'; +import { ChatStorage } from '@/components/main-panel/chat/chat-box/chat'; +import { TaskLoop } from '@/components/main-panel/chat/core/task-loop'; import { llmManager } from './llm'; import { reactive, ref } from 'vue'; diff --git a/renderer/src/views/setting/llm.ts b/renderer/src/views/setting/llm.ts index 44269ba..925caf4 100644 --- a/renderer/src/views/setting/llm.ts +++ b/renderer/src/views/setting/llm.ts @@ -1,7 +1,7 @@ import { markRaw, reactive } from 'vue'; import { createTab, debugModes, tabs } from '@/components/main-panel/panel'; import { ToolStorage } from '@/components/main-panel/tool/tools'; -import { ToolCall } from '@/components/main-panel/chat/chat'; +import { ToolCall } from '@/components/main-panel/chat/chat-box/chat'; import I18n from '@/i18n'; const { t } = I18n.global; diff --git a/servers/main.py b/servers/main.py index 2e7f168..b8fc811 100644 --- a/servers/main.py +++ b/servers/main.py @@ -9,6 +9,16 @@ mcp = FastMCP('锦恢的 MCP Server', version="11.45.14") def add(a: int, b: int) -> int: return a + b +@mcp.resource( + uri="network://log", + name='network_log', + description='用于演示的一个无参数资源协议' +) +def network_log() -> str: + # 访问处理 greeting://{name} 资源访问协议,然后返回 + # 此处方便起见,直接返回一个 Hello,balabala 了 + return f"Response from ..." + @mcp.resource( uri="greeting://{name}", name='greeting', diff --git a/service/src/mcp/ocr.controller.ts b/service/src/mcp/ocr.controller.ts index 6fb6671..83341ba 100644 --- a/service/src/mcp/ocr.controller.ts +++ b/service/src/mcp/ocr.controller.ts @@ -1,6 +1,7 @@ import { Controller, RequestClientType } from "../common"; import { PostMessageble } from "../hook/adapter"; import { diskStorage } from "../hook/db"; +import { createOcrWorker, saveBase64ImageData } from "./ocr.service"; export class OcrController { @Controller('ocr/get-ocr-image') @@ -15,4 +16,21 @@ export class OcrController { } } } + + @Controller('ocr/start-ocr') + async startOcr(client: RequestClientType, data: any, webview: PostMessageble) { + const { base64String, mimeType } = data; + + const filename = saveBase64ImageData(base64String, mimeType); + const worker = createOcrWorker(filename, webview); + + return { + code: 200, + msg: { + filename, + workerId: worker.id + } + } + } + } \ No newline at end of file diff --git a/service/tabs.锦恢的 MCP Server.json b/service/tabs.锦恢的 MCP Server.json index 4afd09e..29778b9 100644 --- a/service/tabs.锦恢的 MCP Server.json +++ b/service/tabs.锦恢的 MCP Server.json @@ -2,47 +2,37 @@ "currentIndex": 0, "tabs": [ { - "name": "交互测试", - "icon": "icon-robot", + "name": "资源", + "icon": "icon-file", "type": "blank", - "componentIndex": 3, + "componentIndex": 0, "storage": { - "messages": [], - "settings": { - "modelIndex": 0, - "enableTools": [ + "formData": {}, + "currentType": "resource", + "currentResourceName": "network_log", + "lastResourceReadResponse": { + "contents": [ { - "name": "add", - "description": "对两个数字进行实数域的加法", - "enabled": true - }, - { - "name": "multiply", - "description": "对两个数字进行实数域的乘法运算", - "enabled": true - }, - { - "name": "is_even", - "description": "判断一个整数是否为偶数", - "enabled": true - }, - { - "name": "capitalize", - "description": "将字符串首字母大写", - "enabled": true - }, - { - "name": "get_weather_by_city_code", - "description": "根据城市天气预报的城市编码 (int),获取指定城市的天气信息", - "enabled": true + "uri": "network://log", + "mimeType": "text/plain", + "text": "Response from ..." } - ], - "enableWebSearch": false, - "temperature": 0.7, - "contextLength": 20, - "systemPrompt": "" + ] } } + }, + { + "name": "工具", + "icon": "icon-tool", + "type": "blank", + "componentIndex": 2, + "storage": { + "formData": { + "a": 0, + "b": 0 + }, + "currentToolName": "add" + } } ] } \ No newline at end of file