From 36744f2a71c5dc87ddda6dd6de4215782e7a88a0 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Mon, 21 Apr 2025 18:47:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=A4=A7=E6=A8=A1=E5=9E=8B=E6=8E=A5=E5=85=A5=2080%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + README.md | 2 +- renderer/public/iconfont.css | 22 +- renderer/public/iconfont.woff2 | Bin 4496 -> 4928 bytes renderer/public/mcp.css | 37 +- .../components/main-panel/chat/task-loop.ts | 2 +- renderer/src/hook/css.ts | 1 + renderer/src/i18n/ar.json | 9 +- renderer/src/i18n/de.json | 9 +- renderer/src/i18n/en.json | 11 +- renderer/src/i18n/fr.json | 9 +- renderer/src/i18n/ja.json | 9 +- renderer/src/i18n/ko.json | 9 +- renderer/src/i18n/ru.json | 9 +- renderer/src/i18n/zh-cn.json | 9 +- renderer/src/i18n/zh-tw.json | 9 +- renderer/src/views/setting/api.ts | 53 +++ renderer/src/views/setting/api.vue | 324 ++++++++++++++---- .../setting/connect-interface-openai.vue | 77 +++++ renderer/src/views/setting/connect-test.vue | 53 +++ renderer/src/views/setting/index.vue | 38 +- renderer/src/views/setting/llm.ts | 5 - service/.gitignore | 3 +- service/src/util.ts | 4 +- service/tabs.image_crawler.json | 101 +----- service/tabs.json | 40 --- 26 files changed, 574 insertions(+), 272 deletions(-) create mode 100644 renderer/src/views/setting/api.ts create mode 100644 renderer/src/views/setting/connect-interface-openai.vue create mode 100644 renderer/src/views/setting/connect-test.vue delete mode 100644 service/tabs.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 373c0c8..667b329 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - 修复选择模型后点击确认跳转回 deepseek 的 bug - 修复 mcp 项目初始化点击工具全部都是空的 bug - 修复无法重新连接的 bug +- 支持自定义第三方 openai 兼容的模型服务 ## [main] 0.0.3 diff --git a/README.md b/README.md index d4a8e0b..ae80068 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ | `all` | 完成最基本的各类基础设施 | `完整版本` | 100% | `Done` | | `render` | chat 模式下支持进行成本分析 | `迭代版本` | 100% | `Done` | | `ext` | 支持基本的 MCP 项目管理 | `MVP` | 0% | `P0` | -| `service` | 支持自定义大模型接入 | `MVP` | 20% | `P0` | +| `service` | 支持自定义大模型接入 | `MVP` | 80% | `P0` | | `all` | 支持同时调试多个 MCP Server | `MVP` | 0% | `P1` | | `all` | 支持通过大模型进行在线验证 | `迭代版本` | 100% | `Done` | | `all` | 支持 completion/complete 协议字段 | `MVP` | 0% | `P1` | diff --git a/renderer/public/iconfont.css b/renderer/public/iconfont.css index 2c10aa2..99e732e 100644 --- a/renderer/public/iconfont.css +++ b/renderer/public/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4870215 */ - src: url('iconfont.woff2?t=1744476757936') format('woff2'), - url('iconfont.woff?t=1744476757936') format('woff'), - url('iconfont.ttf?t=1744476757936') format('truetype'); + src: url('iconfont.woff2?t=1745222758998') format('woff2'), + url('iconfont.woff?t=1745222758998') format('woff'), + url('iconfont.ttf?t=1745222758998') format('truetype'); } .iconfont { @@ -13,6 +13,22 @@ -moz-osx-font-smoothing: grayscale; } +.icon-test:before { + content: "\e8ad"; +} + +.icon-save:before { + content: "\e67c"; +} + +.icon-more:before { + content: "\e612"; +} + +.icon-edit:before { + content: "\e63b"; +} + .icon-connect:before { content: "\ecda"; } diff --git a/renderer/public/iconfont.woff2 b/renderer/public/iconfont.woff2 index 73dd05ecfe462cbbcfe797a4a5ab0ccfacb467f8..e574c5577e16c6c92bdf219eee587dd160850935 100644 GIT binary patch literal 4928 zcmV-G6Tj?tPew8T0RR91024p}3jhEB03w(G021;50RR9100000000000000000000 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 diff --git a/renderer/public/mcp.css b/renderer/public/mcp.css index 89e2dc6..543573c 100644 --- a/renderer/public/mcp.css +++ b/renderer/public/mcp.css @@ -205,39 +205,10 @@ a { background-position: center; } -.server-icon { - background-size: contain; - background-repeat: no-repeat; - background-position: center; - width: 20px; - height: 20px; - margin-right: 8px; +.el-button:hover { + color: var(--foreground) !important; } -.deepseek-icon { - background-image: url('./images/deepseek.com.ico'); -} - -.openai-icon { - background-image: url('./images/openai.com.ico'); -} - -.mistral-icon { - background-image: url('./images/mistral.ai.ico'); -} - -.ollama-icon { - background-image: url('./images/ollama.png'); -} - -.grop-icon { - background-image: url('./images/grok.com.png'); -} - -.perplexity-icon { - background-image: url('./images/perplexity.ai.ico'); -} - -.kimi-icon { - background-image: url('./images/kimichat.cn.png'); +.el-dropdown-menu__item:hover { + background-color: var(--background) !important; } \ 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/task-loop.ts index 2e2c6ab..219d338 100644 --- a/renderer/src/components/main-panel/chat/task-loop.ts +++ b/renderer/src/components/main-panel/chat/task-loop.ts @@ -105,7 +105,7 @@ export class TaskLoop { const chunkHandler = this.bridge.addCommandListener('llm/chat/completions/chunk', data => { if (data.code !== 200) { this.onError(data.msg || '请求模型服务时发生错误'); - reject(new Error(data.msg || '请求模型服务时发生错误')); + resolve(); return; } const { chunk } = data.msg as { chunk: ChatCompletionChunk }; diff --git a/renderer/src/hook/css.ts b/renderer/src/hook/css.ts index 29d0942..643b235 100644 --- a/renderer/src/hook/css.ts +++ b/renderer/src/hook/css.ts @@ -25,6 +25,7 @@ export function setDefaultCss() { document.body.style.setProperty('--el-color-primary-light-5', 'var(--button-disabled)'); document.body.style.setProperty('--el-bg-color', 'var(--background)'); document.body.style.setProperty('--el-text-color-primary', 'var(--foreground)'); + document.body.style.setProperty('--el-button-hover-text-color', 'var(--background)'); // document.body.style.setProperty('--el-color-white', 'var(--background)'); diff --git a/renderer/src/i18n/ar.json b/renderer/src/i18n/ar.json index ec28e86..aa5af34 100644 --- a/renderer/src/i18n/ar.json +++ b/renderer/src/i18n/ar.json @@ -123,5 +123,12 @@ "input-token": "إدخال", "output-token": "إخراج", "total": "الإجمالي", - "cache-hit-ratio": "معدل ضربات التخزين المؤقت" + "cache-hit-ratio": "معدل ضربات التخزين المؤقت", + "success-save": "تم الحفظ بنجاح", + "confirm-delete-model": "هل تريد حذف موفر النموذج؟", + "reserve-one-last-model": "احتفظ بنموذج واحد على الأقل", + "edit": "تعديل", + "delete": "حذف", + "test": "اختبار", + "add-new-server": "إضافة خدمة" } \ No newline at end of file diff --git a/renderer/src/i18n/de.json b/renderer/src/i18n/de.json index 601356a..9f9607f 100644 --- a/renderer/src/i18n/de.json +++ b/renderer/src/i18n/de.json @@ -123,5 +123,12 @@ "input-token": "Eingabe", "output-token": "Ausgabe", "total": "Gesamt", - "cache-hit-ratio": "Cache-Trefferquote" + "cache-hit-ratio": "Cache-Trefferquote", + "success-save": "Erfolgreich gespeichert", + "confirm-delete-model": "Modellanbieter wirklich löschen?", + "reserve-one-last-model": "Behalten Sie mindestens ein Modell", + "edit": "Bearbeiten", + "delete": "Löschen", + "test": "Test", + "add-new-server": "Dienst hinzufügen" } \ No newline at end of file diff --git a/renderer/src/i18n/en.json b/renderer/src/i18n/en.json index 4730438..d87c5ff 100644 --- a/renderer/src/i18n/en.json +++ b/renderer/src/i18n/en.json @@ -99,7 +99,7 @@ "choose-a-project-debug": "Select a project to debug", "model": "Model", "server-provider": "Service Provider", - "api-root-url": "API root path", + "api-root-url": "Base Url", "api-token": "API key", "connection-method": "Connection method", "command": "Command", @@ -123,5 +123,12 @@ "input-token": "Input", "output-token": "Output", "total": "Total", - "cache-hit-ratio": "Cache hit rate" + "cache-hit-ratio": "Cache hit rate", + "success-save": "Successfully saved", + "confirm-delete-model": "Are you sure you want to delete the model provider?", + "reserve-one-last-model": "Keep at least one model", + "edit": "Edit", + "delete": "Delete", + "test": "Test", + "add-new-server": "Add service" } \ No newline at end of file diff --git a/renderer/src/i18n/fr.json b/renderer/src/i18n/fr.json index b0be8a7..77f9766 100644 --- a/renderer/src/i18n/fr.json +++ b/renderer/src/i18n/fr.json @@ -123,5 +123,12 @@ "input-token": "Entrée", "output-token": "Sortie", "total": "Total", - "cache-hit-ratio": "Taux de réussite du cache" + "cache-hit-ratio": "Taux de réussite du cache", + "success-save": "Enregistré avec succès", + "confirm-delete-model": "Êtes-vous sûr de vouloir supprimer le fournisseur de modèles ?", + "reserve-one-last-model": "Conservez au moins un modèle", + "edit": "Modifier", + "delete": "Supprimer", + "test": "Test", + "add-new-server": "Ajouter un service" } \ No newline at end of file diff --git a/renderer/src/i18n/ja.json b/renderer/src/i18n/ja.json index 1afd60f..af92b68 100644 --- a/renderer/src/i18n/ja.json +++ b/renderer/src/i18n/ja.json @@ -123,5 +123,12 @@ "input-token": "入力", "output-token": "出力", "total": "合計", - "cache-hit-ratio": "キャッシュヒット率" + "cache-hit-ratio": "キャッシュヒット率", + "success-save": "正常に保存されました", + "confirm-delete-model": "このモデルプロバイダーを削除しますか?", + "reserve-one-last-model": "少なくとも1つのモデルを保持してください", + "edit": "編集", + "delete": "削除", + "test": "テスト", + "add-new-server": "サービスを追加" } \ No newline at end of file diff --git a/renderer/src/i18n/ko.json b/renderer/src/i18n/ko.json index bb61813..4fd2360 100644 --- a/renderer/src/i18n/ko.json +++ b/renderer/src/i18n/ko.json @@ -123,5 +123,12 @@ "input-token": "입력", "output-token": "출력", "total": "총계", - "cache-hit-ratio": "캐시 적중률" + "cache-hit-ratio": "캐시 적중률", + "success-save": "성공적으로 저장됨", + "confirm-delete-model": "이 모델 공급자를 삭제하시겠습니까?", + "reserve-one-last-model": "적어도 하나의 모델을 유지하세요", + "edit": "편집", + "delete": "삭제", + "test": "테스트", + "add-new-server": "서비스 추가" } \ No newline at end of file diff --git a/renderer/src/i18n/ru.json b/renderer/src/i18n/ru.json index c90b163..a73710e 100644 --- a/renderer/src/i18n/ru.json +++ b/renderer/src/i18n/ru.json @@ -123,5 +123,12 @@ "input-token": "Ввод", "output-token": "Вывод", "total": "Итого", - "cache-hit-ratio": "Коэффициент попаданий в кэш" + "cache-hit-ratio": "Коэффициент попаданий в кэш", + "success-save": "Успешно сохранено", + "confirm-delete-model": "Вы уверены, что хотите удалить поставщика моделей?", + "reserve-one-last-model": "Оставьте хотя бы одну модель", + "edit": "Редактировать", + "delete": "Удалить", + "test": "Тест", + "add-new-server": "Добавить услугу" } \ No newline at end of file diff --git a/renderer/src/i18n/zh-cn.json b/renderer/src/i18n/zh-cn.json index f4ca929..2c030bb 100644 --- a/renderer/src/i18n/zh-cn.json +++ b/renderer/src/i18n/zh-cn.json @@ -123,5 +123,12 @@ "input-token": "输入", "output-token": "输出", "total": "总计", - "cache-hit-ratio": "缓存命中率" + "cache-hit-ratio": "缓存命中率", + "success-save": "成功保存", + "confirm-delete-model": "确定删除该模型提供商?", + "reserve-one-last-model": "至少保留一个模型", + "edit": "编辑", + "delete": "删除", + "test": "测试", + "add-new-server": "添加服务" } \ No newline at end of file diff --git a/renderer/src/i18n/zh-tw.json b/renderer/src/i18n/zh-tw.json index bc5f21b..83427c5 100644 --- a/renderer/src/i18n/zh-tw.json +++ b/renderer/src/i18n/zh-tw.json @@ -123,5 +123,12 @@ "input-token": "輸入", "output-token": "輸出", "total": "總計", - "cache-hit-ratio": "緩存命中率" + "cache-hit-ratio": "緩存命中率", + "success-save": "成功儲存", + "confirm-delete-model": "確定刪除該模型提供商?", + "reserve-one-last-model": "至少保留一個模型", + "edit": "編輯", + "delete": "刪除", + "test": "測試", + "add-new-server": "新增服務" } \ No newline at end of file diff --git a/renderer/src/views/setting/api.ts b/renderer/src/views/setting/api.ts new file mode 100644 index 0000000..a0ecbc0 --- /dev/null +++ b/renderer/src/views/setting/api.ts @@ -0,0 +1,53 @@ +import { ChatStorage } from '@/components/main-panel/chat/chat'; +import { TaskLoop } from '@/components/main-panel/chat/task-loop'; +import { llmManager } from './llm'; +import { reactive, ref } from 'vue'; + +export const simpleTestResult = reactive<{ + done: boolean, + start: boolean, + error: any +}>({ + done: false, + start: false, + error: '', +}); + +export function makeSimpleTalk() { + simpleTestResult.done = false; + simpleTestResult.start = true; + + // 使用最简单的 hello 来测试 + const testMessage = 'hello'; + + const s1 = ref(''); + const s2 = ref([]); + const loop = new TaskLoop(s1, s2); + + const chatStorage: ChatStorage = { + messages: [], + settings: { + temperature: 0.7, + modelIndex: llmManager.currentModelIndex, + systemPrompt: '', + enableTools: [], + enableWebSearch: false, + contextLength: 5 + } + }; + + loop.registerOnDone(() => { + console.log('done'); + simpleTestResult.error = ''; + simpleTestResult.done = true; + simpleTestResult.start = false; + }); + + loop.registerOnError(error => { + console.log(error); + simpleTestResult.error = error; + simpleTestResult.start = false; + }); + + loop.start(chatStorage, testMessage); +} \ No newline at end of file diff --git a/renderer/src/views/setting/api.vue b/renderer/src/views/setting/api.vue index 246b73b..2f45463 100644 --- a/renderer/src/views/setting/api.vue +++ b/renderer/src/views/setting/api.vue @@ -1,21 +1,35 @@ \ No newline at end of file diff --git a/renderer/src/views/setting/connect-interface-openai.vue b/renderer/src/views/setting/connect-interface-openai.vue new file mode 100644 index 0000000..0219a3e --- /dev/null +++ b/renderer/src/views/setting/connect-interface-openai.vue @@ -0,0 +1,77 @@ + + + + + \ No newline at end of file diff --git a/renderer/src/views/setting/connect-test.vue b/renderer/src/views/setting/connect-test.vue new file mode 100644 index 0000000..0ad2294 --- /dev/null +++ b/renderer/src/views/setting/connect-test.vue @@ -0,0 +1,53 @@ + + + + + \ No newline at end of file diff --git a/renderer/src/views/setting/index.vue b/renderer/src/views/setting/index.vue index bc32990..9b83a6b 100644 --- a/renderer/src/views/setting/index.vue +++ b/renderer/src/views/setting/index.vue @@ -1,27 +1,29 @@