@lobehub/lobehub 2.0.0-next.265 → 2.0.0-next.266
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/changelog/v1.json +9 -0
- package/locales/ar/chat.json +1 -0
- package/locales/ar/modelProvider.json +20 -0
- package/locales/ar/models.json +33 -10
- package/locales/ar/plugin.json +1 -0
- package/locales/ar/providers.json +1 -0
- package/locales/ar/setting.json +2 -0
- package/locales/bg-BG/chat.json +1 -0
- package/locales/bg-BG/modelProvider.json +20 -0
- package/locales/bg-BG/models.json +27 -7
- package/locales/bg-BG/plugin.json +1 -0
- package/locales/bg-BG/providers.json +1 -0
- package/locales/bg-BG/setting.json +2 -0
- package/locales/de-DE/chat.json +1 -0
- package/locales/de-DE/modelProvider.json +20 -0
- package/locales/de-DE/models.json +44 -10
- package/locales/de-DE/plugin.json +1 -0
- package/locales/de-DE/providers.json +1 -0
- package/locales/de-DE/setting.json +2 -0
- package/locales/en-US/chat.json +1 -0
- package/locales/en-US/modelProvider.json +20 -0
- package/locales/en-US/models.json +10 -10
- package/locales/en-US/providers.json +1 -0
- package/locales/en-US/setting.json +2 -1
- package/locales/es-ES/chat.json +1 -0
- package/locales/es-ES/modelProvider.json +20 -0
- package/locales/es-ES/models.json +53 -10
- package/locales/es-ES/plugin.json +1 -0
- package/locales/es-ES/providers.json +1 -0
- package/locales/es-ES/setting.json +2 -0
- package/locales/fa-IR/chat.json +1 -0
- package/locales/fa-IR/modelProvider.json +20 -0
- package/locales/fa-IR/models.json +33 -10
- package/locales/fa-IR/plugin.json +1 -0
- package/locales/fa-IR/providers.json +1 -0
- package/locales/fa-IR/setting.json +2 -0
- package/locales/fr-FR/chat.json +1 -0
- package/locales/fr-FR/modelProvider.json +20 -0
- package/locales/fr-FR/models.json +27 -7
- package/locales/fr-FR/plugin.json +1 -0
- package/locales/fr-FR/providers.json +1 -0
- package/locales/fr-FR/setting.json +2 -0
- package/locales/it-IT/chat.json +1 -0
- package/locales/it-IT/modelProvider.json +20 -0
- package/locales/it-IT/models.json +10 -10
- package/locales/it-IT/plugin.json +1 -0
- package/locales/it-IT/providers.json +1 -0
- package/locales/it-IT/setting.json +2 -0
- package/locales/ja-JP/chat.json +1 -0
- package/locales/ja-JP/modelProvider.json +20 -0
- package/locales/ja-JP/models.json +5 -10
- package/locales/ja-JP/plugin.json +1 -0
- package/locales/ja-JP/providers.json +1 -0
- package/locales/ja-JP/setting.json +2 -0
- package/locales/ko-KR/chat.json +1 -0
- package/locales/ko-KR/modelProvider.json +20 -0
- package/locales/ko-KR/models.json +36 -10
- package/locales/ko-KR/plugin.json +1 -0
- package/locales/ko-KR/providers.json +1 -0
- package/locales/ko-KR/setting.json +2 -0
- package/locales/nl-NL/chat.json +1 -0
- package/locales/nl-NL/modelProvider.json +20 -0
- package/locales/nl-NL/models.json +35 -4
- package/locales/nl-NL/plugin.json +1 -0
- package/locales/nl-NL/providers.json +1 -0
- package/locales/nl-NL/setting.json +2 -0
- package/locales/pl-PL/chat.json +1 -0
- package/locales/pl-PL/modelProvider.json +20 -0
- package/locales/pl-PL/models.json +37 -7
- package/locales/pl-PL/plugin.json +1 -0
- package/locales/pl-PL/providers.json +1 -0
- package/locales/pl-PL/setting.json +2 -0
- package/locales/pt-BR/chat.json +1 -0
- package/locales/pt-BR/modelProvider.json +20 -0
- package/locales/pt-BR/models.json +51 -9
- package/locales/pt-BR/plugin.json +1 -0
- package/locales/pt-BR/providers.json +1 -0
- package/locales/pt-BR/setting.json +2 -0
- package/locales/ru-RU/chat.json +1 -0
- package/locales/ru-RU/modelProvider.json +20 -0
- package/locales/ru-RU/models.json +48 -7
- package/locales/ru-RU/plugin.json +1 -0
- package/locales/ru-RU/providers.json +1 -0
- package/locales/ru-RU/setting.json +2 -0
- package/locales/tr-TR/chat.json +1 -0
- package/locales/tr-TR/modelProvider.json +20 -0
- package/locales/tr-TR/models.json +48 -7
- package/locales/tr-TR/plugin.json +1 -0
- package/locales/tr-TR/providers.json +1 -0
- package/locales/tr-TR/setting.json +2 -0
- package/locales/vi-VN/chat.json +1 -0
- package/locales/vi-VN/modelProvider.json +20 -0
- package/locales/vi-VN/models.json +5 -5
- package/locales/vi-VN/plugin.json +1 -0
- package/locales/vi-VN/providers.json +1 -0
- package/locales/vi-VN/setting.json +2 -0
- package/locales/zh-CN/modelProvider.json +20 -20
- package/locales/zh-CN/models.json +49 -8
- package/locales/zh-CN/providers.json +1 -0
- package/locales/zh-CN/setting.json +2 -1
- package/locales/zh-TW/chat.json +1 -0
- package/locales/zh-TW/modelProvider.json +20 -0
- package/locales/zh-TW/models.json +29 -10
- package/locales/zh-TW/plugin.json +1 -0
- package/locales/zh-TW/providers.json +1 -0
- package/locales/zh-TW/setting.json +2 -0
- package/package.json +1 -1
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/Body.tsx +1 -1
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/Cron/CronTopicGroup.tsx +84 -0
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/{Topic/CronTopicList → Cron}/CronTopicItem.tsx +1 -1
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/{Topic/CronTopicList → Cron}/index.tsx +23 -33
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/List/Item/Editing.tsx +12 -49
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/List/index.tsx +3 -1
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/TopicListContent/ThreadList/ThreadItem/Editing.tsx +12 -40
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/hooks/useTopicNavigation.ts +5 -1
- package/src/app/[variants]/(main)/agent/profile/features/AgentCronJobs/CronJobCards.tsx +1 -1
- package/src/app/[variants]/(main)/agent/profile/features/AgentCronJobs/CronJobForm.tsx +1 -1
- package/src/app/[variants]/(main)/group/_layout/Sidebar/AddGroupMemberModal/AvailableAgentList.tsx +0 -1
- package/src/app/[variants]/(main)/group/_layout/Sidebar/AddGroupMemberModal/index.tsx +5 -1
- package/src/components/InlineRename/index.tsx +121 -0
- package/src/features/NavPanel/components/NavItem.tsx +1 -1
- package/src/locales/default/setting.ts +2 -0
- package/src/store/agent/slices/cron/action.ts +108 -0
- package/src/store/agent/slices/cron/index.ts +1 -0
- package/src/store/agent/store.ts +3 -0
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/Topic/CronTopicList/CronTopicGroup.tsx +0 -74
- package/src/app/[variants]/(main)/group/features/ChangelogModal.tsx +0 -11
- package/src/hooks/useFetchCronTopicsWithJobInfo.ts +0 -56
|
@@ -271,20 +271,20 @@
|
|
|
271
271
|
"chatgpt-4o-latest.description": "ChatGPT-4o 是一款即時更新的動態模型,結合強大的理解與生成能力,適用於客服、教育與技術支援等大規模應用場景。",
|
|
272
272
|
"claude-2.0.description": "Claude 2 提供企業級關鍵改進,包括領先的 20 萬 token 上下文、降低幻覺、系統提示與新測試功能:工具調用。",
|
|
273
273
|
"claude-2.1.description": "Claude 2 提供企業級關鍵改進,包括領先的 20 萬 token 上下文、降低幻覺、系統提示與新測試功能:工具調用。",
|
|
274
|
-
"claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku 是 Anthropic
|
|
274
|
+
"claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku 是 Anthropic 最新一代中速度最快的模型,在多項技能上有所提升,並在多項基準測試中超越前一代旗艦 Claude 3 Opus。",
|
|
275
275
|
"claude-3-5-haiku-latest.description": "Claude 3.5 Haiku 提供快速回應,適用於輕量任務。",
|
|
276
|
-
"claude-3-7-sonnet-20250219.description": "Claude 3.7
|
|
276
|
+
"claude-3-7-sonnet-20250219.description": "Claude Sonnet 3.7 是 Anthropic 最智慧的模型,也是市場上首個混合推理模型,支援即時回應與延伸思考,並提供細緻的控制能力。",
|
|
277
277
|
"claude-3-7-sonnet-latest.description": "Claude 3.7 Sonnet 是 Anthropic 最新且最強大的模型,適用於高度複雜任務,具備卓越的效能、智慧、流暢度與理解力。",
|
|
278
278
|
"claude-3-haiku-20240307.description": "Claude 3 Haiku 是 Anthropic 推出的最快速且最精簡的模型,設計用於即時回應,具備快速且準確的表現。",
|
|
279
279
|
"claude-3-opus-20240229.description": "Claude 3 Opus 是 Anthropic 最強大的模型,適用於高度複雜任務,具備卓越的效能、智慧、流暢度與理解力。",
|
|
280
280
|
"claude-3-sonnet-20240229.description": "Claude 3 Sonnet 在智慧與速度之間取得平衡,適合企業工作負載,提供高效能與低成本的大規模部署。",
|
|
281
|
-
"claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 是 Anthropic
|
|
281
|
+
"claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 是 Anthropic 迄今最快且最智慧的 Haiku 模型,具備閃電般的速度與延伸思考能力。",
|
|
282
282
|
"claude-opus-4-1-20250805-thinking.description": "Claude Opus 4.1 Thinking 是一個進階版本,能夠揭示其推理過程。",
|
|
283
283
|
"claude-opus-4-1-20250805.description": "Claude Opus 4.1 是 Anthropic 最新且最強大的模型,適用於高度複雜任務,具備卓越的效能、智慧、流暢度與理解力。",
|
|
284
|
-
"claude-opus-4-20250514.description": "Claude Opus 4 是 Anthropic
|
|
284
|
+
"claude-opus-4-20250514.description": "Claude Opus 4 是 Anthropic 最強大的模型,專為處理高度複雜任務而設,表現出色,具備卓越的智慧、流暢度與理解力。",
|
|
285
285
|
"claude-opus-4-5-20251101.description": "Claude Opus 4.5 是 Anthropic 的旗艦模型,結合卓越智慧與可擴展效能,適合需要最高品質回應與推理的複雜任務。",
|
|
286
286
|
"claude-sonnet-4-20250514-thinking.description": "Claude Sonnet 4 Thinking 可產生即時回應或延伸的逐步思考,並顯示其推理過程。",
|
|
287
|
-
"claude-sonnet-4-20250514.description": "Claude Sonnet 4
|
|
287
|
+
"claude-sonnet-4-20250514.description": "Claude Sonnet 4 是 Anthropic 目前最智慧的模型,為 API 使用者提供即時回應或逐步推理的能力,並具備細緻控制功能。",
|
|
288
288
|
"claude-sonnet-4-5-20250929.description": "Claude Sonnet 4.5 是 Anthropic 迄今最智慧的模型。",
|
|
289
289
|
"codegeex-4.description": "CodeGeeX-4 是一款強大的 AI 程式輔助工具,支援多語言問答與程式碼補全,能有效提升開發者的生產力。",
|
|
290
290
|
"codegeex4-all-9b.description": "CodeGeeX4-ALL-9B 是一個多語言程式碼生成模型,支援程式碼補全與生成、程式碼解釋器、網頁搜尋、函式呼叫與倉庫層級的程式碼問答,涵蓋多種軟體開發場景。它是參數數量低於 100 億的頂尖程式碼模型之一。",
|
|
@@ -355,7 +355,7 @@
|
|
|
355
355
|
"deepseek-ai/deepseek-v3.1-terminus.description": "DeepSeek V3.1 是新一代推理模型,具備更強的複雜推理與思維鏈能力,適用於深度分析任務。",
|
|
356
356
|
"deepseek-ai/deepseek-v3.1.description": "DeepSeek V3.1 是新一代推理模型,具備更強的複雜推理與思維鏈能力,適用於深度分析任務。",
|
|
357
357
|
"deepseek-ai/deepseek-vl2.description": "DeepSeek-VL2 是一款基於 DeepSeekMoE-27B 的 MoE 視覺語言模型,採用稀疏激活,僅使用 4.5B 活躍參數即可達到強大表現。擅長視覺問答、OCR、文件/表格/圖表理解與視覺對齊。",
|
|
358
|
-
"deepseek-chat.description": "
|
|
358
|
+
"deepseek-chat.description": "DeepSeek V3.2 在推理能力與輸出長度之間取得平衡,適用於日常問答與智能代理任務。其公開基準測試達到 GPT-5 水準,並首創將思考整合至工具使用中,在開源代理評估中表現領先。",
|
|
359
359
|
"deepseek-coder-33B-instruct.description": "DeepSeek Coder 33B 是一款程式語言模型,訓練於 2T token(87% 程式碼,13% 中英文文本),支援 16K 上下文視窗與中間填充任務,提供專案級程式補全與片段填充功能。",
|
|
360
360
|
"deepseek-coder-v2.description": "DeepSeek Coder V2 是一款開源 MoE 程式模型,在程式任務中表現強勁,媲美 GPT-4 Turbo。",
|
|
361
361
|
"deepseek-coder-v2:236b.description": "DeepSeek Coder V2 是一款開源 MoE 程式模型,在程式任務中表現強勁,媲美 GPT-4 Turbo。",
|
|
@@ -378,7 +378,7 @@
|
|
|
378
378
|
"deepseek-r1-fast-online.description": "DeepSeek R1 快速全量版,支援即時網頁搜尋,結合 671B 規模能力與快速回應。",
|
|
379
379
|
"deepseek-r1-online.description": "DeepSeek R1 全量版擁有 671B 參數與即時網頁搜尋功能,提供更強的理解與生成能力。",
|
|
380
380
|
"deepseek-r1.description": "DeepSeek-R1 在強化學習前使用冷啟動資料,於數學、程式碼與推理任務中表現可媲美 OpenAI-o1。",
|
|
381
|
-
"deepseek-reasoner.description": "DeepSeek V3.2
|
|
381
|
+
"deepseek-reasoner.description": "DeepSeek V3.2 Thinking 是一款深度推理模型,在輸出前先生成思考鏈(chain-of-thought),以提升準確性,在競賽中表現優異,推理能力媲美 Gemini-3.0-Pro。",
|
|
382
382
|
"deepseek-v2.description": "DeepSeek V2 是一款高效的 MoE 模型,適用於具成本效益的處理任務。",
|
|
383
383
|
"deepseek-v2:236b.description": "DeepSeek V2 236B 是 DeepSeek 專注於程式碼生成的模型,具備強大能力。",
|
|
384
384
|
"deepseek-v3-0324.description": "DeepSeek-V3-0324 是一款擁有 671B 參數的 MoE 模型,在程式設計、技術能力、語境理解與長文本處理方面表現出色。",
|
|
@@ -471,7 +471,7 @@
|
|
|
471
471
|
"ernie-tiny-8k.description": "ERNIE Tiny 8K 是一款超輕量模型,適合簡單問答、分類與低成本推理。",
|
|
472
472
|
"ernie-x1-turbo-32k.description": "ERNIE X1 Turbo 32K 是一款快速思考模型,具備 32K 上下文,適合複雜推理與多輪對話。",
|
|
473
473
|
"ernie-x1.1-preview.description": "ERNIE X1.1 預覽版是一款思考模型預覽,用於評估與測試。",
|
|
474
|
-
"fal-ai/bytedance/seedream/v4.description": "Seedream 4.0
|
|
474
|
+
"fal-ai/bytedance/seedream/v4.description": "Seedream 4.0 由字節跳動 Seed 團隊打造,支援文字與圖像輸入,能從提示中生成高品質、可控性強的圖像。",
|
|
475
475
|
"fal-ai/flux-kontext/dev.description": "FLUX.1 模型專注於圖像編輯,支援文字與圖像輸入。",
|
|
476
476
|
"fal-ai/flux-pro/kontext.description": "FLUX.1 Kontext [pro] 接受文字與參考圖像輸入,實現目標區域編輯與複雜場景轉換。",
|
|
477
477
|
"fal-ai/flux/krea.description": "Flux Krea [dev] 是一款圖像生成模型,偏好更真實自然的美學風格。",
|
|
@@ -479,8 +479,8 @@
|
|
|
479
479
|
"fal-ai/hunyuan-image/v3.description": "一款強大的原生多模態圖像生成模型。",
|
|
480
480
|
"fal-ai/imagen4/preview.description": "來自 Google 的高品質圖像生成模型。",
|
|
481
481
|
"fal-ai/nano-banana.description": "Nano Banana 是 Google 最新、最快且最高效的原生多模態模型,支援透過對話進行圖像生成與編輯。",
|
|
482
|
-
"fal-ai/qwen-image-edit.description": "來自 Qwen
|
|
483
|
-
"fal-ai/qwen-image.description": "
|
|
482
|
+
"fal-ai/qwen-image-edit.description": "來自 Qwen 團隊的專業圖像編輯模型,支援語義與外觀編輯、中英文文字精準修改、風格轉換、旋轉等功能。",
|
|
483
|
+
"fal-ai/qwen-image.description": "Qwen 團隊推出的強大圖像生成模型,具備優異的中文文字渲染能力與多樣化視覺風格。",
|
|
484
484
|
"flux-1-schnell.description": "來自黑森林實驗室的 12B 參數文字轉圖像模型,透過潛在對抗擴散蒸餾技術,在 1 至 4 步內生成高品質圖像。其表現媲美封閉式替代方案,並以 Apache-2.0 授權釋出,供個人、研究與商業用途。",
|
|
485
485
|
"flux-dev.description": "FLUX.1 [dev] 是一款開放權重的蒸餾模型,僅限非商業用途。它保有接近專業水準的圖像品質與指令遵循能力,同時運行更高效,資源使用優於同等大小的標準模型。",
|
|
486
486
|
"flux-kontext-max.description": "最先進的語境圖像生成與編輯技術,結合文字與圖像輸入,實現精準且一致的結果。",
|
|
@@ -573,6 +573,25 @@
|
|
|
573
573
|
"glm-z1-flashx.description": "快速且低成本:Flash 增強版,具備超快推理與高併發能力。",
|
|
574
574
|
"glm-zero-preview.description": "GLM-Zero-Preview 具備強大的複雜推理能力,擅長邏輯、數學與程式任務。",
|
|
575
575
|
"global.anthropic.claude-opus-4-5-20251101-v1:0.description": "Claude Opus 4.5 是 Anthropic 的旗艦模型,結合卓越智慧與可擴展效能,適用於需要最高品質回應與推理的複雜任務。",
|
|
576
|
+
"google/gemini-2.0-flash-001.description": "Gemini 2.0 Flash 提供新一代能力,包括極速處理、原生工具使用、多模態生成,以及 100 萬 token 的上下文視窗。",
|
|
577
|
+
"google/gemini-2.0-flash-exp:free.description": "Gemini 2.0 Flash Experimental 是 Google 最新的實驗性多模態 AI 模型,較前代在世界知識、程式碼與長上下文處理方面有明顯提升。",
|
|
578
|
+
"google/gemini-2.0-flash-lite-001.description": "Gemini 2.0 Flash Lite 是輕量版 Gemini,預設關閉思考功能以降低延遲與成本,但可透過參數啟用。",
|
|
579
|
+
"google/gemini-2.0-flash-lite.description": "Gemini 2.0 Flash Lite 提供新一代功能,包括極速處理、內建工具使用、多模態生成,以及 100 萬 token 的上下文視窗。",
|
|
580
|
+
"google/gemini-2.0-flash.description": "Gemini 2.0 Flash 是 Google 的高效能推理模型,適用於延伸多模態任務。",
|
|
581
|
+
"google/gemini-2.5-flash-image-free.description": "Gemini 2.5 Flash Image 免費層,支援有限配額的多模態生成。",
|
|
582
|
+
"google/gemini-2.5-flash-image-preview.description": "Gemini 2.5 Flash 實驗模型,支援圖像生成。",
|
|
583
|
+
"google/gemini-2.5-flash-image.description": "Gemini 2.5 Flash Image(Nano Banana)是 Google 的圖像生成模型,支援多模態對話。",
|
|
584
|
+
"google/gemini-2.5-flash-lite.description": "Gemini 2.5 Flash Lite 是 Gemini 2.5 的輕量版本,針對延遲與成本進行優化,適合高吞吐量場景。",
|
|
585
|
+
"google/gemini-2.5-flash-preview.description": "Gemini 2.5 Flash 是 Google 最先進的旗艦模型,專為高階推理、程式設計、數學與科學任務打造。內建「思考」功能,能提供更高準確度與更細緻的上下文處理。\n\n注意:此模型有兩種變體——思考與非思考。啟用思考功能會產生額外費用。若選擇標準版本(無「:thinking」後綴),模型將避免生成思考 token。\n\n若需使用思考功能並接收思考 token,請選擇「:thinking」變體,將產生較高的輸出費用。\n\nGemini 2.5 Flash 亦可透過「max reasoning tokens」參數進行配置,詳見文件:https://openrouter.ai/docs/use-cases/reasoning-tokens#max-tokens-for-reasoning。",
|
|
586
|
+
"google/gemini-2.5-flash-preview:thinking.description": "Gemini 2.5 Flash 是 Google 最先進的旗艦模型,專為高階推理、程式設計、數學與科學任務打造。內建「思考」功能,能提供更高準確度與更細緻的上下文處理。\n\n注意:此模型有兩種變體——思考與非思考。啟用思考功能會產生額外費用。若選擇標準版本(無「:thinking」後綴),模型將避免生成思考 token。\n\n若需使用思考功能並接收思考 token,請選擇「:thinking」變體,將產生較高的輸出費用。\n\nGemini 2.5 Flash 亦可透過「max reasoning tokens」參數進行配置,詳見文件:https://openrouter.ai/docs/use-cases/reasoning-tokens#max-tokens-for-reasoning。",
|
|
587
|
+
"google/gemini-2.5-flash.description": "Gemini 2.5 Flash(Lite/Pro/Flash)是 Google 的模型家族,涵蓋低延遲至高效能推理應用。",
|
|
588
|
+
"google/gemini-2.5-pro-free.description": "Gemini 2.5 Pro 免費層提供有限配額的多模態長上下文支援,適合試用與輕量工作流程。",
|
|
589
|
+
"google/gemini-2.5-pro-preview.description": "Gemini 2.5 Pro Preview 是 Google 最先進的思考模型,適用於程式碼、數學與 STEM 領域的複雜推理,並能分析大型資料集、程式碼庫與長文件。",
|
|
590
|
+
"google/gemini-2.5-pro.description": "Gemini 2.5 Pro 是 Google 的旗艦推理模型,支援長上下文處理,適用於複雜任務。",
|
|
591
|
+
"google/gemini-3-pro-image-preview-free.description": "Gemini 3 Pro Image 免費層,支援有限配額的多模態生成。",
|
|
592
|
+
"google/gemini-3-pro-image-preview.description": "Gemini 3 Pro Image(Nano Banana Pro)是 Google 的圖像生成模型,支援多模態對話。",
|
|
593
|
+
"google/gemini-3-pro-preview-free.description": "Gemini 3 Pro Preview 免費版具備與標準版相同的多模態理解與推理能力,但有配額與速率限制,適合試用與低頻使用。",
|
|
594
|
+
"google/gemini-3-pro-preview.description": "Gemini 3 Pro 是 Gemini 家族的次世代多模態推理模型,能理解文字、音訊、圖像與影片,處理複雜任務與大型程式碼庫。",
|
|
576
595
|
"meta/Llama-3.2-90B-Vision-Instruct.description": "先進的圖像推理能力,適用於視覺理解代理應用。",
|
|
577
596
|
"meta/Llama-3.3-70B-Instruct.description": "Llama 3.3 是最先進的多語言開源 Llama 模型,以極低成本提供接近 405B 的效能。該模型基於 Transformer 架構,並透過 SFT 與 RLHF 提升實用性與安全性。經指令微調版本針對多語言對話進行最佳化,在業界基準測試中超越多數開放與封閉模型。知識截止時間:2023 年 12 月。",
|
|
578
597
|
"meta/Meta-Llama-3-70B-Instruct.description": "一款功能強大的 70B 參數模型,擅長推理、程式編寫與廣泛語言任務。",
|
|
@@ -92,6 +92,7 @@
|
|
|
92
92
|
"builtins.lobe-local-system.inspector.noResults": "沒有結果",
|
|
93
93
|
"builtins.lobe-local-system.inspector.rename.result": "<old>{{oldName}}</old> → <new>{{newName}}</new>",
|
|
94
94
|
"builtins.lobe-local-system.title": "本機系統",
|
|
95
|
+
"builtins.lobe-notebook.actions.collapse": "收合",
|
|
95
96
|
"builtins.lobe-notebook.actions.copy": "複製",
|
|
96
97
|
"builtins.lobe-notebook.actions.creating": "正在建立文件...",
|
|
97
98
|
"builtins.lobe-notebook.actions.edit": "編輯",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"internlm.description": "一個專注於大型模型研究與工具的開源組織,提供高效、易用的平台,讓尖端模型與演算法更易於取得。",
|
|
30
30
|
"jina.description": "Jina AI 成立於 2020 年,是領先的搜尋 AI 公司。其搜尋技術堆疊包含向量模型、重排序器與小型語言模型,打造可靠且高品質的生成式與多模態搜尋應用。",
|
|
31
31
|
"lmstudio.description": "LM Studio 是一款桌面應用程式,可在本機開發與實驗大型語言模型。",
|
|
32
|
+
"lobehub.description": "LobeHub Cloud 使用官方 API 存取 AI 模型,並以與模型代幣相關的點數來計算使用量。",
|
|
32
33
|
"minimax.description": "MiniMax 成立於 2021 年,致力於打造通用 AI,擁有多模態基礎模型,包括兆級參數的 MoE 文本模型、語音模型與視覺模型,並推出如海螺 AI 等應用。",
|
|
33
34
|
"mistral.description": "Mistral 提供先進的通用、專業與研究模型,支援複雜推理、多語言任務與程式碼生成,並支援函式呼叫以實現自訂整合。",
|
|
34
35
|
"modelscope.description": "ModelScope 是阿里雲的模型即服務平台,提供多樣化的 AI 模型與推理服務。",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"agentCronJobs.maxExecutions": "最大執行次數",
|
|
34
34
|
"agentCronJobs.name": "任務名稱",
|
|
35
35
|
"agentCronJobs.never": "從未",
|
|
36
|
+
"agentCronJobs.noExecutionResults": "沒有執行結果",
|
|
36
37
|
"agentCronJobs.remainingExecutions": "剩餘:{{count}}",
|
|
37
38
|
"agentCronJobs.save": "儲存",
|
|
38
39
|
"agentCronJobs.schedule": "排程",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"agentCronJobs.timeRange": "時間範圍",
|
|
43
44
|
"agentCronJobs.title": "排程任務",
|
|
44
45
|
"agentCronJobs.unlimited": "無限制",
|
|
46
|
+
"agentCronJobs.unnamedTask": "未命名的任務",
|
|
45
47
|
"agentCronJobs.updateSuccess": "排程任務更新成功",
|
|
46
48
|
"agentCronJobs.weekdays": "平日",
|
|
47
49
|
"agentInfoDescription.basic.avatar": "頭像",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/lobehub",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.266",
|
|
4
4
|
"description": "LobeHub - an open-source,comprehensive AI Agent framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Accordion, Flexbox } from '@lobehub/ui';
|
|
2
2
|
import React, { memo } from 'react';
|
|
3
3
|
|
|
4
|
+
import CronTopicList from './Cron';
|
|
4
5
|
import Topic from './Topic';
|
|
5
|
-
import CronTopicList from './Topic/CronTopicList';
|
|
6
6
|
|
|
7
7
|
export enum ChatSidebarKey {
|
|
8
8
|
CronTopics = 'cronTopics',
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { AccordionItem, ActionIcon, Flexbox, Icon, Text } from '@lobehub/ui';
|
|
4
|
+
import { Settings2Icon, TimerIcon, TimerOffIcon } from 'lucide-react';
|
|
5
|
+
import { memo, useCallback } from 'react';
|
|
6
|
+
import { useTranslation } from 'react-i18next';
|
|
7
|
+
import { useParams } from 'react-router-dom';
|
|
8
|
+
|
|
9
|
+
import { useRouter } from '@/app/[variants]/(main)/hooks/useRouter';
|
|
10
|
+
import type { AgentCronJob } from '@/database/schemas/agentCronJob';
|
|
11
|
+
|
|
12
|
+
import CronTopicItem from './CronTopicItem';
|
|
13
|
+
|
|
14
|
+
interface CronTopicGroupProps {
|
|
15
|
+
cronJob: AgentCronJob | null;
|
|
16
|
+
cronJobId: string;
|
|
17
|
+
topics: Array<{
|
|
18
|
+
createdAt: Date | string;
|
|
19
|
+
favorite?: boolean | null;
|
|
20
|
+
historySummary?: string | null;
|
|
21
|
+
id: string;
|
|
22
|
+
metadata?: any;
|
|
23
|
+
title?: string | null;
|
|
24
|
+
trigger?: string | null;
|
|
25
|
+
updatedAt: Date | string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const CronTopicGroup = memo<CronTopicGroupProps>(({ cronJob, cronJobId, topics }) => {
|
|
30
|
+
const { t } = useTranslation('setting');
|
|
31
|
+
const { aid, cronId } = useParams<{ aid?: string; cronId?: string }>();
|
|
32
|
+
const router = useRouter();
|
|
33
|
+
|
|
34
|
+
const handleOpenCronJob = useCallback(() => {
|
|
35
|
+
if (!aid) return;
|
|
36
|
+
router.push(`/agent/${aid}/cron/${cronJobId}`);
|
|
37
|
+
}, [aid, cronJobId, router]);
|
|
38
|
+
|
|
39
|
+
const cronJobName = cronJob?.name || t('agentCronJobs.unnamedTask');
|
|
40
|
+
const isEnabled = cronJob?.enabled ?? false;
|
|
41
|
+
const isActive = cronId === cronJobId;
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<AccordionItem
|
|
45
|
+
action={
|
|
46
|
+
<ActionIcon
|
|
47
|
+
icon={Settings2Icon}
|
|
48
|
+
onClick={handleOpenCronJob}
|
|
49
|
+
size="small"
|
|
50
|
+
title={t('agentCronJobs.editJob')}
|
|
51
|
+
/>
|
|
52
|
+
}
|
|
53
|
+
itemKey={cronJobId}
|
|
54
|
+
paddingBlock={4}
|
|
55
|
+
paddingInline={'8px 4px'}
|
|
56
|
+
title={
|
|
57
|
+
<Flexbox align="center" gap={6} height={24} horizontal style={{ overflow: 'hidden' }}>
|
|
58
|
+
<Icon icon={isEnabled ? TimerIcon : TimerOffIcon} style={{ opacity: 0.5 }} />
|
|
59
|
+
<Text ellipsis style={{ flex: 1 }} type={isActive ? undefined : 'secondary'}>
|
|
60
|
+
{cronJobName}
|
|
61
|
+
</Text>
|
|
62
|
+
{topics.length > 0 && (
|
|
63
|
+
<Text fontSize={11} type="secondary">
|
|
64
|
+
{topics.length}
|
|
65
|
+
</Text>
|
|
66
|
+
)}
|
|
67
|
+
</Flexbox>
|
|
68
|
+
}
|
|
69
|
+
variant={isActive ? 'filled' : 'borderless'}
|
|
70
|
+
>
|
|
71
|
+
<Flexbox gap={1} paddingBlock={1}>
|
|
72
|
+
{topics.length > 0 ? (
|
|
73
|
+
topics.map((topic) => <CronTopicItem key={topic.id} topic={topic} />)
|
|
74
|
+
) : (
|
|
75
|
+
<Text fontSize={12} style={{ padding: '8px 12px' }} type="secondary">
|
|
76
|
+
{t('agentCronJobs.noExecutionResults')}
|
|
77
|
+
</Text>
|
|
78
|
+
)}
|
|
79
|
+
</Flexbox>
|
|
80
|
+
</AccordionItem>
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
export default CronTopicGroup;
|
package/src/app/[variants]/(main)/agent/_layout/Sidebar/{Topic/CronTopicList → Cron}/index.tsx
RENAMED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { ENABLE_BUSINESS_FEATURES } from '@lobechat/business-const';
|
|
4
|
-
import { AccordionItem, ActionIcon, Flexbox,
|
|
5
|
-
import {
|
|
6
|
-
import { Calendar, Plus } from 'lucide-react';
|
|
4
|
+
import { Accordion, AccordionItem, ActionIcon, Flexbox, Text } from '@lobehub/ui';
|
|
5
|
+
import { Plus } from 'lucide-react';
|
|
7
6
|
import { memo, useCallback } from 'react';
|
|
8
7
|
import { useTranslation } from 'react-i18next';
|
|
9
8
|
import urlJoin from 'url-join';
|
|
@@ -11,9 +10,7 @@ import urlJoin from 'url-join';
|
|
|
11
10
|
import NeuralNetworkLoading from '@/components/NeuralNetworkLoading';
|
|
12
11
|
import EmptyNavItem from '@/features/NavPanel/components/EmptyNavItem';
|
|
13
12
|
import SkeletonList from '@/features/NavPanel/components/SkeletonList';
|
|
14
|
-
import { useFetchCronTopicsWithJobInfo } from '@/hooks/useFetchCronTopicsWithJobInfo';
|
|
15
13
|
import { useQueryRoute } from '@/hooks/useQueryRoute';
|
|
16
|
-
import { agentCronJobService } from '@/services/agentCronJob';
|
|
17
14
|
import { useAgentStore } from '@/store/agent';
|
|
18
15
|
|
|
19
16
|
import CronTopicGroup from './CronTopicGroup';
|
|
@@ -25,33 +22,22 @@ interface CronTopicListProps {
|
|
|
25
22
|
const CronTopicList = memo<CronTopicListProps>(({ itemKey }) => {
|
|
26
23
|
const { t } = useTranslation('setting');
|
|
27
24
|
const router = useQueryRoute();
|
|
28
|
-
const agentId = useAgentStore((s) =>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
const [agentId, createAgentCronJob, useFetchCronTopicsWithJobInfo] = useAgentStore((s) => [
|
|
26
|
+
s.activeAgentId,
|
|
27
|
+
s.createAgentCronJob,
|
|
28
|
+
s.useFetchCronTopicsWithJobInfo,
|
|
29
|
+
]);
|
|
30
|
+
const { data: cronTopicsGroupsWithJobInfo = [], isLoading } =
|
|
31
|
+
useFetchCronTopicsWithJobInfo(agentId);
|
|
34
32
|
|
|
35
33
|
const handleCreateCronJob = useCallback(async () => {
|
|
36
34
|
if (!agentId) return;
|
|
37
|
-
try {
|
|
38
|
-
const result = await agentCronJobService.create({
|
|
39
|
-
agentId,
|
|
40
|
-
content: t('agentCronJobs.form.content.placeholder') || 'This is a cron job',
|
|
41
|
-
cronPattern: '*/30 * * * *',
|
|
42
|
-
enabled: true,
|
|
43
|
-
name: t('agentCronJobs.addJob') || 'Cron Job Task',
|
|
44
|
-
});
|
|
45
35
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.error('Failed to create cron job:', error);
|
|
52
|
-
message.error('Failed to create scheduled task');
|
|
36
|
+
const cronJobId = await createAgentCronJob();
|
|
37
|
+
if (cronJobId) {
|
|
38
|
+
router.push(urlJoin('/agent', agentId, 'cron', cronJobId));
|
|
53
39
|
}
|
|
54
|
-
}, [agentId,
|
|
40
|
+
}, [agentId, createAgentCronJob, router]);
|
|
55
41
|
|
|
56
42
|
if (!ENABLE_BUSINESS_FEATURES) return null;
|
|
57
43
|
|
|
@@ -74,7 +60,6 @@ const CronTopicList = memo<CronTopicListProps>(({ itemKey }) => {
|
|
|
74
60
|
paddingInline={'8px 4px'}
|
|
75
61
|
title={
|
|
76
62
|
<Flexbox align="center" gap={4} horizontal>
|
|
77
|
-
<Icon icon={Calendar} size={12} />
|
|
78
63
|
<Text ellipsis fontSize={12} type={'secondary'} weight={500}>
|
|
79
64
|
{t('agentCronJobs.title')}
|
|
80
65
|
</Text>
|
|
@@ -96,7 +81,6 @@ const CronTopicList = memo<CronTopicListProps>(({ itemKey }) => {
|
|
|
96
81
|
paddingInline={'8px 4px'}
|
|
97
82
|
title={
|
|
98
83
|
<Flexbox align="center" gap={4} horizontal>
|
|
99
|
-
<Icon icon={Calendar} size={12} />
|
|
100
84
|
<Text ellipsis fontSize={12} type={'secondary'} weight={500}>
|
|
101
85
|
{t('agentCronJobs.title')}
|
|
102
86
|
</Text>
|
|
@@ -108,6 +92,8 @@ const CronTopicList = memo<CronTopicListProps>(({ itemKey }) => {
|
|
|
108
92
|
);
|
|
109
93
|
}
|
|
110
94
|
|
|
95
|
+
const totalCronJobs = cronTopicsGroupsWithJobInfo.length;
|
|
96
|
+
|
|
111
97
|
return (
|
|
112
98
|
<AccordionItem
|
|
113
99
|
action={addAction}
|
|
@@ -116,14 +102,18 @@ const CronTopicList = memo<CronTopicListProps>(({ itemKey }) => {
|
|
|
116
102
|
paddingInline={'8px 4px'}
|
|
117
103
|
title={
|
|
118
104
|
<Flexbox align="center" gap={4} horizontal>
|
|
119
|
-
<Icon icon={Calendar} size={12} />
|
|
120
105
|
<Text ellipsis fontSize={12} type={'secondary'} weight={500}>
|
|
121
|
-
{
|
|
106
|
+
{t('agentCronJobs.title')}
|
|
122
107
|
</Text>
|
|
108
|
+
{totalCronJobs > 0 && (
|
|
109
|
+
<Text fontSize={11} type="secondary">
|
|
110
|
+
{totalCronJobs}
|
|
111
|
+
</Text>
|
|
112
|
+
)}
|
|
123
113
|
</Flexbox>
|
|
124
114
|
}
|
|
125
115
|
>
|
|
126
|
-
<
|
|
116
|
+
<Accordion defaultExpandedKeys={cronTopicsGroupsWithJobInfo.map((g) => g.cronJobId)} gap={2}>
|
|
127
117
|
{cronTopicsGroupsWithJobInfo.map((group) => (
|
|
128
118
|
<CronTopicGroup
|
|
129
119
|
cronJob={group.cronJob}
|
|
@@ -132,7 +122,7 @@ const CronTopicList = memo<CronTopicListProps>(({ itemKey }) => {
|
|
|
132
122
|
topics={group.topics}
|
|
133
123
|
/>
|
|
134
124
|
))}
|
|
135
|
-
</
|
|
125
|
+
</Accordion>
|
|
136
126
|
</AccordionItem>
|
|
137
127
|
);
|
|
138
128
|
});
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { InputRef } from 'antd';
|
|
3
|
-
import { memo, useCallback, useEffect, useRef, useState } from 'react';
|
|
1
|
+
import { memo, useCallback } from 'react';
|
|
4
2
|
|
|
3
|
+
import InlineRename from '@/components/InlineRename';
|
|
5
4
|
import { useChatStore } from '@/store/chat';
|
|
6
5
|
|
|
7
6
|
interface EditingProps {
|
|
@@ -10,27 +9,14 @@ interface EditingProps {
|
|
|
10
9
|
toggleEditing: (visible?: boolean) => void;
|
|
11
10
|
}
|
|
12
11
|
|
|
13
|
-
function FocusableInput({ ...props }: InputProps) {
|
|
14
|
-
const ref = useRef<InputRef>(null);
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
queueMicrotask(() => {
|
|
17
|
-
if (ref.current) {
|
|
18
|
-
ref.current.input?.focus();
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
}, []);
|
|
22
|
-
return <Input {...props} ref={ref} />;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
12
|
const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
|
|
26
|
-
const [newTitle, setNewTitle] = useState(title);
|
|
27
13
|
const [editing, updateTopicTitle] = useChatStore((s) => [
|
|
28
14
|
s.topicRenamingId === id,
|
|
29
15
|
s.updateTopicTitle,
|
|
30
16
|
]);
|
|
31
17
|
|
|
32
|
-
const
|
|
33
|
-
|
|
18
|
+
const handleSave = useCallback(
|
|
19
|
+
async (newTitle: string) => {
|
|
34
20
|
try {
|
|
35
21
|
// Set loading state
|
|
36
22
|
useChatStore.setState(
|
|
@@ -53,40 +39,17 @@ const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
|
|
|
53
39
|
'clearTopicUpdating',
|
|
54
40
|
);
|
|
55
41
|
}
|
|
56
|
-
}
|
|
57
|
-
|
|
42
|
+
},
|
|
43
|
+
[id, updateTopicTitle],
|
|
44
|
+
);
|
|
58
45
|
|
|
59
46
|
return (
|
|
60
|
-
<
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
defaultValue={title}
|
|
64
|
-
onBlur={handleUpdate}
|
|
65
|
-
onChange={(e) => setNewTitle(e.target.value)}
|
|
66
|
-
onClick={(e) => e.stopPropagation()}
|
|
67
|
-
onPressEnter={() => {
|
|
68
|
-
handleUpdate();
|
|
69
|
-
toggleEditing(false);
|
|
70
|
-
}}
|
|
71
|
-
/>
|
|
72
|
-
}
|
|
73
|
-
onOpenChange={(open) => {
|
|
74
|
-
if (!open) handleUpdate();
|
|
75
|
-
|
|
76
|
-
toggleEditing(open);
|
|
77
|
-
}}
|
|
47
|
+
<InlineRename
|
|
48
|
+
onOpenChange={(open) => toggleEditing(open)}
|
|
49
|
+
onSave={handleSave}
|
|
78
50
|
open={editing}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
content: {
|
|
82
|
-
padding: 4,
|
|
83
|
-
width: 320,
|
|
84
|
-
},
|
|
85
|
-
}}
|
|
86
|
-
trigger="click"
|
|
87
|
-
>
|
|
88
|
-
<div />
|
|
89
|
-
</Popover>
|
|
51
|
+
title={title}
|
|
52
|
+
/>
|
|
90
53
|
);
|
|
91
54
|
});
|
|
92
55
|
|
|
@@ -18,6 +18,8 @@ import AllTopicsDrawer from '../AllTopicsDrawer';
|
|
|
18
18
|
import ByTimeMode from '../TopicListContent/ByTimeMode';
|
|
19
19
|
import FlatMode from '../TopicListContent/FlatMode';
|
|
20
20
|
|
|
21
|
+
const fetchParams = { excludeTriggers: ['cron'] };
|
|
22
|
+
|
|
21
23
|
const TopicList = memo(() => {
|
|
22
24
|
const { t } = useTranslation('topic');
|
|
23
25
|
const router = useQueryRoute();
|
|
@@ -32,7 +34,7 @@ const TopicList = memo(() => {
|
|
|
32
34
|
|
|
33
35
|
const [topicDisplayMode] = useUserStore((s) => [preferenceSelectors.topicDisplayMode(s)]);
|
|
34
36
|
|
|
35
|
-
useFetchTopics(
|
|
37
|
+
useFetchTopics(fetchParams);
|
|
36
38
|
|
|
37
39
|
// Show skeleton when current session's topic data is not yet loaded
|
|
38
40
|
if (isUndefinedTopics) return <SkeletonList />;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { memo, useCallback, useState } from 'react';
|
|
1
|
+
import { memo, useCallback } from 'react';
|
|
3
2
|
|
|
3
|
+
import InlineRename from '@/components/InlineRename';
|
|
4
4
|
import { useChatStore } from '@/store/chat';
|
|
5
5
|
|
|
6
6
|
interface EditingProps {
|
|
@@ -10,53 +10,25 @@ interface EditingProps {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
const Editing = memo<EditingProps>(({ id, title, toggleEditing }) => {
|
|
13
|
-
const [newTitle, setNewTitle] = useState(title);
|
|
14
13
|
const [editing, updateThreadTitle] = useChatStore((s) => [
|
|
15
14
|
s.threadRenamingId === id,
|
|
16
15
|
s.updateThreadTitle,
|
|
17
16
|
]);
|
|
18
17
|
|
|
19
|
-
const
|
|
20
|
-
|
|
18
|
+
const handleSave = useCallback(
|
|
19
|
+
async (newTitle: string) => {
|
|
21
20
|
await updateThreadTitle(id, newTitle);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
},
|
|
22
|
+
[id, updateThreadTitle],
|
|
23
|
+
);
|
|
25
24
|
|
|
26
25
|
return (
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
autoFocus
|
|
31
|
-
defaultValue={title}
|
|
32
|
-
onBlur={() => {
|
|
33
|
-
handleUpdate();
|
|
34
|
-
toggleEditing(false);
|
|
35
|
-
}}
|
|
36
|
-
onChange={(e) => setNewTitle(e.target.value)}
|
|
37
|
-
onClick={(e) => e.stopPropagation()}
|
|
38
|
-
onPressEnter={() => {
|
|
39
|
-
handleUpdate();
|
|
40
|
-
toggleEditing(false);
|
|
41
|
-
}}
|
|
42
|
-
/>
|
|
43
|
-
}
|
|
44
|
-
onOpenChange={(open) => {
|
|
45
|
-
if (!open) handleUpdate();
|
|
46
|
-
toggleEditing(open);
|
|
47
|
-
}}
|
|
26
|
+
<InlineRename
|
|
27
|
+
onOpenChange={(open) => toggleEditing(open)}
|
|
28
|
+
onSave={handleSave}
|
|
48
29
|
open={editing}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
content: {
|
|
52
|
-
padding: 4,
|
|
53
|
-
width: 320,
|
|
54
|
-
},
|
|
55
|
-
}}
|
|
56
|
-
trigger="click"
|
|
57
|
-
>
|
|
58
|
-
<div />
|
|
59
|
-
</Popover>
|
|
30
|
+
title={title}
|
|
31
|
+
/>
|
|
60
32
|
);
|
|
61
33
|
});
|
|
62
34
|
|
|
@@ -32,7 +32,11 @@ export const useTopicNavigation = () => {
|
|
|
32
32
|
(topicId?: string) => {
|
|
33
33
|
// If in agent sub-route, navigate back to agent chat first
|
|
34
34
|
if (isInAgentSubRoute() && activeAgentId) {
|
|
35
|
-
|
|
35
|
+
const basePath = urlJoin('/agent', activeAgentId as string);
|
|
36
|
+
// Include topicId in URL when navigating from sub-route
|
|
37
|
+
router.push(topicId ? `${basePath}?topic=${topicId}` : basePath);
|
|
38
|
+
toggleConfig(false);
|
|
39
|
+
return;
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
switchTopic(topicId);
|
|
@@ -99,7 +99,7 @@ const CronJobCards = memo<CronJobCardsProps>(({ cronJobs, loading, onDelete, onE
|
|
|
99
99
|
whiteSpace: 'nowrap',
|
|
100
100
|
}}
|
|
101
101
|
>
|
|
102
|
-
{job.name || '
|
|
102
|
+
{job.name || t('agentCronJobs.unnamedTask')}
|
|
103
103
|
</span>
|
|
104
104
|
<Badge status={statusInfo.status} />
|
|
105
105
|
</Flexbox>
|
|
@@ -96,7 +96,7 @@ const CronJobForm = memo<CronJobFormProps>(({ editingJob, formRef, onSubmit }) =
|
|
|
96
96
|
const data: CronJobFormData = {
|
|
97
97
|
content: values.content,
|
|
98
98
|
cronPattern: values.cronPattern,
|
|
99
|
-
enabled:
|
|
99
|
+
enabled: false,
|
|
100
100
|
executionConditions: Object.keys(executionConditions).length > 0 ? executionConditions : null,
|
|
101
101
|
maxExecutions: values.maxExecutions || null,
|
|
102
102
|
name: values.name,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { Button, Flexbox, Modal } from '@lobehub/ui';
|
|
4
|
+
import { Divider } from 'antd';
|
|
4
5
|
import { createStaticStyles } from 'antd-style';
|
|
5
6
|
import { memo, useEffect, useMemo, useState } from 'react';
|
|
6
7
|
import { useTranslation } from 'react-i18next';
|
|
@@ -19,6 +20,7 @@ const styles = createStaticStyles(({ css, cssVar }) => ({
|
|
|
19
20
|
flex-direction: row;
|
|
20
21
|
|
|
21
22
|
height: 500px;
|
|
23
|
+
padding: 12px;
|
|
22
24
|
border: 1px solid ${cssVar.colorBorderSecondary};
|
|
23
25
|
border-radius: ${cssVar.borderRadius}px;
|
|
24
26
|
`,
|
|
@@ -104,10 +106,12 @@ const AddGroupMemberModal = memo<AddGroupMemberModalProps>(
|
|
|
104
106
|
title={t('memberSelection.addMember')}
|
|
105
107
|
width={800}
|
|
106
108
|
>
|
|
107
|
-
<Flexbox className={styles.container} horizontal>
|
|
109
|
+
<Flexbox className={styles.container} gap={8} horizontal>
|
|
108
110
|
{/* Left Column - Available Agents */}
|
|
109
111
|
<AvailableAgentList agents={availableAgents} isLoading={isLoadingAgents} />
|
|
110
112
|
|
|
113
|
+
<Divider orientation={'vertical'} style={{ height: '100%' }} />
|
|
114
|
+
|
|
111
115
|
{/* Right Column - Selected Agents */}
|
|
112
116
|
<SelectedAgentList agents={allAgents} />
|
|
113
117
|
</Flexbox>
|