From 88c0066b06fe78a8a1355f0cac6a246c74e10c69 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Wed, 16 Jul 2025 17:20:13 +0800 Subject: [PATCH 01/28] feat: add topk --- .../knowledge/components/kb-card/KBCardVO.ts | 3 ++ .../knowledge/components/kb-form/KBForm.tsx | 29 +++++++++++++++++++ web/src/app/home/knowledge/page.tsx | 1 + web/src/app/infra/entities/api/index.ts | 1 + web/src/i18n/locales/en-US.ts | 1 + web/src/i18n/locales/ja-JP.ts | 1 + web/src/i18n/locales/zh-Hans.ts | 1 + 7 files changed, 37 insertions(+) diff --git a/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts b/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts index bfbc2adb..b13d2c24 100644 --- a/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts +++ b/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts @@ -3,6 +3,7 @@ export interface IKnowledgeBaseVO { name: string; description: string; embeddingModelUUID: string; + top_k: number; lastUpdatedTimeAgo: string; } @@ -11,6 +12,7 @@ export class KnowledgeBaseVO implements IKnowledgeBaseVO { name: string; description: string; embeddingModelUUID: string; + top_k: number; lastUpdatedTimeAgo: string; constructor(props: IKnowledgeBaseVO) { @@ -18,6 +20,7 @@ export class KnowledgeBaseVO implements IKnowledgeBaseVO { this.name = props.name; this.description = props.description; this.embeddingModelUUID = props.embeddingModelUUID; + this.top_k = props.top_k; this.lastUpdatedTimeAgo = props.lastUpdatedTimeAgo; } } diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index b56c327b..7ca885f4 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -34,6 +34,10 @@ const getFormSchema = (t: (key: string) => string) => embeddingModelUUID: z .string() .min(1, { message: t('knowledge.embeddingModelUUIDRequired') }), + top_k: z + .number() + .min(1, { message: t('knowledge.topKRequired') }) + .max(30, { message: t('knowledge.topKMax') }), }); export default function KBForm({ @@ -59,6 +63,7 @@ export default function KBForm({ name: '', description: t('knowledge.defaultDescription'), embeddingModelUUID: '', + top_k: 5, }, }); @@ -73,6 +78,7 @@ export default function KBForm({ form.setValue('name', val.name); form.setValue('description', val.description); form.setValue('embeddingModelUUID', val.embeddingModelUUID); + form.setValue('top_k', val.top_k || 5); }); } }); @@ -87,6 +93,7 @@ export default function KBForm({ name: res.base.name, description: res.base.description, embeddingModelUUID: res.base.embedding_model_uuid, + top_k: res.base.top_k || 5, }); }); }); @@ -113,6 +120,7 @@ export default function KBForm({ name: data.name, description: data.description, embedding_model_uuid: data.embeddingModelUUID, + top_k: data.top_k, }; } else { // create knowledge base @@ -120,6 +128,7 @@ export default function KBForm({ name: data.name, description: data.description, embedding_model_uuid: data.embeddingModelUUID, + top_k: data.top_k, }; httpClient .createKnowledgeBase(newKb) @@ -216,6 +225,26 @@ export default function KBForm({ )} /> + ( + + + {t('knowledge.topK')} + * + + + field.onChange(Number(e.target.value))} + /> + + + + )} + /> diff --git a/web/src/app/home/knowledge/page.tsx b/web/src/app/home/knowledge/page.tsx index 99de73d8..a2841b24 100644 --- a/web/src/app/home/knowledge/page.tsx +++ b/web/src/app/home/knowledge/page.tsx @@ -46,6 +46,7 @@ export default function KnowledgePage() { name: kb.name, description: kb.description, embeddingModelUUID: kb.embedding_model_uuid, + top_k: kb.top_k, lastUpdatedTimeAgo: lastUpdatedTimeAgoText, }); }), diff --git a/web/src/app/infra/entities/api/index.ts b/web/src/app/infra/entities/api/index.ts index 46d007d8..77dfff05 100644 --- a/web/src/app/infra/entities/api/index.ts +++ b/web/src/app/infra/entities/api/index.ts @@ -146,6 +146,7 @@ export interface KnowledgeBase { name: string; description: string; embedding_model_uuid: string; + top_k: number; created_at?: string; updated_at?: string; } diff --git a/web/src/i18n/locales/en-US.ts b/web/src/i18n/locales/en-US.ts index 8e6d7b49..43110f19 100644 --- a/web/src/i18n/locales/en-US.ts +++ b/web/src/i18n/locales/en-US.ts @@ -245,6 +245,7 @@ const enUS = { today: 'Today', kbName: 'Knowledge Base Name', kbDescription: 'Knowledge Base Description', + topK: 'Top K', defaultDescription: 'A knowledge base', embeddingModelUUID: 'Embedding Model', selectEmbeddingModel: 'Select Embedding Model', diff --git a/web/src/i18n/locales/ja-JP.ts b/web/src/i18n/locales/ja-JP.ts index c0e70806..ad0bf56f 100644 --- a/web/src/i18n/locales/ja-JP.ts +++ b/web/src/i18n/locales/ja-JP.ts @@ -247,6 +247,7 @@ const jaJP = { today: '今日', kbName: '知識ベース名', kbDescription: '知識ベースの説明', + topK: '上位K件', defaultDescription: '知識ベース', embeddingModelUUID: '埋め込みモデル', selectEmbeddingModel: '埋め込みモデルを選択', diff --git a/web/src/i18n/locales/zh-Hans.ts b/web/src/i18n/locales/zh-Hans.ts index 28574fdf..f64fc570 100644 --- a/web/src/i18n/locales/zh-Hans.ts +++ b/web/src/i18n/locales/zh-Hans.ts @@ -240,6 +240,7 @@ const zhHans = { today: '今天', kbName: '知识库名称', kbDescription: '知识库描述', + topK: '召回数量', defaultDescription: '一个知识库', embeddingModelUUID: '嵌入模型', selectEmbeddingModel: '选择嵌入模型', From e31883547d8a3aa006a4358a54ae27dfa71fcb61 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Wed, 16 Jul 2025 18:15:27 +0800 Subject: [PATCH 02/28] feat: add description for topk --- web/src/app/home/knowledge/components/kb-form/KBForm.tsx | 7 +++++++ web/src/i18n/locales/en-US.ts | 3 +++ web/src/i18n/locales/ja-JP.ts | 3 +++ web/src/i18n/locales/zh-Hans.ts | 3 +++ 4 files changed, 16 insertions(+) diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index 7ca885f4..16db601e 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -239,8 +239,15 @@ export default function KBForm({ type="number" {...field} onChange={(e) => field.onChange(Number(e.target.value))} + className="w-[180px] h-10 text-base appearance-none" + min={1} + max={30} + defaultValue={5} /> + + {t('knowledge.topKdescription')} + )} diff --git a/web/src/i18n/locales/en-US.ts b/web/src/i18n/locales/en-US.ts index 43110f19..ddf7ad0c 100644 --- a/web/src/i18n/locales/en-US.ts +++ b/web/src/i18n/locales/en-US.ts @@ -246,6 +246,9 @@ const enUS = { kbName: 'Knowledge Base Name', kbDescription: 'Knowledge Base Description', topK: 'Top K', + topKRequired: 'Top K cannot be empty', + topKMax: 'Top K maximum value is 30', + topKdescription: 'Used to specify the number of relevant documents to retrieve, ranging from 1 to 30.', defaultDescription: 'A knowledge base', embeddingModelUUID: 'Embedding Model', selectEmbeddingModel: 'Select Embedding Model', diff --git a/web/src/i18n/locales/ja-JP.ts b/web/src/i18n/locales/ja-JP.ts index ad0bf56f..69357cb9 100644 --- a/web/src/i18n/locales/ja-JP.ts +++ b/web/src/i18n/locales/ja-JP.ts @@ -248,6 +248,9 @@ const jaJP = { kbName: '知識ベース名', kbDescription: '知識ベースの説明', topK: '上位K件', + topKRequired: '上位K件は必須です', + topKMax: '上位K件の最大値は30です', + topKdescription: '関連ドキュメントを取得するための上位K件の数。1〜30の範囲で設定可能です', defaultDescription: '知識ベース', embeddingModelUUID: '埋め込みモデル', selectEmbeddingModel: '埋め込みモデルを選択', diff --git a/web/src/i18n/locales/zh-Hans.ts b/web/src/i18n/locales/zh-Hans.ts index f64fc570..a0ea2b8e 100644 --- a/web/src/i18n/locales/zh-Hans.ts +++ b/web/src/i18n/locales/zh-Hans.ts @@ -241,6 +241,9 @@ const zhHans = { kbName: '知识库名称', kbDescription: '知识库描述', topK: '召回数量', + topKRequired: '召回数量不能为空', + topKMax: '召回数量最大值为 30', + topKdescription: '用于召回相关文档的数量,取值范围为 1-30', defaultDescription: '一个知识库', embeddingModelUUID: '嵌入模型', selectEmbeddingModel: '选择嵌入模型', From e986a0acaf49bd0d744da34d93eda1982a2b3e75 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Wed, 16 Jul 2025 22:50:17 +0800 Subject: [PATCH 03/28] fix: kb form --- web/src/app/home/knowledge/components/kb-form/KBForm.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index 16db601e..6d0b42f9 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -240,9 +240,6 @@ export default function KBForm({ {...field} onChange={(e) => field.onChange(Number(e.target.value))} className="w-[180px] h-10 text-base appearance-none" - min={1} - max={30} - defaultValue={5} /> From 3fa38f71f126585d6b231785c6ccaf2851a4e0de Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Wed, 23 Jul 2025 17:29:36 +0800 Subject: [PATCH 04/28] feat: add topk --- pkg/api/http/service/knowledge.py | 2 +- pkg/provider/runners/localagent.py | 2 +- pkg/rag/knowledge/kbmgr.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/api/http/service/knowledge.py b/pkg/api/http/service/knowledge.py index 27506ec9..ed4ab008 100644 --- a/pkg/api/http/service/knowledge.py +++ b/pkg/api/http/service/knowledge.py @@ -78,7 +78,7 @@ class KnowledgeService: runtime_kb = await self.ap.rag_mgr.get_knowledge_base_by_uuid(kb_uuid) if runtime_kb is None: raise Exception('Knowledge base not found') - return [result.model_dump() for result in await runtime_kb.retrieve(query)] + return [result.model_dump() for result in await runtime_kb.retrieve(query,runtime_kb.knowledge_base_entity.top_k)] async def get_files_by_knowledge_base(self, kb_uuid: str) -> list[dict]: """获取知识库文件""" diff --git a/pkg/provider/runners/localagent.py b/pkg/provider/runners/localagent.py index 1d3e88ac..3ccb5573 100644 --- a/pkg/provider/runners/localagent.py +++ b/pkg/provider/runners/localagent.py @@ -56,7 +56,7 @@ class LocalAgentRunner(runner.RequestRunner): self.ap.logger.warning(f'Knowledge base {kb_uuid} not found') raise ValueError(f'Knowledge base {kb_uuid} not found') - result = await kb.retrieve(user_message_text) + result = await kb.retrieve(user_message_text,kb.knowledge_base_entity.top_k) final_user_message_text = '' diff --git a/pkg/rag/knowledge/kbmgr.py b/pkg/rag/knowledge/kbmgr.py index a9e7e57a..1cdef361 100644 --- a/pkg/rag/knowledge/kbmgr.py +++ b/pkg/rag/knowledge/kbmgr.py @@ -123,11 +123,11 @@ class RuntimeKnowledgeBase: ) return wrapper.id - async def retrieve(self, query: str) -> list[retriever_entities.RetrieveResultEntry]: + async def retrieve(self, query: str, top_k: int) -> list[retriever_entities.RetrieveResultEntry]: embedding_model = await self.ap.model_mgr.get_embedding_model_by_uuid( self.knowledge_base_entity.embedding_model_uuid ) - return await self.retriever.retrieve(self.knowledge_base_entity.uuid, query, embedding_model) + return await self.retriever.retrieve(self.knowledge_base_entity.uuid, query, embedding_model, top_k) async def delete_file(self, file_id: str): # delete vector From 87f626f3ccd0d2425572722825f49961ff6addff Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Tue, 5 Aug 2025 17:40:27 +0800 Subject: [PATCH 05/28] doc(README): add HelloGitHub badge --- README.md | 4 +++- README_TW.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dd518656..a2ce422f 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@
+Featured|HelloGitHub + [English](README_EN.md) / 简体中文 / [繁體中文](README_TW.md) / [日本語](README_JP.md) / (PR for your language) [![Discord](https://img.shields.io/discord/1335141740050649118?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb)](https://discord.gg/wdNEHETs87) @@ -85,7 +87,7 @@ docker compose up -d | --- | --- | --- | | QQ 个人号 | ✅ | QQ 个人号私聊、群聊 | | QQ 官方机器人 | ✅ | QQ 官方机器人,支持频道、私聊、群聊 | -| 微信 | ✅ | | +| 企业微信 | ✅ | | | 企微对外客服 | ✅ | | | 微信公众号 | ✅ | | | 飞书 | ✅ | | diff --git a/README_TW.md b/README_TW.md index 27bf5e14..7746031a 100644 --- a/README_TW.md +++ b/README_TW.md @@ -3,7 +3,7 @@ LangBot -
+
Featured|HelloGitHub [English](README_EN.md) / [简体中文](README.md) / 繁體中文 / [日本語](README_JP.md) / (PR for your language) From 246eb71b758dc0bdadb94bb1fe54c212f4e2de5b Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Wed, 16 Jul 2025 17:20:13 +0800 Subject: [PATCH 06/28] feat: add topk --- .../knowledge/components/kb-card/KBCardVO.ts | 3 ++ .../knowledge/components/kb-form/KBForm.tsx | 29 +++++++++++++++++++ web/src/app/home/knowledge/page.tsx | 1 + web/src/app/infra/entities/api/index.ts | 1 + web/src/i18n/locales/en-US.ts | 1 + web/src/i18n/locales/ja-JP.ts | 1 + web/src/i18n/locales/zh-Hans.ts | 1 + 7 files changed, 37 insertions(+) diff --git a/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts b/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts index bfbc2adb..b13d2c24 100644 --- a/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts +++ b/web/src/app/home/knowledge/components/kb-card/KBCardVO.ts @@ -3,6 +3,7 @@ export interface IKnowledgeBaseVO { name: string; description: string; embeddingModelUUID: string; + top_k: number; lastUpdatedTimeAgo: string; } @@ -11,6 +12,7 @@ export class KnowledgeBaseVO implements IKnowledgeBaseVO { name: string; description: string; embeddingModelUUID: string; + top_k: number; lastUpdatedTimeAgo: string; constructor(props: IKnowledgeBaseVO) { @@ -18,6 +20,7 @@ export class KnowledgeBaseVO implements IKnowledgeBaseVO { this.name = props.name; this.description = props.description; this.embeddingModelUUID = props.embeddingModelUUID; + this.top_k = props.top_k; this.lastUpdatedTimeAgo = props.lastUpdatedTimeAgo; } } diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index 54d5d6e4..771587f2 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -35,6 +35,10 @@ const getFormSchema = (t: (key: string) => string) => embeddingModelUUID: z .string() .min(1, { message: t('knowledge.embeddingModelUUIDRequired') }), + top_k: z + .number() + .min(1, { message: t('knowledge.topKRequired') }) + .max(30, { message: t('knowledge.topKMax') }), }); export default function KBForm({ @@ -55,6 +59,7 @@ export default function KBForm({ name: '', description: t('knowledge.defaultDescription'), embeddingModelUUID: '', + top_k: 5, }, }); @@ -69,6 +74,7 @@ export default function KBForm({ form.setValue('name', val.name); form.setValue('description', val.description); form.setValue('embeddingModelUUID', val.embeddingModelUUID); + form.setValue('top_k', val.top_k || 5); }); } }); @@ -83,6 +89,7 @@ export default function KBForm({ name: res.base.name, description: res.base.description, embeddingModelUUID: res.base.embedding_model_uuid, + top_k: res.base.top_k || 5, }); }); }); @@ -109,6 +116,7 @@ export default function KBForm({ name: data.name, description: data.description, embedding_model_uuid: data.embeddingModelUUID, + top_k: data.top_k, }; httpClient .updateKnowledgeBase(initKbId, updateKb) @@ -127,6 +135,7 @@ export default function KBForm({ name: data.name, description: data.description, embedding_model_uuid: data.embeddingModelUUID, + top_k: data.top_k, }; httpClient .createKnowledgeBase(newKb) @@ -226,6 +235,26 @@ export default function KBForm({ )} /> + ( + + + {t('knowledge.topK')} + * + + + field.onChange(Number(e.target.value))} + /> + + + + )} + />
diff --git a/web/src/app/home/knowledge/page.tsx b/web/src/app/home/knowledge/page.tsx index 0a8cc2eb..b290f7be 100644 --- a/web/src/app/home/knowledge/page.tsx +++ b/web/src/app/home/knowledge/page.tsx @@ -46,6 +46,7 @@ export default function KnowledgePage() { name: kb.name, description: kb.description, embeddingModelUUID: kb.embedding_model_uuid, + top_k: kb.top_k, lastUpdatedTimeAgo: lastUpdatedTimeAgoText, }); }), diff --git a/web/src/app/infra/entities/api/index.ts b/web/src/app/infra/entities/api/index.ts index 76d0a1f6..787631a3 100644 --- a/web/src/app/infra/entities/api/index.ts +++ b/web/src/app/infra/entities/api/index.ts @@ -155,6 +155,7 @@ export interface KnowledgeBase { name: string; description: string; embedding_model_uuid: string; + top_k: number; created_at?: string; updated_at?: string; } diff --git a/web/src/i18n/locales/en-US.ts b/web/src/i18n/locales/en-US.ts index 7c306d51..0ee05729 100644 --- a/web/src/i18n/locales/en-US.ts +++ b/web/src/i18n/locales/en-US.ts @@ -252,6 +252,7 @@ const enUS = { today: 'Today', kbName: 'Knowledge Base Name', kbDescription: 'Knowledge Base Description', + topK: 'Top K', defaultDescription: 'A knowledge base', embeddingModelUUID: 'Embedding Model', selectEmbeddingModel: 'Select Embedding Model', diff --git a/web/src/i18n/locales/ja-JP.ts b/web/src/i18n/locales/ja-JP.ts index bdd6374d..a2634d4b 100644 --- a/web/src/i18n/locales/ja-JP.ts +++ b/web/src/i18n/locales/ja-JP.ts @@ -254,6 +254,7 @@ const jaJP = { today: '今日', kbName: '知識ベース名', kbDescription: '知識ベースの説明', + topK: '上位K件', defaultDescription: '知識ベース', embeddingModelUUID: '埋め込みモデル', selectEmbeddingModel: '埋め込みモデルを選択', diff --git a/web/src/i18n/locales/zh-Hans.ts b/web/src/i18n/locales/zh-Hans.ts index 5209c5e2..ec9b3049 100644 --- a/web/src/i18n/locales/zh-Hans.ts +++ b/web/src/i18n/locales/zh-Hans.ts @@ -247,6 +247,7 @@ const zhHans = { today: '今天', kbName: '知识库名称', kbDescription: '知识库描述', + topK: '召回数量', defaultDescription: '一个知识库', embeddingModelUUID: '嵌入模型', selectEmbeddingModel: '选择嵌入模型', From e4f321ea7a9dd231032c9d4f9facaa58af1942c3 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Wed, 16 Jul 2025 18:15:27 +0800 Subject: [PATCH 07/28] feat: add description for topk --- web/src/app/home/knowledge/components/kb-form/KBForm.tsx | 7 +++++++ web/src/i18n/locales/en-US.ts | 3 +++ web/src/i18n/locales/ja-JP.ts | 3 +++ web/src/i18n/locales/zh-Hans.ts | 3 +++ 4 files changed, 16 insertions(+) diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index 771587f2..447fd360 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -249,8 +249,15 @@ export default function KBForm({ type="number" {...field} onChange={(e) => field.onChange(Number(e.target.value))} + className="w-[180px] h-10 text-base appearance-none" + min={1} + max={30} + defaultValue={5} /> + + {t('knowledge.topKdescription')} + )} diff --git a/web/src/i18n/locales/en-US.ts b/web/src/i18n/locales/en-US.ts index 0ee05729..ff855d31 100644 --- a/web/src/i18n/locales/en-US.ts +++ b/web/src/i18n/locales/en-US.ts @@ -253,6 +253,9 @@ const enUS = { kbName: 'Knowledge Base Name', kbDescription: 'Knowledge Base Description', topK: 'Top K', + topKRequired: 'Top K cannot be empty', + topKMax: 'Top K maximum value is 30', + topKdescription: 'Used to specify the number of relevant documents to retrieve, ranging from 1 to 30.', defaultDescription: 'A knowledge base', embeddingModelUUID: 'Embedding Model', selectEmbeddingModel: 'Select Embedding Model', diff --git a/web/src/i18n/locales/ja-JP.ts b/web/src/i18n/locales/ja-JP.ts index a2634d4b..1fa337a0 100644 --- a/web/src/i18n/locales/ja-JP.ts +++ b/web/src/i18n/locales/ja-JP.ts @@ -255,6 +255,9 @@ const jaJP = { kbName: '知識ベース名', kbDescription: '知識ベースの説明', topK: '上位K件', + topKRequired: '上位K件は必須です', + topKMax: '上位K件の最大値は30です', + topKdescription: '関連ドキュメントを取得するための上位K件の数。1〜30の範囲で設定可能です', defaultDescription: '知識ベース', embeddingModelUUID: '埋め込みモデル', selectEmbeddingModel: '埋め込みモデルを選択', diff --git a/web/src/i18n/locales/zh-Hans.ts b/web/src/i18n/locales/zh-Hans.ts index ec9b3049..2575094a 100644 --- a/web/src/i18n/locales/zh-Hans.ts +++ b/web/src/i18n/locales/zh-Hans.ts @@ -248,6 +248,9 @@ const zhHans = { kbName: '知识库名称', kbDescription: '知识库描述', topK: '召回数量', + topKRequired: '召回数量不能为空', + topKMax: '召回数量最大值为 30', + topKdescription: '用于召回相关文档的数量,取值范围为 1-30', defaultDescription: '一个知识库', embeddingModelUUID: '嵌入模型', selectEmbeddingModel: '选择嵌入模型', From 4e95bc542c6acbbfdf89b853cdec0ea41c5c2f96 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Wed, 16 Jul 2025 22:50:17 +0800 Subject: [PATCH 08/28] fix: kb form --- web/src/app/home/knowledge/components/kb-form/KBForm.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index 447fd360..398d2302 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -250,9 +250,6 @@ export default function KBForm({ {...field} onChange={(e) => field.onChange(Number(e.target.value))} className="w-[180px] h-10 text-base appearance-none" - min={1} - max={30} - defaultValue={5} /> From 47e9ce96fca746991ff9e389f019e55f4f8fcaa9 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Wed, 23 Jul 2025 17:29:36 +0800 Subject: [PATCH 09/28] feat: add topk --- pkg/api/http/service/knowledge.py | 2 +- pkg/provider/runners/localagent.py | 2 +- pkg/rag/knowledge/kbmgr.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/api/http/service/knowledge.py b/pkg/api/http/service/knowledge.py index 27506ec9..ed4ab008 100644 --- a/pkg/api/http/service/knowledge.py +++ b/pkg/api/http/service/knowledge.py @@ -78,7 +78,7 @@ class KnowledgeService: runtime_kb = await self.ap.rag_mgr.get_knowledge_base_by_uuid(kb_uuid) if runtime_kb is None: raise Exception('Knowledge base not found') - return [result.model_dump() for result in await runtime_kb.retrieve(query)] + return [result.model_dump() for result in await runtime_kb.retrieve(query,runtime_kb.knowledge_base_entity.top_k)] async def get_files_by_knowledge_base(self, kb_uuid: str) -> list[dict]: """获取知识库文件""" diff --git a/pkg/provider/runners/localagent.py b/pkg/provider/runners/localagent.py index 1d3e88ac..3ccb5573 100644 --- a/pkg/provider/runners/localagent.py +++ b/pkg/provider/runners/localagent.py @@ -56,7 +56,7 @@ class LocalAgentRunner(runner.RequestRunner): self.ap.logger.warning(f'Knowledge base {kb_uuid} not found') raise ValueError(f'Knowledge base {kb_uuid} not found') - result = await kb.retrieve(user_message_text) + result = await kb.retrieve(user_message_text,kb.knowledge_base_entity.top_k) final_user_message_text = '' diff --git a/pkg/rag/knowledge/kbmgr.py b/pkg/rag/knowledge/kbmgr.py index a9e7e57a..1cdef361 100644 --- a/pkg/rag/knowledge/kbmgr.py +++ b/pkg/rag/knowledge/kbmgr.py @@ -123,11 +123,11 @@ class RuntimeKnowledgeBase: ) return wrapper.id - async def retrieve(self, query: str) -> list[retriever_entities.RetrieveResultEntry]: + async def retrieve(self, query: str, top_k: int) -> list[retriever_entities.RetrieveResultEntry]: embedding_model = await self.ap.model_mgr.get_embedding_model_by_uuid( self.knowledge_base_entity.embedding_model_uuid ) - return await self.retriever.retrieve(self.knowledge_base_entity.uuid, query, embedding_model) + return await self.retriever.retrieve(self.knowledge_base_entity.uuid, query, embedding_model, top_k) async def delete_file(self, file_id: str): # delete vector From eb7b5dcc25da88506bdac075f9efa749fd808b70 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Fri, 8 Aug 2025 17:31:24 +0800 Subject: [PATCH 10/28] chore: rename zh_Hans label of deepseek requester --- pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml index 6f320e66..9a22c5d9 100644 --- a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml @@ -4,7 +4,7 @@ metadata: name: deepseek-chat-completions label: en_US: DeepSeek - zh_Hans: 深度求索 + zh_Hans: DeepSeek icon: deepseek.svg spec: config: From 2aef139577afd6d9c11ecdc52718528dce87f8fd Mon Sep 17 00:00:00 2001 From: TwperBody Date: Sun, 10 Aug 2025 22:17:06 +0800 Subject: [PATCH 11/28] dark mode --- web/src/app/global.css | 39 ++++---- web/src/app/home/bots/BotDetailDialog.tsx | 2 +- .../components/bot-card/botCard.module.css | 35 ++++++++ .../home/bots/components/bot-form/BotForm.tsx | 4 +- .../dynamic-form/DynamicFormItemComponent.tsx | 10 +-- .../home-sidebar/HomeSidebar.module.css | 90 ++++++++++++++----- .../home-titlebar/HomeTittleBar.module.css | 12 +++ web/src/app/home/knowledge/KBDetailDialog.tsx | 2 +- .../components/kb-card/KBCard.module.css | 37 ++++++++ .../components/kb-docs/documents/columns.tsx | 2 +- .../knowledge/components/kb-form/KBForm.tsx | 2 +- web/src/app/home/layout.module.css | 22 +++++ .../embedding-card/EmbeddingCard.module.css | 31 +++++++ .../embedding-form/EmbeddingForm.tsx | 4 +- .../component/llm-card/LLMCard.module.css | 43 +++++++++ .../models/component/llm-form/LLMForm.tsx | 4 +- web/src/app/home/models/page.tsx | 6 +- .../home/pipelines/PipelineDetailDialog.tsx | 2 +- .../components/debug-dialog/AtBadge.tsx | 4 +- .../components/debug-dialog/DebugDialog.tsx | 24 ++--- .../pipeline-card/pipelineCard.module.css | 37 ++++++++ .../pipeline-form/PipelineFormComponent.tsx | 4 +- web/src/app/home/pipelines/page.tsx | 10 +-- web/src/app/home/plugins/page.tsx | 4 +- .../plugin-card/PluginCardComponent.tsx | 18 ++-- .../plugin-market/PluginMarketComponent.tsx | 12 +-- .../PluginMarketCardComponent.tsx | 14 +-- .../createCartComponent.module.css | 14 +++ web/src/app/layout.tsx | 5 +- web/src/app/login/page.tsx | 8 +- web/src/app/register/page.tsx | 8 +- web/src/app/reset-password/page.tsx | 8 +- .../components/providers/theme-provider.tsx | 18 ++++ web/src/components/ui/pagination.tsx | 4 +- web/src/components/ui/theme-toggle.tsx | 24 +++++ 35 files changed, 450 insertions(+), 113 deletions(-) create mode 100644 web/src/components/providers/theme-provider.tsx create mode 100644 web/src/components/ui/theme-toggle.tsx diff --git a/web/src/app/global.css b/web/src/app/global.css index 079437e8..310d509a 100644 --- a/web/src/app/global.css +++ b/web/src/app/global.css @@ -56,6 +56,15 @@ background: rgba(0, 0, 0, 0.35); /* 悬停加深 */ } +/* 暗黑模式下的滚动条 */ +.dark ::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.2); /* 半透明白色 */ +} + +.dark ::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.35); /* 悬停加深 */ +} + /* 兼容 Edge */ @supports (-ms-ime-align: auto) { body { @@ -108,36 +117,36 @@ } .dark { - --background: oklch(0.141 0.005 285.823); + --background: oklch(0.08 0.002 285.823); --foreground: oklch(0.985 0 0); - --card: oklch(0.21 0.006 285.885); + --card: oklch(0.12 0.004 285.885); --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.21 0.006 285.885); + --popover: oklch(0.12 0.004 285.885); --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.92 0.004 286.32); - --primary-foreground: oklch(0.21 0.006 285.885); - --secondary: oklch(0.274 0.006 286.033); + --primary: oklch(0.62 0.2 255); + --primary-foreground: oklch(1 0 0); + --secondary: oklch(0.18 0.004 286.033); --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.274 0.006 286.033); + --muted: oklch(0.18 0.004 286.033); --muted-foreground: oklch(0.705 0.015 286.067); - --accent: oklch(0.274 0.006 286.033); + --accent: oklch(0.18 0.004 286.033); --accent-foreground: oklch(0.985 0 0); --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); + --border: oklch(1 0 0 / 8%); + --input: oklch(1 0 0 / 10%); --ring: oklch(0.552 0.016 285.938); --chart-1: oklch(0.488 0.243 264.376); --chart-2: oklch(0.696 0.17 162.48); --chart-3: oklch(0.769 0.188 70.08); --chart-4: oklch(0.627 0.265 303.9); --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.21 0.006 285.885); + --sidebar: oklch(0.1 0.003 285.885); --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.274 0.006 286.033); + --sidebar-primary: oklch(0.62 0.2 255); + --sidebar-primary-foreground: oklch(1 0 0); + --sidebar-accent: oklch(0.18 0.004 286.033); --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-border: oklch(1 0 0 / 8%); --sidebar-ring: oklch(0.552 0.016 285.938); } diff --git a/web/src/app/home/bots/BotDetailDialog.tsx b/web/src/app/home/bots/BotDetailDialog.tsx index db19e1d4..fbb8c359 100644 --- a/web/src/app/home/bots/BotDetailDialog.tsx +++ b/web/src/app/home/bots/BotDetailDialog.tsx @@ -159,7 +159,7 @@ export default function BotDetailDialog({ diff --git a/web/src/app/home/bots/components/bot-card/botCard.module.css b/web/src/app/home/bots/components/bot-card/botCard.module.css index 396b5831..0c316049 100644 --- a/web/src/app/home/bots/components/bot-card/botCard.module.css +++ b/web/src/app/home/bots/components/bot-card/botCard.module.css @@ -6,12 +6,22 @@ box-shadow: 0px 2px 2px 0 rgba(0, 0, 0, 0.2); padding: 1.2rem; cursor: pointer; + transition: all 0.2s ease; +} + +:global(.dark) .cardContainer { + background-color: #1a1a1e; + box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); } .cardContainer:hover { box-shadow: 0px 2px 8px 0 rgba(0, 0, 0, 0.1); } +:global(.dark) .cardContainer:hover { + box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); +} + .iconBasicInfoContainer { width: 100%; height: 100%; @@ -47,6 +57,11 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + color: #1a1a1a; +} + +:global(.dark) .basicInfoName { + color: #f0f0f0; } .basicInfoDescription { @@ -58,6 +73,10 @@ text-overflow: ellipsis; } +:global(.dark) .basicInfoDescription { + color: #888888; +} + .basicInfoAdapterContainer { display: flex; flex-direction: row; @@ -71,12 +90,20 @@ color: #626262; } +:global(.dark) .basicInfoAdapterIcon { + color: #a0a0a0; +} + .basicInfoAdapterLabel { font-size: 1.2rem; font-weight: 500; color: #626262; } +:global(.dark) .basicInfoAdapterLabel { + color: #a0a0a0; +} + .basicInfoPipelineContainer { display: flex; flex-direction: row; @@ -90,12 +117,20 @@ margin-top: 0.2rem; } +:global(.dark) .basicInfoPipelineIcon { + color: #a0a0a0; +} + .basicInfoPipelineLabel { font-size: 1.2rem; font-weight: 500; color: #626262; } +:global(.dark) .basicInfoPipelineLabel { + color: #a0a0a0; +} + .bigText { white-space: nowrap; overflow: hidden; diff --git a/web/src/app/home/bots/components/bot-form/BotForm.tsx b/web/src/app/home/bots/components/bot-form/BotForm.tsx index bd757ae0..02291027 100644 --- a/web/src/app/home/bots/components/bot-form/BotForm.tsx +++ b/web/src/app/home/bots/components/bot-form/BotForm.tsx @@ -394,7 +394,7 @@ export default function BotForm({ {t('bots.bindPipeline')} - + @@ -150,7 +150,7 @@ export default function DynamicFormItemComponent({ case DynamicFormItemType.LLM_MODEL_SELECTOR: return ( - + @@ -291,7 +291,7 @@ export default function DynamicFormItemComponent({
{/* 角色选择 */} {index === 0 ? ( -
+
system
) : ( @@ -303,7 +303,7 @@ export default function DynamicFormItemComponent({ field.onChange(newValue); }} > - + diff --git a/web/src/app/home/components/home-sidebar/HomeSidebar.module.css b/web/src/app/home/components/home-sidebar/HomeSidebar.module.css index d525d495..4aeb96e3 100644 --- a/web/src/app/home/components/home-sidebar/HomeSidebar.module.css +++ b/web/src/app/home/components/home-sidebar/HomeSidebar.module.css @@ -13,6 +13,10 @@ /* box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.1); */ } +:global(.dark) .sidebarContainer { + background-color: #0a0a0b !important; +} + .langbotIconContainer { width: 200px; height: 70px; @@ -21,32 +25,49 @@ align-items: center; justify-content: center; gap: 0.8rem; +} - .langbotIcon { - width: 2.8rem; - height: 2.8rem; - box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); - border-radius: 8px; - } +.langbotIcon { + width: 2.8rem; + height: 2.8rem; + box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); + border-radius: 8px; +} - .langbotTextContainer { - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: flex-start; - gap: 0.1rem; - } +:global(.dark) .langbotIcon { + box-shadow: 0 0 10px 0 rgba(255, 255, 255, 0.1); +} - .langbotText { - font-size: 1.4rem; - font-weight: 500; - } +.langbotTextContainer { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: 0.1rem; +} - .langbotVersion { - font-size: 0.8rem; - font-weight: 700; - color: #6c6c6c; - } +.langbotText { + font-size: 1.4rem; + font-weight: 500; + color: #1a1a1a; +} + +:global(.dark) .langbotText { + font-size: 1.4rem; + font-weight: 500; + color: #f0f0f0 !important; +} + +.langbotVersion { + font-size: 0.8rem; + font-weight: 700; + color: #6c6c6c; +} + +:global(.dark) .langbotVersion { + font-size: 0.8rem; + font-weight: 700; + color: #a0a0a0 !important; } .sidebarTopContainer { @@ -76,6 +97,7 @@ justify-content: flex-start; cursor: pointer; gap: 0.5rem; + transition: all 0.2s ease; /* background-color: aqua; */ } @@ -85,16 +107,40 @@ box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); } +:global(.dark) .sidebarSelected { + background-color: #2288ee; + color: white; + box-shadow: 0 0 10px 0 rgba(34, 136, 238, 0.3); +} + .sidebarUnselected { color: #6c6c6c; } +:global(.dark) .sidebarUnselected { + color: #a0a0a0 !important; +} + +.sidebarUnselected:hover { + background-color: rgba(34, 136, 238, 0.1); + color: #2288ee; +} + +:global(.dark) .sidebarUnselected:hover { + background-color: rgba(34, 136, 238, 0.2); + color: #66baff; +} + .sidebarChildIcon { width: 20px; height: 20px; background-color: rgba(96, 149, 209, 0); } +.sidebarChildName { + color: inherit; +} + .sidebarBottomContainer { width: 100%; display: flex; diff --git a/web/src/app/home/components/home-titlebar/HomeTittleBar.module.css b/web/src/app/home/components/home-titlebar/HomeTittleBar.module.css index bc740231..73bb2242 100644 --- a/web/src/app/home/components/home-titlebar/HomeTittleBar.module.css +++ b/web/src/app/home/components/home-titlebar/HomeTittleBar.module.css @@ -17,6 +17,10 @@ color: #585858; } +:global(.dark) .titleText { + color: #e0e0e0; +} + .subtitleText { margin-left: 3.2rem; font-size: 0.8rem; @@ -25,8 +29,16 @@ align-items: center; } +:global(.dark) .subtitleText { + color: #b0b0b0; +} + .helpLink { margin-left: 0.2rem; font-size: 0.8rem; color: #8b8b8b; } + +:global(.dark) .helpLink { + color: #a0a0a0; +} diff --git a/web/src/app/home/knowledge/KBDetailDialog.tsx b/web/src/app/home/knowledge/KBDetailDialog.tsx index 7ad8d4a4..33a21267 100644 --- a/web/src/app/home/knowledge/KBDetailDialog.tsx +++ b/web/src/app/home/knowledge/KBDetailDialog.tsx @@ -152,7 +152,7 @@ export default function KBDetailDialog({ diff --git a/web/src/app/home/knowledge/components/kb-card/KBCard.module.css b/web/src/app/home/knowledge/components/kb-card/KBCard.module.css index 2ecbd44a..dfc0002a 100644 --- a/web/src/app/home/knowledge/components/kb-card/KBCard.module.css +++ b/web/src/app/home/knowledge/components/kb-card/KBCard.module.css @@ -10,12 +10,22 @@ flex-direction: row; justify-content: space-between; gap: 0.5rem; + transition: all 0.2s ease; +} + +:global(.dark) .cardContainer { + background-color: #1a1a1e; + box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); } .cardContainer:hover { box-shadow: 0px 2px 8px 0 rgba(0, 0, 0, 0.1); } +:global(.dark) .cardContainer:hover { + box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); +} + .basicInfoContainer { width: 100%; height: 100%; @@ -35,6 +45,11 @@ .basicInfoNameText { font-size: 1.4rem; font-weight: 500; + color: #1a1a1a; +} + +:global(.dark) .basicInfoNameText { + color: #f0f0f0; } .basicInfoDescriptionText { @@ -48,6 +63,10 @@ color: #b1b1b1; } +:global(.dark) .basicInfoDescriptionText { + color: #888888; +} + .basicInfoLastUpdatedTimeContainer { display: flex; flex-direction: row; @@ -58,11 +77,21 @@ .basicInfoUpdateTimeIcon { width: 1.2rem; height: 1.2rem; + color: #626262; +} + +:global(.dark) .basicInfoUpdateTimeIcon { + color: #a0a0a0; } .basicInfoUpdateTimeText { font-size: 1rem; font-weight: 400; + color: #626262; +} + +:global(.dark) .basicInfoUpdateTimeText { + color: #a0a0a0; } .operationContainer { @@ -86,12 +115,20 @@ color: #ffcd27; } +:global(.dark) .operationDefaultBadgeIcon { + color: #fbbf24; +} + .operationDefaultBadgeText { font-size: 1rem; font-weight: 400; color: #ffcd27; } +:global(.dark) .operationDefaultBadgeText { + color: #fbbf24; +} + .bigText { white-space: nowrap; overflow: hidden; diff --git a/web/src/app/home/knowledge/components/kb-docs/documents/columns.tsx b/web/src/app/home/knowledge/components/kb-docs/documents/columns.tsx index 6142cfc4..45bc1ae8 100644 --- a/web/src/app/home/knowledge/components/kb-docs/documents/columns.tsx +++ b/web/src/app/home/knowledge/components/kb-docs/documents/columns.tsx @@ -77,7 +77,7 @@ export const columns = ( - + {t('knowledge.documentsTab.actions')} diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index 54d5d6e4..010d14bf 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -200,7 +200,7 @@ export default function KBForm({ }} value={field.value} > - + diff --git a/web/src/app/home/layout.module.css b/web/src/app/home/layout.module.css index 78a11beb..ad9725ca 100644 --- a/web/src/app/home/layout.module.css +++ b/web/src/app/home/layout.module.css @@ -7,6 +7,19 @@ background-color: #eee; } +:global(.dark) .homeLayoutContainer { + background-color: #0a0a0b; +} + +/* 侧边栏区域 */ +.sidebar { + background-color: #eee; +} + +:global(.dark) .sidebar { + background-color: #0a0a0b; +} + /* 主内容区域 */ .main { background-color: #fafafa; @@ -23,6 +36,11 @@ box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.05); } +:global(.dark) .main { + background-color: #151518; + box-shadow: 0 0 6px 0 rgba(255, 255, 255, 0.05); +} + .mainContent { padding: 1.5rem; padding-left: 2rem; @@ -30,3 +48,7 @@ overflow-y: auto; background-color: #fafafa; } + +:global(.dark) .mainContent { + background-color: #151518; +} diff --git a/web/src/app/home/models/component/embedding-card/EmbeddingCard.module.css b/web/src/app/home/models/component/embedding-card/EmbeddingCard.module.css index 9c6c54f7..8a43224a 100644 --- a/web/src/app/home/models/component/embedding-card/EmbeddingCard.module.css +++ b/web/src/app/home/models/component/embedding-card/EmbeddingCard.module.css @@ -6,12 +6,22 @@ box-shadow: 0px 2px 2px 0 rgba(0, 0, 0, 0.2); padding: 1.2rem; cursor: pointer; + transition: all 0.2s ease; +} + +:global(.dark) .cardContainer { + background-color: #1a1a1e; + box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); } .cardContainer:hover { box-shadow: 0px 2px 8px 0 rgba(0, 0, 0, 0.1); } +:global(.dark) .cardContainer:hover { + box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); +} + .iconBasicInfoContainer { width: 100%; height: 100%; @@ -39,6 +49,11 @@ .basicInfoText { font-size: 1.4rem; font-weight: bold; + color: #1a1a1a; +} + +:global(.dark) .basicInfoText { + color: #f0f0f0; } .providerContainer { @@ -56,12 +71,20 @@ color: #626262; } +:global(.dark) .providerIcon { + color: #a0a0a0; +} + .providerLabel { font-size: 1.2rem; font-weight: 600; color: #626262; } +:global(.dark) .providerLabel { + color: #a0a0a0; +} + .baseURLContainer { display: flex; flex-direction: row; @@ -77,6 +100,10 @@ color: #626262; } +:global(.dark) .baseURLIcon { + color: #a0a0a0; +} + .baseURLText { font-size: 1rem; width: 100%; @@ -87,6 +114,10 @@ max-width: 100%; } +:global(.dark) .baseURLText { + color: #a0a0a0; +} + .bigText { white-space: nowrap; overflow: hidden; diff --git a/web/src/app/home/models/component/embedding-form/EmbeddingForm.tsx b/web/src/app/home/models/component/embedding-form/EmbeddingForm.tsx index d50885ae..a7d241db 100644 --- a/web/src/app/home/models/component/embedding-form/EmbeddingForm.tsx +++ b/web/src/app/home/models/component/embedding-form/EmbeddingForm.tsx @@ -404,7 +404,7 @@ export default function EmbeddingForm({ }} value={field.value} > - + @@ -479,7 +479,7 @@ export default function EmbeddingForm({ updateExtraArg(index, 'type', value) } > - + diff --git a/web/src/app/home/models/component/llm-card/LLMCard.module.css b/web/src/app/home/models/component/llm-card/LLMCard.module.css index b6d1ac6f..ecd6a549 100644 --- a/web/src/app/home/models/component/llm-card/LLMCard.module.css +++ b/web/src/app/home/models/component/llm-card/LLMCard.module.css @@ -6,12 +6,22 @@ box-shadow: 0px 2px 2px 0 rgba(0, 0, 0, 0.2); padding: 1.2rem; cursor: pointer; + transition: all 0.2s ease; +} + +:global(.dark) .cardContainer { + background-color: #1a1a1e; + box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); } .cardContainer:hover { box-shadow: 0px 2px 8px 0 rgba(0, 0, 0, 0.1); } +:global(.dark) .cardContainer:hover { + box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); +} + .iconBasicInfoContainer { width: 100%; height: 100%; @@ -40,6 +50,11 @@ .basicInfoText { font-size: 1.4rem; font-weight: bold; + color: #1a1a1a; +} + +:global(.dark) .basicInfoText { + color: #f0f0f0; } .providerContainer { @@ -57,12 +72,20 @@ color: #626262; } +:global(.dark) .providerIcon { + color: #a0a0a0; +} + .providerLabel { font-size: 1.2rem; font-weight: 600; color: #626262; } +:global(.dark) .providerLabel { + color: #a0a0a0; +} + .baseURLContainer { display: flex; flex-direction: row; @@ -78,6 +101,10 @@ color: #626262; } +:global(.dark) .baseURLIcon { + color: #a0a0a0; +} + .baseURLText { font-size: 1rem; width: 100%; @@ -88,6 +115,10 @@ max-width: 100%; } +:global(.dark) .baseURLText { + color: #a0a0a0; +} + .abilitiesContainer { display: flex; flex-direction: row; @@ -108,18 +139,30 @@ background-color: #66baff80; } +:global(.dark) .abilityBadge { + background-color: rgba(34, 136, 238, 0.3); +} + .abilityIcon { width: 1rem; height: 1rem; color: #2288ee; } +:global(.dark) .abilityIcon { + color: #66baff; +} + .abilityLabel { font-size: 0.8rem; font-weight: 400; color: #2288ee; } +:global(.dark) .abilityLabel { + color: #66baff; +} + .bigText { white-space: nowrap; overflow: hidden; diff --git a/web/src/app/home/models/component/llm-form/LLMForm.tsx b/web/src/app/home/models/component/llm-form/LLMForm.tsx index 73cc32fe..4268261f 100644 --- a/web/src/app/home/models/component/llm-form/LLMForm.tsx +++ b/web/src/app/home/models/component/llm-form/LLMForm.tsx @@ -420,7 +420,7 @@ export default function LLMForm({ }} value={field.value} > - + @@ -553,7 +553,7 @@ export default function LLMForm({ updateExtraArg(index, 'type', value) } > - + diff --git a/web/src/app/home/models/page.tsx b/web/src/app/home/models/page.tsx index 2f936753..9060f9bc 100644 --- a/web/src/app/home/models/page.tsx +++ b/web/src/app/home/models/page.tsx @@ -192,7 +192,7 @@ export default function LLMConfigPage() {
- + {t('llm.llmModels')} @@ -206,12 +206,12 @@ export default function LLMConfigPage() {
-

{t('llm.description')}

+

{t('llm.description')}

-

+

{t('embedding.description')}

diff --git a/web/src/app/home/pipelines/PipelineDetailDialog.tsx b/web/src/app/home/pipelines/PipelineDetailDialog.tsx index 53cf9eaa..91b8b192 100644 --- a/web/src/app/home/pipelines/PipelineDetailDialog.tsx +++ b/web/src/app/home/pipelines/PipelineDetailDialog.tsx @@ -142,7 +142,7 @@ export default function PipelineDialog({ diff --git a/web/src/app/home/pipelines/components/debug-dialog/AtBadge.tsx b/web/src/app/home/pipelines/components/debug-dialog/AtBadge.tsx index 38a83d39..1ead0ab3 100644 --- a/web/src/app/home/pipelines/components/debug-dialog/AtBadge.tsx +++ b/web/src/app/home/pipelines/components/debug-dialog/AtBadge.tsx @@ -15,13 +15,13 @@ export default function AtBadge({ return ( @{targetName} {!readonly && onRemove && ( diff --git a/web/src/app/home/pipelines/components/debug-dialog/DebugDialog.tsx b/web/src/app/home/pipelines/components/debug-dialog/DebugDialog.tsx index a84389e0..8429ffd5 100644 --- a/web/src/app/home/pipelines/components/debug-dialog/DebugDialog.tsx +++ b/web/src/app/home/pipelines/components/debug-dialog/DebugDialog.tsx @@ -218,14 +218,14 @@ export default function DebugDialog({ const renderContent = () => (
-
+
- +
{messages.length === 0 ? (
@@ -281,7 +281,7 @@ export default function DebugDialog({ 'max-w-md px-5 py-3 rounded-2xl', message.role === 'user' ? 'bg-[#2288ee] text-white rounded-br-none' - : 'bg-gray-100 text-gray-900 rounded-bl-none', + : 'bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded-bl-none', )} > {renderMessageContent(message)} @@ -290,7 +290,7 @@ export default function DebugDialog({ 'text-xs mt-2', message.role === 'user' ? 'text-white/70' - : 'text-gray-500', + : 'text-gray-500 dark:text-gray-400', )} > {message.role === 'user' @@ -305,7 +305,7 @@ export default function DebugDialog({
-
+
{hasAt && ( @@ -322,23 +322,23 @@ export default function DebugDialog({ ? t('pipelines.debugDialog.privateChat') : t('pipelines.debugDialog.groupChat'), })} - className="flex-1 rounded-md px-3 py-2 border border-gray-300 focus:border-[#2288ee] transition-none text-base" + className="flex-1 rounded-md px-3 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 focus:border-[#2288ee] transition-none text-base" /> {showAtPopover && (
setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} > - + @webchatbot - {t('pipelines.debugDialog.atTips')}
@@ -369,7 +369,7 @@ export default function DebugDialog({ // 原有的Dialog包装 return ( - + {renderContent()} ); diff --git a/web/src/app/home/pipelines/components/pipeline-card/pipelineCard.module.css b/web/src/app/home/pipelines/components/pipeline-card/pipelineCard.module.css index 2ecbd44a..dfc0002a 100644 --- a/web/src/app/home/pipelines/components/pipeline-card/pipelineCard.module.css +++ b/web/src/app/home/pipelines/components/pipeline-card/pipelineCard.module.css @@ -10,12 +10,22 @@ flex-direction: row; justify-content: space-between; gap: 0.5rem; + transition: all 0.2s ease; +} + +:global(.dark) .cardContainer { + background-color: #1a1a1e; + box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); } .cardContainer:hover { box-shadow: 0px 2px 8px 0 rgba(0, 0, 0, 0.1); } +:global(.dark) .cardContainer:hover { + box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); +} + .basicInfoContainer { width: 100%; height: 100%; @@ -35,6 +45,11 @@ .basicInfoNameText { font-size: 1.4rem; font-weight: 500; + color: #1a1a1a; +} + +:global(.dark) .basicInfoNameText { + color: #f0f0f0; } .basicInfoDescriptionText { @@ -48,6 +63,10 @@ color: #b1b1b1; } +:global(.dark) .basicInfoDescriptionText { + color: #888888; +} + .basicInfoLastUpdatedTimeContainer { display: flex; flex-direction: row; @@ -58,11 +77,21 @@ .basicInfoUpdateTimeIcon { width: 1.2rem; height: 1.2rem; + color: #626262; +} + +:global(.dark) .basicInfoUpdateTimeIcon { + color: #a0a0a0; } .basicInfoUpdateTimeText { font-size: 1rem; font-weight: 400; + color: #626262; +} + +:global(.dark) .basicInfoUpdateTimeText { + color: #a0a0a0; } .operationContainer { @@ -86,12 +115,20 @@ color: #ffcd27; } +:global(.dark) .operationDefaultBadgeIcon { + color: #fbbf24; +} + .operationDefaultBadgeText { font-size: 1rem; font-weight: 400; color: #ffcd27; } +:global(.dark) .operationDefaultBadgeText { + color: #fbbf24; +} + .bigText { white-space: nowrap; overflow: hidden; diff --git a/web/src/app/home/pipelines/components/pipeline-form/PipelineFormComponent.tsx b/web/src/app/home/pipelines/components/pipeline-form/PipelineFormComponent.tsx index 4d2dfbd5..07fb3d49 100644 --- a/web/src/app/home/pipelines/components/pipeline-form/PipelineFormComponent.tsx +++ b/web/src/app/home/pipelines/components/pipeline-form/PipelineFormComponent.tsx @@ -342,7 +342,7 @@ export default function PipelineFormComponent({ return ( <> -
+
{/* 按钮栏移到 Tabs 外部,始终固定底部 */} {showButtons && ( -
+
{isEditMode && !isDefaultPipeline && ( + ); +} \ No newline at end of file From a27560e80421f498faf6c32efd1bb7d9e60a4495 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Mon, 11 Aug 2025 00:12:06 +0800 Subject: [PATCH 12/28] fix: page bug --- web/src/app/home/knowledge/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/app/home/knowledge/page.tsx b/web/src/app/home/knowledge/page.tsx index b290f7be..85e99c56 100644 --- a/web/src/app/home/knowledge/page.tsx +++ b/web/src/app/home/knowledge/page.tsx @@ -46,7 +46,7 @@ export default function KnowledgePage() { name: kb.name, description: kb.description, embeddingModelUUID: kb.embedding_model_uuid, - top_k: kb.top_k, + top_k: kb.top_k ?? 5, lastUpdatedTimeAgo: lastUpdatedTimeAgoText, }); }), From 012444847925f8fb95d05ddc70b99e33cae32375 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 11 Aug 2025 20:41:57 +0800 Subject: [PATCH 13/28] perf: card shadowbox --- .../components/bot-card/botCard.module.css | 6 +-- .../home/bots/components/bot-form/BotForm.tsx | 4 +- .../dynamic-form/DynamicFormItemComponent.tsx | 8 +-- .../EmptyAndCreateComponent.tsx | 27 ---------- .../emptyAndCreate.module.css | 54 ------------------- .../components/kb-card/KBCard.module.css | 6 +-- .../knowledge/components/kb-form/KBForm.tsx | 2 +- .../embedding-card/EmbeddingCard.module.css | 6 +-- .../embedding-form/EmbeddingForm.tsx | 4 +- .../component/llm-card/LLMCard.module.css | 6 +-- .../models/component/llm-form/LLMForm.tsx | 4 +- .../pipeline-card/pipelineCard.module.css | 6 +-- web/src/app/home/pipelines/page.tsx | 19 +++++-- .../plugin-card/PluginCardComponent.tsx | 10 ++-- .../plugin-market/PluginMarketComponent.tsx | 21 ++++++-- .../PluginMarketCardComponent.tsx | 6 ++- .../createCartComponent.module.css | 6 +-- .../components/providers/theme-provider.tsx | 4 +- web/src/components/ui/theme-toggle.tsx | 3 +- 19 files changed, 73 insertions(+), 129 deletions(-) delete mode 100644 web/src/app/home/components/empty-and-create-component/EmptyAndCreateComponent.tsx delete mode 100644 web/src/app/home/components/empty-and-create-component/emptyAndCreate.module.css diff --git a/web/src/app/home/bots/components/bot-card/botCard.module.css b/web/src/app/home/bots/components/bot-card/botCard.module.css index 0c316049..d9b82b9b 100644 --- a/web/src/app/home/bots/components/bot-card/botCard.module.css +++ b/web/src/app/home/bots/components/bot-card/botCard.module.css @@ -10,8 +10,8 @@ } :global(.dark) .cardContainer { - background-color: #1a1a1e; - box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); + background-color: #1f1f22; + box-shadow: 0; } .cardContainer:hover { @@ -19,7 +19,7 @@ } :global(.dark) .cardContainer:hover { - box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); + box-shadow: 0; } .iconBasicInfoContainer { diff --git a/web/src/app/home/bots/components/bot-form/BotForm.tsx b/web/src/app/home/bots/components/bot-form/BotForm.tsx index 02291027..92811a65 100644 --- a/web/src/app/home/bots/components/bot-form/BotForm.tsx +++ b/web/src/app/home/bots/components/bot-form/BotForm.tsx @@ -394,7 +394,7 @@ export default function BotForm({ {t('bots.bindPipeline')} - + @@ -150,7 +150,7 @@ export default function DynamicFormItemComponent({ case DynamicFormItemType.LLM_MODEL_SELECTOR: return ( - + @@ -303,7 +303,7 @@ export default function DynamicFormItemComponent({ field.onChange(newValue); }} > - + diff --git a/web/src/app/home/components/empty-and-create-component/EmptyAndCreateComponent.tsx b/web/src/app/home/components/empty-and-create-component/EmptyAndCreateComponent.tsx deleted file mode 100644 index b55b4cee..00000000 --- a/web/src/app/home/components/empty-and-create-component/EmptyAndCreateComponent.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import styles from './emptyAndCreate.module.css'; - -export default function EmptyAndCreateComponent({ - title, - subTitle, - buttonText, - onButtonClick, -}: { - title: string; - subTitle: string; - buttonText: string; - onButtonClick: () => void; -}) { - return ( -
-
-
-
{title}
-
{subTitle}
-
-
- {buttonText} -
-
-
- ); -} diff --git a/web/src/app/home/components/empty-and-create-component/emptyAndCreate.module.css b/web/src/app/home/components/empty-and-create-component/emptyAndCreate.module.css deleted file mode 100644 index 3504d7a3..00000000 --- a/web/src/app/home/components/empty-and-create-component/emptyAndCreate.module.css +++ /dev/null @@ -1,54 +0,0 @@ -.emptyPageContainer { - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - background: #fff; - border: 1px solid #c5c5c5; - border-radius: 10px; -} - -.emptyContainer { - width: 100%; - height: 50%; - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; -} - -.emptyCreateButton { - width: 200px; - height: 50px; - border-radius: 20px; - background-color: #2288ee; - color: #fff; - font-size: 20px; - font-weight: bold; - text-align: center; - line-height: 50px; - user-select: none; -} - -.emptyCreateButton:hover { - background-color: #1b77d2; -} - -.emptyInfoContainer { - width: 100%; - height: 60px; - display: flex; - flex-direction: column; - align-items: center; - color: #353535; -} - -.emptyInfoText { - font-size: 30px; -} - -.emptyInfoSubText { - font-size: 28px; -} diff --git a/web/src/app/home/knowledge/components/kb-card/KBCard.module.css b/web/src/app/home/knowledge/components/kb-card/KBCard.module.css index dfc0002a..d2bfebca 100644 --- a/web/src/app/home/knowledge/components/kb-card/KBCard.module.css +++ b/web/src/app/home/knowledge/components/kb-card/KBCard.module.css @@ -14,8 +14,8 @@ } :global(.dark) .cardContainer { - background-color: #1a1a1e; - box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); + background-color: #1f1f22; + box-shadow: 0; } .cardContainer:hover { @@ -23,7 +23,7 @@ } :global(.dark) .cardContainer:hover { - box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); + box-shadow: 0; } .basicInfoContainer { diff --git a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx index 010d14bf..bad97cfa 100644 --- a/web/src/app/home/knowledge/components/kb-form/KBForm.tsx +++ b/web/src/app/home/knowledge/components/kb-form/KBForm.tsx @@ -200,7 +200,7 @@ export default function KBForm({ }} value={field.value} > - + diff --git a/web/src/app/home/models/component/embedding-card/EmbeddingCard.module.css b/web/src/app/home/models/component/embedding-card/EmbeddingCard.module.css index 8a43224a..9545619b 100644 --- a/web/src/app/home/models/component/embedding-card/EmbeddingCard.module.css +++ b/web/src/app/home/models/component/embedding-card/EmbeddingCard.module.css @@ -10,8 +10,8 @@ } :global(.dark) .cardContainer { - background-color: #1a1a1e; - box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); + background-color: #1f1f22; + box-shadow: 0; } .cardContainer:hover { @@ -19,7 +19,7 @@ } :global(.dark) .cardContainer:hover { - box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); + box-shadow: 0; } .iconBasicInfoContainer { diff --git a/web/src/app/home/models/component/embedding-form/EmbeddingForm.tsx b/web/src/app/home/models/component/embedding-form/EmbeddingForm.tsx index a7d241db..abc717c6 100644 --- a/web/src/app/home/models/component/embedding-form/EmbeddingForm.tsx +++ b/web/src/app/home/models/component/embedding-form/EmbeddingForm.tsx @@ -404,7 +404,7 @@ export default function EmbeddingForm({ }} value={field.value} > - + @@ -479,7 +479,7 @@ export default function EmbeddingForm({ updateExtraArg(index, 'type', value) } > - + diff --git a/web/src/app/home/models/component/llm-card/LLMCard.module.css b/web/src/app/home/models/component/llm-card/LLMCard.module.css index ecd6a549..aedbebde 100644 --- a/web/src/app/home/models/component/llm-card/LLMCard.module.css +++ b/web/src/app/home/models/component/llm-card/LLMCard.module.css @@ -10,8 +10,8 @@ } :global(.dark) .cardContainer { - background-color: #1a1a1e; - box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); + background-color: #1f1f22; + box-shadow: 0; } .cardContainer:hover { @@ -19,7 +19,7 @@ } :global(.dark) .cardContainer:hover { - box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); + box-shadow: 0; } .iconBasicInfoContainer { diff --git a/web/src/app/home/models/component/llm-form/LLMForm.tsx b/web/src/app/home/models/component/llm-form/LLMForm.tsx index 4268261f..54e0b9ce 100644 --- a/web/src/app/home/models/component/llm-form/LLMForm.tsx +++ b/web/src/app/home/models/component/llm-form/LLMForm.tsx @@ -420,7 +420,7 @@ export default function LLMForm({ }} value={field.value} > - + @@ -553,7 +553,7 @@ export default function LLMForm({ updateExtraArg(index, 'type', value) } > - + diff --git a/web/src/app/home/pipelines/components/pipeline-card/pipelineCard.module.css b/web/src/app/home/pipelines/components/pipeline-card/pipelineCard.module.css index dfc0002a..d2bfebca 100644 --- a/web/src/app/home/pipelines/components/pipeline-card/pipelineCard.module.css +++ b/web/src/app/home/pipelines/components/pipeline-card/pipelineCard.module.css @@ -14,8 +14,8 @@ } :global(.dark) .cardContainer { - background-color: #1a1a1e; - box-shadow: 0px 2px 8px 0 rgba(255, 255, 255, 0.1); + background-color: #1f1f22; + box-shadow: 0; } .cardContainer:hover { @@ -23,7 +23,7 @@ } :global(.dark) .cardContainer:hover { - box-shadow: 0px 4px 12px 0 rgba(255, 255, 255, 0.15); + box-shadow: 0; } .basicInfoContainer { diff --git a/web/src/app/home/pipelines/page.tsx b/web/src/app/home/pipelines/page.tsx index c81eb5fd..c7801a33 100644 --- a/web/src/app/home/pipelines/page.tsx +++ b/web/src/app/home/pipelines/page.tsx @@ -125,17 +125,26 @@ export default function PluginConfigPage() { value={`${sortByValue},${sortOrderValue}`} onValueChange={handleSortChange} > - + - - + + {t('pipelines.newestCreated')} - + {t('pipelines.recentlyEdited')} - + {t('pipelines.earliestEdited')} diff --git a/web/src/app/home/plugins/plugin-installed/plugin-card/PluginCardComponent.tsx b/web/src/app/home/plugins/plugin-installed/plugin-card/PluginCardComponent.tsx index f965a9a9..fed9c53f 100644 --- a/web/src/app/home/plugins/plugin-installed/plugin-card/PluginCardComponent.tsx +++ b/web/src/app/home/plugins/plugin-installed/plugin-card/PluginCardComponent.tsx @@ -34,7 +34,7 @@ export default function PluginCardComponent({ } return (
@@ -54,7 +54,9 @@ export default function PluginCardComponent({ {cardVO.author} /{' '}
-
{cardVO.name}
+
+ {cardVO.name} +
v{cardVO.version} @@ -115,7 +117,9 @@ export default function PluginCardComponent({
- + - - {t('plugins.mostStars')} - + + + {t('plugins.mostStars')} + + {t('plugins.recentlyAdded')} - + {t('plugins.recentlyUpdated')} diff --git a/web/src/app/home/plugins/plugin-market/plugin-market-card/PluginMarketCardComponent.tsx b/web/src/app/home/plugins/plugin-market/plugin-market-card/PluginMarketCardComponent.tsx index 02e01277..fc4a4812 100644 --- a/web/src/app/home/plugins/plugin-market/plugin-market-card/PluginMarketCardComponent.tsx +++ b/web/src/app/home/plugins/plugin-market/plugin-market-card/PluginMarketCardComponent.tsx @@ -16,7 +16,7 @@ export default function PluginMarketCardComponent({ } return ( -
+
-
{cardVO.name}
+
+ {cardVO.name} +
diff --git a/web/src/app/infra/basic-component/create-card-component/createCartComponent.module.css b/web/src/app/infra/basic-component/create-card-component/createCartComponent.module.css index 1536df0f..76a5672d 100644 --- a/web/src/app/infra/basic-component/create-card-component/createCartComponent.module.css +++ b/web/src/app/infra/basic-component/create-card-component/createCartComponent.module.css @@ -11,8 +11,8 @@ } :global(.dark) .cardContainer { - background-color: #1a1a1e; - box-shadow: 0 0 8px 0 rgba(255, 255, 255, 0.1); + background-color: #1f1f22; + box-shadow: 0; } .cardContainer:hover { @@ -20,7 +20,7 @@ } :global(.dark) .cardContainer:hover { - box-shadow: 0 0 15px 0 rgba(255, 255, 255, 0.15); + box-shadow: 0; } .createCardContainer { diff --git a/web/src/components/providers/theme-provider.tsx b/web/src/components/providers/theme-provider.tsx index 278f54c7..cc8cd30f 100644 --- a/web/src/components/providers/theme-provider.tsx +++ b/web/src/components/providers/theme-provider.tsx @@ -1,7 +1,7 @@ 'use client'; import { ThemeProvider as NextThemesProvider } from 'next-themes'; -import { type ThemeProviderProps } from 'next-themes/dist/types'; +import { type ThemeProviderProps } from 'next-themes'; export function ThemeProvider({ children, ...props }: ThemeProviderProps) { return ( @@ -15,4 +15,4 @@ export function ThemeProvider({ children, ...props }: ThemeProviderProps) { {children} ); -} \ No newline at end of file +} diff --git a/web/src/components/ui/theme-toggle.tsx b/web/src/components/ui/theme-toggle.tsx index 14cad0f4..143e9460 100644 --- a/web/src/components/ui/theme-toggle.tsx +++ b/web/src/components/ui/theme-toggle.tsx @@ -18,7 +18,6 @@ export function ThemeToggle() { > - 切换主题 ); -} \ No newline at end of file +} From 5f18a1b13a4307cac337ed07be7780a0a022fca3 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 11 Aug 2025 20:46:08 +0800 Subject: [PATCH 14/28] chore: prettier --- .../knowledge/components/kb-docs/documents/columns.tsx | 5 ++++- web/src/app/home/models/page.tsx | 4 +++- .../pipelines/components/debug-dialog/DebugDialog.tsx | 4 +++- .../components/pipeline-form/PipelineFormComponent.tsx | 2 +- web/src/app/layout.tsx | 8 ++++---- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/web/src/app/home/knowledge/components/kb-docs/documents/columns.tsx b/web/src/app/home/knowledge/components/kb-docs/documents/columns.tsx index 45bc1ae8..2880c1ba 100644 --- a/web/src/app/home/knowledge/components/kb-docs/documents/columns.tsx +++ b/web/src/app/home/knowledge/components/kb-docs/documents/columns.tsx @@ -77,7 +77,10 @@ export const columns = ( - + {t('knowledge.documentsTab.actions')} diff --git a/web/src/app/home/models/page.tsx b/web/src/app/home/models/page.tsx index 9060f9bc..66099125 100644 --- a/web/src/app/home/models/page.tsx +++ b/web/src/app/home/models/page.tsx @@ -206,7 +206,9 @@ export default function LLMConfigPage() {
-

{t('llm.description')}

+

+ {t('llm.description')} +

diff --git a/web/src/app/home/pipelines/components/debug-dialog/DebugDialog.tsx b/web/src/app/home/pipelines/components/debug-dialog/DebugDialog.tsx index 8429ffd5..1d2c0840 100644 --- a/web/src/app/home/pipelines/components/debug-dialog/DebugDialog.tsx +++ b/web/src/app/home/pipelines/components/debug-dialog/DebugDialog.tsx @@ -332,7 +332,9 @@ export default function DebugDialog({
setIsHovering(true)} diff --git a/web/src/app/home/pipelines/components/pipeline-form/PipelineFormComponent.tsx b/web/src/app/home/pipelines/components/pipeline-form/PipelineFormComponent.tsx index 07fb3d49..7d26ad30 100644 --- a/web/src/app/home/pipelines/components/pipeline-form/PipelineFormComponent.tsx +++ b/web/src/app/home/pipelines/components/pipeline-form/PipelineFormComponent.tsx @@ -342,7 +342,7 @@ export default function PipelineFormComponent({ return ( <> -
+
- - {children} - - + + {children} + + From 0021efebd71f72f3b02e2c7c238b4fd08df95d33 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 11 Aug 2025 20:50:39 +0800 Subject: [PATCH 15/28] perf: minor fix --- .../app/home/bots/components/bot-log/view/botLog.module.css | 5 +++++ .../app/home/knowledge/components/kb-docs/FileUploadZone.tsx | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/web/src/app/home/bots/components/bot-log/view/botLog.module.css b/web/src/app/home/bots/components/bot-log/view/botLog.module.css index 232d42e4..9cbeffa6 100644 --- a/web/src/app/home/bots/components/bot-log/view/botLog.module.css +++ b/web/src/app/home/bots/components/bot-log/view/botLog.module.css @@ -18,6 +18,11 @@ cursor: pointer; } +:global(.dark) .botLogCardContainer { + background-color: #1f1f22; + border: 1px solid #2a2a2e; +} + .listHeader { width: 100%; height: 2.5rem; diff --git a/web/src/app/home/knowledge/components/kb-docs/FileUploadZone.tsx b/web/src/app/home/knowledge/components/kb-docs/FileUploadZone.tsx index 3b4123ec..512ea198 100644 --- a/web/src/app/home/knowledge/components/kb-docs/FileUploadZone.tsx +++ b/web/src/app/home/knowledge/components/kb-docs/FileUploadZone.tsx @@ -127,12 +127,12 @@ export default function FileUploadZone({
-

+

{isUploading ? t('knowledge.documentsTab.uploading') : t('knowledge.documentsTab.dragAndDrop')}

-

+

{t('knowledge.documentsTab.supportedFormats')}

From 146c38e64c07c115e8b1b06df3e98e4bbafcd0e4 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Mon, 11 Aug 2025 22:58:48 +0800 Subject: [PATCH 16/28] fix: wrong positions --- web/src/i18n/locales/en-US.ts | 3 ++- web/src/i18n/locales/ja-JP.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/web/src/i18n/locales/en-US.ts b/web/src/i18n/locales/en-US.ts index ff855d31..b32a9d8b 100644 --- a/web/src/i18n/locales/en-US.ts +++ b/web/src/i18n/locales/en-US.ts @@ -255,7 +255,8 @@ const enUS = { topK: 'Top K', topKRequired: 'Top K cannot be empty', topKMax: 'Top K maximum value is 30', - topKdescription: 'Used to specify the number of relevant documents to retrieve, ranging from 1 to 30.', + topKdescription: + 'Used to specify the number of relevant documents to retrieve, ranging from 1 to 30.', defaultDescription: 'A knowledge base', embeddingModelUUID: 'Embedding Model', selectEmbeddingModel: 'Select Embedding Model', diff --git a/web/src/i18n/locales/ja-JP.ts b/web/src/i18n/locales/ja-JP.ts index 1fa337a0..9e6870fd 100644 --- a/web/src/i18n/locales/ja-JP.ts +++ b/web/src/i18n/locales/ja-JP.ts @@ -257,7 +257,8 @@ const jaJP = { topK: '上位K件', topKRequired: '上位K件は必須です', topKMax: '上位K件の最大値は30です', - topKdescription: '関連ドキュメントを取得するための上位K件の数。1〜30の範囲で設定可能です', + topKdescription: + '関連ドキュメントを取得するための上位K件の数。1〜30の範囲で設定可能です', defaultDescription: '知識ベース', embeddingModelUUID: '埋め込みモデル', selectEmbeddingModel: '埋め込みモデルを選択', From 457cc3eecdc4aeef3f22ee345114b3d353b42895 Mon Sep 17 00:00:00 2001 From: WangCham <651122857@qq.com> Date: Mon, 11 Aug 2025 23:22:36 +0800 Subject: [PATCH 17/28] fix: wrong definition of topk --- web/src/app/infra/entities/api/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/app/infra/entities/api/index.ts b/web/src/app/infra/entities/api/index.ts index 787631a3..d687dce5 100644 --- a/web/src/app/infra/entities/api/index.ts +++ b/web/src/app/infra/entities/api/index.ts @@ -61,7 +61,7 @@ export interface KnowledgeBase { description: string; embedding_model_uuid: string; created_at?: string; - top_k?: number; + top_k: number; } export interface ApiRespProviderEmbeddingModels { From 39ef92676b0895673af8d00a56b53132ba9573b1 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 11 Aug 2025 23:38:41 +0800 Subject: [PATCH 18/28] doc: add back wechat --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a2ce422f..347db63f 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,7 @@ docker compose up -d | QQ 官方机器人 | ✅ | QQ 官方机器人,支持频道、私聊、群聊 | | 企业微信 | ✅ | | | 企微对外客服 | ✅ | | +| 个人微信 | ✅ | | | 微信公众号 | ✅ | | | 飞书 | ✅ | | | 钉钉 | ✅ | | From c5480078b3b6c4c7a6ec2165085b429a317784b6 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Tue, 12 Aug 2025 11:30:42 +0800 Subject: [PATCH 19/28] perf: make prompt editor textarea --- .../dynamic-form/DynamicFormItemComponent.tsx | 3 ++- web/src/components/ui/textarea.tsx | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 web/src/components/ui/textarea.tsx diff --git a/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx b/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx index d758cbc0..a762f7d0 100644 --- a/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx +++ b/web/src/app/home/components/dynamic-form/DynamicFormItemComponent.tsx @@ -26,6 +26,7 @@ import { } from '@/components/ui/hover-card'; import { useTranslation } from 'react-i18next'; import { i18nObj } from '@/i18n/I18nProvider'; +import { Textarea } from '@/components/ui/textarea'; export default function DynamicFormItemComponent({ config, @@ -315,7 +316,7 @@ export default function DynamicFormItemComponent({ )} {/* 内容输入 */} - { diff --git a/web/src/components/ui/textarea.tsx b/web/src/components/ui/textarea.tsx new file mode 100644 index 00000000..5f558e74 --- /dev/null +++ b/web/src/components/ui/textarea.tsx @@ -0,0 +1,18 @@ +import * as React from 'react'; + +import { cn } from '@/lib/utils'; + +function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) { + return ( +