From 1cfbc878bd1c39caf650ebbea38e8065d2b2a1b6 Mon Sep 17 00:00:00 2001 From: sxjeru Date: Thu, 16 Oct 2025 21:50:32 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=92=84=20style:=20Add=20Claude=20Haik?= =?UTF-8?q?u=204.5=20model=20(#9735)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 添加 Claude Haiku 4.5 模型及其相关配置 * fix: 修复模型 ID 格式并移除 Llama 4 Maverick 模型 * 添加 doubao-seed-1.6-lite;更新模型价格区间格式,调整价格单位为百万 tokens * fix: Invalid combination of reasoning_effort and thinking type: low + disabled * feat: 添加 Qwen3 VL Flash 和 Qwen3 Coder 30B A3B 模型,更新定价和发布信息 --- packages/const/src/models.ts | 2 + packages/model-bank/src/aiModels/aihubmix.ts | 34 ++ packages/model-bank/src/aiModels/anthropic.ts | 34 ++ packages/model-bank/src/aiModels/cerebras.ts | 17 - .../model-bank/src/aiModels/ollamacloud.ts | 2 +- packages/model-bank/src/aiModels/qwen.ts | 321 ++++++++++++++---- .../model-bank/src/aiModels/volcengine.ts | 107 ++++-- packages/model-bank/src/aiModels/zhipu.ts | 94 ++--- .../src/core/parameterResolver.ts | 1 + 9 files changed, 451 insertions(+), 161 deletions(-) diff --git a/packages/const/src/models.ts b/packages/const/src/models.ts index 3ba32f47e01..504516a9a2a 100644 --- a/packages/const/src/models.ts +++ b/packages/const/src/models.ts @@ -41,6 +41,7 @@ export const responsesAPIModels = new Set([ * models support context caching */ export const contextCachingModels = new Set([ + 'claude-haiku-4-5-20251001', 'claude-sonnet-4-5-latest', 'claude-sonnet-4-5-20250929', 'anthropic/claude-sonnet-4.5', @@ -64,6 +65,7 @@ export const thinkingWithToolClaudeModels = new Set([ 'claude-sonnet-4-20250514', 'claude-sonnet-4-5-latest', 'claude-sonnet-4-5-20250929', + 'claude-haiku-4-5-20251001', 'anthropic/claude-sonnet-4.5', 'claude-3-7-sonnet-latest', 'claude-3-7-sonnet-20250219', diff --git a/packages/model-bank/src/aiModels/aihubmix.ts b/packages/model-bank/src/aiModels/aihubmix.ts index f28fc6a0c3c..1a5107c6d6a 100644 --- a/packages/model-bank/src/aiModels/aihubmix.ts +++ b/packages/model-bank/src/aiModels/aihubmix.ts @@ -654,6 +654,40 @@ const aihubmixModels: AIChatModelCard[] = [ }, type: 'chat', }, + { + abilities: { + functionCall: true, + reasoning: true, + search: true, + structuredOutput: true, + vision: true, + }, + contextWindowTokens: 200_000, + description: 'Claude Haiku 4.5 是 Anthropic 最快且最智能的 Haiku 模型,具有闪电般的速度和扩展思考能力。', + displayName: 'Claude Haiku 4.5', + enabled: true, + id: 'claude-haiku-4-5-20251001', + maxOutput: 64_000, + pricing: { + units: [ + { name: 'textInput', rate: 1, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textOutput', rate: 5, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textInput_cacheRead', rate: 0.1, strategy: 'fixed', unit: 'millionTokens' }, + { + lookup: { prices: { '1h': 2, '5m': 1.25 }, pricingParams: ['ttl'] }, + name: 'textInput_cacheWrite', + strategy: 'lookup', + unit: 'millionTokens', + }, + ], + }, + releasedAt: '2025-10-16', + settings: { + extendParams: ['disableContextCaching', 'enableReasoning', 'reasoningBudgetToken'], + searchImpl: 'params', + }, + type: 'chat', + }, { abilities: { functionCall: true, diff --git a/packages/model-bank/src/aiModels/anthropic.ts b/packages/model-bank/src/aiModels/anthropic.ts index 3965e2bdf21..4ce70d59e41 100644 --- a/packages/model-bank/src/aiModels/anthropic.ts +++ b/packages/model-bank/src/aiModels/anthropic.ts @@ -30,6 +30,40 @@ const anthropicChatModels: AIChatModelCard[] = [ }, type: 'chat', }, + { + abilities: { + functionCall: true, + reasoning: true, + search: true, + structuredOutput: true, + vision: true, + }, + contextWindowTokens: 200_000, + description: 'Claude Haiku 4.5 是 Anthropic 最快且最智能的 Haiku 模型,具有闪电般的速度和扩展思考能力。', + displayName: 'Claude Haiku 4.5', + enabled: true, + id: 'claude-haiku-4-5-20251001', + maxOutput: 64_000, + pricing: { + units: [ + { name: 'textInput', rate: 1, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textOutput', rate: 5, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textInput_cacheRead', rate: 0.1, strategy: 'fixed', unit: 'millionTokens' }, + { + lookup: { prices: { '1h': 2, '5m': 1.25 }, pricingParams: ['ttl'] }, + name: 'textInput_cacheWrite', + strategy: 'lookup', + unit: 'millionTokens', + }, + ], + }, + releasedAt: '2025-10-16', + settings: { + extendParams: ['disableContextCaching', 'enableReasoning', 'reasoningBudgetToken'], + searchImpl: 'params', + }, + type: 'chat', + }, { abilities: { functionCall: true, diff --git a/packages/model-bank/src/aiModels/cerebras.ts b/packages/model-bank/src/aiModels/cerebras.ts index f43841b81af..fc66067c05f 100644 --- a/packages/model-bank/src/aiModels/cerebras.ts +++ b/packages/model-bank/src/aiModels/cerebras.ts @@ -17,23 +17,6 @@ const cerebrasModels: AIChatModelCard[] = [ }, type: 'chat', }, - { - abilities: { - functionCall: true, - }, - contextWindowTokens: 32_768, - description: - 'Llama 4 Maverick:高性能的 Llama 系列模型,适合高级推理、复杂问题解决和指令跟随任务。', - displayName: 'Llama 4 Maverick', - id: 'llama-4-maverick-17b-128e-instruct', - pricing: { - units: [ - { name: 'textInput', rate: 0.2, strategy: 'fixed', unit: 'millionTokens' }, - { name: 'textOutput', rate: 0.6, strategy: 'fixed', unit: 'millionTokens' }, - ], - }, - type: 'chat', - }, { abilities: { functionCall: true, diff --git a/packages/model-bank/src/aiModels/ollamacloud.ts b/packages/model-bank/src/aiModels/ollamacloud.ts index 95ea69741ad..7e0a38ec792 100644 --- a/packages/model-bank/src/aiModels/ollamacloud.ts +++ b/packages/model-bank/src/aiModels/ollamacloud.ts @@ -11,7 +11,7 @@ const ollamaCloudModels: AIChatModelCard[] = [ '智谱最新旗舰模型 GLM-4.6 (355B) 在高级编码、长文本处理、推理与智能体能力上全面超越前代,尤其在编程能力上对齐 Claude Sonnet 4,成为国内顶尖的 Coding 模型。', displayName: 'GLM-4.6', enabled: true, - id: 'glm4.6:355b', + id: 'glm-4.6', type: 'chat', }, { diff --git a/packages/model-bank/src/aiModels/qwen.ts b/packages/model-bank/src/aiModels/qwen.ts index aae977ca1d5..8eb24166612 100644 --- a/packages/model-bank/src/aiModels/qwen.ts +++ b/packages/model-bank/src/aiModels/qwen.ts @@ -5,8 +5,8 @@ import { AIChatModelCard, AIImageModelCard } from '../types/aiModel'; const qwenChatModels: AIChatModelCard[] = [ { abilities: { - vision: true, reasoning: true, + vision: true, }, config: { deploymentName: 'qwen3-vl-plus', @@ -24,9 +24,9 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 1, - '[32_000, 128_000]': 1.5, - '[128_000, infinity]': 3, + '[0, 0.032]': 1, + '[0.032, 0.128]': 1.5, + '[0.128, infinity]': 3, }, pricingParams: ['textInputRange'], }, @@ -37,9 +37,9 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 10, - '[32_000, 128_000]': 15, - '[128_000, infinity]': 30, + '[0, 0.032]': 10, + '[0.032, 0.128]': 15, + '[0.128, infinity]': 30, }, pricingParams: ['textInputRange'], }, @@ -55,12 +55,64 @@ const qwenChatModels: AIChatModelCard[] = [ }, type: 'chat', }, + { + abilities: { + reasoning: true, + vision: true, + }, + config: { + deploymentName: 'qwen3-vl-flash-2025-10-15', + }, + contextWindowTokens: 262_144, + description: 'Qwen3 VL Flash:轻量化高速推理版本,适合对延迟敏感或大批量请求场景。', + displayName: 'Qwen3 VL Flash', + id: 'qwen3-vl-flash', + maxOutput: 32_768, + organization: 'Qwen', + pricing: { + currency: 'CNY', + units: [ + { + lookup: { + prices: { + '[0, 0.032]': 0.15, + '[0.032, 0.128]': 0.3, + '[0.128, 0.256]': 0.6, + }, + pricingParams: ['textInputRange'], + }, + name: 'textInput', + strategy: 'lookup', + unit: 'millionTokens', + }, + { + lookup: { + prices: { + '[0, 0.032]': 1.5, + '[0.032, 0.128]': 3, + '[0.128, 0.256]': 6, + }, + pricingParams: ['textInputRange'], + }, + name: 'textOutput', + strategy: 'lookup', + unit: 'millionTokens', + }, + ], + }, + releasedAt: '2025-10-15', + settings: { + extendParams: ['enableReasoning', 'reasoningBudgetToken'], + }, + type: 'chat', + }, { abilities: { reasoning: true, }, contextWindowTokens: 131_072, - description: 'deepseek-v3.2-exp 引入稀疏注意力机制,旨在提升处理长文本时的训练与推理效率,价格低于 deepseek-v3.1。', + description: + 'deepseek-v3.2-exp 引入稀疏注意力机制,旨在提升处理长文本时的训练与推理效率,价格低于 deepseek-v3.1。', displayName: 'DeepSeek V3.2 Exp', id: 'deepseek-v3.2-exp', maxOutput: 65_536, @@ -136,8 +188,8 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 3, - '[32_000, infinity]': 4, + '[0, 0.032]': 3, + '[0.032, infinity]': 4, }, pricingParams: ['textInputRange'], }, @@ -148,8 +200,8 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 14, - '[32_000, infinity]': 16, + '[0, 0.032]': 14, + '[0.032, infinity]': 16, }, pricingParams: ['textInputRange'], }, @@ -179,8 +231,8 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.8, - '[32_000, infinity]': 1.2, + '[0, 0.032]': 0.8, + '[0.032, infinity]': 1.2, }, pricingParams: ['textInputRange'], }, @@ -191,8 +243,8 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 6, - '[32_000, infinity]': 8, + '[0, 0.032]': 6, + '[0.032, infinity]': 8, }, pricingParams: ['textInputRange'], }, @@ -212,7 +264,7 @@ const qwenChatModels: AIChatModelCard[] = [ functionCall: true, }, config: { - deploymentName: 'qwen3-coder-plus', // 其支持上下文缓存 + deploymentName: 'qwen3-coder-plus', // 支持上下文缓存 }, contextWindowTokens: 1_000_000, description: @@ -227,10 +279,10 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.8, - '[32_000, 128_000]': 1.2, - '[128_000, 256_000]': 2, - '[256_000, infinity]': 4, + '[0, 0.032]': 4 * 0.2, + '[0.032, 0.128]': 6 * 0.2, + '[0.128, 0.256]': 10 * 0.2, + '[0.256, infinity]': 20 * 0.2, }, pricingParams: ['textInputRange'], }, @@ -241,10 +293,10 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 4, - '[32_000, 128_000]': 6, - '[128_000, 256_000]': 10, - '[256_000, infinity]': 20, + '[0, 0.032]': 4, + '[0.032, 0.128]': 6, + '[0.128, 0.256]': 10, + '[0.256, infinity]': 20, }, pricingParams: ['textInputRange'], }, @@ -255,10 +307,10 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 16, - '[32_000, 128_000]': 24, - '[128_000, 256_000]': 40, - '[256_000, infinity]': 200, + '[0, 0.032]': 16, + '[0.032, 0.128]': 24, + '[0.128, 0.256]': 40, + '[0.256, infinity]': 200, }, pricingParams: ['textInputRange'], }, @@ -268,7 +320,6 @@ const qwenChatModels: AIChatModelCard[] = [ }, ], }, - releasedAt: '2025-07-22', type: 'chat', }, { @@ -276,7 +327,7 @@ const qwenChatModels: AIChatModelCard[] = [ functionCall: true, }, config: { - deploymentName: 'qwen3-coder-flash', + deploymentName: 'qwen3-coder-flash', // 支持上下文缓存 }, contextWindowTokens: 1_000_000, description: @@ -288,12 +339,50 @@ const qwenChatModels: AIChatModelCard[] = [ pricing: { currency: 'CNY', units: [ - { name: 'textInput_cacheRead', rate: 1.5 * 0.2, strategy: 'fixed', unit: 'millionTokens' }, // tokens 32K ~ 128K - { name: 'textInput', rate: 1.5, strategy: 'fixed', unit: 'millionTokens' }, - { name: 'textOutput', rate: 6, strategy: 'fixed', unit: 'millionTokens' }, + { + lookup: { + prices: { + '[0, 0.032]': 0.2, + '[0.032, 0.128]': 0.3, + '[0.128, 0.256]': 0.5, + '[0.256, 1]': 1, + }, + pricingParams: ['textInputRange'], + }, + name: 'textInput_cacheRead', + strategy: 'lookup', + unit: 'millionTokens', + }, + { + lookup: { + prices: { + '[0, 0.032]': 1, + '[0.032, 0.128]': 1.5, + '[0.128, 0.256]': 2.5, + '[0.256, 1]': 5, + }, + pricingParams: ['textInputRange'], + }, + name: 'textInput', + strategy: 'lookup', + unit: 'millionTokens', + }, + { + lookup: { + prices: { + '[0, 0.032]': 4, + '[0.032, 0.128]': 6, + '[0.128, 0.256]': 10, + '[0.256, 1]': 25, + }, + pricingParams: ['textInputRange'], + }, + name: 'textOutput', + strategy: 'lookup', + unit: 'millionTokens', + }, ], }, - releasedAt: '2025-07-28', type: 'chat', }, { @@ -310,8 +399,76 @@ const qwenChatModels: AIChatModelCard[] = [ pricing: { currency: 'CNY', units: [ - { name: 'textInput', rate: 9, strategy: 'fixed', unit: 'millionTokens' }, - { name: 'textOutput', rate: 36, strategy: 'fixed', unit: 'millionTokens' }, + { + lookup: { + prices: { + '[0, 0.032]': 6, + '[0.032, 0.128]': 9, + '[0.128, 0.2]': 15, + }, + pricingParams: ['textInputRange'], + }, + name: 'textInput', + strategy: 'lookup', + unit: 'millionTokens', + }, + { + lookup: { + prices: { + '[0, 0.032]': 24, + '[0.032, 0.128]': 36, + '[0.128, 0.2]': 60, + }, + pricingParams: ['textInputRange'], + }, + name: 'textOutput', + strategy: 'lookup', + unit: 'millionTokens', + }, + ], + }, + type: 'chat', + }, + { + abilities: { + functionCall: true, + }, + contextWindowTokens: 262_144, + description: + '通义千问代码模型开源版。最新的 qwen3-coder-30b-a3b-instruct 是基于 Qwen3 的代码生成模型,具有强大的Coding Agent能力,擅长工具调用和环境交互,能够实现自主编程、代码能力卓越的同时兼具通用能力。', + displayName: 'Qwen3 Coder 30B A3B', + id: 'qwen3-coder-30b-a3b-instruct', + maxOutput: 65_536, + organization: 'Qwen', + pricing: { + currency: 'CNY', + units: [ + { + lookup: { + prices: { + '[0, 0.032]': 1.5, + '[0.032, 0.128]': 2.25, + '[0.128, 0.2]': 3.75, + }, + pricingParams: ['textInputRange'], + }, + name: 'textInput', + strategy: 'lookup', + unit: 'millionTokens', + }, + { + lookup: { + prices: { + '[0, 0.032]': 6, + '[0.032, 0.128]': 9, + '[0.128, 0.2]': 15, + }, + pricingParams: ['textInputRange'], + }, + name: 'textOutput', + strategy: 'lookup', + unit: 'millionTokens', + }, ], }, type: 'chat', @@ -426,7 +583,7 @@ const qwenChatModels: AIChatModelCard[] = [ currency: 'CNY', units: [ { name: 'textInput', rate: 1, strategy: 'fixed', unit: 'millionTokens' }, - { name: 'textOutput', rate: 4, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textOutput', rate: 10, strategy: 'fixed', unit: 'millionTokens' }, ], }, releasedAt: '2025-09-12', @@ -450,7 +607,7 @@ const qwenChatModels: AIChatModelCard[] = [ currency: 'CNY', units: [ { name: 'textInput', rate: 1, strategy: 'fixed', unit: 'millionTokens' }, - { name: 'textOutput', rate: 10, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textOutput', rate: 4, strategy: 'fixed', unit: 'millionTokens' }, ], }, releasedAt: '2025-09-12', @@ -663,7 +820,7 @@ const qwenChatModels: AIChatModelCard[] = [ search: true, }, config: { - deploymentName: 'qwq-plus-latest', // expired on 2025-09-02 + deploymentName: 'qwq-plus-2025-03-05', }, contextWindowTokens: 131_072, description: @@ -679,7 +836,7 @@ const qwenChatModels: AIChatModelCard[] = [ { name: 'textOutput', rate: 4, strategy: 'fixed', unit: 'millionTokens' }, ], }, - releasedAt: '2025-03-06', + releasedAt: '2025-03-05', settings: { searchImpl: 'params', }, @@ -796,9 +953,9 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 128_000]': 0.8 * 0.2, - '[128_000, 256_000]': 2.4 * 0.2, - '[256_000, infinity]': 4.8 * 0.2, + '[0, 0.128]': 0.8 * 0.2, + '[0.128, 0.256]': 2.4 * 0.2, + '[0.256, infinity]': 4.8 * 0.2, }, pricingParams: ['textInputRange'], }, @@ -809,9 +966,9 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 128_000]': 0.8, - '[128_000, 256_000]': 2.4, - '[256_000, infinity]': 4.8, + '[0, 0.128]': 0.8, + '[0.128, 0.256]': 2.4, + '[0.256, infinity]': 4.8, }, pricingParams: ['textInputRange'], }, @@ -822,12 +979,12 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 128_000]_[false]': 2, - '[0, 128_000]_[true]': 8, - '[128_000, 256_000]_[false]': 20, - '[128_000, 256_000]_[true]': 24, - '[256_000, infinity]_[false]': 48, - '[256_000, infinity]_[true]': 64, + '[0, 0.128]_[false]': 2, + '[0, 0.128]_[true]': 8, + '[0.128, 0.256]_[false]': 20, + '[0.128, 0.256]_[true]': 24, + '[0.256, infinity]_[false]': 48, + '[0.256, infinity]_[true]': 64, }, pricingParams: ['textInputRange', 'thinkingMode'], }, @@ -837,7 +994,6 @@ const qwenChatModels: AIChatModelCard[] = [ }, ], }, - releasedAt: '2025-07-14', settings: { extendParams: ['enableReasoning', 'reasoningBudgetToken'], searchImpl: 'params', @@ -866,9 +1022,9 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 6 * 0.2, - '[32_000, 128_000]': 10 * 0.2, - '[128_000, infinity]': 15 * 0.2, + '[0, 0.032]': 6 * 0.2, + '[0.032, 0.128]': 10 * 0.2, + '[0.128, infinity]': 15 * 0.2, }, pricingParams: ['textInputRange'], }, @@ -879,9 +1035,9 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 6, - '[32_000, 128_000]': 10, - '[128_000, infinity]': 15, + '[0, 0.032]': 6, + '[0.032, 0.128]': 10, + '[0.128, infinity]': 15, }, pricingParams: ['textInputRange'], }, @@ -892,9 +1048,9 @@ const qwenChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 24, - '[32_000, 128_000]': 40, - '[128_000, infinity]': 60, + '[0, 0.032]': 24, + '[0.032, 0.128]': 40, + '[0.128, infinity]': 60, }, pricingParams: ['textInputRange'], }, @@ -966,7 +1122,34 @@ const qwenChatModels: AIChatModelCard[] = [ vision: true, }, config: { - deploymentName: 'qwen-omni-turbo-latest', // expired on 2025-08-13 + deploymentName: 'qwen3-omni-flash-2025-09-15', + }, + contextWindowTokens: 65_536, + description: + 'Qwen-Omni 模型能够接收文本、图片、音频、视频等多种模态的组合输入,并生成文本或语音形式的回复, 提供多种拟人音色,支持多语言和方言的语音输出,可应用于文本创作、视觉识别、语音助手等场景。', + displayName: 'Qwen Omni Turbo', + id: 'qwen3-omni-flash', + maxOutput: 16_384, + organization: 'Qwen', + pricing: { + currency: 'CNY', + units: [ + { name: 'textInput', rate: 1.8, strategy: 'fixed', unit: 'millionTokens' }, + { name: 'textOutput', rate: 6.9, strategy: 'fixed', unit: 'millionTokens' }, + ], + }, + releasedAt: '2025-09-15', + settings: { + extendParams: ['enableReasoning', 'reasoningBudgetToken'], + }, + type: 'chat', + }, + { + abilities: { + vision: true, + }, + config: { + deploymentName: 'qwen-omni-turbo-2025-03-26', }, contextWindowTokens: 32_768, description: @@ -1202,7 +1385,7 @@ const qwenChatModels: AIChatModelCard[] = [ vision: true, }, config: { - deploymentName: 'qvq-max-latest', + deploymentName: 'qvq-max-2025-05-15', }, contextWindowTokens: 131_072, description: @@ -1227,7 +1410,7 @@ const qwenChatModels: AIChatModelCard[] = [ vision: true, }, config: { - deploymentName: 'qvq-plus-latest', + deploymentName: 'qvq-plus-2025-05-15', }, contextWindowTokens: 131_072, description: @@ -1687,8 +1870,8 @@ const qwenImageModels: AIImageModelCard[] = [ seed: { default: null }, }, pricing: { - currency: 'USD', - units: [{ name: 'imageGeneration', rate: 0.041, strategy: 'fixed', unit: 'image' }], + currency: 'CNY', + units: [{ name: 'imageGeneration', rate: 0.3, strategy: 'fixed', unit: 'image' }], }, releasedAt: '2025-09-18', type: 'image', @@ -1836,7 +2019,7 @@ const qwenImageModels: AIImageModelCard[] = [ }, pricing: { currency: 'CNY', - units: [{ name: 'imageGeneration', rate: 0.04, strategy: 'fixed', unit: 'image' }], + units: [{ name: 'imageGeneration', rate: 0.16, strategy: 'fixed', unit: 'image' }], }, releasedAt: '2024-05-22', type: 'image', diff --git a/packages/model-bank/src/aiModels/volcengine.ts b/packages/model-bank/src/aiModels/volcengine.ts index 55623c149f4..8387b197491 100644 --- a/packages/model-bank/src/aiModels/volcengine.ts +++ b/packages/model-bank/src/aiModels/volcengine.ts @@ -74,9 +74,9 @@ const doubaoChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.8, - '[128_000, infinity]': 4.8, - '[32_000, 128_000]': 2.4, + '[0, 0.032]': 0.8, + '[0.032, 0.128]': 2.4, + '[0.128, infinity]': 4.8, }, pricingParams: ['textInputRange'], }, @@ -87,9 +87,9 @@ const doubaoChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 8, - '[128_000, infinity]': 24, - '[32_000, 128_000]': 16, + '[0, 0.032]': 8, + '[0.032, 0.128]': 16, + '[0.128, infinity]': 24, }, pricingParams: ['textInputRange'], }, @@ -127,9 +127,9 @@ const doubaoChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.8, - '[128_000, infinity]': 2.4, - '[32_000, 128_000]': 1.2, + '[0, 0.032]': 0.8, + '[0.032, 0.128]': 1.2, + '[0.128, infinity]': 2.4, }, pricingParams: ['textInputRange'], }, @@ -140,9 +140,9 @@ const doubaoChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 8, - '[128_000, infinity]': 24, - '[32_000, 128_000]': 16, + '[0, 0.032]': 8, + '[0.032, 0.128]': 16, + '[0.128, infinity]': 24, }, pricingParams: ['textInputRange'], }, @@ -162,7 +162,7 @@ const doubaoChatModels: AIChatModelCard[] = [ vision: true, }, config: { - deploymentName: 'doubao-seed-1-6-250615', + deploymentName: 'doubao-seed-1-6-251015', }, contextWindowTokens: 256_000, description: @@ -177,9 +177,9 @@ const doubaoChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.8, - '[128_000, infinity]': 2.4, - '[32_000, 128_000]': 1.2, + '[0, 0.032]': 0.8, + '[0.032, 0.128]': 1.2, + '[0.128, infinity]': 2.4, }, pricingParams: ['textInputRange'], }, @@ -190,10 +190,10 @@ const doubaoChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 8192]': 2, - '[0, 32_000]_[8192, infinity]': 8, - '[128_000, infinity]_[0, infinity]': 24, - '[32_000, 128_000]_[0, infinity]': 16, + '[0, 0.032]_[0, 0.0002]': 2, + '[0, 0.032]_[0.0002, infinity]': 8, + '[0.032, 0.128]_[0, infinity]': 16, + '[0.128, infinity]_[0, infinity]': 24, }, pricingParams: ['textInputRange', 'textOutputRange'], }, @@ -205,7 +205,60 @@ const doubaoChatModels: AIChatModelCard[] = [ ], }, settings: { - extendParams: ['thinking'], + extendParams: ['gpt5ReasoningEffort'], + }, + type: 'chat', + }, + { + abilities: { + functionCall: true, + reasoning: true, + vision: true, + }, + config: { + deploymentName: 'doubao-seed-1-6-lite-251015', + }, + contextWindowTokens: 256_000, + description: + 'Doubao-Seed-1.6-lite 全新多模态深度思考模型,支持思考程度可调节(reasoning effort),即 Minimal、Low、Medium、High 四种模式,更强性价比,常见任务的最佳选择,上下文窗口至256k。', + displayName: 'Doubao Seed 1.6 Lite', + id: 'doubao-seed-1.6-lite', + maxOutput: 32_000, + pricing: { + currency: 'CNY', + units: [ + { + lookup: { + prices: { + '[0, 0.032]': 0.3, + '[0.032, 0.128]': 0.6, + '[0.128, 0.256]': 1.2, + }, + pricingParams: ['textInputRange'], + }, + name: 'textInput', + strategy: 'lookup', + unit: 'millionTokens', + }, + { + lookup: { + prices: { + '[0, 0.032]_[0, 0.0002]': 0.6, + '[0, 0.032]_[0.0002, infinity]': 2.4, + '[0.032, 0.128]_[0, infinity]': 4, + '[0.128, 0.256]_[0, infinity]': 12, + }, + pricingParams: ['textInputRange', 'textOutputRange'], + }, + name: 'textOutput', + strategy: 'lookup', + unit: 'millionTokens', + }, + { name: 'textInput_cacheRead', rate: 0.06, strategy: 'fixed', unit: 'millionTokens' }, + ], + }, + settings: { + extendParams: ['gpt5ReasoningEffort'], }, type: 'chat', }, @@ -231,9 +284,9 @@ const doubaoChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.15, - '[128_000, infinity]': 0.6, - '[32_000, 128_000]': 0.3, + '[0, 0.032]': 0.15, + '[0.032, 0.128]': 0.3, + '[0.128, infinity]': 0.6, }, pricingParams: ['textInputRange'], }, @@ -244,9 +297,9 @@ const doubaoChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 1.5, - '[128_000, infinity]': 6, - '[32_000, 128_000]': 3, + '[0, 0.032]': 1.5, + '[0.032, 0.128]': 3, + '[0.128, infinity]': 6, }, pricingParams: ['textInputRange'], }, diff --git a/packages/model-bank/src/aiModels/zhipu.ts b/packages/model-bank/src/aiModels/zhipu.ts index 1a93108c089..6de0cd6c71b 100644 --- a/packages/model-bank/src/aiModels/zhipu.ts +++ b/packages/model-bank/src/aiModels/zhipu.ts @@ -23,9 +23,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 0.4, - '[0, 32_000]_[200, infinity]': 0.6, - '[32_000, 200_000]': 0.8, + '[0, 0.032]_[0, 0.0002]': 0.4, + '[0, 0.032]_[0.0002, infinity]': 0.6, + '[0.032, 0.2]': 0.8, }, pricingParams: ['textInput', 'textOutput'], }, @@ -36,9 +36,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 2, - '[0, 32_000]_[200, infinity]': 3, - '[32_000, 200_000]': 4, + '[0, 0.032]_[0, 0.0002]': 2, + '[0, 0.032]_[0.0002, infinity]': 3, + '[0.032, 0.2]': 4, }, pricingParams: ['textInput', 'textOutput'], }, @@ -49,9 +49,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 8, - '[0, 32_000]_[200, infinity]': 14, - '[32_000, 200_000]': 16, + '[0, 0.032]_[0, 0.0002]': 8, + '[0, 0.032]_[0.0002, infinity]': 14, + '[0.032, 0.2]': 16, }, pricingParams: ['textInput', 'textOutput'], }, @@ -87,8 +87,8 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.4, - '[32_000, 65_536]': 0.8, + '[0, 0.032]': 0.4, + '[0.032, infinity]': 0.8, }, pricingParams: ['textInput'], }, @@ -99,8 +99,8 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 2, - '[32_000, 65_536]': 4, + '[0, 0.032]': 2, + '[0.032, infinity]': 4, }, pricingParams: ['textInput'], }, @@ -111,8 +111,8 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 6, - '[32_000, 65_536]': 12, + '[0, 0.032]': 6, + '[0.032, infinity]': 12, }, pricingParams: ['textInput'], }, @@ -146,9 +146,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 0.4, - '[0, 32_000]_[200, infinity]': 0.6, - '[32_000, 128_000]': 0.8, + '[0, 0.032]_[0, 0.0002]': 0.4, + '[0, 0.032]_[0.0002, infinity]': 0.6, + '[0.032, 0.128]': 0.8, }, pricingParams: ['textInput', 'textOutput'], }, @@ -159,9 +159,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 2, - '[0, 32_000]_[200, infinity]': 3, - '[32_000, 128_000]': 4, + '[0, 0.032]_[0, 0.0002]': 2, + '[0, 0.032]_[0.0002, infinity]': 3, + '[0.032, 0.128]': 4, }, pricingParams: ['textInput', 'textOutput'], }, @@ -172,9 +172,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 8, - '[0, 32_000]_[200, infinity]': 14, - '[32_000, 128_000]': 16, + '[0, 0.032]_[0, 0.0002]': 8, + '[0, 0.032]_[0.0002, infinity]': 14, + '[0.032, 0.128]': 16, }, pricingParams: ['textInput', 'textOutput'], }, @@ -207,9 +207,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 1.6, - '[0, 32_000]_[200, infinity]': 2.4, - '[32_000, 128_000]': 3.2, + '[0, 0.032]': 1.6, + '[0, 0.032]_[0.0002, infinity]': 2.4, + '[0.032, 0.128]': 3.2, }, pricingParams: ['textInput', 'textOutput'], }, @@ -220,9 +220,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 8, - '[0, 32_000]_[200, infinity]': 12, - '[32_000, 128_000]': 16, + '[0, 0.032]_[0, 0.0002]': 8, + '[0, 0.032]_[0.0002, infinity]': 12, + '[0.032, 0.128]': 16, }, pricingParams: ['textInput', 'textOutput'], }, @@ -233,9 +233,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 16, - '[0, 32_000]_[200, infinity]': 32, - '[32_000, 128_000]': 64, + '[0, 0.032]_[0, 0.0002]': 16, + '[0, 0.032]_[0.0002, infinity]': 32, + '[0.032, 0.128]': 64, }, pricingParams: ['textInput', 'textOutput'], }, @@ -268,8 +268,8 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.16, - '[32_000, 128_000]': 0.24, + '[0, 0.032]': 0.16, + '[0.032, 0.128]': 0.24, }, pricingParams: ['textInput'], }, @@ -280,8 +280,8 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.8, - '[32_000, 128_000]': 1.2, + '[0, 0.032]': 0.8, + '[0.032, 0.128]': 1.2, }, pricingParams: ['textInput'], }, @@ -292,9 +292,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 2, - '[0, 32_000]_[200, infinity]': 6, - '[32_000, 128_000]': 8, + '[0, 0.032]_[0, 0.0002]': 2, + '[0, 0.032]_[0.0002, infinity]': 6, + '[0.032, 0.128]': 8, }, pricingParams: ['textInput', 'textOutput'], }, @@ -327,8 +327,8 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 0.8, - '[32_000, 128_000]': 1.6, + '[0, 0.032]': 0.8, + '[0.032, 0.128]': 1.6, }, pricingParams: ['textInput'], }, @@ -339,8 +339,8 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]': 4, - '[32_000, 128_000]': 8, + '[0, 0.032]': 4, + '[0.032, 0.128]': 8, }, pricingParams: ['textInput'], }, @@ -351,9 +351,9 @@ const zhipuChatModels: AIChatModelCard[] = [ { lookup: { prices: { - '[0, 32_000]_[0, 200]': 12, - '[0, 32_000]_[200, infinity]': 16, - '[32_000, 128_000]': 32, + '[0, 0.032]_[0, 0.0002]': 12, + '[0, 0.032]_[0.0002, infinity]': 16, + '[0.032, 0.128]': 32, }, pricingParams: ['textInput', 'textOutput'], }, diff --git a/packages/model-runtime/src/core/parameterResolver.ts b/packages/model-runtime/src/core/parameterResolver.ts index 90bc46ae480..d012cecaa58 100644 --- a/packages/model-runtime/src/core/parameterResolver.ts +++ b/packages/model-runtime/src/core/parameterResolver.ts @@ -251,6 +251,7 @@ export const MODEL_PARAMETER_CONFLICTS = { 'claude-opus-4-1', 'claude-opus-4-1-20250805', 'claude-sonnet-4-5-20250929', + 'claude-haiku-4-5-20251001', ]), /** From ea44ef1b4c28d3bb172a15c2b286942640a45f2b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 16 Oct 2025 14:01:35 +0000 Subject: [PATCH 2/6] :bookmark: chore(release): v1.137.10 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### [Version 1.137.10](https://github.com/lobehub/lobe-chat/compare/v1.137.9...v1.137.10) Released on **2025-10-16** #### 💄 Styles - **misc**: Add Claude Haiku 4.5 model.
Improvements and Fixes #### Styles * **misc**: Add Claude Haiku 4.5 model, closes [#9735](https://github.com/lobehub/lobe-chat/issues/9735) ([1cfbc87](https://github.com/lobehub/lobe-chat/commit/1cfbc87))
[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
--- CHANGELOG.md | 25 +++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73bc4db6974..81516c78454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,31 @@ # Changelog +### [Version 1.137.10](https://github.com/lobehub/lobe-chat/compare/v1.137.9...v1.137.10) + +Released on **2025-10-16** + +#### 💄 Styles + +- **misc**: Add Claude Haiku 4.5 model. + +
+ +
+Improvements and Fixes + +#### Styles + +- **misc**: Add Claude Haiku 4.5 model, closes [#9735](https://github.com/lobehub/lobe-chat/issues/9735) ([1cfbc87](https://github.com/lobehub/lobe-chat/commit/1cfbc87)) + +
+ +
+ +[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top) + +
+ ### [Version 1.137.9](https://github.com/lobehub/lobe-chat/compare/v1.137.8...v1.137.9) Released on **2025-10-15** diff --git a/package.json b/package.json index 66e8e44cb14..a893f175712 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lobehub/chat", - "version": "1.137.9", + "version": "1.137.10", "description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.", "keywords": [ "framework", From e525cb2ed6e1a5f25028ddfbe891370bb34c0ea0 Mon Sep 17 00:00:00 2001 From: lobehubbot Date: Thu, 16 Oct 2025 14:02:46 +0000 Subject: [PATCH 3/6] =?UTF-8?q?=F0=9F=93=9D=20docs(bot):=20Auto=20sync=20a?= =?UTF-8?q?gents=20&=20plugin=20to=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog/v1.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/changelog/v1.json b/changelog/v1.json index 0bd847929be..874ba0180ed 100644 --- a/changelog/v1.json +++ b/changelog/v1.json @@ -1,4 +1,11 @@ [ + { + "children": { + "improvements": ["Add Claude Haiku 4.5 model."] + }, + "date": "2025-10-16", + "version": "1.137.10" + }, { "children": { "improvements": ["Improve update notification."] From 03c28385e58dba00704bd77aee542e805270e530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Wang?= <52880665+RiverTwilight@users.noreply.github.com> Date: Thu, 16 Oct 2025 22:16:40 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E2=9C=A8=20feat:=20support=20Group=20Chat,?= =?UTF-8?q?=20Mention,=20and=20Multi-Agent=20Orchestration=20with=20featur?= =?UTF-8?q?e=20flag=20(#8976)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: implement group chat functionality * fix * update * revert pglite mock * fix: Add missing test * fix mention * fix mention * lint: Clear unused varibles * fix: type check * fix: Coverage * build: Add missing test * fix: add mention back * fix: Add missing test * fix: Add test for topic * feat: Group chat fallback style * fix: Revert unncessary files * fix: circular deps * feat: tool usage * fix: Replace debug info * feat: Update i18n * opti: Better prompr * fix claude * feat: Filter model without function calling * fix: DM reduction * lint: Address build error * fix: Test error * feat: Store model info * style: Clean up welcome messaeg * feat: Use new welcome message * fix: inbox not working * fix: inbox not working * fix: type error * feat: Optimize prompt * fix: Revert unintentional changes * lint: Remove unused code * fix: better test * fix: Use debug * refact: Move normalization postion * opti: Better prompt * opti: Better prompt * opti: Better prompt * lint: Clear console.log * fix: Update test snap * fix: test error * fix: Unexpectly test fail --------- Co-authored-by: arvinxx --- docs/usage/features/group-chat.mdx | 52 + docs/usage/features/group-chat.zh-CN.mdx | 52 + locales/ar/chat.json | 97 +- locales/ar/components.json | 14 +- locales/ar/error.json | 3 + locales/ar/providers.json | 5 +- locales/ar/setting.json | 110 ++ locales/ar/welcome.json | 334 ++++++ locales/bg-BG/chat.json | 97 +- locales/bg-BG/error.json | 3 + locales/bg-BG/providers.json | 5 +- locales/bg-BG/setting.json | 110 ++ locales/bg-BG/welcome.json | 334 ++++++ locales/de-DE/chat.json | 97 +- locales/de-DE/error.json | 3 + locales/de-DE/providers.json | 5 +- locales/de-DE/setting.json | 110 ++ locales/de-DE/welcome.json | 334 ++++++ locales/en-US/chat.json | 97 +- locales/en-US/error.json | 3 + locales/en-US/providers.json | 5 +- locales/en-US/setting.json | 112 +- locales/en-US/welcome.json | 334 ++++++ locales/es-ES/chat.json | 97 +- locales/es-ES/components.json | 8 +- locales/es-ES/error.json | 3 + locales/es-ES/providers.json | 5 +- locales/es-ES/setting.json | 110 ++ locales/es-ES/welcome.json | 334 ++++++ locales/fa-IR/chat.json | 97 +- locales/fa-IR/error.json | 3 + locales/fa-IR/providers.json | 5 +- locales/fa-IR/setting.json | 110 ++ locales/fa-IR/welcome.json | 334 ++++++ locales/fr-FR/chat.json | 97 +- locales/fr-FR/error.json | 3 + locales/fr-FR/providers.json | 5 +- locales/fr-FR/setting.json | 110 ++ locales/fr-FR/welcome.json | 334 ++++++ locales/it-IT/chat.json | 97 +- locales/it-IT/error.json | 3 + locales/it-IT/providers.json | 5 +- locales/it-IT/setting.json | 110 ++ locales/it-IT/welcome.json | 334 ++++++ locales/ja-JP/chat.json | 97 +- locales/ja-JP/error.json | 3 + locales/ja-JP/providers.json | 5 +- locales/ja-JP/setting.json | 110 ++ locales/ja-JP/welcome.json | 334 ++++++ locales/ko-KR/chat.json | 289 ++++-- locales/ko-KR/error.json | 3 + locales/ko-KR/providers.json | 123 +-- locales/ko-KR/setting.json | 110 ++ locales/ko-KR/welcome.json | 382 ++++++- locales/nl-NL/chat.json | 97 +- locales/nl-NL/error.json | 3 + locales/nl-NL/providers.json | 5 +- locales/nl-NL/setting.json | 110 ++ locales/nl-NL/welcome.json | 334 ++++++ locales/pl-PL/chat.json | 97 +- locales/pl-PL/error.json | 3 + locales/pl-PL/providers.json | 5 +- locales/pl-PL/setting.json | 110 ++ locales/pl-PL/welcome.json | 334 ++++++ locales/pt-BR/chat.json | 97 +- locales/pt-BR/components.json | 10 +- locales/pt-BR/error.json | 3 + locales/pt-BR/providers.json | 5 +- locales/pt-BR/setting.json | 110 ++ locales/pt-BR/welcome.json | 334 ++++++ locales/ru-RU/chat.json | 97 +- locales/ru-RU/error.json | 3 + locales/ru-RU/setting.json | 110 ++ locales/ru-RU/welcome.json | 334 ++++++ locales/tr-TR/chat.json | 97 +- locales/tr-TR/components.json | 10 +- locales/tr-TR/error.json | 3 + locales/tr-TR/providers.json | 5 +- locales/tr-TR/setting.json | 110 ++ locales/tr-TR/welcome.json | 334 ++++++ locales/vi-VN/chat.json | 97 +- locales/vi-VN/error.json | 21 +- locales/vi-VN/providers.json | 5 +- locales/vi-VN/setting.json | 110 ++ locales/vi-VN/welcome.json | 334 ++++++ locales/zh-CN/chat.json | 95 ++ locales/zh-CN/error.json | 3 + locales/zh-CN/setting.json | 110 ++ locales/zh-CN/welcome.json | 339 +++++++ locales/zh-TW/chat.json | 97 +- locales/zh-TW/error.json | 3 + locales/zh-TW/providers.json | 5 +- locales/zh-TW/setting.json | 110 ++ locales/zh-TW/welcome.json | 334 ++++++ packages/const/src/settings/systemAgent.ts | 1 + .../src/models/__tests__/chatGroup.test.ts | 819 +++++++++++++++ .../src/models/__tests__/message.test.ts | 48 + .../src/models/__tests__/session.test.ts | 155 ++- .../src/models/__tests__/topic.test.ts | 95 +- packages/database/src/models/chatGroup.ts | 252 +++++ packages/database/src/models/message.ts | 24 +- packages/database/src/models/session.ts | 72 +- packages/database/src/models/topic.ts | 56 +- packages/model-bank/src/aiModels/aihubmix.ts | 1 + .../src/providers/anthropic/generateObject.ts | 8 +- packages/prompts/src/chains/summaryTitle.ts | 3 +- .../src/prompts/chatMessages/index.test.ts | 85 +- .../prompts/src/prompts/chatMessages/index.ts | 126 +++ .../__snapshots__/index.test.ts.snap | 281 +++++ .../src/prompts/groupChat/index.test.ts | 205 ++++ .../prompts/src/prompts/groupChat/index.ts | 165 +++ packages/prompts/src/prompts/index.ts | 1 + packages/types/src/agent/item.ts | 6 + packages/types/src/message/base.ts | 2 +- packages/types/src/serverConfig.ts | 4 +- packages/types/src/session/agentSession.ts | 5 +- .../types/src/user/settings/systemAgent.ts | 1 + public/favicon-32x32-dev.ico | Bin 2495 -> 2146 bytes public/favicon-dev.ico | Bin 896 -> 831 bytes .../Desktop/SideBar/TopActions.test.tsx | 38 +- .../ChatInput/Desktop/ClassicChat.tsx | 84 +- .../features/ChatInput/Desktop/GroupChat.tsx | 153 ++- .../features/ChatInput/Desktop/index.tsx | 10 +- .../ChatInput/Desktop/useSendMenuItems.tsx | 92 ++ .../MentionedUsers/MentionedUserItem.tsx | 54 + .../ChatInput/Mobile/MentionedUsers/index.tsx | 41 + .../features/ChatInput/Mobile/index.tsx | 18 +- .../features/ChatInput/index.tsx | 9 +- .../features/ChatInput/useSend.ts | 172 +++- .../ChatItem/OrchestratorThinking.tsx | 58 ++ .../features/ChatList/ChatItem/index.tsx | 36 +- .../GroupWelcome/GroupUsageSuggest.tsx | 164 +++ .../WelcomeChatItem/GroupWelcome/index.tsx | 55 + .../GroupWelcome/useTemplateMatching.ts | 105 ++ .../ChatList/WelcomeChatItem/index.tsx | 18 +- .../(workspace)/@topic/_layout/Desktop.tsx | 11 +- .../(workspace)/@topic/_layout/Mobile.tsx | 2 +- .../chat/(workspace)/@topic/default.tsx | 28 +- .../features/AgentConfig/SystemRole.tsx | 110 ++ .../@topic/features/AgentConfig/index.tsx | 75 ++ .../@topic/features/ConfigLayout.tsx | 97 ++ .../@topic/features/ConfigSwitcher.tsx | 25 + .../features/GroupConfig/GroupMember.tsx | 232 +++++ .../features/GroupConfig/GroupMemberItem.tsx | 121 +++ .../@topic/features/GroupConfig/GroupRole.tsx | 86 ++ .../@topic/features/GroupConfig/index.tsx | 124 +++ .../@topic/features/GroupConfig/style.ts | 39 + .../features/SystemRole/SystemRoleContent.tsx | 146 --- .../@topic/features/SystemRole/index.tsx | 18 - .../@topic/features/SystemRole/style.ts | 21 - .../@topic/features/{ => Topic}/Header.tsx | 0 .../TopicListContent/ByTimeMode/GroupItem.tsx | 0 .../TopicListContent/ByTimeMode/index.tsx | 0 .../TopicListContent/FlatMode/index.tsx | 0 .../TopicListContent/SearchResult/index.tsx | 2 +- .../TopicListContent/ThreadItem/Content.tsx | 0 .../TopicListContent/ThreadItem/index.tsx | 0 .../TopicListContent/ThreadList/index.tsx | 0 .../TopicItem/DefaultContent.tsx | 0 .../TopicItem/TopicContent.tsx | 0 .../TopicListContent/TopicItem/index.tsx | 0 .../{ => Topic}/TopicListContent/index.tsx | 2 +- .../{ => Topic}/TopicSearchBar/index.tsx | 0 .../@topic/features/Topic/index.tsx | 27 + .../_layout/Desktop/ChatHeader/Main.tsx | 63 +- .../ChatHeader/Tags/MemberCountTag.tsx | 31 + .../_layout/Desktop/ChatHeader/Tags/index.tsx | 12 + .../features/AgentSettings/index.tsx | 110 +- .../features/GroupChatSettings/index.tsx | 97 ++ .../(workspace)/features/SettingButton.tsx | 18 +- .../_layout/Desktop/SessionHeader.tsx | 244 ++++- .../CollapseGroup/Actions.tsx | 117 ++- .../SessionListContent/DefaultMode.tsx | 45 +- .../SessionListContent/List/Item/Actions.tsx | 34 +- .../SessionListContent/List/Item/index.tsx | 64 +- .../SessionListContent/List/index.tsx | 4 +- .../SessionListContent/ListItem/index.tsx | 69 +- .../SessionListContent/SearchMode.tsx | 26 +- .../ChatGroupWizard/ChatGroupWizard.tsx | 740 ++++++++++++++ src/components/ChatGroupWizard/index.ts | 3 + src/components/ChatGroupWizard/templates.ts | 36 + src/components/DMTag/export.ts | 2 + src/components/DMTag/index.tsx | 79 ++ .../DragUpload/useDragUpload.test.tsx | 25 +- .../MemberSelectionModal.tsx | 363 +++++++ src/components/MemberSelectionModal/index.ts | 2 + src/config/featureFlags/index.ts | 53 +- src/config/featureFlags/schema.test.ts | 6 +- src/config/featureFlags/schema.ts | 5 + .../models/__tests__/topic.test.ts | 2 +- src/database/_deprecated/models/topic.ts | 12 +- .../ChatInput/ActionBar/Mention/index.tsx | 67 ++ .../ActionBar/Token/TokenTagForGroupChat.tsx | 288 ++++++ .../ChatInput/ActionBar/Token/index.tsx | 13 + src/features/ChatInput/ActionBar/config.ts | 5 +- src/features/ChatInput/ChatInputProvider.tsx | 3 + .../MentionedUsers/MentionedUserItem.tsx | 83 ++ .../Desktop/MentionedUsers/index.tsx | 54 + src/features/ChatInput/InputEditor/index.tsx | 67 +- src/features/ChatInput/StoreUpdater.tsx | 2 + src/features/ChatInput/store/initialState.ts | 3 +- src/features/ChatItem/ChatItem.tsx | 51 +- .../ChatItem/components/MessageContent.tsx | 6 +- src/features/ChatItem/components/Title.tsx | 5 +- src/features/ChatItem/style.ts | 8 + src/features/ChatItem/type.ts | 27 +- .../MarkdownElements/LobeArtifact/index.ts | 5 +- .../MarkdownElements/LobeThinking/index.ts | 1 + .../MarkdownElements/LocalFile/index.ts | 8 +- .../MarkdownElements/Mention/Render.tsx | 109 ++ .../MarkdownElements/Mention/index.ts | 14 + .../MarkdownElements/Thinking/index.ts | 7 +- .../Conversation/MarkdownElements/index.ts | 2 + ...eateRemarkCustomTagWithAttributesPlugin.ts | 80 ++ .../Conversation/MarkdownElements/type.ts | 3 + .../Conversation/Messages/Assistant/index.tsx | 59 +- .../Messages/Supervisor/TodoList.tsx | 159 +++ .../Messages/Supervisor/index.tsx | 185 ++++ .../Conversation/Messages/User/Extra.tsx | 5 +- .../Messages/User/MessageContent.tsx | 6 +- .../Conversation/Messages/User/index.tsx | 65 +- src/features/Conversation/Messages/index.tsx | 14 +- .../hooks/useChatListActionsBar.tsx | 6 +- src/features/GroupChatSettings/AgentCard.tsx | 139 +++ .../GroupChatSettings/ChatGroupMeta.tsx | 103 ++ .../GroupChatSettings/ChatGroupSettings.tsx | 187 ++++ .../GroupChatSettings/GroupCategory/index.tsx | 30 + .../GroupCategory/useGroupCategory.tsx | 42 + .../GroupChatSettingsProvider.tsx | 19 + .../GroupChatSettings/GroupMembers.tsx | 201 ++++ .../GroupChatSettings/GroupSettings.tsx | 30 + .../GroupSettingsContent.tsx | 24 + .../GroupChatSettings/HostMemberCard.tsx | 105 ++ .../GroupChatSettings/StoreUpdater.tsx | 35 + .../hooks/useGroupChatSettings.ts | 25 + src/features/GroupChatSettings/index.ts | 17 + .../GroupChatSettings/store/action.ts | 105 ++ src/features/GroupChatSettings/store/index.ts | 18 + .../GroupChatSettings/store/initialState.ts | 23 + .../GroupChatSettings/store/selectors.ts | 13 + src/features/GroupInfo/index.tsx | 60 ++ src/features/ModelSelect/index.tsx | 108 +- .../GroupThread/Body/ThreadChatItem.tsx | 26 + .../GroupThread/Body/ThreadChatList.tsx | 53 + .../Portal/GroupThread/Body/index.tsx | 24 + .../Portal/GroupThread/Header/index.tsx | 55 + .../Portal/GroupThread/Title/index.tsx | 10 + src/features/Portal/GroupThread/hook.ts | 9 + src/features/Portal/GroupThread/index.ts | 13 + src/features/Portal/router.tsx | 4 +- src/hooks/useFetchGroups.ts | 13 + src/hooks/useFetchMessages.ts | 24 +- src/hooks/useInitAgentConfig.ts | 20 +- src/hooks/useInitGroupConfig.ts | 22 + src/locales/default/chat.ts | 121 +++ src/locales/default/error.ts | 4 + src/locales/default/setting.ts | 112 +- src/locales/default/welcome.ts | 355 +++++++ src/server/routers/lambda/config/index.ts | 28 +- src/server/routers/lambda/group.ts | 113 +++ src/server/routers/lambda/index.ts | 2 + src/server/routers/lambda/message.ts | 19 +- src/server/routers/lambda/session.ts | 25 +- src/server/routers/lambda/topic.ts | 3 +- src/services/aiChat.ts | 4 + src/services/chat/chat.test.ts | 3 +- src/services/chat/index.ts | 12 +- src/services/chatGroup/client.ts | 63 ++ src/services/chatGroup/index.ts | 12 + src/services/chatGroup/server.ts | 67 ++ src/services/chatGroup/type.ts | 22 + src/services/export/_deprecated.ts | 2 +- src/services/message/_deprecated.ts | 10 + src/services/message/client.ts | 26 +- src/services/message/server.ts | 20 +- src/services/message/type.ts | 4 +- src/services/session/_deprecated.ts | 1 + src/services/session/client.ts | 24 +- src/services/topic/_deprecated.test.ts | 2 +- src/services/topic/client.ts | 2 +- src/services/topic/pglite.test.ts | 2 +- src/services/topic/server.ts | 2 +- src/services/topic/type.ts | 5 +- src/store/agent/slices/chat/action.ts | 6 +- .../agent/slices/chat/selectors/agent.ts | 18 + .../slices/aiChat/actions/generateAIChat.ts | 7 +- .../aiChat/actions/generateAIGroupChat.ts | 956 ++++++++++++++++++ src/store/chat/slices/message/action.test.ts | 18 +- src/store/chat/slices/message/action.ts | 114 ++- src/store/chat/slices/message/initialState.ts | 45 +- .../chat/slices/message/selectors.test.ts | 31 +- src/store/chat/slices/message/selectors.ts | 60 ++ .../chat/slices/message/supervisor.test.ts | 159 +++ src/store/chat/slices/message/supervisor.ts | 767 ++++++++++++++ src/store/chat/slices/plugin/action.ts | 1 + src/store/chat/slices/topic/action.test.ts | 139 +++ src/store/chat/slices/topic/action.ts | 133 ++- src/store/chat/store.ts | 3 + src/store/chatGroup/action.ts | 363 +++++++ src/store/chatGroup/helpers.ts | 18 + src/store/chatGroup/index.ts | 5 + src/store/chatGroup/initialState.ts | 54 + src/store/chatGroup/reducers.ts | 69 ++ src/store/chatGroup/selectors.ts | 77 ++ src/store/chatGroup/store.ts | 23 + src/store/global/initialState.ts | 6 + src/store/mention/action.ts | 49 + src/store/mention/index.ts | 2 + src/store/mention/initialState.ts | 7 + src/store/mention/selectors.ts | 9 + src/store/mention/store.ts | 20 + src/store/serverConfig/Provider.tsx | 9 +- src/store/serverConfig/selectors.test.ts | 39 +- src/store/serverConfig/selectors.ts | 5 +- src/store/serverConfig/store.test.ts | 21 +- src/store/serverConfig/store.ts | 10 +- .../session/slices/session/action.test.ts | 62 +- src/store/session/slices/session/action.ts | 64 +- src/store/session/slices/session/helpers.ts | 9 +- .../session/slices/session/initialState.ts | 8 +- src/store/session/slices/session/reducers.ts | 6 +- .../session/slices/session/selectors/list.ts | 29 +- .../session/slices/session/selectors/meta.ts | 30 + .../slices/sessionGroup/initialState.ts | 1 - .../__snapshots__/settings.test.ts.snap | 4 + .../slices/settings/selectors/systemAgent.ts | 2 + 326 files changed, 23714 insertions(+), 1125 deletions(-) create mode 100644 docs/usage/features/group-chat.mdx create mode 100644 docs/usage/features/group-chat.zh-CN.mdx create mode 100644 packages/database/src/models/__tests__/chatGroup.test.ts create mode 100644 packages/database/src/models/chatGroup.ts create mode 100644 packages/prompts/src/prompts/groupChat/__snapshots__/index.test.ts.snap create mode 100644 packages/prompts/src/prompts/groupChat/index.test.ts create mode 100644 packages/prompts/src/prompts/groupChat/index.ts create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/useSendMenuItems.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/MentionedUsers/MentionedUserItem.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/MentionedUsers/index.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/OrchestratorThinking.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/GroupUsageSuggest.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/index.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/useTemplateMatching.ts create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/AgentConfig/SystemRole.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/AgentConfig/index.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/ConfigLayout.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/ConfigSwitcher.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupMember.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupMemberItem.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupRole.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/index.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/style.ts delete mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx delete mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/index.tsx delete mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/style.ts rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/Header.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/ByTimeMode/GroupItem.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/ByTimeMode/index.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/FlatMode/index.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/SearchResult/index.tsx (96%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/ThreadItem/Content.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/ThreadItem/index.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/ThreadList/index.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/TopicItem/DefaultContent.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/TopicItem/TopicContent.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/TopicItem/index.tsx (100%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicListContent/index.tsx (97%) rename src/app/[variants]/(main)/chat/(workspace)/@topic/features/{ => Topic}/TopicSearchBar/index.tsx (100%) create mode 100644 src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/index.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags/MemberCountTag.tsx create mode 100644 src/app/[variants]/(main)/chat/(workspace)/features/GroupChatSettings/index.tsx create mode 100644 src/components/ChatGroupWizard/ChatGroupWizard.tsx create mode 100644 src/components/ChatGroupWizard/index.ts create mode 100644 src/components/ChatGroupWizard/templates.ts create mode 100644 src/components/DMTag/export.ts create mode 100644 src/components/DMTag/index.tsx create mode 100644 src/components/MemberSelectionModal/MemberSelectionModal.tsx create mode 100644 src/components/MemberSelectionModal/index.ts create mode 100644 src/features/ChatInput/ActionBar/Mention/index.tsx create mode 100644 src/features/ChatInput/ActionBar/Token/TokenTagForGroupChat.tsx create mode 100644 src/features/ChatInput/Desktop/MentionedUsers/MentionedUserItem.tsx create mode 100644 src/features/ChatInput/Desktop/MentionedUsers/index.tsx create mode 100644 src/features/Conversation/MarkdownElements/Mention/Render.tsx create mode 100644 src/features/Conversation/MarkdownElements/Mention/index.ts create mode 100644 src/features/Conversation/MarkdownElements/remarkPlugins/createRemarkCustomTagWithAttributesPlugin.ts create mode 100644 src/features/Conversation/Messages/Supervisor/TodoList.tsx create mode 100644 src/features/Conversation/Messages/Supervisor/index.tsx create mode 100644 src/features/GroupChatSettings/AgentCard.tsx create mode 100644 src/features/GroupChatSettings/ChatGroupMeta.tsx create mode 100644 src/features/GroupChatSettings/ChatGroupSettings.tsx create mode 100644 src/features/GroupChatSettings/GroupCategory/index.tsx create mode 100644 src/features/GroupChatSettings/GroupCategory/useGroupCategory.tsx create mode 100644 src/features/GroupChatSettings/GroupChatSettingsProvider.tsx create mode 100644 src/features/GroupChatSettings/GroupMembers.tsx create mode 100644 src/features/GroupChatSettings/GroupSettings.tsx create mode 100644 src/features/GroupChatSettings/GroupSettingsContent.tsx create mode 100644 src/features/GroupChatSettings/HostMemberCard.tsx create mode 100644 src/features/GroupChatSettings/StoreUpdater.tsx create mode 100644 src/features/GroupChatSettings/hooks/useGroupChatSettings.ts create mode 100644 src/features/GroupChatSettings/index.ts create mode 100644 src/features/GroupChatSettings/store/action.ts create mode 100644 src/features/GroupChatSettings/store/index.ts create mode 100644 src/features/GroupChatSettings/store/initialState.ts create mode 100644 src/features/GroupChatSettings/store/selectors.ts create mode 100644 src/features/GroupInfo/index.tsx create mode 100644 src/features/Portal/GroupThread/Body/ThreadChatItem.tsx create mode 100644 src/features/Portal/GroupThread/Body/ThreadChatList.tsx create mode 100644 src/features/Portal/GroupThread/Body/index.tsx create mode 100644 src/features/Portal/GroupThread/Header/index.tsx create mode 100644 src/features/Portal/GroupThread/Title/index.tsx create mode 100644 src/features/Portal/GroupThread/hook.ts create mode 100644 src/features/Portal/GroupThread/index.ts create mode 100644 src/hooks/useFetchGroups.ts create mode 100644 src/hooks/useInitGroupConfig.ts create mode 100644 src/server/routers/lambda/group.ts create mode 100644 src/services/chatGroup/client.ts create mode 100644 src/services/chatGroup/index.ts create mode 100644 src/services/chatGroup/server.ts create mode 100644 src/services/chatGroup/type.ts create mode 100644 src/store/chat/slices/aiChat/actions/generateAIGroupChat.ts create mode 100644 src/store/chat/slices/message/supervisor.test.ts create mode 100644 src/store/chat/slices/message/supervisor.ts create mode 100644 src/store/chatGroup/action.ts create mode 100644 src/store/chatGroup/helpers.ts create mode 100644 src/store/chatGroup/index.ts create mode 100644 src/store/chatGroup/initialState.ts create mode 100644 src/store/chatGroup/reducers.ts create mode 100644 src/store/chatGroup/selectors.ts create mode 100644 src/store/chatGroup/store.ts create mode 100644 src/store/mention/action.ts create mode 100644 src/store/mention/index.ts create mode 100644 src/store/mention/initialState.ts create mode 100644 src/store/mention/selectors.ts create mode 100644 src/store/mention/store.ts diff --git a/docs/usage/features/group-chat.mdx b/docs/usage/features/group-chat.mdx new file mode 100644 index 00000000000..1515960ee4f --- /dev/null +++ b/docs/usage/features/group-chat.mdx @@ -0,0 +1,52 @@ +--- +title: Group Chat +description: Turn any conversation into a team effort. Multiple AI agents collaborate naturally to give you richer, more insightful responses. +tags: + - Group Chat + - Multi-Agent + - AI Orchestration + - Agent Coordination +--- + +# Group Chat + +{'Group + +Sometimes one perspective isn't enough. Group Chat brings together multiple AI agents, each with their own expertise, to collaborate on your conversations. Richer discussions, diverse viewpoints, and solutions you wouldn't get from any single agent. + +## Highlights + +- Multiple assistants with specialized knowledge work together, each contributing their strengths +- A built-in host ensures the group chat runs smoothly and organized +- Private messaging allows seamless coordination between assistants +- You get comprehensive answers from multiple perspectives +- Ready to use with your own assistants or rich group chat team templates + +## Use Cases + +**Learning and Research**: Different assistants gather different materials through different tools, then come together for spontaneous discussion. + +**Entertainment**: Multiplayer language games like Werewolf, Model United Nations, and Turtle Soup. + +**Brainstorming**: Diverse perspectives spark better ideas. + +**Problem Solving**: Benefit from insights across different professional fields, with different tools and MCPs, group chat allows you to have the perfect AI team. + +## Quick Start + +Click the "Create Group Chat" button, you can choose to create directly from preset group chat templates, or select your own assistants to form a group chat. + +You can use @ to mention a group member in the group chat, or click their avatar to send them a private message. Everything works just like in a real chat room. + +### Interrupt and Resume Group Chat + +You can interrupt the host's thinking at any time, and the group chat will "pause" after interruption. You can start the moderator at any time, and the group chat will continue. + +Of course, conversations may also stop naturally. + +### Advanced Options + +- Group Chat Speed: Customize the response speed of the group chat +- Custom Moderator: Guide the moderator's behavior according to specific needs + +Group Chat transforms how you interact with AI. Instead of getting one answer, you participate in a conversation—complete with different viewpoints, collaborative problem-solving, and profound insights that emerge when AI agents work together. diff --git a/docs/usage/features/group-chat.zh-CN.mdx b/docs/usage/features/group-chat.zh-CN.mdx new file mode 100644 index 00000000000..4782be336a0 --- /dev/null +++ b/docs/usage/features/group-chat.zh-CN.mdx @@ -0,0 +1,52 @@ +--- +title: 群聊 +description: 让对话变成团队协作。多个 AI 智能体自然配合,为你提供更丰富、更有洞察力的回答。 +tags: + - 群组对话 + - 多智能体 + - AI 编排 + - 智能体协调 +--- + +# 群聊 + +{'群聊'} + +有时候,一个视角远远不够。群聊功能让多个拥有不同知识和技能的 AI 智能体聚在一起,协作参与你的对话。更丰富的讨论、多元的观点,以及任何单一智能体都无法提供的解决方案。 + +## 亮点 + +- 多个具有专业知识的助手协同工作,各取所长 +- 群聊内置的主持人将确保整个群聊有条不紊的进行 +- 私信功能让助手间无缝协调配合 +- 你将从多个视角获得全面的答案 +- 开箱即用,由你自己的助手组成,或者使用丰富的群聊团队模版 + +## 适用场景 + +**学习研究**:不同的助手通过不同的工具收集不同的资料,汇聚一处并自发讨论。 + +**娱乐**:狼人杀、模拟联合国、海龟汤等多人语聊游戏。 + +**头脑风暴**:多元观点激发更好的想法。 + +**问题解决**:受益于不同专业领域的见解,以及不同的工具和 MCP,群聊允许你拥有完美的 AI 团队。 + +## 快速开始 + +点击「创建群聊」按钮,你可以选择直接从预设的群聊模版创建,或选择你自己的助手组成群聊。 + +你可以在群聊中输入 @ 来提及某个群成员,或者点击它们的头像对其私聊。一切就像是在真实的聊天室中一样。 + +### 中断与继续群聊 + +你可以随时打断主持人的思考,打断后群聊将会「暂停」。你可以随时开启主持人,群聊便会继续。 + +当然,对话也有可能自然地停止。 + +### 高级选项 + +- 群聊速度:自定义群聊的回答速度 +- 自定义主持人:根据特定需要指导主持人的行为 + +群聊改变了你与 AI 的互动方式。不再是获得一个答案,而是参与一场对话 —— 包含不同观点、协作解决问题,以及 AI 智能体协同工作时产生的深刻洞察。 diff --git a/locales/ar/chat.json b/locales/ar/chat.json index 2d9282208fc..c6359a15a87 100644 --- a/locales/ar/chat.json +++ b/locales/ar/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "النموذج" }, + "active": "نشط", "agentDefaultMessage": "مرحبًا، أنا **{{name}}**، يمكنك بدء المحادثة معي على الفور، أو يمكنك الذهاب إلى [إعدادات المساعد]({{url}}) لإكمال معلوماتي.", "agentDefaultMessageWithSystemRole": "مرحبًا، أنا **{{name}}**، كيف يمكنني مساعدتك؟", "agentDefaultMessageWithoutEdit": "مرحبًا، أنا **{{name}}**، كيف يمكنني مساعدتك؟", @@ -13,17 +14,28 @@ "thought": "عملية التفكير", "unknownTitle": "عمل غير مسمى" }, + "availableAgents": "المساعدون المتاحون", "backToBottom": "العودة إلى الأسفل", "chatList": { "longMessageDetail": "عرض التفاصيل" }, "clearCurrentMessages": "مسح رسائل الجلسة الحالية", "confirmClearCurrentMessages": "سيتم مسح رسائل الجلسة الحالية قريبًا، وبمجرد المسح لن يمكن استعادتها، يرجى تأكيد الإجراء الخاص بك", + "confirmRemoveChatGroupItemAlert": "سيتم حذف هذه المحادثة الجماعية، ولن يتأثر أعضاء المجموعة، يرجى تأكيد العملية الخاصة بك", + "confirmRemoveGroupItemAlert": "سيتم حذف هذه المجموعة قريبًا. بعد الحذف، سيُنتقل المساعدون في هذه المجموعة إلى القائمة الافتراضية. يرجى تأكيد إجراء الحذف.", + "confirmRemoveGroupSuccess": "تم حذف الدردشة الجماعية بنجاح", "confirmRemoveSessionItemAlert": "سيتم حذف هذا المساعد قريبًا، وبمجرد الحذف لن يمكن استعادته، يرجى تأكيد الإجراء الخاص بك", "confirmRemoveSessionSuccess": "تم حذف المساعد بنجاح", "defaultAgent": "المساعد الافتراضي", + "defaultGroupChat": "المحادثة الجماعية", "defaultList": "القائمة الافتراضية", "defaultSession": "المساعد الافتراضي", + "dm": { + "placeholder": "ستظهر رسائلك الخاصة مع {{agentTitle}} هنا.", + "tooltip": "أرسل رسالة خاصة", + "visibleTo": "مرئي فقط لـ {{target}}", + "you": "أنت" + }, "duplicateSession": { "loading": "جاري النسخ...", "success": "تم النسخ بنجاح", @@ -58,11 +70,56 @@ "title": "استخراج محتوى رابط الويب" } }, + "group": { + "desc": "التعاون مع عدة مساعدين للذكاء الاصطناعي في مساحة محادثة مشتركة.", + "memberTooltip": "هناك {{count}} عضوًا في المجموعة", + "orchestratorThinking": "المُنسق يفكر...", + "removeMember": "إزالة عضو", + "title": "مجموعة" + }, + "groupDescription": "وصف المجموعة", + "groupSidebar": { + "members": { + "addMember": "إضافة عضو", + "memberSettings": "إعدادات العضو", + "orchestrator": "المُنسق", + "orchestratorThinking": "المُنسق يفكر...", + "removeMember": "إزالة عضو", + "stopOrchestrator": "إيقاف التفكير", + "triggerOrchestrator": "بدء المحادثة الجماعية" + }, + "tabs": { + "host": "المضيف", + "members": "الأعضاء", + "role": "الإعداد" + } + }, + "groupWizard": { + "chooseMembers": "اختر المساعدين الحاليين...", + "createGroup": "إنشاء دردشة جماعية", + "existingMembers": "الأعضاء الحاليون", + "groupMembers": "سيتم أيضًا إضافة هؤلاء المساعدين إلى قائمتك", + "host": { + "description": "لجعل الدردشة الجماعية تعمل تلقائيًا", + "title": "المضيف", + "tooltip": "إذا تم تعطيل مضيف الدردشة الجماعية، فستحتاج إلى الإشارة يدويًا إلى الأعضاء باستخدام @ لكي يتمكنوا من الرد" + }, + "memberCount": "{{count}} عضو", + "noMatchingTemplates": "لا توجد قوالب مطابقة", + "noSelectedTemplates": "لم يتم اختيار أي قالب", + "noTemplateMembers": "لا يوجد أعضاء في القالب", + "noTemplates": "لا توجد قوالب متاحة", + "searchTemplates": "ابحث في القوالب...", + "title": "إنشاء دردشة جماعية", + "useTemplate": "استخدام القالب" + }, + "hideForYou": "تم إخفاء محتوى الرسائل الخاصة، يرجى تفعيل خيار 【عرض محتوى الرسائل الخاصة】 في الإعدادات للعرض", "history": { "title": "سيتذكر المساعد آخر {{count}} رسالة فقط" }, "historyRange": "نطاق التاريخ", "historySummary": "ملخص الرسائل التاريخية", + "inactive": "غير نشط", "inbox": { "desc": "قم بتشغيل مجموعة الدماغ وأشعل شرارة التفكير. مساعدك الذكي، هنا حيث يمكنك التواصل بكل شيء", "title": "دردشة عشوائية" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "جارٍ فهم وتحليل نواياك..." }, + "inviteMembers": "دعوة الأعضاء", "knowledgeBase": { "all": "جميع المحتويات", "allFiles": "جميع الملفات", @@ -101,12 +159,29 @@ "uploadGuide": "يمكنك عرض الملفات التي تم تحميلها في «قاعدة المعرفة»", "viewMore": "عرض المزيد" }, + "memberSelection": { + "addMember": "إضافة عضو", + "allMembers": "جميع الأعضاء", + "createGroup": "إنشاء محادثة جماعية", + "noAvailableAgents": "لا يوجد مساعدين متاحين للدعوة", + "noSelectedAgents": "لم يتم اختيار مساعدين بعد", + "searchAgents": "البحث عن مساعدين...", + "setInitialMembers": "اختيار أعضاء المجموعة" + }, + "members": "الأعضاء", + "mention": { + "title": "الإشارة إلى الأعضاء" + }, "messageAction": { "delAndRegenerate": "حذف وإعادة الإنشاء", "deleteDisabledByThreads": "يوجد موضوعات فرعية، لا يمكن الحذف", "regenerate": "إعادة الإنشاء" }, "messages": { + "dm": { + "sentTo": "مرئي فقط لـ {{name}}", + "title": "الرسائل الخاصة" + }, "modelCard": { "credit": "نقاط", "creditPricing": "التسعير", @@ -156,6 +231,13 @@ "previousMessage": "الرسالة السابقة" }, "newAgent": "مساعد جديد", + "newGroupChat": "إنشاء دردشة جماعية جديدة", + "noAgentsYet": "لا يوجد أي مساعد في هذه المجموعة بعد. انقر على زر + لدعوة مساعد.", + "noAvailableAgents": "لا يوجد مساعدون متاحون للدعوة", + "noMatchingAgents": "لا يوجد مساعد متطابق", + "noMembersYet": "لا يوجد أعضاء في هذه المجموعة بعد. انقر على زر + لدعوة المساعدين.", + "noSelectedAgents": "لم يتم اختيار أي مساعد بعد", + "owner": "مالك المجموعة", "pin": "تثبيت", "pinOff": "إلغاء التثبيت", "rag": { @@ -196,12 +278,16 @@ "title": "بحث عبر الإنترنت" }, "searchAgentPlaceholder": "مساعد البحث...", + "searchAgents": "مساعد البحث...", + "selectedAgents": "المساعدون المختارون", "sendPlaceholder": "أدخل محتوى الدردشة...", "sessionGroup": { "config": "إدارة المجموعات", "confirmRemoveGroupAlert": "سيتم حذف هذه المجموعة قريبًا، وبعد الحذف، سيتم نقل مساعدي هذه المجموعة إلى القائمة الافتراضية، يرجى تأكيد إجراءك", "createAgentSuccess": "تم إنشاء المساعد بنجاح", "createGroup": "إضافة مجموعة جديدة", + "createGroupFailed": "فشل إنشاء المحادثة الجماعية", + "createGroupSuccess": "تم إنشاء المحادثة الجماعية بنجاح", "createSuccess": "تم الإنشاء بنجاح", "creatingAgent": "جاري إنشاء المساعد...", "inputPlaceholder": "الرجاء إدخال اسم المجموعة...", @@ -235,6 +321,12 @@ "loading": "جارٍ التعرف...", "prettifying": "جارٍ التجميل..." }, + "supervisor": { + "todoList": { + "allComplete": "تم إنجاز جميع المهام", + "title": "المهام المنجزة" + } + }, "thread": { "divider": "موضوع فرعي", "threadMessageCount": "{{messageCount}} رسالة", @@ -248,6 +340,7 @@ "chats": "رسائل المحادثة", "historySummary": "ملخص التاريخ", "rest": "المتبقي", + "supervisor": "مُنسق المجموعة", "systemRole": "تعيين الدور", "title": "تفاصيل الرمز", "tools": "تعيين الإضافات", @@ -273,6 +366,7 @@ "action": "قراءة صوتية", "clear": "مسح الصوت" }, + "untitledAgent": "مساعد بدون اسم", "updateAgent": "تحديث معلومات المساعد", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "لا يمكن أن يتجاوز حجم ملف الفيديو 20 ميغابايت، حجم الملف الحالي هو {{actualSize}}" } }, + "you": "أنت", "zenMode": "وضع التركيز" -} +} diff --git a/locales/ar/components.json b/locales/ar/components.json index 1a8ddee5d30..14ecd7139d3 100644 --- a/locales/ar/components.json +++ b/locales/ar/components.json @@ -1,8 +1,8 @@ { "ArgsInput": { - "addArgument": "إضافة معامل", - "argumentPlaceholder": "المعامل {{index}}", - "enterFirstArgument": "أدخل المعامل الأول..." + "addArgument": "إضافة وسيط", + "argumentPlaceholder": "الوسيط {{index}}", + "enterFirstArgument": "أدخل الوسيط الأول..." }, "DragUpload": { "dragDesc": "اسحب الملفات هنا، يدعم تحميل عدة صور.", @@ -145,10 +145,10 @@ "uploadingWithCount": "تم تحميل {{completed}} من أصل {{total}}" }, "validation": { - "fileSizeExceeded": "تجاوز حجم الملف الحد المسموح به", - "fileSizeExceededDetail": "{{fileName}} ({{actualSize}}) يتجاوز الحد الأقصى للحجم وهو {{maxSize}}", - "fileSizeExceededMultiple": "{{count}} من الملفات تتجاوز الحد الأقصى للحجم {{maxSize}}: {{fileList}}", - "imageCountExceeded": "تجاوز عدد الصور الحد المسموح به" + "fileSizeExceeded": "تجاوز حجم الملف الحد المسموح", + "fileSizeExceededDetail": "{{fileName}} ({{actualSize}}) يتجاوز الحد الأقصى للحجم {{maxSize}}", + "fileSizeExceededMultiple": "{{count}} ملفات تتجاوز الحد الأقصى للحجم {{maxSize}}: {{fileList}}", + "imageCountExceeded": "تجاوز عدد الصور الحد المسموح" } }, "OllamaSetupGuide": { diff --git a/locales/ar/error.json b/locales/ar/error.json index 2d3e4a3b30e..fd83802dd6c 100644 --- a/locales/ar/error.json +++ b/locales/ar/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "فشل طلب الخدمة، يرجى التحقق من الإعدادات أو إعادة المحاولة" }, + "supervisor": { + "decisionFailed": "تعذر على مشرف المجموعة العمل. يرجى التحقق من إعدادات المشرف الخاصة بك، والتأكد من تكوين النموذج الصحيح، ومفتاح API، وعنوان API." + }, "testConnectionFailed": "فشل اختبار الاتصال: {{error}}", "tts": { "responseError": "فشل طلب الخدمة، يرجى التحقق من الإعدادات أو إعادة المحاولة" diff --git a/locales/ar/providers.json b/locales/ar/providers.json index 5f1421bad94..da23235ce8b 100644 --- a/locales/ar/providers.json +++ b/locales/ar/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock هي خدمة تقدمها أمازون AWS، تركز على توفير نماذج لغة ورؤية متقدمة للذكاء الاصطناعي للشركات. تشمل عائلة نماذجها سلسلة Claude من Anthropic وسلسلة Llama 3.1 من Meta، وتغطي مجموعة من الخيارات من النماذج الخفيفة إلى عالية الأداء، وتدعم مهام مثل توليد النصوص، والحوار، ومعالجة الصور، مما يجعلها مناسبة لتطبيقات الشركات بمختلف أحجامها واحتياجاتها." }, "bfl": { - "description": "مختبر أبحاث رائد في مقدمة الذكاء الاصطناعي، يبني البنية التحتية البصرية للمستقبل." + "description": "مختبر بحثي رائد في مجال الذكاء الاصطناعي المتقدّم، يبني بنية تحتية بصرية للغد." + }, + "cerebras": { + "description": "Cerebras هو نظام استدلال ذكاء اصطناعي يعتمد على نظام CS-3 المخصص، ويهدف إلى تقديم أسرع خدمات النماذج اللغوية الكبيرة (LLM) في العالم مع استجابة فورية وقدرة معالجة عالية. تم تصميمه خصيصًا للقضاء على التأخير وتسريع سير العمل المعقد للذكاء الاصطناعي مثل توليد الشيفرات في الوقت الحقيقي والمهام التفاعلية." }, "cerebras": { "description": "Cerebras هو نظام استدلال ذكاء اصطناعي يعتمد على نظام CS-3 المخصص، ويهدف إلى تقديم أسرع خدمات النماذج اللغوية الكبيرة (LLM) في العالم مع استجابة فورية وقدرة معالجة عالية. تم تصميمه خصيصًا للقضاء على التأخير وتسريع سير العمل المعقد للذكاء الاصطناعي مثل توليد الشيفرات في الوقت الحقيقي والمهام التفاعلية." diff --git a/locales/ar/setting.json b/locales/ar/setting.json index 62b540c932e..59574cdd0c1 100644 --- a/locales/ar/setting.json +++ b/locales/ar/setting.json @@ -35,9 +35,16 @@ "title": "إعادة تعيين جميع الإعدادات" } }, + "groupTab": { + "chat": "الدردشة", + "members": "الأعضاء", + "meta": "المعلومات الأساسية" + }, "header": { "desc": "إعدادات التفضيلات والنماذج.", "global": "إعدادات عامة", + "group": "إعدادات الدردشة الجماعية", + "groupDesc": "إدارة الدردشة الجماعية الحالية", "session": "إعدادات الجلسة", "sessionDesc": "إعداد الشخصية وتفضيلات الجلسة.", "sessionWithName": "إعدادات الجلسة · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "يتم <1>التخطيط لتوفير المزيد من النماذج، ترقبوا المزيد" }, + "message": { + "success": "تم التحديث بنجاح" + }, "plugin": { "addMCPPlugin": "إضافة مكون MCP", "addTooltip": "إضافة البرنامج المساعد", @@ -294,6 +304,101 @@ }, "title": "الإعدادات العامة" }, + "settingGroup": { + "description": { + "placeholder": "يرجى إدخال وصف الدردشة الجماعية", + "title": "وصف الدردشة الجماعية" + }, + "name": { + "placeholder": "يرجى إدخال اسم الدردشة الجماعية", + "title": "اسم الدردشة الجماعية" + }, + "scene": { + "desc": "اختر مشهد الدردشة الجماعية", + "options": { + "casual": "غير رسمي", + "productive": "إنتاجي" + }, + "title": "مشهد الدردشة الجماعية" + }, + "submit": "تحديث الدردشة الجماعية", + "systemPrompt": { + "placeholder": "يرجى إدخال كلمة تلميح نظام المضيف", + "title": "كلمة تلميح نظام المضيف" + }, + "title": "معلومات الدردشة الجماعية" + }, + "settingGroupChat": { + "allowDM": { + "desc": "عند الإيقاف، لا يزال بإمكانك إرسال رسائل خاصة إلى المساعد يدويًا", + "title": "السماح للمساعد بإرسال رسائل خاصة" + }, + "enableSupervisor": { + "desc": "تفعيل وظيفة مشرف الدردشة الجماعية، حيث يدير المشرف سير المحادثة", + "title": "تفعيل المشرف" + }, + "maxResponseInRow": { + "desc": "اختر عدد الرسائل التي يمكن للأعضاء الرد عليها بشكل متتالي. تعيين القيمة إلى 0 لتعطيل هذا القيد.", + "title": "عدد الردود المتتالية" + }, + "model": { + "desc": "لن يتأثر حديث أعضاء المجموعة. بعض النماذج لا يمكن استخدامها كنماذج مشرف.", + "title": "نموذج المضيف" + }, + "orchestratorTitle": "إعدادات المضيف", + "responseOrder": { + "desc": "سيتم الرد من قبل الوكيل وفقًا للترتيب المحدد في الدردشة الجماعية", + "options": { + "natural": "طبيعي", + "sequential": "تتابعي" + }, + "placeholder": "اختر ترتيب الردود", + "title": "ترتيب الردود" + }, + "responseSpeed": { + "desc": "تحكم في سرعة سير الدردشة الجماعية بشكل عام", + "options": { + "fast": "سريع", + "medium": "متوسط", + "slow": "بطيء" + }, + "placeholder": "اختر سرعة الرد", + "title": "سرعة الرد" + }, + "revealDM": { + "desc": "اجعل محتوى الرسائل الخاصة المرسلة إلى الأعضاء الآخرين مرئيًا لك.", + "title": "عرض محتوى الرسائل الخاصة" + }, + "submit": "تحديث الإعدادات", + "systemPrompt": { + "desc": "كلمة تلميح نظام مخصصة لمضيف محادثة الدردشة الجماعية. قد تؤثر على سلوك المضيف الافتراضي.", + "placeholder": "يرجى إدخال كلمة تلميح نظام المضيف المخصصة...", + "title": "كلمة تلميح نظام المضيف" + }, + "title": "إعدادات الدردشة" + }, + "settingGroupMembers": { + "addToGroup": "انضم إلى المجموعة", + "availableAgents": "المساعدون المتاحون", + "defaultAgent": "المساعد المخصص", + "disableHost": "تعطيل مساعد المضيف", + "edit": "تعديل الأعضاء", + "empty": "لا يوجد وكلاء في هذه الدردشة الجماعية. انقر على زر + لإضافة أعضاء.", + "enableHost": "تمكين مساعد المضيف", + "groupHost": "مضيف المجموعة", + "groupMembers": "أعضاء المجموعة", + "host": { + "description": "عندما يكون المضيف في المجموعة، ستعمل الدردشة الجماعية بشكل تلقائي، مناسب للمهام الإبداعية.", + "title": "المضيف" + }, + "noAvailableAgents": "لا يوجد مساعدين متاحين", + "noDescription": "لا يوجد وصف", + "noMembersInGroup": "لا يوجد أعضاء في المجموعة", + "owner": "أنت (المالك)", + "remove": "إزالة العضو", + "removeFromGroup": "إخراج من المجموعة", + "you": "أنت" + }, "settingImage": { "defaultCount": { "desc": "اضبط عدد الصور الافتراضي عند إنشاء مهمة جديدة في لوحة توليد الصور.", @@ -522,6 +627,11 @@ "modelDesc": "نموذج مخصص لتسمية موضوعات الرسم بالذكاء الاصطناعي تلقائيًا", "title": "تسمية موضوعات الرسم بالذكاء الاصطناعي تلقائيًا" }, + "groupChatSupervisor": { + "label": "نموذج إشراف الدردشة الجماعية", + "modelDesc": "النموذج المعيّن للإشراف وإدارة محادثات الدردشة الجماعية", + "title": "إدارة إشراف الدردشة الجماعية" + }, "helpInfo": "عند إنشاء مساعد جديد، سيتم استخدام إعدادات المساعد الافتراضية كقيم افتراضية.", "historyCompress": { "label": "نموذج تاريخ المحادثة", diff --git a/locales/ar/welcome.json b/locales/ar/welcome.json index 6ce131293c8..740015823b0 100644 --- a/locales/ar/welcome.json +++ b/locales/ar/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "أنا مساعدك الذكي الشخصي {{appName}}، كيف يمكنني مساعدتك الآن؟
إذا كنت بحاجة إلى مساعد أكثر احترافية أو تخصيصًا، يمكنك النقر على لإنشاء مساعد مخصص", "defaultMessageWithoutCreate": "أنا مساعدك الذكي الشخصي {{appName}}، كيف يمكنني مساعدتك الآن؟", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "مناقشة تقنية ومراجعة الأقران لتغييرات وتنفيذ الشيفرة البرمجية", + "emoji": "💻", + "prompt": "دعنا نراجع بعض الشيفرات معًا. هل يمكنك مساعدتنا في تحليل هذه الشيفرات وتحديد مجالات التحسين؟", + "title": "مراجعة الشيفرة" + }, + "investment": { + "description": "تحليل السوق، مناقشة استراتيجيات الاستثمار ومشاركة الرؤى المالية", + "emoji": "📈", + "prompt": "دعنا نحلل السوق معًا. هل يمكنك مساعدتنا في مناقشة استراتيجيات الاستثمار ومشاركة الرؤى المالية؟", + "title": "نادي الاستثمار" + }, + "research": { + "description": "استكشاف المفاهيم العلمية، إجراء التجارب ومشاركة الاكتشافات", + "emoji": "🔬", + "prompt": "دعنا نستكشف العلوم معًا! هل يمكنك مساعدتنا في إجراء التجارب ومشاركة اكتشافاتنا؟", + "title": "معرض العلوم" + }, + "study": { + "description": "اجتماعات تعلم تعاونية، مناقشة المفاهيم وحل المشكلات معًا", + "emoji": "📚", + "prompt": "دعنا نشكل مجموعة دراسة. هل يمكنك مساعدتنا في فهم هذه المفاهيم وحل المشكلات معًا؟", + "title": "مجموعة الدراسة" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "إنشاء، نقد وتقدير أشكال مختلفة من الفن البصري والرقمي", + "emoji": "🖼️", + "prompt": "دعنا نقيم ورشة عمل فنية! هل يمكنك مساعدتنا في إنشاء، نقد وتقدير أشكال مختلفة من الفن؟", + "title": "ورشة العمل الفنية" + }, + "debate": { + "description": "نقاشات ومناظرات منظمة حول مواضيع وقضايا مختلفة", + "emoji": "⚖️", + "prompt": "دعنا نجري مناظرة منظمة. هل يمكنك مساعدتنا في تنظيم نقاش منطقي حول هذا الموضوع؟", + "title": "نادي المناظرة" + }, + "designReview": { + "description": "اجتماعات تعاونية لتقديم ملاحظات على مفاهيم التصميم، النماذج الأولية أو الأعمال الإبداعية", + "emoji": "🎨", + "prompt": "نحتاج إلى مراجعة بعض التصاميم. هل يمكنك مساعدتنا في تقديم ملاحظات بناءة على مفاهيم التصميم والنماذج الأولية؟", + "title": "مراجعة التصميم" + }, + "ideation": { + "description": "توليد أفكار إبداعية وحل المشكلات بشكل تعاوني من وجهات نظر متعددة", + "emoji": "🧠", + "prompt": "دعنا نبدأ جلسة عصف ذهني للمشروع. هل يمكنك مساعدتنا في توليد أفكار وحلول إبداعية؟", + "title": "جلسة العصف الذهني" + } + }, + "game": { + "debateClub": { + "description": "نقاشات ومناظرات منظمة حول مواضيع وقضايا مختلفة", + "emoji": "⚖️", + "prompt": "دعنا نجري مناظرة منظمة. هل يمكنك مساعدتنا في تنظيم نقاش منطقي حول هذا الموضوع؟", + "title": "نادي المناظرة" + }, + "gameNight": { + "description": "ألعاب تفاعلية ممتعة وأنشطة لبناء الروابط بين الفريق والاستمتاع", + "emoji": "🎲", + "prompt": "ليلة الألعاب بدأت! هل يمكنك مساعدتنا في تنظيم بعض الألعاب التفاعلية الممتعة لبناء الروابط بين الفريق؟", + "title": "ليلة الألعاب" + }, + "modelUN": { + "description": "محاكاة مناظرات الأمم المتحدة والمفاوضات الدبلوماسية حول القضايا العالمية", + "emoji": "🌍", + "prompt": "دعنا نحاكي مناظرة الأمم المتحدة. هل يمكنك مساعدتنا في إعداد مفاوضات دبلوماسية حول القضايا العالمية؟", + "title": "محاكاة الأمم المتحدة" + }, + "werewolf": { + "description": "لعبة اجتماعية تعتمد على الاستراتيجية والنقاش لكشف دور الذئب بين اللاعبين", + "emoji": "🐺", + "prompt": "دعنا نلعب لعبة الذئب! هل يمكنك مساعدتنا في إعداد القواعد وإدارة هذه اللعبة الاجتماعية الاستنتاجية؟", + "title": "لعبة الذئب" + } + }, + "general": { + "brainstorm": { + "description": "توليد أفكار إبداعية وحل المشكلات بشكل تعاوني من وجهات نظر متعددة", + "emoji": "🧠", + "prompt": "دعنا نبدأ جلسة عصف ذهني للمشروع. هل يمكنك مساعدتنا في توليد أفكار وحلول إبداعية؟", + "title": "جلسة العصف الذهني" + }, + "debate": { + "description": "نقاشات ومناظرات منظمة حول مواضيع وقضايا مختلفة", + "emoji": "⚖️", + "prompt": "دعنا نجري مناظرة منظمة. هل يمكنك مساعدتنا في تنظيم نقاش منطقي حول هذا الموضوع؟", + "title": "نادي المناظرة" + }, + "languagePractice": { + "description": "ممارسة المحادثة وتعلم لغات جديدة مع الناطقين بها", + "emoji": "🗣️", + "prompt": "دعنا نمارس لغة جديدة معًا. هل يمكنك مساعدتنا في تعلم وممارسة التحدث بهذه اللغة؟", + "title": "ممارسة اللغة" + }, + "studyGroup": { + "description": "اجتماعات تعلم تعاونية، مناقشة المفاهيم وحل المشكلات معًا", + "emoji": "📚", + "prompt": "دعنا نشكل مجموعة دراسة. هل يمكنك مساعدتنا في فهم هذه المفاهيم وحل المشكلات معًا؟", + "title": "مجموعة الدراسة" + } + }, + "planning": { + "cookingClass": { + "description": "تعلم ومشاركة مهارات الطهي، الوصفات والتقاليد الطهوية", + "emoji": "👨‍🍳", + "prompt": "دعنا نحضر درس طبخ! هل يمكنك مساعدتنا في تعلم وصفات جديدة ومهارات الطهي؟", + "title": "صف الطبخ" + }, + "fitnessChallenge": { + "description": "تحديد أهداف لياقة جماعية، مشاركة تمارين وتحفيز بعضنا البعض", + "emoji": "💪", + "prompt": "دعنا نبدأ تحدي اللياقة! هل يمكنك مساعدتنا في تحديد الأهداف وتحفيز بعضنا البعض للحفاظ على الصحة؟", + "title": "تحدي اللياقة" + }, + "planningPoker": { + "description": "تقنية تقدير مهام المشروع وحجم العمل باستخدام بطاقات التخطيط الرشيق", + "emoji": "🃏", + "prompt": "نحن نقوم بلعب البوكر التخطيطي للمشروع. هل يمكنك مساعدتنا في استخدام تقنيات الرشيق لتقدير حجم هذه المهام؟", + "title": "بوكر التخطيط" + }, + "travelPlanning": { + "description": "تخطيط الرحلات، مشاركة تجارب السفر واكتشاف وجهات جديدة", + "emoji": "✈️", + "prompt": "دعنا نخطط رحلة معًا! هل يمكنك مساعدتنا في البحث عن الوجهات وتخطيط مسار الرحلة؟", + "title": "تخطيط السفر" + } + }, + "product": { + "codeReview": { + "description": "مناقشة تقنية ومراجعة الأقران لتغييرات وتنفيذ الشيفرة البرمجية", + "emoji": "💻", + "prompt": "دعنا نراجع بعض الشيفرات معًا. هل يمكنك مساعدتنا في تحليل هذه الشيفرات وتحديد مجالات التحسين؟", + "title": "مراجعة الشيفرة" + }, + "designReview": { + "description": "اجتماعات تعاونية لتقديم ملاحظات على مفاهيم التصميم، النماذج الأولية أو الأعمال الإبداعية", + "emoji": "🎨", + "prompt": "نحتاج إلى مراجعة بعض التصاميم. هل يمكنك مساعدتنا في تقديم ملاحظات بناءة على مفاهيم التصميم والنماذج الأولية؟", + "title": "مراجعة التصميم" + }, + "sprintPlanning": { + "description": "تقنية تقدير مهام المشروع وحجم العمل باستخدام بطاقات التخطيط الرشيق", + "emoji": "🃏", + "prompt": "نحن نقوم بلعب البوكر التخطيطي للمشروع. هل يمكنك مساعدتنا في استخدام تقنيات الرشيق لتقدير حجم هذه المهام؟", + "title": "بوكر التخطيط" + }, + "techExchange": { + "description": "مناقشة التقنيات الناشئة، الابتكار واتجاهات الصناعة", + "emoji": "🚀", + "prompt": "دعنا نجري تبادلًا تقنيًا! هل يمكنك مساعدتنا في مناقشة التقنيات الناشئة واتجاهات الصناعة؟", + "title": "تبادل تقني" + } + }, + "title": "توصيات استخدام الدردشة الجماعية", + "writing": { + "bookClub": { + "description": "مناقشات وتحليلات أدبية للكتب، القصص والأعمال الأدبية", + "emoji": "📖", + "prompt": "دعنا نبدأ مناقشة نادي الكتاب. هل يمكنك مساعدتنا في تحليل هذا الكتاب ومناقشة مواضيعه؟", + "title": "نادي الكتاب" + }, + "movieClub": { + "description": "مشاهدة ومناقشة الأفلام، الوثائقيات والوسائط البصرية معًا", + "emoji": "🎬", + "prompt": "دعنا نبدأ مناقشة نادي الأفلام. هل يمكنك مساعدتنا في تحليل هذا الفيلم ومناقشة مواضيعه؟", + "title": "نادي الأفلام" + }, + "musicSession": { + "description": "جلسات تعاون في تأليف الموسيقى، المشاركة والتقدير", + "emoji": "🎵", + "prompt": "دعنا نقم بجلسة ارتجال موسيقية! هل يمكنك مساعدتنا في إنشاء وتقدير الموسيقى معًا؟", + "title": "جلسة الموسيقى الارتجالية" + }, + "studyGroup": { + "description": "اجتماعات تعلم تعاونية، مناقشة المفاهيم وحل المشكلات معًا", + "emoji": "📚", + "prompt": "دعنا نشكل مجموعة دراسة. هل يمكنك مساعدتنا في فهم هذه المفاهيم وحل المشكلات معًا؟", + "title": "مجموعة الدراسة" + } + } + }, + "groupMessage": "مرحبًا بك في الدردشة الجماعية! تعاون مع عدة مساعدين من الذكاء الاصطناعي في مساحة محادثة مشتركة.", + "groupTemplates": { + "analysis": { + "description": "رؤى مدفوعة بالبيانات، بحث وتحليل معمق", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "أنت بارع في معالجة البيانات وتفسيرها، وتكشف عن الأنماط والاتجاهات الكامنة وراء البيانات من خلال الرسوم البيانية والتحليلات الإحصائية.", + "title": "محلل بيانات" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "أنت خبير بحث، مسؤول عن جمع المعلومات والبحث المعمق، قادر على تحليل المشكلات من عدة أبعاد بشكل شامل.", + "title": "خبير بحث" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "أنت خبير إحصاء، متمكن من مختلف الطرق والنماذج الإحصائية، قادر على استخراج رؤى تجارية قيمة من البيانات.", + "title": "خبير إحصاء" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "أنت محلل كمي، متخصص في النمذجة الكمية وتقييم المخاطر، تستخدم الطرق الرياضية لحل المشكلات المعقدة.", + "title": "محلل كمي" + } + ], + "title": "فريق التحليل" + }, + "brainstorm": { + "description": "تفكير إبداعي متعدد الأبعاد، تحفيز إمكانيات لا محدودة", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "أنت مدير إبداعي، ماهر في التحكم في اتجاه الإبداع من منظور شامل، قادر على تحويل المفاهيم المجردة إلى خطط إبداعية قابلة للتنفيذ.", + "title": "مدير إبداعي" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "أنت خبير ابتكار، مسؤول عن اكتشاف حلول جديدة وأفكار مبتكرة، تجيد التفكير خارج الأطر التقليدية.", + "title": "خبير ابتكار" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "أنت خبير تفكير تصميمي، تفكر من منظور تجربة المستخدم والعرض البصري، تركز على التعبير الإبداعي المرئي.", + "title": "خبير تفكير تصميمي" + } + ], + "title": "مجموعة العصف الذهني" + }, + "game": { + "description": "الاستمتاع بألعاب نصية متعددة اللاعبين مثل لعبة الذئب ومن هو العميل السري", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "أنت ماهر في المشاركة في مختلف ألعاب النص المتعددة اللاعبين، وقادر على اللعب وفقًا لقواعد اللعبة.", + "title": "لاعب" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "أنت ماهر في المشاركة في مختلف ألعاب النص المتعددة اللاعبين، وقادر على اللعب وفقًا لقواعد اللعبة.", + "title": "لاعب" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "أنت ماهر في المشاركة في مختلف ألعاب النص المتعددة اللاعبين، وقادر على اللعب وفقًا لقواعد اللعبة.", + "title": "لاعب" + } + ], + "title": "صالة الألعاب" + }, + "planning": { + "description": "التخطيط الاستراتيجي وإدارة المشاريع، تنسيق شامل", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "أنت مسؤول عن التخطيط العام للمشروع، مراقبة التقدم وتنسيق الموارد لضمان إتمام المشروع في الوقت المحدد وبجودة عالية.", + "title": "طباخ" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "أنت مسؤول عن وضع الخطط الاستراتيجية طويلة الأمد، تحليل فرص السوق، تحديد الأهداف ومسارات التنفيذ.", + "title": "خبير شراء المواد" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "أنت مسؤول عن وضع خطط تنفيذية مفصلة، تنسيق موارد الأقسام المختلفة وضمان قابلية تنفيذ الخطة.", + "title": "خبير تطوير الطعام" + } + ], + "title": "فريق تطوير الطعام" + }, + "product": { + "description": "تصميم وتطوير المنتجات، ابتكار منتجات عالية الجودة", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "أنت مصمم، ماهر في تصميم مختلف أنواع المنتجات، قادر على التصميم وفق متطلبات المنتج.", + "title": "مصمم" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "أنت مدير منتج، مسؤول عن تخطيط وتصميم وتطوير وصيانة المنتج، لضمان جودة المنتج وتجربة المستخدم.", + "title": "مدير منتج" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "أنت مهندس شامل ذو خبرة، ماهر في تطوير مختلف أنواع المنتجات، قادر على التطوير وفق متطلبات المنتج.", + "title": "مهندس شامل" + } + ], + "title": "فريق تطوير المنتج" + }, + "writing": { + "description": "إنشاء المحتوى والتحرير، ابتكار نصوص عالية الجودة", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "أنت ماهر في إنشاء محتوى بأنماط أدبية مختلفة، وقادر على تعديل أسلوب الكتابة حسب المشاهد والجمهور.", + "title": "كاتب محتوى" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "أنت محرر، مسؤول عن تدقيق النصوص، تنقيحها وتحسينها، لضمان دقة المحتوى وسلاسته واحترافيته.", + "title": "محرر" + } + ], + "title": "دائرة الكتابة" + } + }, "qa": { "q01": "ما هو LobeHub؟", "q02": "ما هو {{appName}}؟", diff --git a/locales/bg-BG/chat.json b/locales/bg-BG/chat.json index 4074f38c947..183d636f344 100644 --- a/locales/bg-BG/chat.json +++ b/locales/bg-BG/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Модел" }, + "active": "Активен", "agentDefaultMessage": "Здравейте, аз съм **{{name}}**, можете да започнете разговор с мен веднага или да отидете на [Настройки на асистента]({{url}}), за да попълните информацията ми.", "agentDefaultMessageWithSystemRole": "Здравейте, аз съм **{{name}}**. Как мога да ви помогна?", "agentDefaultMessageWithoutEdit": "Здравейте, аз съм **{{name}}**. Как мога да ви помогна?", @@ -13,17 +14,28 @@ "thought": "Процес на мислене", "unknownTitle": "Неназован артефакт" }, + "availableAgents": "Налични асистенти", "backToBottom": "Върни се в началото", "chatList": { "longMessageDetail": "Вижте детайлите" }, "clearCurrentMessages": "Изчисти съобщенията от текущата сесия", "confirmClearCurrentMessages": "На път си да изчистиш съобщенията от текущата сесия. След като бъдат изчистени, те не могат да бъдат възстановени. Моля, потвърди действието си.", + "confirmRemoveChatGroupItemAlert": "Груповият чат ще бъде изтрит, но членовете на групата няма да бъдат засегнати. Моля, потвърдете действието си.", + "confirmRemoveGroupItemAlert": "Ще изтриете тази група. След изтриването помощниците ѝ ще бъдат преместени в списъка по подразбиране. Моля, потвърдете действието си.", + "confirmRemoveGroupSuccess": "Груповият чат е изтрит успешно", "confirmRemoveSessionItemAlert": "На път си да изтриеш този агент. След като бъде изтрит, той не може да бъде възстановен. Моля, потвърди действието си.", "confirmRemoveSessionSuccess": "Сесията е успешно изтрита", "defaultAgent": "Агент по подразбиране", + "defaultGroupChat": "Групов чат", "defaultList": "Списък по подразбиране", "defaultSession": "Агент по подразбиране", + "dm": { + "placeholder": "Вашите лични съобщения с {{agentTitle}} ще се показват тук.", + "tooltip": "Изпрати лично съобщение", + "visibleTo": "Видимо само за {{target}}", + "you": "ти" + }, "duplicateSession": { "loading": "Копиране...", "success": "Копирането е успешно", @@ -58,11 +70,56 @@ "title": "Извличане на съдържание от уеб връзки" } }, + "group": { + "desc": "Сътрудничете с няколко асистента с изкуствен интелект в споделено пространство за разговор.", + "memberTooltip": "В групата има {{count}} членове", + "orchestratorThinking": "Водещият мисли...", + "removeMember": "Премахване на член", + "title": "Група" + }, + "groupDescription": "Описание на групата", + "groupSidebar": { + "members": { + "addMember": "Добавяне на член", + "memberSettings": "Настройки на член", + "orchestrator": "Водещ", + "orchestratorThinking": "Водещият мисли...", + "removeMember": "Премахване на член", + "stopOrchestrator": "Спиране на мисленето", + "triggerOrchestrator": "Започване на групов чат" + }, + "tabs": { + "host": "Водещ", + "members": "Членове", + "role": "Настройка" + } + }, + "groupWizard": { + "chooseMembers": "Изберете съществуващи асистенти...", + "createGroup": "Създаване на групов чат", + "existingMembers": "Съществуващи помощници", + "groupMembers": "Тези асистенти също ще бъдат добавени към вашия списък", + "host": { + "description": "Автоматизира работата на груповия чат", + "title": "Водещ", + "tooltip": "Ако деактивирате водещия на груповия чат, ще трябва ръчно да @споменете членовете, за да могат да отговорят" + }, + "memberCount": "{{count}} членове", + "noMatchingTemplates": "Няма съвпадащи шаблони", + "noSelectedTemplates": "Не са избрани шаблони", + "noTemplateMembers": "В шаблона няма членове", + "noTemplates": "Няма налични шаблони", + "searchTemplates": "Търсене на шаблони...", + "title": "Създаване на групов чат", + "useTemplate": "Използвай шаблон" + }, + "hideForYou": "Съдържанието на личните съобщения е скрито. Моля, активирайте „Показване на съдържанието на личните съобщения“ в настройките, за да го видите.", "history": { "title": "Асистентът ще запомни само последните {{count}} съобщения" }, "historyRange": "Диапазон на историята", "historySummary": "Исторически обобщение на съобщения", + "inactive": "Неактивен", "inbox": { "desc": "Активирай мозъчния клъстер и събуди креативното мислене. Твоят виртуален агент е тук, за да общува с теб за всичко.", "title": "Просто чати" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Разбирам и анализирам вашето намерение..." }, + "inviteMembers": "Поканете членове", "knowledgeBase": { "all": "Всички съдържания", "allFiles": "Всички файлове", @@ -101,12 +159,29 @@ "uploadGuide": "Качените файлове могат да бъдат прегледани в „База знания“", "viewMore": "Вижте още" }, + "memberSelection": { + "addMember": "Добавяне на член", + "allMembers": "Всички членове", + "createGroup": "Създаване на групов чат", + "noAvailableAgents": "Няма налични асистенти за покана", + "noSelectedAgents": "Все още не са избрани асистенти", + "searchAgents": "Търсене на асистенти...", + "setInitialMembers": "Избор на членове на групата" + }, + "members": "Членове", + "mention": { + "title": "Споменаване на членове" + }, "messageAction": { "delAndRegenerate": "Изтрий и прегенерирай", "deleteDisabledByThreads": "Съществуват подтеми, не можете да изтриете.", "regenerate": "Прегенерирай" }, "messages": { + "dm": { + "sentTo": "Видимо само за {{name}}", + "title": "Лично съобщение" + }, "modelCard": { "credit": "Кредити", "creditPricing": "Ценообразуване", @@ -156,6 +231,13 @@ "previousMessage": "Предишно съобщение" }, "newAgent": "Нов агент", + "newGroupChat": "Създаване на нов групов чат", + "noAgentsYet": "В тази група все още няма асистенти. Натиснете бутона +, за да поканите асистенти.", + "noAvailableAgents": "Няма налични асистенти за поканване", + "noMatchingAgents": "Няма съвпадащи помощници", + "noMembersYet": "В тази група все още няма членове. Щракнете върху бутона +, за да поканите асистенти.", + "noSelectedAgents": "Все още не е избран помощник", + "owner": "Собственик на групата", "pin": "Закачи", "pinOff": "Откачи", "rag": { @@ -196,12 +278,16 @@ "title": "Търсене в интернет" }, "searchAgentPlaceholder": "Търсач на помощ...", + "searchAgents": "Асистент за търсене...", + "selectedAgents": "Избрани помощници", "sendPlaceholder": "Напиши съобщението си тук...", "sessionGroup": { "config": "Управление на групи", "confirmRemoveGroupAlert": "Тази група е на път да бъде изтрита. След изтриването, агентите в тази група ще бъдат преместени в списъка по подразбиране. Моля, потвърди действието си.", "createAgentSuccess": "Асистентът е създаден успешно", "createGroup": "Добави нова група", + "createGroupFailed": "Създаването на груповия чат не бе успешно", + "createGroupSuccess": "Груповият чат бе създаден успешно", "createSuccess": "Създадена успешно", "creatingAgent": "Създаване на асистент...", "inputPlaceholder": "Моля, въведете име на групата...", @@ -235,6 +321,12 @@ "loading": "Разпознаване...", "prettifying": "Изглаждане..." }, + "supervisor": { + "todoList": { + "allComplete": "Всички задачи са изпълнени", + "title": "Задачите са изпълнени" + } + }, "thread": { "divider": "Подтема", "threadMessageCount": "{{messageCount}} съобщения", @@ -248,6 +340,7 @@ "chats": "Чат съобщения", "historySummary": "Историческо резюме", "rest": "Оставащи", + "supervisor": "Водещ на групата", "systemRole": "Настройки на ролята", "title": "Детайли на токена", "tools": "Настройки на плъгина", @@ -273,6 +366,7 @@ "action": "Текст към говор", "clear": "Изчисти речта" }, + "untitledAgent": "Безименен асистент", "updateAgent": "Актуализирай информацията за агента", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "Размерът на видео файла не може да надвишава 20MB, текущият размер е {{actualSize}}" } }, + "you": "ти", "zenMode": "Режим на фокус" -} +} diff --git a/locales/bg-BG/error.json b/locales/bg-BG/error.json index 2f782cfcb7b..897f4ab3d3e 100644 --- a/locales/bg-BG/error.json +++ b/locales/bg-BG/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Заявката за услуга е неуспешна, моля, проверете конфигурацията или опитайте отново" }, + "supervisor": { + "decisionFailed": "Ръководителят на групата не може да работи. Моля, проверете конфигурацията на ръководителя си, за да се уверите, че е зададен правилният модел, API ключ и API адрес." + }, "testConnectionFailed": "Неуспешно свързване: {{error}}", "tts": { "responseError": "Заявката за услуга е неуспешна, моля, проверете конфигурацията или опитайте отново" diff --git a/locales/bg-BG/providers.json b/locales/bg-BG/providers.json index 80e420c23e0..c7fe97287ad 100644 --- a/locales/bg-BG/providers.json +++ b/locales/bg-BG/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock е услуга, предоставяна от Amazon AWS, фокусирана върху предоставянето на напреднали AI езикови и визуални модели за предприятия. Семейството на моделите включва серията Claude на Anthropic, серията Llama 3.1 на Meta и други, обхващащи разнообразие от опции от леки до високо производителни, поддържащи текстово генериране, диалог, обработка на изображения и много други задачи, подходящи за различни мащаби и нужди на бизнес приложения." }, "bfl": { - "description": "Водеща изследователска лаборатория за авангарден изкуствен интелект, която изгражда визуалната инфраструктура на утрешния ден." + "description": "Водеща лаборатория за авангардни изследвания в областта на изкуствения интелект, изграждаща визуалната инфраструктура на утрешния ден." + }, + "cerebras": { + "description": "Cerebras е AI платформа за извеждане, базирана на специализираната си система CS-3, създадена да предоставя най-бързите в света услуги за големи езикови модели (LLM) с незабавен отговор и висок капацитет на обработка. Тя е проектирана да елиминира закъсненията и да ускори сложни AI работни процеси, като генериране на код в реално време и изпълнение на агентски задачи." }, "cerebras": { "description": "Cerebras е AI платформа за извеждане, базирана на специализираната си система CS-3, създадена да предоставя най-бързите в света услуги за големи езикови модели (LLM) с незабавен отговор и висок капацитет на обработка. Тя е проектирана да елиминира закъсненията и да ускори сложни AI работни процеси, като генериране на код в реално време и изпълнение на агентски задачи." diff --git a/locales/bg-BG/setting.json b/locales/bg-BG/setting.json index e7a2b7d8f24..b8ef97c5095 100644 --- a/locales/bg-BG/setting.json +++ b/locales/bg-BG/setting.json @@ -35,9 +35,16 @@ "title": "Нулиране на всички настройки" } }, + "groupTab": { + "chat": "Чат", + "members": "Членове", + "meta": "Основна информация" + }, "header": { "desc": "Предпочитания и настройки на модела.", "global": "Глобални настройки", + "group": "Настройки на груповия чат", + "groupDesc": "Управление на текущия групов чат", "session": "Настройки на сесията", "sessionDesc": "Задаване на роля и предпочитания за сесия.", "sessionWithName": "Настройки на сесията · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Още модели са <1>планирани да бъдат добавени, очаквайте" }, + "message": { + "success": "Актуализацията беше успешна" + }, "plugin": { "addMCPPlugin": "Добавяне на MCP плъгин", "addTooltip": "Персонализиран плъгин", @@ -294,6 +304,101 @@ }, "title": "Общи настройки" }, + "settingGroup": { + "description": { + "placeholder": "Моля, въведете описание на груповия чат", + "title": "Описание на груповия чат" + }, + "name": { + "placeholder": "Моля, въведете име на груповия чат", + "title": "Име на груповия чат" + }, + "scene": { + "desc": "Изберете сцена за групов чат", + "options": { + "casual": "Свободно", + "productive": "Продуктивно" + }, + "title": "Сцена на груповия чат" + }, + "submit": "Актуализиране на груповия чат", + "systemPrompt": { + "placeholder": "Моля, въведете системно подсещане за водещия", + "title": "Системно подсещане за водещия" + }, + "title": "Информация за груповия чат" + }, + "settingGroupChat": { + "allowDM": { + "desc": "След изключване все още можете да изпращате лични съобщения до асистента", + "title": "Разреши лични съобщения от асистента" + }, + "enableSupervisor": { + "desc": "Активиране на функцията за модератор в груповия чат. Модераторът ще управлява хода на разговора", + "title": "Активирай модератор" + }, + "maxResponseInRow": { + "desc": "Изберете колко поредни съобщения може да отговори един член. Задайте 0 за деактивиране на ограничението.", + "title": "Брой поредни отговори" + }, + "model": { + "desc": "Изказванията на членовете на групата няма да бъдат засегнати. Някои модели не могат да се използват като модераторски модели.", + "title": "Модел на водещия" + }, + "orchestratorTitle": "Настройки на водещия", + "responseOrder": { + "desc": "Агентът ще отговаря в реда, зададен в груповия чат", + "options": { + "natural": "Естествен", + "sequential": "Последователен" + }, + "placeholder": "Изберете ред на отговор", + "title": "Ред на отговор" + }, + "responseSpeed": { + "desc": "Контролира общата скорост на груповия чат", + "options": { + "fast": "Бързо", + "medium": "Средно", + "slow": "Бавно" + }, + "placeholder": "Изберете скорост на отговор", + "title": "Скорост на отговор" + }, + "revealDM": { + "desc": "Позволява ви да виждате личните съобщения, изпратени до други членове.", + "title": "Показване на лични съобщения" + }, + "submit": "Актуализиране на настройките", + "systemPrompt": { + "desc": "Персонализирано системно подсещане за водещия на груповия чат. Това може да повлияе на поведението на водещия по подразбиране.", + "placeholder": "Моля, въведете персонализирано системно подсещане за водещия...", + "title": "Системно подсещане за водещия" + }, + "title": "Настройки на чата" + }, + "settingGroupMembers": { + "addToGroup": "Добавяне към групата", + "availableAgents": "Налични асистенти", + "defaultAgent": "Персонализиран асистент", + "disableHost": "Изключване на асистента на водещия", + "edit": "Редактиране на членове", + "empty": "В този групов чат няма агенти. Натиснете бутона +, за да добавите членове.", + "enableHost": "Включване на асистента на водещия", + "groupHost": "Водещ на групата", + "groupMembers": "Членове на групата", + "host": { + "description": "Когато водещият е в групата, груповият чат се управлява автоматично, подходящ за творчески задачи.", + "title": "Водещ" + }, + "noAvailableAgents": "Няма налични асистенти", + "noDescription": "Няма описание", + "noMembersInGroup": "Групата няма членове", + "owner": "Вие (собственик)", + "remove": "Премахване на член", + "removeFromGroup": "Премахване от групата", + "you": "Вие" + }, "settingImage": { "defaultCount": { "desc": "Задайте броя на изображенията по подразбиране, които да се генерират при създаване на нова задача в панела за генериране на изображения.", @@ -522,6 +627,11 @@ "modelDesc": "Модел, предназначен за автоматично именуване на теми за AI рисуване", "title": "Автоматично именуване на теми за AI рисуване" }, + "groupChatSupervisor": { + "label": "Модел за надзор на груповите чатове", + "modelDesc": "Определя модела, използван за надзор и управление на разговори в груповите чатове", + "title": "Надзор на груповите чатове" + }, "helpInfo": "Когато създавате нов асистент, настройките по подразбиране ще се използват като предварителни стойности.", "historyCompress": { "label": "Модел на история на сесията", diff --git a/locales/bg-BG/welcome.json b/locales/bg-BG/welcome.json index 256bd89eaae..74c9f50ade7 100644 --- a/locales/bg-BG/welcome.json +++ b/locales/bg-BG/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Аз съм вашият личен интелигентен асистент {{appName}}. Как мога да ви помогна сега?
Ако имате нужда от по-професионален или персонализиран асистент, можете да кликнете на , за да създадете персонализиран асистент.", "defaultMessageWithoutCreate": "Аз съм вашият личен интелигентен асистент {{appName}}. Как мога да ви помогна сега?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Техническо обсъждане и преглед на промените в кода и реализацията от колеги", + "emoji": "💻", + "prompt": "Нека прегледаме някакъв код заедно. Можеш ли да ни помогнеш да анализираме този код и да идентифицираме възможности за подобрение?", + "title": "Преглед на код" + }, + "investment": { + "description": "Анализ на пазара, обсъждане на инвестиционни стратегии и споделяне на финансови прозрения", + "emoji": "📈", + "prompt": "Нека анализираме пазара заедно. Можеш ли да ни помогнеш да обсъдим инвестиционни стратегии и да споделим финансови прозрения?", + "title": "Инвестиционен клуб" + }, + "research": { + "description": "Изследване на научни концепции, провеждане на експерименти и споделяне на открития", + "emoji": "🔬", + "prompt": "Нека изследваме науката заедно! Можеш ли да ни помогнеш да проведем експерименти и да споделим нашите открития?", + "title": "Научна изложба" + }, + "study": { + "description": "Съвместни учебни сесии, обсъждане на концепции и решаване на проблеми заедно", + "emoji": "📚", + "prompt": "Нека сформираме учебна група. Можеш ли да ни помогнеш да разберем тези концепции и да решим проблемите заедно?", + "title": "Учебна група" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Създаване, коментиране и оценяване на различни форми на визуално и дигитално изкуство", + "emoji": "🖼️", + "prompt": "Нека организираме арт работилница! Можеш ли да ни помогнеш да създаваме, коментираме и оценяваме различни форми на изкуство?", + "title": "Арт работилница" + }, + "debate": { + "description": "Структурирани дискусии и дебати по различни теми и актуални въпроси", + "emoji": "⚖️", + "prompt": "Нека проведем структурирана дискусия. Можеш ли да ни помогнеш да организираме аргументиран дебат по тази тема?", + "title": "Дебатен клуб" + }, + "designReview": { + "description": "Съвместни сесии за обратна връзка относно дизайнерски концепции, прототипи или творчески проекти", + "emoji": "🎨", + "prompt": "Трябва да прегледаме някои дизайнерски проекти. Можеш ли да ни помогнеш да дадем конструктивна обратна връзка за концепциите и прототипите?", + "title": "Преглед на дизайн" + }, + "ideation": { + "description": "Многоаспектно сътрудничество за генериране на идеи и креативно решаване на проблеми", + "emoji": "🧠", + "prompt": "Нека започнем мозъчна атака за проекта. Можеш ли да ни помогнеш да генерираме идеи и решения?", + "title": "Мозъчна атака" + } + }, + "game": { + "debateClub": { + "description": "Структурирани дискусии и дебати по различни теми и актуални въпроси", + "emoji": "⚖️", + "prompt": "Нека проведем структурирана дискусия. Можеш ли да ни помогнеш да организираме аргументиран дебат по тази тема?", + "title": "Дебатен клуб" + }, + "gameNight": { + "description": "Забавни интерактивни игри и дейности за изграждане на екипен дух и забавление", + "emoji": "🎲", + "prompt": "Време е за игрова вечер! Можеш ли да ни помогнеш да организираме забавни интерактивни игри за изграждане на екипен дух?", + "title": "Игрова вечер" + }, + "modelUN": { + "description": "Симулация на ООН с дебати и дипломатически преговори по глобални въпроси", + "emoji": "🌍", + "prompt": "Нека симулираме дебат в ООН. Можеш ли да ни помогнеш да организираме дипломатически преговори по глобални въпроси?", + "title": "Симулация на ООН" + }, + "werewolf": { + "description": "Социална игра за разгадаване на вълци чрез стратегия и дискусии", + "emoji": "🐺", + "prompt": "Нека играем Вълк! Можеш ли да ни помогнеш да установим правилата и да водиш тази социална игра за разгадаване?", + "title": "Игра Вълк" + } + }, + "general": { + "brainstorm": { + "description": "Многоаспектно сътрудничество за генериране на идеи и креативно решаване на проблеми", + "emoji": "🧠", + "prompt": "Нека започнем мозъчна атака за проекта. Можеш ли да ни помогнеш да генерираме идеи и решения?", + "title": "Мозъчна атака" + }, + "debate": { + "description": "Структурирани дискусии и дебати по различни теми и актуални въпроси", + "emoji": "⚖️", + "prompt": "Нека проведем структурирана дискусия. Можеш ли да ни помогнеш да организираме аргументиран дебат по тази тема?", + "title": "Дебатен клуб" + }, + "languagePractice": { + "description": "Практика на говорене и учене на нов език с носители на езика", + "emoji": "🗣️", + "prompt": "Нека практикуваме нов език заедно. Можеш ли да ни помогнеш да учим и практикуваме говорене на този език?", + "title": "Езикова практика" + }, + "studyGroup": { + "description": "Съвместни учебни сесии, обсъждане на концепции и решаване на проблеми заедно", + "emoji": "📚", + "prompt": "Нека сформираме учебна група. Можеш ли да ни помогнеш да разберем тези концепции и да решим проблемите заедно?", + "title": "Учебна група" + } + }, + "planning": { + "cookingClass": { + "description": "Учене и споделяне на кулинарни умения, рецепти и традиции", + "emoji": "👨‍🍳", + "prompt": "Нека посетим кулинарен клас! Можеш ли да ни помогнеш да научим нови рецепти и кулинарни техники?", + "title": "Кулинарен клас" + }, + "fitnessChallenge": { + "description": "Поставяне на групови фитнес цели, споделяне на упражнения и взаимна мотивация", + "emoji": "💪", + "prompt": "Нека започнем фитнес предизвикателство! Можеш ли да ни помогнеш да поставим цели и да се мотивираме взаимно да останем здрави?", + "title": "Фитнес предизвикателство" + }, + "planningPoker": { + "description": "Аджайл техника за оценка на задачи и обем на работа чрез карти", + "emoji": "🃏", + "prompt": "Провеждаме планиращ покер за проекта. Можеш ли да ни помогнеш да използваме аджайл техники за оценка на обема на задачите?", + "title": "Планиращ покер" + }, + "travelPlanning": { + "description": "Планиране на пътувания, споделяне на преживявания и откриване на нови дестинации", + "emoji": "✈️", + "prompt": "Нека планираме пътуване заедно! Можеш ли да ни помогнеш да проучим дестинации и да организираме маршрута?", + "title": "Планиране на пътуване" + } + }, + "product": { + "codeReview": { + "description": "Техническо обсъждане и преглед на промените в кода и реализацията от колеги", + "emoji": "💻", + "prompt": "Нека прегледаме някакъв код заедно. Можеш ли да ни помогнеш да анализираме този код и да идентифицираме възможности за подобрение?", + "title": "Преглед на код" + }, + "designReview": { + "description": "Съвместни сесии за обратна връзка относно дизайнерски концепции, прототипи или творчески проекти", + "emoji": "🎨", + "prompt": "Трябва да прегледаме някои дизайнерски проекти. Можеш ли да ни помогнеш да дадем конструктивна обратна връзка за концепциите и прототипите?", + "title": "Преглед на дизайн" + }, + "sprintPlanning": { + "description": "Аджайл техника за оценка на задачи и обем на работа чрез карти", + "emoji": "🃏", + "prompt": "Провеждаме планиращ покер за проекта. Можеш ли да ни помогнеш да използваме аджайл техники за оценка на обема на задачите?", + "title": "Планиращ покер" + }, + "techExchange": { + "description": "Обсъждане на нови технологии, иновации и тенденции в индустрията", + "emoji": "🚀", + "prompt": "Нека проведем технически обмен! Можеш ли да ни помогнеш да обсъдим нови технологии и тенденции в индустрията?", + "title": "Технически обмен" + } + }, + "title": "Препоръки за използване на групов чат", + "writing": { + "bookClub": { + "description": "Литературни дискусии и анализи на книги, истории и литературни произведения", + "emoji": "📖", + "prompt": "Нека започнем дискусия в книжен клуб. Можеш ли да ни помогнеш да анализираме тази книга и да обсъдим темите ѝ заедно?", + "title": "Книжен клуб" + }, + "movieClub": { + "description": "Гледане и обсъждане на филми, документални и визуални медии заедно", + "emoji": "🎬", + "prompt": "Нека започнем дискусия в кино клуб. Можеш ли да ни помогнеш да анализираме този филм и да обсъдим темите му заедно?", + "title": "Кино клуб" + }, + "musicSession": { + "description": "Съвместно създаване, споделяне и оценяване на музика", + "emoji": "🎵", + "prompt": "Нека направим музикална импровизация! Можеш ли да ни помогнеш да създаваме и оценяваме музика заедно?", + "title": "Музикална импровизация" + }, + "studyGroup": { + "description": "Съвместни учебни сесии, обсъждане на концепции и решаване на проблеми заедно", + "emoji": "📚", + "prompt": "Нека сформираме учебна група. Можеш ли да ни помогнеш да разберем тези концепции и да решим проблемите заедно?", + "title": "Учебна група" + } + } + }, + "groupMessage": "Добре дошли в груповия чат! Сътрудничете с няколко AI помощника в споделено разговорно пространство.", + "groupTemplates": { + "analysis": { + "description": "Данни, водещи до прозрения, задълбочен анализ и изследване", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Вие сте експерт в обработката и тълкуването на данни, разкривайки закономерности и тенденции чрез диаграми и статистически анализи.", + "title": "Анализатор на данни" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Ти си изследовател, специализиран в събирането на информация и задълбочени проучвания, способен да анализира проблемите от множество гледни точки.", + "title": "Изследовател" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Ти си статистик, експерт в различни статистически методи и модели, който извлича ценни бизнес прозрения от данните.", + "title": "Статистик" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Ти си количествен анализатор, специализиран в количествено моделиране и оценка на риска, използващ математически методи за решаване на сложни проблеми.", + "title": "Количествен анализатор" + } + ], + "title": "Екип за анализ" + }, + "brainstorm": { + "description": "Многостранно креативно мислене, стимулиране на безкрайни възможности", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Ти си креативен директор, умел в управлението на творческата посока от макро ниво, способен да превръща абстрактни концепции в конкретни изпълними творчески решения.", + "title": "Креативен директор" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Ти си експерт по иновации, специализиран в откриването на новаторски решения и пробивни идеи, умеещ да мисли извън установените рамки.", + "title": "Експерт по иновации" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Ти си специалист по дизайн мислене, който разглежда проблемите от гледна точка на потребителското изживяване и визуалната презентация, с акцент върху визуалното изразяване на креативността.", + "title": "Дизайнер на мислене" + } + ], + "title": "Мозъчна атака група" + }, + "game": { + "description": "Забавлявай се с различни многопотребителски текстови игри, като Мафия и Кой е предателят", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Ти си експерт в различни многопотребителски текстови игри и можеш да играеш според правилата на играта.", + "title": "Играч" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Ти си експерт в различни многопотребителски текстови игри и можеш да играеш според правилата на играта.", + "title": "Играч" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Ти си експерт в различни многопотребителски текстови игри и можеш да играеш според правилата на играта.", + "title": "Играч" + } + ], + "title": "Игрална зала" + }, + "planning": { + "description": "Стратегическо планиране и управление на проекти, координиране на цялостната картина", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Отговаряш за цялостното планиране на проекта, контрол на напредъка и координация на ресурсите, за да осигуриш навременно и качествено изпълнение.", + "title": "Главен готвач" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Отговаряш за разработване на дългосрочни стратегически планове, анализ на пазарните възможности, поставяне на цели и определяне на пътища за постигането им.", + "title": "Експерт по снабдяване с продукти" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Отговаряш за изготвяне на детайлни оперативни планове, координация на ресурсите между отделите и осигуряване на изпълнимостта на плана.", + "title": "Експерт по кулинарни разработки" + } + ], + "title": "Екип за кулинарни разработки" + }, + "product": { + "description": "Проектиране и разработка на продукти, създаване на качествени продукти", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Ти си дизайнер, умел в проектирането на различни видове продукти, способен да проектира според изискванията на продукта.", + "title": "Дизайнер" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Ти си продуктов мениджър, отговорен за планирането, проектирането, разработката и поддръжката на продукта, осигурявайки качеството и потребителското изживяване.", + "title": "Продуктов мениджър" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Ти си опитен full-stack инженер, умел в разработката на различни видове продукти, способен да разработва според изискванията на продукта.", + "title": "Full-stack инженер" + } + ], + "title": "Екип за разработка на продукти" + }, + "writing": { + "description": "Създаване и редактиране на съдържание, създаване на качествени текстове", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Експерт си в създаването на съдържание в различни жанрове и можеш да адаптираш стила на писане според различни ситуации и аудитории.", + "title": "Писател на съдържание" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Ти си редактор, отговорен за корекция, полиране и оптимизиране на текстове, осигурявайки точност, плавност и професионализъм на съдържанието.", + "title": "Редактор" + } + ], + "title": "Кръг на писателите" + } + }, "qa": { "q01": "Какво е LobeHub?", "q02": "Какво е {{appName}}?", diff --git a/locales/de-DE/chat.json b/locales/de-DE/chat.json index 180f15c159b..da29f3fab99 100644 --- a/locales/de-DE/chat.json +++ b/locales/de-DE/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Modell" }, + "active": "Aktiv", "agentDefaultMessage": "Hallo, ich bin **{{name}}**. Du kannst sofort mit mir sprechen oder zu den [Assistenteneinstellungen]({{url}}) gehen, um meine Informationen zu vervollständigen.", "agentDefaultMessageWithSystemRole": "Hallo, ich bin **{{name}}**. Wie kann ich Ihnen behilflich sein?", "agentDefaultMessageWithoutEdit": "Hallo, ich bin **{{name}}**. Wie kann ich Ihnen behilflich sein?", @@ -13,17 +14,28 @@ "thought": "Denkenprozess", "unknownTitle": "Unbenanntes Werk" }, + "availableAgents": "Verfügbare Assistenten", "backToBottom": "Zurück zum Ende", "chatList": { "longMessageDetail": "Details anzeigen" }, "clearCurrentMessages": "Aktuelle Nachrichten löschen", "confirmClearCurrentMessages": "Möchtest du wirklich die aktuellen Nachrichten löschen? Diese Aktion kann nicht rückgängig gemacht werden.", + "confirmRemoveChatGroupItemAlert": "Die Gruppenunterhaltung wird gelöscht, die Mitglieder bleiben davon unberührt. Bitte bestätigen Sie Ihre Aktion.", + "confirmRemoveGroupItemAlert": "Sie sind dabei, diese Gruppe zu löschen. Nach der Löschung werden die Assistenten dieser Gruppe in die Standardliste verschoben. Bitte bestätigen Sie Ihre Aktion.", + "confirmRemoveGroupSuccess": "Gruppenchat erfolgreich gelöscht", "confirmRemoveSessionItemAlert": "Möchtest du diesen Assistenten wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", "confirmRemoveSessionSuccess": "Hilfe wurde erfolgreich entfernt", "defaultAgent": "Standardassistent", + "defaultGroupChat": "Gruppenchat", "defaultList": "Standardliste", "defaultSession": "Standardassistent", + "dm": { + "placeholder": "Ihre Direktnachrichten mit {{agentTitle}} werden hier angezeigt.", + "tooltip": "Direktnachricht senden", + "visibleTo": "Nur für {{target}} sichtbar", + "you": "Du" + }, "duplicateSession": { "loading": "Kopieren läuft...", "success": "Kopieren erfolgreich", @@ -58,11 +70,56 @@ "title": "Webseiten-Link-Inhalt extrahieren" } }, + "group": { + "desc": "Mit mehreren KI‑Assistenten in einem gemeinsamen Gesprächsraum zusammenarbeiten.", + "memberTooltip": "In der Gruppe sind {{count}} Mitglieder", + "orchestratorThinking": "Der Moderator denkt nach...", + "removeMember": "Mitglied entfernen", + "title": "Gruppe" + }, + "groupDescription": "Gruppenbeschreibung", + "groupSidebar": { + "members": { + "addMember": "Mitglied hinzufügen", + "memberSettings": "Mitgliedereinstellungen", + "orchestrator": "Moderator", + "orchestratorThinking": "Der Moderator denkt nach...", + "removeMember": "Mitglied entfernen", + "stopOrchestrator": "Nachdenken beenden", + "triggerOrchestrator": "Gruppenchat starten" + }, + "tabs": { + "host": "Moderator", + "members": "Mitglieder", + "role": "Einstellungen" + } + }, + "groupWizard": { + "chooseMembers": "Bestehende Assistenten auswählen...", + "createGroup": "Gruppenchat erstellen", + "existingMembers": "Bestehende Assistenten", + "groupMembers": "Diese Assistenten werden ebenfalls zu Ihrer Liste hinzugefügt", + "host": { + "description": "Automatisiert den Gruppenchat", + "title": "Moderator", + "tooltip": "Wenn der Gruppenmoderator deaktiviert ist, müssen Sie Mitglieder manuell mit @ erwähnen, damit sie antworten können." + }, + "memberCount": "{{count}} Mitglieder", + "noMatchingTemplates": "Keine passenden Vorlagen", + "noSelectedTemplates": "Keine Vorlagen ausgewählt", + "noTemplateMembers": "Keine Mitglieder in der Vorlage", + "noTemplates": "Keine Vorlagen verfügbar", + "searchTemplates": "Vorlagen durchsuchen...", + "title": "Gruppenchat erstellen", + "useTemplate": "Vorlage verwenden" + }, + "hideForYou": "Private Nachrichten sind ausgeblendet. Bitte aktivieren Sie in den Einstellungen „Private Nachrichten anzeigen“, um sie zu sehen.", "history": { "title": "Der Assistent wird nur die letzten {{count}} Nachrichten speichern" }, "historyRange": "Verlaufsbereich", "historySummary": "Zusammenfassung historischer Nachrichten", + "inactive": "Inaktiv", "inbox": { "desc": "Aktiviere das Gehirncluster und entfache den Funken des Denkens. Dein intelligenter Assistent, der mit dir über alles kommuniziert.", "title": "Lass uns plaudern" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Verstehe und analysiere gerade Ihre Absicht..." }, + "inviteMembers": "Mitglieder einladen", "knowledgeBase": { "all": "Alle Inhalte", "allFiles": "Alle Dateien", @@ -101,12 +159,29 @@ "uploadGuide": "Hochgeladene Dateien können in der „Wissensdatenbank“ eingesehen werden.", "viewMore": "Mehr anzeigen" }, + "memberSelection": { + "addMember": "Mitglied hinzufügen", + "allMembers": "Alle Mitglieder", + "createGroup": "Gruppenchat erstellen", + "noAvailableAgents": "Keine verfügbaren Assistenten zum Einladen", + "noSelectedAgents": "Noch keine Assistenten ausgewählt", + "searchAgents": "Assistenten suchen...", + "setInitialMembers": "Gruppenmitglieder auswählen" + }, + "members": "Mitglieder", + "mention": { + "title": "Mitglieder erwähnen" + }, "messageAction": { "delAndRegenerate": "Löschen und neu generieren", "deleteDisabledByThreads": "Es gibt Unterthemen, die Löschung ist nicht möglich.", "regenerate": "Neu generieren" }, "messages": { + "dm": { + "sentTo": "Nur für {{name}} sichtbar", + "title": "Direktnachricht" + }, "modelCard": { "credit": "Punkte", "creditPricing": "Preisgestaltung", @@ -156,6 +231,13 @@ "previousMessage": "Vorherige Nachricht" }, "newAgent": "Neuer Assistent", + "newGroupChat": "Neue Gruppe erstellen", + "noAgentsYet": "In dieser Gruppe gibt es noch keine Assistenten. Klicken Sie auf die + Schaltfläche, um einen Assistenten einzuladen.", + "noAvailableAgents": "Keine verfügbaren Assistenten zum Einladen.", + "noMatchingAgents": "Keine passenden Assistenten", + "noMembersYet": "Diese Gruppe hat noch keine Mitglieder. Klicken Sie auf die +-Schaltfläche, um Assistenten einzuladen.", + "noSelectedAgents": "Noch keinen Assistenten ausgewählt", + "owner": "Gruppeninhaber", "pin": "Anheften", "pinOff": "Anheften aufheben", "rag": { @@ -196,12 +278,16 @@ "title": "Netzwerksuche" }, "searchAgentPlaceholder": "Suchassistent...", + "searchAgents": "Suchassistent...", + "selectedAgents": "Ausgewählte Assistenten", "sendPlaceholder": "Chat-Nachricht eingeben...", "sessionGroup": { "config": "Gruppenkonfiguration", "confirmRemoveGroupAlert": "Die Gruppe wird bald gelöscht. Nach dem Löschen werden die Assistenten in die Standardliste verschoben. Bitte bestätigen Sie Ihre Aktion.", "createAgentSuccess": "Assistent erfolgreich erstellt", "createGroup": "Neue Gruppe erstellen", + "createGroupFailed": "Gruppenerstellung fehlgeschlagen", + "createGroupSuccess": "Gruppe erfolgreich erstellt", "createSuccess": "Erstellung erfolgreich", "creatingAgent": "Assistent wird erstellt...", "inputPlaceholder": "Geben Sie den Gruppennamen ein...", @@ -235,6 +321,12 @@ "loading": "Erkenne...", "prettifying": "Verschönern..." }, + "supervisor": { + "todoList": { + "allComplete": "Alle Aufgaben erledigt", + "title": "Aufgaben abgeschlossen" + } + }, "thread": { "divider": "Unterthema", "threadMessageCount": "{{messageCount}} Nachrichten", @@ -248,6 +340,7 @@ "chats": "Chats", "historySummary": "Historische Zusammenfassung", "rest": "Verbleibend", + "supervisor": "Gruppenmoderator", "systemRole": "Systemrolle", "title": "Kontextdetails", "tools": "Werkzeuge", @@ -273,6 +366,7 @@ "action": "Sprachausgabe", "clear": "Sprachausgabe löschen" }, + "untitledAgent": "Unbenannter Assistent", "updateAgent": "Assistenteninformationen aktualisieren", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "Die Videodatei darf nicht größer als 20 MB sein, die aktuelle Dateigröße beträgt {{actualSize}}" } }, + "you": "du", "zenMode": "Fokusmodus" -} +} diff --git a/locales/de-DE/error.json b/locales/de-DE/error.json index aabc728ca57..71308af294a 100644 --- a/locales/de-DE/error.json +++ b/locales/de-DE/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Serviceanfrage fehlgeschlagen. Bitte überprüfen Sie die Konfiguration oder versuchen Sie es erneut" }, + "supervisor": { + "decisionFailed": "Der Gruppenleiter kann nicht arbeiten. Bitte überprüfen Sie Ihre Leiterkonfiguration und stellen Sie sicher, dass das richtige Modell, der API-Schlüssel und die API-Adresse korrekt konfiguriert sind." + }, "testConnectionFailed": "Verbindungstest fehlgeschlagen: {{error}}", "tts": { "responseError": "Serviceanfrage fehlgeschlagen. Bitte überprüfen Sie die Konfiguration oder versuchen Sie es erneut" diff --git a/locales/de-DE/providers.json b/locales/de-DE/providers.json index 4a15983efde..bf61fc5d1c4 100644 --- a/locales/de-DE/providers.json +++ b/locales/de-DE/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock ist ein Service von Amazon AWS, der sich darauf konzentriert, Unternehmen fortschrittliche KI-Sprach- und visuelle Modelle bereitzustellen. Die Modellfamilie umfasst die Claude-Serie von Anthropic, die Llama 3.1-Serie von Meta und mehr, und bietet eine Vielzahl von Optionen von leichtgewichtig bis hochleistungsfähig, die Textgenerierung, Dialoge, Bildverarbeitung und andere Aufgaben unterstützen und für Unternehmensanwendungen unterschiedlicher Größen und Anforderungen geeignet sind." }, "bfl": { - "description": "Ein führendes, an vorderster Front tätiges KI-Forschungslabor, das die visuelle Infrastruktur von morgen gestaltet." + "description": "Ein führendes, hochmodernes Forschungslabor für künstliche Intelligenz, das die visuelle Infrastruktur von morgen aufbaut." + }, + "cerebras": { + "description": "Cerebras ist eine KI-Inferenzplattform, die auf dem spezialisierten CS-3-System basiert. Sie wurde entwickelt, um weltweit die schnellsten, in Echtzeit reagierenden und hochdurchsatzfähigen LLM-Dienste bereitzustellen. Ziel ist es, Latenzen zu eliminieren und komplexe KI-Workflows wie die Echtzeit-Codegenerierung und Agentenaufgaben zu beschleunigen." }, "cerebras": { "description": "Cerebras ist eine KI-Inferenzplattform, die auf dem spezialisierten CS-3-System basiert. Sie wurde entwickelt, um weltweit die schnellsten, in Echtzeit reagierenden und hochdurchsatzfähigen LLM-Dienste bereitzustellen. Ziel ist es, Latenzen zu eliminieren und komplexe KI-Workflows wie die Echtzeit-Codegenerierung und Agentenaufgaben zu beschleunigen." diff --git a/locales/de-DE/setting.json b/locales/de-DE/setting.json index 3c1ab5f3e67..fafff4b4450 100644 --- a/locales/de-DE/setting.json +++ b/locales/de-DE/setting.json @@ -35,9 +35,16 @@ "title": "Alle Einstellungen zurücksetzen" } }, + "groupTab": { + "chat": "Chat", + "members": "Mitglieder", + "meta": "Grundinformationen" + }, "header": { "desc": "Präferenzen und Modellkonfigurationen.", "global": "Global Einstellungen", + "group": "Gruppeneinstellungen", + "groupDesc": "Verwalten Sie den aktuellen Gruppenchat", "session": "Sitzungseinstellungen", "sessionDesc": "Rollenkonfiguration und Sitzungspräferenzen.", "sessionWithName": "Sitzungseinstellungen · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Weitere Modelle werden <1>geplant, bitte freuen Sie sich auf weitere Updates" }, + "message": { + "success": "Erfolgreich aktualisiert" + }, "plugin": { "addMCPPlugin": "MCP-Plugin hinzufügen", "addTooltip": "Benutzerdefiniertes Plugin", @@ -294,6 +304,101 @@ }, "title": "Allgemeine Einstellungen" }, + "settingGroup": { + "description": { + "placeholder": "Bitte geben Sie eine Gruppenchat-Beschreibung ein", + "title": "Gruppenchat-Beschreibung" + }, + "name": { + "placeholder": "Bitte geben Sie einen Gruppennamen ein", + "title": "Gruppenchat-Name" + }, + "scene": { + "desc": "Gruppenchatszenario auswählen", + "options": { + "casual": "Freizeit", + "productive": "Produktivität" + }, + "title": "Gruppenchatszenario" + }, + "submit": "Gruppe aktualisieren", + "systemPrompt": { + "placeholder": "Bitte geben Sie den Systemhinweis für den Moderator ein", + "title": "Systemhinweis des Moderators" + }, + "title": "Gruppenchat-Informationen" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Wenn deaktiviert, kannst du dem Assistenten weiterhin direkt Nachrichten senden", + "title": "Direktnachrichten vom Assistenten erlauben" + }, + "enableSupervisor": { + "desc": "Aktiviere die Moderationsfunktion für Gruppenchats. Moderatoren verwalten den Gesprächsverlauf.", + "title": "Moderator aktivieren" + }, + "maxResponseInRow": { + "desc": "Wählen Sie, wie viele Nachrichten ein Mitglied hintereinander antworten kann. Setzen Sie auf 0, um diese Begrenzung zu deaktivieren.", + "title": "Anzahl der aufeinanderfolgenden Antworten" + }, + "model": { + "desc": "Beiträge von Gruppenmitgliedern bleiben unbeeinträchtigt. Einige Modelle können nicht als Moderatoren verwendet werden.", + "title": "Moderator-Modell" + }, + "orchestratorTitle": "Moderatoreinstellungen", + "responseOrder": { + "desc": "Der Agent antwortet in der im Gruppenchat festgelegten Reihenfolge.", + "options": { + "natural": "Natürlich", + "sequential": "Sequenziell" + }, + "placeholder": "Antwortreihenfolge wählen", + "title": "Antwortreihenfolge" + }, + "responseSpeed": { + "desc": "Steuert die allgemeine Geschwindigkeit des Gruppenchat-Verlaufs.", + "options": { + "fast": "Schnell", + "medium": "Mittel", + "slow": "Langsam" + }, + "placeholder": "Antwortgeschwindigkeit wählen", + "title": "Antwortgeschwindigkeit" + }, + "revealDM": { + "desc": "Macht private Nachrichten, die an andere Mitglieder gesendet wurden, für Sie sichtbar.", + "title": "Private Nachrichten anzeigen" + }, + "submit": "Einstellungen aktualisieren", + "systemPrompt": { + "desc": "Benutzerdefinierter Systemhinweis für den Moderator des Gruppenchats. Dies kann das Standardverhalten des Moderators beeinflussen.", + "placeholder": "Bitte geben Sie einen benutzerdefinierten Systemhinweis für den Moderator ein...", + "title": "Systemhinweis des Moderators" + }, + "title": "Chat-Einstellungen" + }, + "settingGroupMembers": { + "addToGroup": "Zur Gruppe hinzufügen", + "availableAgents": "Verfügbare Assistenten", + "defaultAgent": "Benutzerdefinierter Assistent", + "disableHost": "Moderator-Assistent deaktivieren", + "edit": "Mitglieder bearbeiten", + "empty": "In diesem Gruppenchat sind keine Agenten vorhanden. Klicken Sie auf die + Schaltfläche, um Mitglieder hinzuzufügen.", + "enableHost": "Moderator-Assistent aktivieren", + "groupHost": "Gruppenmoderator", + "groupMembers": "Gruppenmitglieder", + "host": { + "description": "Wenn der Moderator in der Gruppe ist, läuft der Gruppenchat automatisiert, geeignet für kreative Aufgaben.", + "title": "Moderator" + }, + "noAvailableAgents": "Keine verfügbaren Assistenten", + "noDescription": "Keine Beschreibung vorhanden", + "noMembersInGroup": "Keine Mitglieder in der Gruppe", + "owner": "Sie (Eigentümer)", + "remove": "Mitglied entfernen", + "removeFromGroup": "Aus der Gruppe entfernen", + "you": "Sie" + }, "settingImage": { "defaultCount": { "desc": "Legen Sie die Standardanzahl der Bilder fest, die beim Erstellen einer neuen Aufgabe im Bildgenerierungs-Panel erzeugt werden.", @@ -522,6 +627,11 @@ "modelDesc": "Modell zur automatischen Benennung von Themen für KI-Malerei", "title": "Automatische Benennung von KI-Malthemen" }, + "groupChatSupervisor": { + "label": "Gruppenchat-Überwachungsmodell", + "modelDesc": "Ein Modell, das zur Überwachung und Verwaltung von Gruppenchats verwendet wird.", + "title": "Überwachung und Verwaltung von Gruppenchats" + }, "helpInfo": "Beim Erstellen eines neuen Assistenten werden die Standardassistenteneinstellungen als Voreinstellungen verwendet.", "historyCompress": { "label": "Gesprächshistorienmodell", diff --git a/locales/de-DE/welcome.json b/locales/de-DE/welcome.json index 423daacf3c9..b11a8f1c53e 100644 --- a/locales/de-DE/welcome.json +++ b/locales/de-DE/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Ich bin Ihr persönlicher intelligenter Assistent {{appName}}. Wie kann ich Ihnen jetzt helfen?
Wenn Sie einen professionelleren oder maßgeschneiderten Assistenten benötigen, klicken Sie auf , um einen benutzerdefinierten Assistenten zu erstellen.", "defaultMessageWithoutCreate": "Ich bin Ihr persönlicher intelligenter Assistent {{appName}}. Wie kann ich Ihnen jetzt helfen?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Technische Diskussion und Peer-Review von Codeänderungen und Implementierungen", + "emoji": "💻", + "prompt": "Lass uns gemeinsam etwas Code überprüfen. Kannst du uns helfen, diesen Code zu analysieren und Verbesserungsmöglichkeiten zu identifizieren?", + "title": "Code-Review" + }, + "investment": { + "description": "Marktanalyse, Diskussion von Anlagestrategien und Teilen von Finanzinsights", + "emoji": "📈", + "prompt": "Lass uns gemeinsam den Markt analysieren. Kannst du uns helfen, Anlagestrategien zu diskutieren und Finanzinsights zu teilen?", + "title": "Investment-Club" + }, + "research": { + "description": "Erforschung wissenschaftlicher Konzepte, Durchführung von Experimenten und Teilen von Erkenntnissen", + "emoji": "🔬", + "prompt": "Lass uns gemeinsam Wissenschaft entdecken! Kannst du uns helfen, Experimente durchzuführen und unsere Erkenntnisse zu teilen?", + "title": "Wissenschaftsausstellung" + }, + "study": { + "description": "Kooperative Lernsitzungen, Diskussion von Konzepten und gemeinsames Lösen von Problemen", + "emoji": "📚", + "prompt": "Lass uns eine Lerngruppe bilden. Kannst du uns helfen, diese Konzepte zu verstehen und gemeinsam Probleme zu lösen?", + "title": "Lerngruppe" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Kreation, Kritik und Wertschätzung verschiedener Formen visueller und digitaler Kunst", + "emoji": "🖼️", + "prompt": "Lass uns einen Kunstworkshop veranstalten! Kannst du uns helfen, verschiedene Kunstformen zu kreieren, zu kritisieren und zu schätzen?", + "title": "Kunstworkshop" + }, + "debate": { + "description": "Strukturierte Diskussionen und Debatten zu verschiedenen Themen und aktuellen Ereignissen", + "emoji": "⚖️", + "prompt": "Lass uns eine strukturierte Debatte führen. Kannst du uns helfen, eine fundierte Diskussion zu diesem Thema zu organisieren?", + "title": "Debattierclub" + }, + "designReview": { + "description": "Kooperative Feedback-Sitzungen zu Designkonzepten, Prototypen oder kreativen Arbeiten", + "emoji": "🎨", + "prompt": "Wir müssen einige Designarbeiten überprüfen. Kannst du uns helfen, konstruktives Feedback zu Designkonzepten und Prototypen zu geben?", + "title": "Design-Review" + }, + "ideation": { + "description": "Kollaborative Ideengenerierung aus verschiedenen Perspektiven und kreative Problemlösung", + "emoji": "🧠", + "prompt": "Lass uns mit dem Brainstorming für das Projekt beginnen. Kannst du uns helfen, kreative Ideen und Lösungen zu entwickeln?", + "title": "Brainstorming" + } + }, + "game": { + "debateClub": { + "description": "Strukturierte Diskussionen und Debatten zu verschiedenen Themen und aktuellen Ereignissen", + "emoji": "⚖️", + "prompt": "Lass uns eine strukturierte Debatte führen. Kannst du uns helfen, eine fundierte Diskussion zu diesem Thema zu organisieren?", + "title": "Debattierclub" + }, + "gameNight": { + "description": "Unterhaltsame interaktive Spiele und Aktivitäten zur Teambildung und zum Spaß haben", + "emoji": "🎲", + "prompt": "Die Spielnacht beginnt! Kannst du uns helfen, einige unterhaltsame interaktive Spiele zur Teambildung zu organisieren?", + "title": "Spielnacht" + }, + "modelUN": { + "description": "Simulation von UN-Debatten und diplomatischen Verhandlungen zu globalen Themen", + "emoji": "🌍", + "prompt": "Lass uns eine UN-Debatte simulieren. Kannst du uns helfen, eine diplomatische Verhandlung zu globalen Themen zu gestalten?", + "title": "Model United Nations" + }, + "werewolf": { + "description": "Soziales Deduktionsspiel, bei dem Spieler durch Strategie und Diskussion die Werwölfe finden", + "emoji": "🐺", + "prompt": "Lass uns Werwolf spielen! Kannst du uns helfen, die Regeln festzulegen und das soziale Deduktionsspiel zu moderieren?", + "title": "Werwolf-Spiel" + } + }, + "general": { + "brainstorm": { + "description": "Kollaborative Ideengenerierung aus verschiedenen Perspektiven und kreative Problemlösung", + "emoji": "🧠", + "prompt": "Lass uns mit dem Brainstorming für das Projekt beginnen. Kannst du uns helfen, kreative Ideen und Lösungen zu entwickeln?", + "title": "Brainstorming" + }, + "debate": { + "description": "Strukturierte Diskussionen und Debatten zu verschiedenen Themen und aktuellen Ereignissen", + "emoji": "⚖️", + "prompt": "Lass uns eine strukturierte Debatte führen. Kannst du uns helfen, eine fundierte Diskussion zu diesem Thema zu organisieren?", + "title": "Debattierclub" + }, + "languagePractice": { + "description": "Sprachpraxis mit Muttersprachlern zum Sprechen und Lernen neuer Sprachen", + "emoji": "🗣️", + "prompt": "Lass uns gemeinsam eine neue Sprache üben. Kannst du uns helfen, diese Sprache zu lernen und zu sprechen?", + "title": "Sprachpraxis" + }, + "studyGroup": { + "description": "Kooperative Lernsitzungen, Diskussion von Konzepten und gemeinsames Lösen von Problemen", + "emoji": "📚", + "prompt": "Lass uns eine Lerngruppe bilden. Kannst du uns helfen, diese Konzepte zu verstehen und gemeinsam Probleme zu lösen?", + "title": "Lerngruppe" + } + }, + "planning": { + "cookingClass": { + "description": "Lernen und Teilen von Kochtechniken, Rezepten und kulinarischen Traditionen", + "emoji": "👨‍🍳", + "prompt": "Lass uns einen Kochkurs machen! Kannst du uns helfen, neue Rezepte und Kochtechniken zu lernen?", + "title": "Kochkurs" + }, + "fitnessChallenge": { + "description": "Setzen von Gruppenfitnesszielen, Teilen von Trainingsmethoden und gegenseitige Motivation", + "emoji": "💪", + "prompt": "Lass uns eine Fitness-Challenge starten! Kannst du uns helfen, Ziele zu setzen und uns gegenseitig zu motivieren, gesund zu bleiben?", + "title": "Fitness-Challenge" + }, + "planningPoker": { + "description": "Agile Schätztechnik mit Karten zur Abschätzung von Projektaufgaben und Arbeitsaufwand", + "emoji": "🃏", + "prompt": "Wir machen gerade Planning Poker für das Projekt. Kannst du uns helfen, diese Aufgaben mit agilen Techniken zu schätzen?", + "title": "Planning Poker" + }, + "travelPlanning": { + "description": "Reiseplanung, Teilen von Reiseerfahrungen und Entdecken neuer Ziele", + "emoji": "✈️", + "prompt": "Lass uns gemeinsam eine Reise planen! Kannst du uns helfen, Reiseziele zu recherchieren und die Reiseroute zu planen?", + "title": "Reiseplanung" + } + }, + "product": { + "codeReview": { + "description": "Technische Diskussion und Peer-Review von Codeänderungen und Implementierungen", + "emoji": "💻", + "prompt": "Lass uns gemeinsam etwas Code überprüfen. Kannst du uns helfen, diesen Code zu analysieren und Verbesserungsmöglichkeiten zu identifizieren?", + "title": "Code-Review" + }, + "designReview": { + "description": "Kooperative Feedback-Sitzungen zu Designkonzepten, Prototypen oder kreativen Arbeiten", + "emoji": "🎨", + "prompt": "Wir müssen einige Designarbeiten überprüfen. Kannst du uns helfen, konstruktives Feedback zu Designkonzepten und Prototypen zu geben?", + "title": "Design-Review" + }, + "sprintPlanning": { + "description": "Agile Schätztechnik mit Karten zur Abschätzung von Projektaufgaben und Arbeitsaufwand", + "emoji": "🃏", + "prompt": "Wir machen gerade Planning Poker für das Projekt. Kannst du uns helfen, diese Aufgaben mit agilen Techniken zu schätzen?", + "title": "Planning Poker" + }, + "techExchange": { + "description": "Diskussion über aufkommende Technologien, Innovationen und Branchentrends", + "emoji": "🚀", + "prompt": "Lass uns einen Technikaustausch machen! Kannst du uns helfen, über neue Technologien und Branchentrends zu diskutieren?", + "title": "Technikaustausch" + } + }, + "title": "Empfehlungen zur Nutzung von Gruppenchats", + "writing": { + "bookClub": { + "description": "Literarische Diskussion und Analyse von Büchern, Geschichten und literarischen Werken", + "emoji": "📖", + "prompt": "Lass uns mit der Buchclub-Diskussion beginnen. Kannst du uns helfen, dieses Buch zu analysieren und seine Themen zu erkunden?", + "title": "Buchclub" + }, + "movieClub": { + "description": "Gemeinsames Anschauen und Diskutieren von Filmen, Dokumentationen und visuellen Medien", + "emoji": "🎬", + "prompt": "Lass uns mit der Filmclub-Diskussion beginnen. Kannst du uns helfen, diesen Film zu analysieren und seine Themen zu erkunden?", + "title": "Filmclub" + }, + "musicSession": { + "description": "Kooperative Musikproduktion, Teilen und Wertschätzung von Musik", + "emoji": "🎵", + "prompt": "Lass uns eine musikalische Jam-Session machen! Kannst du uns helfen, gemeinsam Musik zu kreieren und zu genießen?", + "title": "Musik-Jam" + }, + "studyGroup": { + "description": "Kooperative Lernsitzungen, Diskussion von Konzepten und gemeinsames Lösen von Problemen", + "emoji": "📚", + "prompt": "Lass uns eine Lerngruppe bilden. Kannst du uns helfen, diese Konzepte zu verstehen und gemeinsam Probleme zu lösen?", + "title": "Lerngruppe" + } + } + }, + "groupMessage": "Willkommen im Gruppenchat! Kollaborieren Sie mit mehreren KI-Assistenten in einem gemeinsamen Gesprächsraum.", + "groupTemplates": { + "analysis": { + "description": "Datengetriebene Erkenntnisse, tiefgehende Forschung und Analyse", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Du bist spezialisiert auf die Verarbeitung und Interpretation von Daten und deckst durch Diagramme und statistische Analysen Muster und Trends hinter den Daten auf.", + "title": "Datenanalyst" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Du bist Forschungsexperte, zuständig für Informationssammlung und tiefgehende Untersuchungen, analysierst Probleme aus verschiedenen Perspektiven umfassend.", + "title": "Forschungsexperte" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Du bist Statistikexperte, versiert in verschiedenen statistischen Methoden und Modellen, extrahierst wertvolle geschäftliche Erkenntnisse aus Daten.", + "title": "Statistikexperte" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Du bist quantitativer Analyst, spezialisiert auf quantitative Modellierung und Risikobewertung, löst komplexe Probleme mit mathematischen Methoden.", + "title": "Quantitativer Analyst" + } + ], + "title": "Analyse-Team" + }, + "brainstorm": { + "description": "Kreatives Denken aus mehreren Blickwinkeln, unendliche Möglichkeiten entfesseln", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Du bist Kreativdirektor, meisterst die kreative Ausrichtung aus makroskopischer Sicht, verwandelst abstrakte Konzepte in konkrete, umsetzbare Ideen.", + "title": "Kreativdirektor" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Du bist Innovationsspezialist, findest neuartige Lösungen und bahnbrechende Denkansätze, denkst außerhalb gewohnter Rahmen.", + "title": "Innovationsspezialist" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Du bist Design-Thinking-Experte, betrachtest Probleme aus Nutzererlebnis- und visueller Perspektive, legst Wert auf kreative Visualisierung.", + "title": "Design-Thinking-Experte" + } + ], + "title": "Brainstorming-Gruppe" + }, + "game": { + "description": "Spiele verschiedene Mehrspieler-Textspiele wie Werwolf und Wer ist der Maulwurf", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Du bist erfahren in der Teilnahme an verschiedenen Mehrspieler-Textspielen und kannst nach den Spielregeln spielen.", + "title": "Spieler" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Du bist erfahren in der Teilnahme an verschiedenen Mehrspieler-Textspielen und kannst nach den Spielregeln spielen.", + "title": "Spieler" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Du bist erfahren in der Teilnahme an verschiedenen Mehrspieler-Textspielen und kannst nach den Spielregeln spielen.", + "title": "Spieler" + } + ], + "title": "Spielhalle" + }, + "planning": { + "description": "Strategische Planung und Projektmanagement, Gesamtkoordination", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Du bist verantwortlich für die Gesamtplanung, Fortschrittskontrolle und Ressourcenkoordination des Projekts, um eine termingerechte und qualitativ hochwertige Fertigstellung sicherzustellen.", + "title": "Koch" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Du bist verantwortlich für die Entwicklung langfristiger strategischer Pläne, Marktanalysen, Zielsetzungen und Umsetzungswege.", + "title": "Einkaufsspezialist" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Du bist verantwortlich für die Erstellung detaillierter Ausführungspläne, Koordination der Ressourcen verschiedener Abteilungen und Sicherstellung der Umsetzbarkeit der Pläne.", + "title": "Experte für Lebensmittelentwicklung" + } + ], + "title": "Lebensmittelentwicklungsteam" + }, + "product": { + "description": "Produktdesign und -entwicklung, hochwertige Produkte schaffen", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Du bist Designer, spezialisiert auf die Gestaltung verschiedener Produkttypen, entwirfst entsprechend den Produktanforderungen.", + "title": "Designer" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Du bist Produktmanager, verantwortlich für Planung, Design, Entwicklung und Wartung des Produkts, sicherst Qualität und Nutzererlebnis.", + "title": "Produktmanager" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Du bist erfahrener Full-Stack-Entwickler, entwickelst verschiedene Produkttypen, setzt Produktanforderungen um.", + "title": "Full-Stack-Entwickler" + } + ], + "title": "Produktentwicklungsteam" + }, + "writing": { + "description": "Inhaltserstellung und Redaktion, hochwertige Texte gestalten", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Du bist erfahren im Verfassen von Inhalten verschiedener Stilrichtungen und kannst den Schreibstil je nach Szenario und Zielgruppe anpassen.", + "title": "Content-Autor" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Du bist Redakteur, verantwortlich für Korrektur, Überarbeitung und Optimierung von Texten, sicherst Genauigkeit, Flüssigkeit und Professionalität.", + "title": "Redakteur" + } + ], + "title": "Schreibteam" + } + }, "qa": { "q01": "Was ist LobeHub?", "q02": "Was ist {{appName}}?", diff --git a/locales/en-US/chat.json b/locales/en-US/chat.json index 5dc793470b1..bc87f45892e 100644 --- a/locales/en-US/chat.json +++ b/locales/en-US/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Model" }, + "active": "Active", "agentDefaultMessage": "Hello, I am **{{name}}**. You can start a conversation with me right away, or you can go to [Assistant Settings]({{url}}) to complete my information.", "agentDefaultMessageWithSystemRole": "Hello, I am **{{name}}**. How can I assist you today?", "agentDefaultMessageWithoutEdit": "Hello, I am **{{name}}**. How can I assist you today?", @@ -13,17 +14,28 @@ "thought": "Thought", "unknownTitle": "Untitled Work" }, + "availableAgents": "Available assistants", "backToBottom": "Back to bottom", "chatList": { "longMessageDetail": "View Details" }, "clearCurrentMessages": "Clear current session messages", "confirmClearCurrentMessages": "You are about to clear the current session messages. Once cleared, they cannot be retrieved. Please confirm your action.", + "confirmRemoveChatGroupItemAlert": "You are about to delete this group chat. Group members will not be affected. Please confirm your action.", + "confirmRemoveGroupItemAlert": "You are about to delete this group. After deletion, its assistants will be moved to the default list. Please confirm your action.", + "confirmRemoveGroupSuccess": "Group chat deleted successfully", "confirmRemoveSessionItemAlert": "You are about to delete this assistant. Once deleted, it cannot be retrieved. Please confirm your action.", "confirmRemoveSessionSuccess": "Assistant removed successfully", "defaultAgent": "Default Assistant", + "defaultGroupChat": "Group Chat", "defaultList": "Default List", "defaultSession": "Default Assistant", + "dm": { + "placeholder": "Your private messages with {{agentTitle}} will appear here.", + "tooltip": "Send a private message", + "visibleTo": "Visible to {{target}} only", + "you": "You" + }, "duplicateSession": { "loading": "Copying...", "success": "Copy successful", @@ -58,11 +70,56 @@ "title": "Extract Webpage Link Content" } }, + "group": { + "desc": "Collaborate with multiple AI assistants in a shared conversation space.", + "memberTooltip": "There are {{count}} members in the group", + "orchestratorThinking": "The host is thinking...", + "removeMember": "Remove Member", + "title": "Group" + }, + "groupDescription": "Group description", + "groupSidebar": { + "members": { + "addMember": "Add Member", + "memberSettings": "Member Settings", + "orchestrator": "Host", + "orchestratorThinking": "The host is thinking...", + "removeMember": "Remove Member", + "stopOrchestrator": "Stop Thinking", + "triggerOrchestrator": "Start Group Chat" + }, + "tabs": { + "host": "Host", + "members": "Members", + "role": "Settings" + } + }, + "groupWizard": { + "chooseMembers": "Select existing assistants...", + "createGroup": "Create Group Chat", + "existingMembers": "Existing Assistants", + "groupMembers": "These assistants will also be added to your list", + "host": { + "description": "Automate group chat operations", + "title": "Host", + "tooltip": "If group chat hosting is disabled, you'll need to manually @mention members to get their responses." + }, + "memberCount": "{{count}} members", + "noMatchingTemplates": "No matching templates", + "noSelectedTemplates": "No templates selected", + "noTemplateMembers": "No members in the template", + "noTemplates": "No templates available", + "searchTemplates": "Search templates...", + "title": "Create Group Chat", + "useTemplate": "Use Template" + }, + "hideForYou": "Direct message content is hidden. Please enable 'Show Direct Message Content' in settings to view.", "history": { "title": "The assistant will only remember the last {{count}} messages." }, "historyRange": "History Range", "historySummary": "Historical Message Summary", + "inactive": "Inactive", "inbox": { "desc": "Activate the brain cluster and spark creative thinking. Your virtual assistant is here to communicate with you about everything.", "title": "Just Chat" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Understanding and analyzing your intent..." }, + "inviteMembers": "Invite members", "knowledgeBase": { "all": "All Content", "allFiles": "All Files", @@ -101,12 +159,29 @@ "uploadGuide": "Uploaded files can be viewed in the 'Knowledge Base'.", "viewMore": "View More" }, + "memberSelection": { + "addMember": "Add Member", + "allMembers": "All members", + "createGroup": "Create Group Chat", + "noAvailableAgents": "No assistants available to invite", + "noSelectedAgents": "No assistants selected yet", + "searchAgents": "Search assistants...", + "setInitialMembers": "Select Group Members" + }, + "members": "Members", + "mention": { + "title": "Mention Members" + }, "messageAction": { "delAndRegenerate": "Delete and Regenerate", "deleteDisabledByThreads": "There are subtopics, deletion is not allowed", "regenerate": "Regenerate" }, "messages": { + "dm": { + "sentTo": "Visible only to {{name}}", + "title": "Direct Message" + }, "modelCard": { "credit": "Credits", "creditPricing": "Pricing", @@ -156,6 +231,13 @@ "previousMessage": "Previous message" }, "newAgent": "New Assistant", + "newGroupChat": "New Group Chat", + "noAgentsYet": "There are no assistants in this group yet. Click the + button to invite an assistant.", + "noAvailableAgents": "No assistants available to invite", + "noMatchingAgents": "No matching assistants", + "noMembersYet": "This group doesn't have any members yet. Click the + button to invite assistants.", + "noSelectedAgents": "No assistant selected yet", + "owner": "Group Owner", "pin": "Pin", "pinOff": "Unpin", "rag": { @@ -196,12 +278,16 @@ "title": "Online Search" }, "searchAgentPlaceholder": "Search assistants...", + "searchAgents": "Search assistants...", + "selectedAgents": "Selected agents", "sendPlaceholder": "Type your message here...", "sessionGroup": { "config": "Group Management", "confirmRemoveGroupAlert": "This group is about to be deleted. After deletion, the assistants in this group will be moved to the default list. Please confirm your operation.", "createAgentSuccess": "Assistant created successfully", "createGroup": "Add New Group", + "createGroupFailed": "Failed to create group chat", + "createGroupSuccess": "Group chat created successfully", "createSuccess": "Created successfully", "creatingAgent": "Creating assistant...", "inputPlaceholder": "Please enter group name...", @@ -235,6 +321,12 @@ "loading": "Recognizing...", "prettifying": "Polishing..." }, + "supervisor": { + "todoList": { + "allComplete": "All tasks completed", + "title": "Tasks Completed" + } + }, "thread": { "divider": "Subtopic", "threadMessageCount": "{{messageCount}} messages", @@ -248,6 +340,7 @@ "chats": "Chat Messages", "historySummary": "History Summary", "rest": "Remaining", + "supervisor": "Group Host", "systemRole": "Role Settings", "title": "Context Details", "tools": "Plugin Settings", @@ -273,6 +366,7 @@ "action": "Text-to-Speech", "clear": "Clear Speech" }, + "untitledAgent": "Untitled Assistant", "updateAgent": "Update Assistant Information", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "Video file size must not exceed 20MB. Current file size is {{actualSize}}." } }, + "you": "you", "zenMode": "Zen Mode" -} +} diff --git a/locales/en-US/error.json b/locales/en-US/error.json index a61ac9e6344..cb222e9fab9 100644 --- a/locales/en-US/error.json +++ b/locales/en-US/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Service request failed, please check the configuration or try again" }, + "supervisor": { + "decisionFailed": "The group host is unable to function. Please check your host configuration to ensure the correct model, API Key, and API endpoint are set." + }, "testConnectionFailed": "Test connection failed: {{error}}", "tts": { "responseError": "Service request failed, please check the configuration or try again" diff --git a/locales/en-US/providers.json b/locales/en-US/providers.json index ee0907e3096..3f6f320094a 100644 --- a/locales/en-US/providers.json +++ b/locales/en-US/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock is a service provided by Amazon AWS, focusing on delivering advanced AI language and visual models for enterprises. Its model family includes Anthropic's Claude series, Meta's Llama 3.1 series, and more, offering a range of options from lightweight to high-performance, supporting tasks such as text generation, conversation, and image processing for businesses of varying scales and needs." }, "bfl": { - "description": "A leading, cutting-edge artificial intelligence research lab building the visual infrastructure of tomorrow." + "description": "A leading, cutting-edge AI research lab building the visual infrastructure of tomorrow." + }, + "cerebras": { + "description": "Cerebras is an AI inference platform built on its dedicated CS-3 system, designed to deliver the world's fastest, real-time, high-throughput LLM services. It is specifically engineered to eliminate latency and accelerate complex AI workflows such as real-time code generation and agent-based tasks." }, "cerebras": { "description": "Cerebras is an AI inference platform built on its dedicated CS-3 system, designed to deliver the world's fastest, real-time, high-throughput LLM services. It is specifically engineered to eliminate latency and accelerate complex AI workflows such as real-time code generation and agent-based tasks." diff --git a/locales/en-US/setting.json b/locales/en-US/setting.json index 32e6c10f2b2..e114342f7be 100644 --- a/locales/en-US/setting.json +++ b/locales/en-US/setting.json @@ -35,9 +35,16 @@ "title": "Reset All Settings" } }, + "groupTab": { + "chat": "Chat", + "members": "Members", + "meta": "Basic Info" + }, "header": { "desc": "Preferences and model settings.", "global": "Global Settings", + "group": "Group Chat Settings", + "groupDesc": "Manage the current group chat", "session": "Session Settings", "sessionDesc": "Role settings and session preferences.", "sessionWithName": "Session Settings · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "More models are <1>planned to be added, stay tuned" }, + "message": { + "success": "Update successful" + }, "plugin": { "addMCPPlugin": "Add MCP Plugin", "addTooltip": "Custom Plugin", @@ -294,6 +304,101 @@ }, "title": "General Settings" }, + "settingGroup": { + "description": { + "placeholder": "Please enter the group chat description", + "title": "Group Chat Description" + }, + "name": { + "placeholder": "Please enter the group chat name", + "title": "Group Chat Name" + }, + "scene": { + "desc": "Select group chat scenario", + "options": { + "casual": "Casual", + "productive": "Productive" + }, + "title": "Group Chat Scenario" + }, + "submit": "Update Group Chat", + "systemPrompt": { + "placeholder": "Please enter the host system prompt", + "title": "Host System Prompt" + }, + "title": "Group Chat Information" + }, + "settingGroupChat": { + "allowDM": { + "desc": "When turned off, you can still send direct messages to the assistant", + "title": "Allow Direct Messages from Assistant" + }, + "enableSupervisor": { + "desc": "The host will manage the flow of the conversation.", + "title": "Enable Host" + }, + "maxResponseInRow": { + "desc": "Select how many consecutive messages a member can reply with. Set to 0 to disable this limit.", + "title": "Consecutive Reply Count" + }, + "model": { + "desc": "Group members' messages will not be affected. Some models cannot be used as host models.", + "title": "Host Model" + }, + "orchestratorTitle": "Host Settings", + "responseOrder": { + "desc": "The agent will reply in the order set within the group chat", + "options": { + "natural": "Natural", + "sequential": "Sequential" + }, + "placeholder": "Select reply order", + "title": "Reply Order" + }, + "responseSpeed": { + "desc": "Controls the overall pace of the group chat", + "options": { + "fast": "Fast", + "medium": "Medium", + "slow": "Slow" + }, + "placeholder": "Select reply speed", + "title": "Reply Speed" + }, + "revealDM": { + "desc": "Make private messages sent to other members visible to you.", + "title": "Show Private Messages" + }, + "submit": "Update Settings", + "systemPrompt": { + "desc": "Custom system prompt for the group chat host. This may affect the default host behavior.", + "placeholder": "Please enter a custom host system prompt...", + "title": "Host System Prompt" + }, + "title": "Chat Settings" + }, + "settingGroupMembers": { + "addToGroup": "Add to Group", + "availableAgents": "Available Assistants", + "defaultAgent": "Custom Assistant", + "disableHost": "Disable Host Assistant", + "edit": "Edit Member", + "empty": "No agents in this group chat yet. Click the + button to add members.", + "enableHost": "Enable Host Assistant", + "groupHost": "Group Host", + "groupMembers": "Group Members", + "host": { + "description": "When the host is in the group, the chat runs automatically, suitable for brainstorming tasks.", + "title": "Host" + }, + "noAvailableAgents": "No available assistants", + "noDescription": "No description", + "noMembersInGroup": "No members in the group", + "owner": "You (Owner)", + "remove": "Remove Member", + "removeFromGroup": "Remove from Group", + "you": "You" + }, "settingImage": { "defaultCount": { "desc": "Set the default number of images generated when creating a new task in the image generation panel.", @@ -522,6 +627,11 @@ "modelDesc": "Model designated for automatic naming of AI art topics", "title": "AI Art Automatic Topic Naming" }, + "groupChatSupervisor": { + "label": "Group Chat Supervision Model", + "modelDesc": "Model for supervising and managing group chat conversations.", + "title": "Group Chat Supervision" + }, "helpInfo": "When creating a new assistant, the default assistant settings will be used as preset values.", "historyCompress": { "label": "Conversation History Model", @@ -553,7 +663,7 @@ "tab": { "about": "About", "agent": "Default Assistant", - "common": "Common Settings", + "common": "General", "experiment": "Experiment", "hotkey": "Hotkeys", "image": "AI Drawing", diff --git a/locales/en-US/welcome.json b/locales/en-US/welcome.json index da90dd1f20f..4748fb6b1b5 100644 --- a/locales/en-US/welcome.json +++ b/locales/en-US/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "I am your personal intelligent assistant {{appName}}. How can I assist you today?
If you need a more professional or customized assistant, you can click to create a custom assistant.", "defaultMessageWithoutCreate": "I am your personal intelligent assistant {{appName}}. How can I assist you today?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Technical discussion and peer review of code changes and implementations", + "emoji": "💻", + "prompt": "Let's review some code together. Can you help us analyze this code and identify areas for improvement?", + "title": "Code Review" + }, + "investment": { + "description": "Analyze markets, discuss investment strategies, and share financial insights", + "emoji": "📈", + "prompt": "Let's analyze the market together. Can you help us discuss investment strategies and share financial insights?", + "title": "Investment Club" + }, + "research": { + "description": "Explore scientific concepts, conduct experiments, and share discoveries", + "emoji": "🔬", + "prompt": "Let's explore science together! Can you help us conduct experiments and share our findings?", + "title": "Science Exhibition" + }, + "study": { + "description": "Collaborative study sessions to discuss concepts and solve problems together", + "emoji": "📚", + "prompt": "Let's form a study group. Can you help us understand these concepts and solve problems together?", + "title": "Study Group" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Create, critique, and appreciate various forms of visual and digital art", + "emoji": "🖼️", + "prompt": "Let's hold an art workshop! Can you help us create, critique, and appreciate various forms of art?", + "title": "Art Workshop" + }, + "debate": { + "description": "Structured discussions and debates on various topics and current events", + "emoji": "⚖️", + "prompt": "Let's have a structured debate. Can you help us organize a reasoned discussion on this topic?", + "title": "Debate Club" + }, + "designReview": { + "description": "Collaborative feedback sessions on design concepts, prototypes, or creative works", + "emoji": "🎨", + "prompt": "We need to review some designs. Can you help us provide constructive feedback on design concepts and prototypes?", + "title": "Design Review" + }, + "ideation": { + "description": "Collaborative multi-perspective idea generation and creative problem solving", + "emoji": "🧠", + "prompt": "Let's start brainstorming for the project. Can you help us generate creative ideas and solutions?", + "title": "Brainstorming" + } + }, + "game": { + "debateClub": { + "description": "Structured discussions and debates on various topics and current events", + "emoji": "⚖️", + "prompt": "Let's have a structured debate. Can you help us organize a reasoned discussion on this topic?", + "title": "Debate Club" + }, + "gameNight": { + "description": "Fun interactive games and activities to build team bonds and enjoy ourselves", + "emoji": "🎲", + "prompt": "Game night is on! Can you help us organize some fun interactive games to build team spirit?", + "title": "Game Night" + }, + "modelUN": { + "description": "Simulated United Nations debates and diplomatic negotiations on global issues", + "emoji": "🌍", + "prompt": "Let's simulate a United Nations debate. Can you help us set up a diplomatic negotiation on global issues?", + "title": "Model United Nations" + }, + "werewolf": { + "description": "A social deduction game where players use strategy and discussion to identify werewolves", + "emoji": "🐺", + "prompt": "Let's play Werewolf! Can you help us set the rules and moderate this social deduction game?", + "title": "Werewolf Game" + } + }, + "general": { + "brainstorm": { + "description": "Collaborative multi-perspective idea generation and creative problem solving", + "emoji": "🧠", + "prompt": "Let's start brainstorming for the project. Can you help us generate creative ideas and solutions?", + "title": "Brainstorming" + }, + "debate": { + "description": "Structured discussions and debates on various topics and current events", + "emoji": "⚖️", + "prompt": "Let's have a structured debate. Can you help us organize a reasoned discussion on this topic?", + "title": "Debate Club" + }, + "languagePractice": { + "description": "Practice speaking and learn new languages with native speakers", + "emoji": "🗣️", + "prompt": "Let's practice a new language together. Can you help us learn and practice speaking this language?", + "title": "Language Practice" + }, + "studyGroup": { + "description": "Collaborative study sessions to discuss concepts and solve problems together", + "emoji": "📚", + "prompt": "Let's form a study group. Can you help us understand these concepts and solve problems together?", + "title": "Study Group" + } + }, + "planning": { + "cookingClass": { + "description": "Learn and share cooking skills, recipes, and culinary traditions", + "emoji": "👨‍🍳", + "prompt": "Let's have a cooking class! Can you help us learn new recipes and cooking techniques together?", + "title": "Cooking Class" + }, + "fitnessChallenge": { + "description": "Set group fitness goals, share workout methods, and motivate each other", + "emoji": "💪", + "prompt": "Let's start a fitness challenge! Can you help us set goals and motivate each other to stay healthy?", + "title": "Fitness Challenge" + }, + "planningPoker": { + "description": "Agile estimation technique using cards to estimate project tasks and workloads", + "emoji": "🃏", + "prompt": "We're doing planning poker for the project. Can you help us use agile techniques to estimate these tasks?", + "title": "Planning Poker" + }, + "travelPlanning": { + "description": "Plan trips, share travel experiences, and discover new destinations", + "emoji": "✈️", + "prompt": "Let's plan a trip together! Can you help us research destinations and organize the itinerary?", + "title": "Travel Planning" + } + }, + "product": { + "codeReview": { + "description": "Technical discussion and peer review of code changes and implementations", + "emoji": "💻", + "prompt": "Let's review some code together. Can you help us analyze this code and identify areas for improvement?", + "title": "Code Review" + }, + "designReview": { + "description": "Collaborative feedback sessions on design concepts, prototypes, or creative works", + "emoji": "🎨", + "prompt": "We need to review some designs. Can you help us provide constructive feedback on design concepts and prototypes?", + "title": "Design Review" + }, + "sprintPlanning": { + "description": "Agile estimation technique using cards to estimate project tasks and workloads", + "emoji": "🃏", + "prompt": "We're doing planning poker for the project. Can you help us use agile techniques to estimate these tasks?", + "title": "Planning Poker" + }, + "techExchange": { + "description": "Discuss emerging technologies, innovations, and industry trends", + "emoji": "🚀", + "prompt": "Let's have a tech exchange! Can you help us discuss emerging technologies and industry trends?", + "title": "Tech Exchange" + } + }, + "title": "Group Chat Usage Recommendations", + "writing": { + "bookClub": { + "description": "Literary discussions and analysis of books, stories, and literary works", + "emoji": "📖", + "prompt": "Let's start a book club discussion. Can you help us analyze this book and explore its themes together?", + "title": "Book Club" + }, + "movieClub": { + "description": "Watch and discuss movies, documentaries, and visual media together", + "emoji": "🎬", + "prompt": "Let's start a movie club discussion. Can you help us analyze this film and explore its themes together?", + "title": "Movie Club" + }, + "musicSession": { + "description": "Collaborative music creation, sharing, and appreciation sessions", + "emoji": "🎵", + "prompt": "Let's have a music jam session! Can you help us create and appreciate music together?", + "title": "Music Jam" + }, + "studyGroup": { + "description": "Collaborative study sessions to discuss concepts and solve problems together", + "emoji": "📚", + "prompt": "Let's form a study group. Can you help us understand these concepts and solve problems together?", + "title": "Study Group" + } + } + }, + "groupMessage": "Welcome to group chat! Collaborate with multiple AI assistants in a shared conversation space.", + "groupTemplates": { + "analysis": { + "description": "Data-driven insights, in-depth research and analysis", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "You excel at processing and interpreting data, uncovering patterns and trends through charts and statistical analysis.", + "title": "Data Analyst" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "You are a research expert responsible for information gathering and in-depth investigation, capable of comprehensive multi-dimensional analysis.", + "title": "Research Expert" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "You are a statistics expert proficient in various statistical methods and models, able to extract valuable business insights from data.", + "title": "Statistics Expert" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "You are a quantitative analyst specializing in quantitative modeling and risk assessment, solving complex problems using mathematical methods.", + "title": "Quantitative Analyst" + } + ], + "title": "Analysis Team" + }, + "brainstorm": { + "description": "Multi-perspective creative thinking, inspiring infinite possibilities", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "You are a creative director skilled at overseeing creative direction from a macro perspective, transforming abstract concepts into concrete, actionable creative plans.", + "title": "Creative Director" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "You are an innovation expert responsible for discovering novel solutions and breakthrough thinking, adept at thinking outside conventional frameworks.", + "title": "Innovation Expert" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "You are a design thinking specialist who approaches problems from user experience and visual presentation perspectives, emphasizing creative visualization.", + "title": "Design Thinking Specialist" + } + ], + "title": "Brainstorming Group" + }, + "game": { + "description": "Enjoy various multiplayer text games, such as Werewolf and Undercover", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "You excel at participating in various multiplayer text games and can play according to the game rules.", + "title": "Game Player" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "You excel at participating in various multiplayer text games and can play according to the game rules.", + "title": "Game Player" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "You excel at participating in various multiplayer text games and can play according to the game rules.", + "title": "Game Player" + } + ], + "title": "Game Hall" + }, + "planning": { + "description": "Strategic planning and project management, coordinating the big picture", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "You are responsible for overall project planning, progress control, and resource coordination to ensure timely and high-quality completion.", + "title": "Project Manager" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "You are responsible for developing long-term strategic plans, analyzing market opportunities, and setting goals and implementation paths.", + "title": "Strategy Lead" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "You are responsible for creating detailed execution plans, coordinating resources across departments, and ensuring plan feasibility.", + "title": "Culinary R&D Specialist" + } + ], + "title": "Culinary R&D Team" + }, + "product": { + "description": "Product design and development, creating high-quality products", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "You are a designer skilled in designing various types of products, able to design according to product requirements.", + "title": "Designer" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "You are a product manager responsible for product planning, design, development, and maintenance, ensuring product quality and user experience.", + "title": "Product Manager" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "You are an experienced full-stack engineer skilled in developing various types of products, able to develop according to product requirements.", + "title": "Full-Stack Engineer" + } + ], + "title": "Product Development Team" + }, + "writing": { + "description": "Content creation and editing, crafting high-quality copy", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "You specialize in creating content in various styles and can adjust your writing style according to different scenarios and audiences.", + "title": "Content Writer" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "You are an editor responsible for proofreading, polishing, and optimizing text, ensuring accuracy, fluency, and professionalism.", + "title": "Editor" + } + ], + "title": "Writing Circle" + } + }, "qa": { "q01": "What is LobeHub?", "q02": "What is {{appName}}?", diff --git a/locales/es-ES/chat.json b/locales/es-ES/chat.json index adc8819da96..2cccac22b45 100644 --- a/locales/es-ES/chat.json +++ b/locales/es-ES/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Cambiar modelo" }, + "active": "Activo", "agentDefaultMessage": "Hola, soy **{{name}}**. Puedes comenzar a hablar conmigo de inmediato o ir a [Configuración del asistente]({{url}}) para completar mi información.", "agentDefaultMessageWithSystemRole": "Hola, soy **{{name}}**, ¿en qué puedo ayudarte?", "agentDefaultMessageWithoutEdit": "Hola, soy **{{name}}**, ¿en qué puedo ayudarte?", @@ -13,17 +14,28 @@ "thought": "Proceso de pensamiento", "unknownTitle": "Obra sin título" }, + "availableAgents": "Agentes disponibles", "backToBottom": "Volver al fondo", "chatList": { "longMessageDetail": "Ver detalles" }, "clearCurrentMessages": "Borrar mensajes actuales", "confirmClearCurrentMessages": "Estás a punto de borrar los mensajes de esta sesión. Una vez borrados, no se podrán recuperar. Por favor, confirma tu acción.", + "confirmRemoveChatGroupItemAlert": "Se eliminará este chat grupal, los miembros del grupo no se verán afectados, por favor confirma tu acción", + "confirmRemoveGroupItemAlert": "Estás a punto de eliminar este grupo. Una vez eliminado, los asistentes de este grupo se moverán a la lista predeterminada. Por favor, confirma tu acción", + "confirmRemoveGroupSuccess": "El grupo de chat se eliminó con éxito", "confirmRemoveSessionItemAlert": "Estás a punto de eliminar este asistente. Una vez eliminado, no se podrá recuperar. Por favor, confirma tu acción.", "confirmRemoveSessionSuccess": "Asistente eliminado con éxito", "defaultAgent": "Asistente predeterminado", + "defaultGroupChat": "Chat grupal", "defaultList": "Lista predeterminada", "defaultSession": "Asistente predeterminado", + "dm": { + "placeholder": "Tus mensajes privados con {{agentTitle}} se mostrarán aquí.", + "tooltip": "Enviar mensaje privado", + "visibleTo": "Visible solo para {{target}}", + "you": "tú" + }, "duplicateSession": { "loading": "Cargando duplicado...", "success": "Duplicado exitoso", @@ -58,11 +70,56 @@ "title": "Extraer contenido del enlace web" } }, + "group": { + "desc": "Colabora con varios asistentes de IA en un espacio de conversación compartido.", + "memberTooltip": "El grupo tiene {{count}} miembros", + "orchestratorThinking": "El anfitrión está pensando...", + "removeMember": "Eliminar miembro", + "title": "Grupo" + }, + "groupDescription": "Descripción del grupo", + "groupSidebar": { + "members": { + "addMember": "Agregar miembro", + "memberSettings": "Configuración de miembros", + "orchestrator": "Anfitrión", + "orchestratorThinking": "El anfitrión está pensando...", + "removeMember": "Eliminar miembro", + "stopOrchestrator": "Detener pensamiento", + "triggerOrchestrator": "Iniciar chat grupal" + }, + "tabs": { + "host": "Anfitrión", + "members": "Miembros", + "role": "Configuración" + } + }, + "groupWizard": { + "chooseMembers": "Selecciona asistentes existentes...", + "createGroup": "Crear grupo de chat", + "existingMembers": "Asistentes existentes", + "groupMembers": "Estos asistentes también se agregarán a tu lista", + "host": { + "description": "Automatiza el funcionamiento del chat grupal", + "title": "Anfitrión", + "tooltip": "Si se desactiva el anfitrión del grupo, deberás mencionar manualmente a los miembros con @ para que puedan responder" + }, + "memberCount": "{{count}} miembros", + "noMatchingTemplates": "No hay plantillas que coincidan", + "noSelectedTemplates": "No se seleccionaron plantillas", + "noTemplateMembers": "No hay miembros en la plantilla", + "noTemplates": "No hay plantillas disponibles", + "searchTemplates": "Buscar plantillas...", + "title": "Crear grupo de chat", + "useTemplate": "Usar plantilla" + }, + "hideForYou": "El contenido del mensaje privado está oculto, por favor activa 【Mostrar contenido de mensajes privados】 en la configuración para verlo", "history": { "title": "El asistente solo recordará los últimos {{count}} mensajes" }, "historyRange": "Rango de historial", "historySummary": "Resumen de mensajes históricos", + "inactive": "inactivo", "inbox": { "desc": "Despierta la mente con el poder del cerebro colectivo. Tu asistente inteligente está aquí para conversar contigo sobre cualquier cosa.", "title": "Charla casual" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Entendiendo y analizando su intención..." }, + "inviteMembers": "Invitar a miembros", "knowledgeBase": { "all": "Todo el contenido", "allFiles": "Todos los archivos", @@ -101,12 +159,29 @@ "uploadGuide": "Los archivos subidos se pueden ver en la 'Base de conocimiento'.", "viewMore": "Ver más" }, + "memberSelection": { + "addMember": "Agregar miembro", + "allMembers": "Todos los miembros", + "createGroup": "Crear chat grupal", + "noAvailableAgents": "No hay asistentes disponibles para invitar", + "noSelectedAgents": "No se ha seleccionado ningún asistente", + "searchAgents": "Buscar asistentes...", + "setInitialMembers": "Seleccionar miembros del grupo" + }, + "members": "Miembros", + "mention": { + "title": "Mencionar miembros" + }, "messageAction": { "delAndRegenerate": "Eliminar y Regenerar", "deleteDisabledByThreads": "Existen subtemas, no se puede eliminar", "regenerate": "Regenerar" }, "messages": { + "dm": { + "sentTo": "Visible solo para {{name}}", + "title": "Mensaje privado" + }, "modelCard": { "credit": "Créditos", "creditPricing": "Precios", @@ -156,6 +231,13 @@ "previousMessage": "Mensaje anterior" }, "newAgent": "Nuevo asistente", + "newGroupChat": "Crear nuevo chat de grupo", + "noAgentsYet": "Este grupo aún no tiene asistentes. Haz clic en el botón + para invitar asistentes.", + "noAvailableAgents": "No hay asistentes disponibles para invitar", + "noMatchingAgents": "No se encontraron asistentes coincidentes", + "noMembersYet": "Este grupo aún no tiene miembros. Haz clic en el botón + para invitar asistentes.", + "noSelectedAgents": "No se ha seleccionado ningún asistente", + "owner": "Propietario del grupo", "pin": "Fijar", "pinOff": "Desfijar", "rag": { @@ -196,12 +278,16 @@ "title": "Búsqueda en línea" }, "searchAgentPlaceholder": "Asistente de búsqueda...", + "searchAgents": "Asistente de búsqueda...", + "selectedAgents": "Agentes seleccionados", "sendPlaceholder": "Escribe tu mensaje...", "sessionGroup": { "config": "Gestión de grupos", "confirmRemoveGroupAlert": "Estás a punto de eliminar este grupo. Una vez eliminado, los asistentes de este grupo se moverán a la lista predeterminada. Por favor, confirma tu acción.", "createAgentSuccess": "Asistente creado con éxito", "createGroup": "Crear nuevo grupo", + "createGroupFailed": "Error al crear el chat grupal", + "createGroupSuccess": "Chat grupal creado con éxito", "createSuccess": "Grupo creado con éxito", "creatingAgent": "Creando asistente...", "inputPlaceholder": "Introduce el nombre del grupo...", @@ -235,6 +321,12 @@ "loading": "Reconociendo...", "prettifying": "Embelleciendo..." }, + "supervisor": { + "todoList": { + "allComplete": "Todas las tareas están completadas", + "title": "Tareas completadas" + } + }, "thread": { "divider": "Subtema", "threadMessageCount": "{{messageCount}} mensajes", @@ -248,6 +340,7 @@ "chats": "Mensajes de chat", "historySummary": "Resumen histórico", "rest": "Restante", + "supervisor": "Anfitrión del grupo", "systemRole": "Rol del sistema", "title": "Detalles del token", "tools": "Herramientas", @@ -273,6 +366,7 @@ "action": "Lectura de voz", "clear": "Borrar voz" }, + "untitledAgent": "Asistente sin título", "updateAgent": "Actualizar información del asistente", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "El tamaño del archivo de video no puede superar los 20 MB, el tamaño actual es {{actualSize}}" } }, + "you": "tú", "zenMode": "Modo de concentración" -} +} diff --git a/locales/es-ES/components.json b/locales/es-ES/components.json index 5603c8ed123..ebed3081615 100644 --- a/locales/es-ES/components.json +++ b/locales/es-ES/components.json @@ -1,8 +1,8 @@ { "ArgsInput": { "addArgument": "Añadir argumento", - "argumentPlaceholder": "Argumento {{index}}", - "enterFirstArgument": "Introduce el primer argumento..." + "argumentPlaceholder": "Parámetro {{index}}", + "enterFirstArgument": "Introduce el primer parámetro..." }, "DragUpload": { "dragDesc": "Arrastra los archivos aquí, se admite la carga de múltiples imágenes.", @@ -145,10 +145,10 @@ "uploadingWithCount": "{{completed}}/{{total}} subidas" }, "validation": { - "fileSizeExceeded": "El tamaño del archivo supera el límite permitido", + "fileSizeExceeded": "El tamaño del archivo excede el límite", "fileSizeExceededDetail": "{{fileName}} ({{actualSize}}) supera el tamaño máximo permitido de {{maxSize}}", "fileSizeExceededMultiple": "{{count}} archivos superan el tamaño máximo permitido de {{maxSize}}: {{fileList}}", - "imageCountExceeded": "Se ha superado el límite de imágenes permitido" + "imageCountExceeded": "Se ha excedido el límite de imágenes" } }, "OllamaSetupGuide": { diff --git a/locales/es-ES/error.json b/locales/es-ES/error.json index ac2cf0049ef..24c540852ae 100644 --- a/locales/es-ES/error.json +++ b/locales/es-ES/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Error en la solicitud de servicio. Verifique la configuración o reintente" }, + "supervisor": { + "decisionFailed": "El moderador del grupo no puede funcionar. Por favor, verifica la configuración de tu moderador para asegurarte de que el modelo, la clave API y la dirección API estén configurados correctamente." + }, "testConnectionFailed": "Fallo en la prueba de conexión: {{error}}", "tts": { "responseError": "Error en la solicitud de servicio. Verifique la configuración o reintente" diff --git a/locales/es-ES/providers.json b/locales/es-ES/providers.json index fe52c7d78de..317f4069ec6 100644 --- a/locales/es-ES/providers.json +++ b/locales/es-ES/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock es un servicio proporcionado por Amazon AWS, enfocado en ofrecer modelos de lenguaje y visuales avanzados para empresas. Su familia de modelos incluye la serie Claude de Anthropic, la serie Llama 3.1 de Meta, entre otros, abarcando una variedad de opciones desde ligeras hasta de alto rendimiento, apoyando tareas como generación de texto, diálogos y procesamiento de imágenes, adecuadas para aplicaciones empresariales de diferentes escalas y necesidades." }, "bfl": { - "description": "Laboratorio líder en investigación de inteligencia artificial de vanguardia, construyendo la infraestructura visual del mañana." + "description": "Un laboratorio líder en investigación de inteligencia artificial de vanguardia que desarrolla la infraestructura visual del mañana." + }, + "cerebras": { + "description": "Cerebras es una plataforma de inferencia de IA basada en su sistema especializado CS-3, diseñada para ofrecer el servicio de LLM más rápido del mundo, con respuesta en tiempo real y alto rendimiento. Está especialmente concebida para eliminar la latencia y acelerar flujos de trabajo complejos de IA, como la generación de código en tiempo real y tareas de agentes." }, "cerebras": { "description": "Cerebras es una plataforma de inferencia de IA basada en su sistema especializado CS-3, diseñada para ofrecer el servicio de LLM más rápido del mundo, con respuesta en tiempo real y alto rendimiento. Está especialmente concebida para eliminar la latencia y acelerar flujos de trabajo complejos de IA, como la generación de código en tiempo real y tareas de agentes." diff --git a/locales/es-ES/setting.json b/locales/es-ES/setting.json index 8e89c63428e..e1f3c0e928f 100644 --- a/locales/es-ES/setting.json +++ b/locales/es-ES/setting.json @@ -35,9 +35,16 @@ "title": "Restablecer todas las configuraciones" } }, + "groupTab": { + "chat": "Chat", + "members": "Miembros", + "meta": "Información básica" + }, "header": { "desc": "Preferencias y configuración del modelo.", "global": "Configuración global", + "group": "Configuración del grupo", + "groupDesc": "Gestionar el grupo actual", "session": "Configuración de la sesión", "sessionDesc": "Configuración de roles y preferencias de sesión.", "sessionWithName": "Configuración de la sesión · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Más modelos están en <1>planificación para su incorporación, ¡estén atentos!" }, + "message": { + "success": "Actualización exitosa" + }, "plugin": { "addMCPPlugin": "Agregar complemento MCP", "addTooltip": "Agregar complemento personalizado", @@ -294,6 +304,101 @@ }, "title": "Configuración Común" }, + "settingGroup": { + "description": { + "placeholder": "Por favor, ingrese la descripción del grupo", + "title": "Descripción del grupo" + }, + "name": { + "placeholder": "Por favor, ingrese el nombre del grupo", + "title": "Nombre del grupo" + }, + "scene": { + "desc": "Selecciona el escenario del chat grupal", + "options": { + "casual": "Informal", + "productive": "Productivo" + }, + "title": "Escenario del chat grupal" + }, + "submit": "Actualizar grupo", + "systemPrompt": { + "placeholder": "Por favor, ingrese la indicación del sistema para el anfitrión", + "title": "Indicación del sistema para el anfitrión" + }, + "title": "Información del grupo" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Si se desactiva, aún podrás enviar mensajes directos al asistente", + "title": "Permitir mensajes directos del asistente" + }, + "enableSupervisor": { + "desc": "Activa la función de moderador del grupo; el moderador gestionará el flujo de la conversación", + "title": "Activar moderador" + }, + "maxResponseInRow": { + "desc": "Seleccione cuántos mensajes puede responder un miembro de forma consecutiva. Establecer en 0 desactiva esta limitación.", + "title": "Número de respuestas consecutivas" + }, + "model": { + "desc": "Las intervenciones de los miembros del grupo no se verán afectadas. Algunos modelos no pueden utilizarse como moderadores.", + "title": "Modelo del anfitrión" + }, + "orchestratorTitle": "Configuración del anfitrión", + "responseOrder": { + "desc": "Los agentes responderán en el orden establecido en el grupo.", + "options": { + "natural": "Natural", + "sequential": "Secuencial" + }, + "placeholder": "Seleccione el orden de respuesta", + "title": "Orden de respuesta" + }, + "responseSpeed": { + "desc": "Controla la velocidad general del chat grupal.", + "options": { + "fast": "Rápido", + "medium": "Medio", + "slow": "Lento" + }, + "placeholder": "Seleccione la velocidad de respuesta", + "title": "Velocidad de respuesta" + }, + "revealDM": { + "desc": "Permite ver los mensajes privados enviados a otros miembros.", + "title": "Mostrar contenido de mensajes privados" + }, + "submit": "Actualizar configuración", + "systemPrompt": { + "desc": "Indicación personalizada del sistema para el anfitrión del chat grupal. Esto puede afectar el comportamiento predeterminado del anfitrión.", + "placeholder": "Por favor, ingrese una indicación personalizada para el anfitrión...", + "title": "Indicación del sistema para el anfitrión" + }, + "title": "Configuración del chat" + }, + "settingGroupMembers": { + "addToGroup": "Unirse al grupo", + "availableAgents": "Asistentes disponibles", + "defaultAgent": "Asistente personalizado", + "disableHost": "Desactivar asistente del anfitrión", + "edit": "Editar miembro", + "empty": "No hay agentes en este grupo. Haga clic en el botón + para agregar miembros.", + "enableHost": "Activar asistente del anfitrión", + "groupHost": "Anfitrión del grupo", + "groupMembers": "Miembros del grupo", + "host": { + "description": "Cuando el anfitrión está en el grupo, el chat grupal se automatiza, ideal para tareas creativas.", + "title": "Anfitrión" + }, + "noAvailableAgents": "No hay asistentes disponibles", + "noDescription": "Sin descripción", + "noMembersInGroup": "El grupo no tiene miembros", + "owner": "Tú (propietario)", + "remove": "Eliminar miembro", + "removeFromGroup": "Eliminar del grupo", + "you": "Tú" + }, "settingImage": { "defaultCount": { "desc": "Establece la cantidad predeterminada de imágenes al crear una nueva tarea en el panel de generación de imágenes.", @@ -522,6 +627,11 @@ "modelDesc": "Modelo designado para la denominación automática de temas en pintura AI", "title": "Denominación automática de temas para pintura AI" }, + "groupChatSupervisor": { + "label": "Modelo de supervisión de chats grupales", + "modelDesc": "Modelo designado para supervisar y gestionar las conversaciones en chats grupales", + "title": "Supervisión y gestión de chats grupales" + }, "helpInfo": "Al crear un nuevo asistente, se utilizarán los ajustes predeterminados del asistente como valores predeterminados.", "historyCompress": { "label": "Modelo de historial de conversación", diff --git a/locales/es-ES/welcome.json b/locales/es-ES/welcome.json index f99a4d1219a..93810e85165 100644 --- a/locales/es-ES/welcome.json +++ b/locales/es-ES/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Soy su asistente inteligente personal {{appName}}. ¿En qué puedo ayudarle ahora?
Si necesita un asistente más profesional o personalizado, puede hacer clic en para crear un asistente personalizado.", "defaultMessageWithoutCreate": "Soy su asistente inteligente personal {{appName}}. ¿En qué puedo ayudarle ahora?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Discutir técnicamente y revisar en equipo los cambios e implementaciones de código", + "emoji": "💻", + "prompt": "Vamos a revisar algo de código juntos. ¿Puedes ayudarnos a analizar este código e identificar áreas de mejora?", + "title": "Revisión de Código" + }, + "investment": { + "description": "Analizar el mercado, debatir estrategias de inversión y compartir perspectivas financieras", + "emoji": "📈", + "prompt": "Vamos a analizar el mercado juntos. ¿Puedes ayudarnos a debatir estrategias de inversión y compartir perspectivas financieras?", + "title": "Club de Inversión" + }, + "research": { + "description": "Explorar conceptos científicos, realizar experimentos y compartir descubrimientos", + "emoji": "🔬", + "prompt": "¡Vamos a explorar la ciencia juntos! ¿Puedes ayudarnos a realizar experimentos y compartir nuestros hallazgos?", + "title": "Exposición Científica" + }, + "study": { + "description": "Sesiones colaborativas de aprendizaje para discutir conceptos y resolver problemas en conjunto", + "emoji": "📚", + "prompt": "Formemos un grupo de estudio. ¿Puedes ayudarnos a entender estos conceptos y resolver problemas juntos?", + "title": "Grupo de Estudio" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Crear, comentar y apreciar diversas formas de arte visual y digital", + "emoji": "🖼️", + "prompt": "¡Organicemos un taller de arte! ¿Puedes ayudarnos a crear, comentar y apreciar diferentes formas de arte?", + "title": "Taller de Arte" + }, + "debate": { + "description": "Discusión estructurada y debate sobre diversos temas y actualidad", + "emoji": "⚖️", + "prompt": "Vamos a realizar un debate estructurado. ¿Puedes ayudarnos a organizar una discusión fundamentada sobre este tema?", + "title": "Club de Debate" + }, + "designReview": { + "description": "Reuniones colaborativas para dar retroalimentación sobre conceptos de diseño, prototipos o creaciones", + "emoji": "🎨", + "prompt": "Necesitamos revisar algunos diseños. ¿Puedes ayudarnos a proporcionar retroalimentación constructiva sobre conceptos y prototipos?", + "title": "Revisión de Diseño" + }, + "ideation": { + "description": "Generación colaborativa de ideas desde múltiples perspectivas y resolución creativa de problemas", + "emoji": "🧠", + "prompt": "Comencemos una sesión de lluvia de ideas para el proyecto. ¿Puedes ayudarnos a generar ideas y soluciones creativas?", + "title": "Lluvia de Ideas" + } + }, + "game": { + "debateClub": { + "description": "Discusión estructurada y debate sobre diversos temas y actualidad", + "emoji": "⚖️", + "prompt": "Vamos a realizar un debate estructurado. ¿Puedes ayudarnos a organizar una discusión fundamentada sobre este tema?", + "title": "Club de Debate" + }, + "gameNight": { + "description": "Juegos interactivos divertidos y actividades para fortalecer lazos de equipo y disfrutar", + "emoji": "🎲", + "prompt": "¡Comienza la noche de juegos! ¿Puedes ayudarnos a organizar juegos interactivos divertidos para fortalecer el equipo?", + "title": "Noche de Juegos" + }, + "modelUN": { + "description": "Simulación de debates de la ONU y negociaciones diplomáticas sobre temas globales", + "emoji": "🌍", + "prompt": "Vamos a simular un debate de la ONU. ¿Puedes ayudarnos a organizar una negociación diplomática sobre temas globales?", + "title": "Modelo de Naciones Unidas" + }, + "werewolf": { + "description": "Juego social de deducción donde los jugadores identifican a los lobos mediante estrategia y discusión", + "emoji": "🐺", + "prompt": "¡Juguemos al juego de los lobos! ¿Puedes ayudarnos a establecer las reglas y moderar este juego de deducción social?", + "title": "Juego de Lobos" + } + }, + "general": { + "brainstorm": { + "description": "Generación colaborativa de ideas desde múltiples perspectivas y resolución creativa de problemas", + "emoji": "🧠", + "prompt": "Comencemos una sesión de lluvia de ideas para el proyecto. ¿Puedes ayudarnos a generar ideas y soluciones creativas?", + "title": "Lluvia de Ideas" + }, + "debate": { + "description": "Discusión estructurada y debate sobre diversos temas y actualidad", + "emoji": "⚖️", + "prompt": "Vamos a realizar un debate estructurado. ¿Puedes ayudarnos a organizar una discusión fundamentada sobre este tema?", + "title": "Club de Debate" + }, + "languagePractice": { + "description": "Practicar conversación y aprender nuevos idiomas con hablantes nativos", + "emoji": "🗣️", + "prompt": "Practiquemos un nuevo idioma juntos. ¿Puedes ayudarnos a aprender y practicar el habla de este idioma?", + "title": "Práctica de Idiomas" + }, + "studyGroup": { + "description": "Sesiones colaborativas de aprendizaje para discutir conceptos y resolver problemas en conjunto", + "emoji": "📚", + "prompt": "Formemos un grupo de estudio. ¿Puedes ayudarnos a entender estos conceptos y resolver problemas juntos?", + "title": "Grupo de Estudio" + } + }, + "planning": { + "cookingClass": { + "description": "Aprender y compartir técnicas culinarias, recetas y tradiciones gastronómicas", + "emoji": "👨‍🍳", + "prompt": "¡Vamos a una clase de cocina! ¿Puedes ayudarnos a aprender nuevas recetas y técnicas culinarias?", + "title": "Clase de Cocina" + }, + "fitnessChallenge": { + "description": "Establecer metas grupales de fitness, compartir rutinas y motivarse mutuamente", + "emoji": "💪", + "prompt": "¡Comencemos un desafío de fitness! ¿Puedes ayudarnos a establecer metas y motivarnos para mantenernos saludables?", + "title": "Desafío de Fitness" + }, + "planningPoker": { + "description": "Técnica ágil de estimación usando cartas para valorar tareas y cargas de trabajo del proyecto", + "emoji": "🃏", + "prompt": "Estamos haciendo planificación con poker. ¿Puedes ayudarnos a estimar la carga de trabajo de estas tareas usando técnicas ágiles?", + "title": "Planning Poker" + }, + "travelPlanning": { + "description": "Planificar viajes, compartir experiencias y descubrir nuevos destinos", + "emoji": "✈️", + "prompt": "Vamos a planificar un viaje juntos. ¿Puedes ayudarnos a investigar destinos y organizar el itinerario?", + "title": "Planificación de Viajes" + } + }, + "product": { + "codeReview": { + "description": "Discutir técnicamente y revisar en equipo los cambios e implementaciones de código", + "emoji": "💻", + "prompt": "Vamos a revisar algo de código juntos. ¿Puedes ayudarnos a analizar este código e identificar áreas de mejora?", + "title": "Revisión de Código" + }, + "designReview": { + "description": "Reuniones colaborativas para dar retroalimentación sobre conceptos de diseño, prototipos o creaciones", + "emoji": "🎨", + "prompt": "Necesitamos revisar algunos diseños. ¿Puedes ayudarnos a proporcionar retroalimentación constructiva sobre conceptos y prototipos?", + "title": "Revisión de Diseño" + }, + "sprintPlanning": { + "description": "Técnica ágil de estimación usando cartas para valorar tareas y cargas de trabajo del proyecto", + "emoji": "🃏", + "prompt": "Estamos haciendo planificación con poker. ¿Puedes ayudarnos a estimar la carga de trabajo de estas tareas usando técnicas ágiles?", + "title": "Planning Poker" + }, + "techExchange": { + "description": "Discutir tecnologías emergentes, innovación y tendencias del sector", + "emoji": "🚀", + "prompt": "¡Hagamos un intercambio tecnológico! ¿Puedes ayudarnos a debatir sobre tecnologías emergentes y tendencias del sector?", + "title": "Intercambio Tecnológico" + } + }, + "title": "Recomendaciones para el uso de chats grupales", + "writing": { + "bookClub": { + "description": "Discusión y análisis literario de libros, historias y obras literarias", + "emoji": "📖", + "prompt": "Comencemos la discusión del club de lectura. ¿Puedes ayudarnos a analizar este libro y explorar sus temas juntos?", + "title": "Club de Lectura" + }, + "movieClub": { + "description": "Ver y discutir películas, documentales y medios visuales juntos", + "emoji": "🎬", + "prompt": "Comencemos la discusión del club de cine. ¿Puedes ayudarnos a analizar esta película y explorar sus temas juntos?", + "title": "Club de Cine" + }, + "musicSession": { + "description": "Sesiones colaborativas de creación, compartir y apreciar música", + "emoji": "🎵", + "prompt": "¡Hagamos una sesión de improvisación musical! ¿Puedes ayudarnos a crear y disfrutar música juntos?", + "title": "Improvisación Musical" + }, + "studyGroup": { + "description": "Sesiones colaborativas de aprendizaje para discutir conceptos y resolver problemas en conjunto", + "emoji": "📚", + "prompt": "Formemos un grupo de estudio. ¿Puedes ayudarnos a entender estos conceptos y resolver problemas juntos?", + "title": "Grupo de Estudio" + } + } + }, + "groupMessage": "¡Bienvenidos al chat grupal! Colabora con múltiples asistentes de IA en un espacio de conversación compartido.", + "groupTemplates": { + "analysis": { + "description": "Perspectivas impulsadas por datos, análisis en profundidad", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Eres experto en manejar e interpretar datos, revelando patrones y tendencias ocultas a través de gráficos y análisis estadísticos.", + "title": "Analista de datos" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Eres un experto en investigación, encargado de la recopilación de información y estudios profundos, capaz de analizar problemas desde múltiples dimensiones.", + "title": "Experto en investigación" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Eres un experto en estadística, dominando diversos métodos y modelos estadísticos, capaz de extraer valiosos insights comerciales de los datos.", + "title": "Experto en estadística" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Eres un analista cuantitativo, especializado en modelado cuantitativo y evaluación de riesgos, resolviendo problemas complejos mediante métodos matemáticos.", + "title": "Analista cuantitativo" + } + ], + "title": "Equipo de análisis" + }, + "brainstorm": { + "description": "Pensamiento creativo desde múltiples perspectivas, estimulando posibilidades infinitas", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Eres un director creativo, experto en controlar la dirección creativa desde una perspectiva macro, capaz de transformar conceptos abstractos en planes creativos concretos y ejecutables.", + "title": "Director creativo" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Eres un experto en innovación, encargado de descubrir soluciones novedosas y pensamientos disruptivos, hábil para pensar fuera de los marcos convencionales.", + "title": "Experto en innovación" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Eres un especialista en pensamiento de diseño, abordando problemas desde la experiencia del usuario y la presentación visual, enfocándote en la expresión visual de la creatividad.", + "title": "Especialista en diseño" + } + ], + "title": "Grupo de Lluvia de Ideas" + }, + "game": { + "description": "Disfruta de varios juegos de texto multijugador, como Hombre Lobo y Quién es el impostor", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Eres experto en participar en diversos juegos de texto multijugador y puedes jugar conforme a las reglas del juego.", + "title": "Jugador" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Eres experto en participar en diversos juegos de texto multijugador y puedes jugar conforme a las reglas del juego.", + "title": "Jugador" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Eres experto en participar en diversos juegos de texto multijugador y puedes jugar conforme a las reglas del juego.", + "title": "Jugador" + } + ], + "title": "Sala de juegos" + }, + "planning": { + "description": "Planificación estratégica y gestión de proyectos, coordinando el panorama general", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Eres responsable de la planificación general del proyecto, control de progreso y coordinación de recursos para asegurar la entrega a tiempo y con calidad.", + "title": "Chef" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Eres responsable de formular la planificación estratégica a largo plazo, analizar oportunidades de mercado, establecer objetivos y rutas para alcanzarlos.", + "title": "Especialista en compras de ingredientes" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Eres responsable de elaborar planes detallados de ejecución, coordinar recursos interdepartamentales y asegurar la viabilidad del plan.", + "title": "Experto en desarrollo culinario" + } + ], + "title": "Equipo de desarrollo culinario" + }, + "product": { + "description": "Diseño y desarrollo de productos, creando productos de alta calidad", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Eres un diseñador, experto en diseñar diversos tipos de productos, capaz de diseñar según los requisitos del producto.", + "title": "Diseñador" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Eres un gerente de producto, responsable de la planificación, diseño, desarrollo y mantenimiento del producto, asegurando la calidad y experiencia del usuario.", + "title": "Gerente de producto" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Eres un ingeniero full stack experimentado, experto en desarrollar diversos tipos de productos, capaz de desarrollar según los requisitos del producto.", + "title": "Ingeniero full stack" + } + ], + "title": "Equipo de desarrollo de productos" + }, + "writing": { + "description": "Creación y edición de contenido, produciendo textos de alta calidad", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Eres experto en crear contenido de diversos géneros y puedes ajustar el estilo de escritura según el contexto y la audiencia.", + "title": "Redactor de contenido" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Eres un editor, responsable de la corrección, pulido y optimización de textos, asegurando la precisión, fluidez y profesionalismo del contenido.", + "title": "Editor" + } + ], + "title": "Círculo de escritura" + } + }, "qa": { "q01": "¿Qué es LobeHub?", "q02": "¿Qué es {{appName}}?", diff --git a/locales/fa-IR/chat.json b/locales/fa-IR/chat.json index 6895580ef0a..1f1b3157242 100644 --- a/locales/fa-IR/chat.json +++ b/locales/fa-IR/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "مدل" }, + "active": "فعال", "agentDefaultMessage": "سلام، من **{{name}}** هستم. می‌توانید همین حالا با من گفتگو را شروع کنید یا به [تنظیمات دستیار]({{url}}) بروید و اطلاعات من را تکمیل کنید.", "agentDefaultMessageWithSystemRole": "سلام، من **{{name}}** هستم، چگونه می‌توانم به شما کمک کنم؟", "agentDefaultMessageWithoutEdit": "سلام، من **{{name}}** هستم، چگونه می‌توانم به شما کمک کنم؟", @@ -13,17 +14,28 @@ "thought": "فرآیند تفکر", "unknownTitle": "اثر بدون نام" }, + "availableAgents": "دستیاران در دسترس", "backToBottom": "بازگشت به پایین", "chatList": { "longMessageDetail": "مشاهده جزئیات" }, "clearCurrentMessages": "پاک کردن پیام‌های جلسه فعلی", "confirmClearCurrentMessages": "پیام‌های جلسه فعلی به زودی پاک خواهند شد و پس از پاک شدن قابل بازیابی نخواهند بود. لطفاً عملیات خود را تأیید کنید.", + "confirmRemoveChatGroupItemAlert": "در حال حذف این گروه چت هستید، اعضای گروه تحت تأثیر قرار نمی‌گیرند، لطفاً عملیات خود را تأیید کنید", + "confirmRemoveGroupItemAlert": "در حال حذف این گروه هستید؛ پس از حذف، دستیاران این گروه به فهرست پیش‌فرض منتقل خواهند شد. لطفاً عملیات خود را تأیید کنید.", + "confirmRemoveGroupSuccess": "حذف گروه چت با موفقیت انجام شد", "confirmRemoveSessionItemAlert": "این دستیار به زودی حذف خواهد شد و پس از حذف قابل بازیابی نخواهد بود، لطفاً عملیات خود را تأیید کنید.", "confirmRemoveSessionSuccess": "حذف دستیار با موفقیت انجام شد", "defaultAgent": "دستیار سفارشی", + "defaultGroupChat": "گروه چت", "defaultList": "فهرست پیش‌فرض", "defaultSession": "دستیار سفارشی", + "dm": { + "placeholder": "پیام‌های خصوصی بین شما و {{agentTitle}} در اینجا نمایش داده می‌شوند.", + "tooltip": "ارسال پیام خصوصی", + "visibleTo": "فقط برای {{target}} قابل مشاهده است", + "you": "تو" + }, "duplicateSession": { "loading": "در حال کپی کردن...", "success": "کپی با موفقیت انجام شد", @@ -58,11 +70,56 @@ "title": "استخراج محتوای لینک وب" } }, + "group": { + "desc": "در یک فضای گفتگوی مشترک با چندین دستیار هوش مصنوعی همکاری کنید.", + "memberTooltip": "این گروه {{count}} عضو دارد", + "orchestratorThinking": "مجری در حال فکر کردن است...", + "removeMember": "حذف عضو", + "title": "گروه‌ها" + }, + "groupDescription": "توضیحات گروه", + "groupSidebar": { + "members": { + "addMember": "افزودن عضو", + "memberSettings": "تنظیمات اعضا", + "orchestrator": "مجری", + "orchestratorThinking": "مجری در حال فکر کردن است...", + "removeMember": "حذف عضو", + "stopOrchestrator": "توقف فکر کردن", + "triggerOrchestrator": "شروع گروه چت" + }, + "tabs": { + "host": "میزبان", + "members": "اعضا", + "role": "تنظیمات" + } + }, + "groupWizard": { + "chooseMembers": "انتخاب دستیاران موجود...", + "createGroup": "ایجاد گروه چت", + "existingMembers": "دستیاران موجود", + "groupMembers": "این دستیاران نیز به فهرست شما اضافه خواهند شد", + "host": { + "description": "اجرای خودکار چت گروهی", + "title": "مجری", + "tooltip": "اگر میزبانی گروه غیرفعال شود، باید به‌صورت دستی با @ اعضا را منشن کنید تا بتوانند پاسخ دهند" + }, + "memberCount": "{{count}} عضو", + "noMatchingTemplates": "هیچ قالبی مطابقت ندارد", + "noSelectedTemplates": "هیچ قالبی انتخاب نشده است", + "noTemplateMembers": "در قالب هیچ عضوی وجود ندارد", + "noTemplates": "هیچ قالبی در دسترس نیست", + "searchTemplates": "جستجوی قالب‌ها...", + "title": "ایجاد گروه چت", + "useTemplate": "استفاده از قالب" + }, + "hideForYou": "محتوای پیام خصوصی مخفی شده است، لطفاً برای مشاهده آن گزینه «نمایش محتوای پیام خصوصی» را در تنظیمات فعال کنید", "history": { "title": "دستیار فقط آخرین {{count}} پیام را به خاطر خواهد سپرد" }, "historyRange": "محدوده تاریخی", "historySummary": "خلاصه پیام‌های تاریخی", + "inactive": "غیرفعال", "inbox": { "desc": "خوشه‌های مغزی را فعال کنید و جرقه‌های تفکر را برانگیزید. دستیار هوشمند شما اینجاست تا با شما در مورد هر چیزی صحبت کند.", "title": "گپ دوستانه" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "در حال درک و تحلیل نیت شما..." }, + "inviteMembers": "دعوت اعضا", "knowledgeBase": { "all": "همه محتوا", "allFiles": "همه فایل‌ها", @@ -101,12 +159,29 @@ "uploadGuide": "فایل‌های آپلود شده را می‌توانید در «پایگاه دانش» مشاهده کنید.", "viewMore": "مشاهده بیشتر" }, + "memberSelection": { + "addMember": "افزودن عضو", + "allMembers": "تمام اعضا", + "createGroup": "ایجاد گروه چت", + "noAvailableAgents": "دستیار قابل دعوت وجود ندارد", + "noSelectedAgents": "هنوز دستیار انتخاب نشده است", + "searchAgents": "جستجوی دستیار...", + "setInitialMembers": "انتخاب اعضای گروه" + }, + "members": "اعضا", + "mention": { + "title": "ذکر اعضا" + }, "messageAction": { "delAndRegenerate": "حذف و بازتولید", "deleteDisabledByThreads": "زیرموضوع وجود دارد، نمی‌توان حذف کرد", "regenerate": "بازتولید" }, "messages": { + "dm": { + "sentTo": "فقط برای {{name}} قابل مشاهده است", + "title": "پیام خصوصی" + }, "modelCard": { "credit": "اعتبار", "creditPricing": "قیمت گذاری", @@ -156,6 +231,13 @@ "previousMessage": "پیام قبلی" }, "newAgent": "دستیار جدید", + "newGroupChat": "ایجاد چت گروهی جدید", + "noAgentsYet": "در این گروه هنوز هیچ دستیار وجود ندارد. برای دعوت دستیار، روی دکمهٔ «+» کلیک کنید.", + "noAvailableAgents": "هیچ دستیاری برای دعوت موجود نیست", + "noMatchingAgents": "هیچ دستیار مطابقتی یافت نشد", + "noMembersYet": "این گروه هنوز عضوی ندارد. برای دعوت دستیاران، روی دکمهٔ + کلیک کنید.", + "noSelectedAgents": "هنوز هیچ دستیار انتخاب نشده است", + "owner": "صاحب گروه", "pin": "سنجاق کردن", "pinOff": "لغو سنجاق", "rag": { @@ -196,12 +278,16 @@ "title": "جستجوی متصل" }, "searchAgentPlaceholder": "جستجوی دستیار...", + "searchAgents": "دستیار جستجو...", + "selectedAgents": "دستیاران انتخاب‌شده", "sendPlaceholder": "نوشتن پیام...", "sessionGroup": { "config": "مدیریت گروه", "confirmRemoveGroupAlert": "این گروه در حال حذف شدن است. پس از حذف، دستیارهای این گروه به لیست پیش‌فرض منتقل خواهند شد. لطفاً عملیات خود را تأیید کنید.", "createAgentSuccess": "دستیار با موفقیت ایجاد شد", "createGroup": "افزودن گروه جدید", + "createGroupFailed": "ایجاد گروه چت ناموفق بود", + "createGroupSuccess": "گروه چت با موفقیت ایجاد شد", "createSuccess": "گروه با موفقیت ایجاد شد", "creatingAgent": "در حال ایجاد دستیار...", "inputPlaceholder": "لطفاً نام گروه را وارد کنید...", @@ -235,6 +321,12 @@ "loading": "در حال شناسایی...", "prettifying": "در حال ویرایش..." }, + "supervisor": { + "todoList": { + "allComplete": "همه وظایف انجام شده‌اند", + "title": "وظایف انجام شده" + } + }, "thread": { "divider": "زیرموضوع", "threadMessageCount": "{{messageCount}} پیام", @@ -248,6 +340,7 @@ "chats": "پیام‌های گفتگو", "historySummary": "خلاصه تاریخ", "rest": "باقی‌مانده قابل استفاده", + "supervisor": "مجری گروه", "systemRole": "تنظیم نقش", "title": "جزئیات پیام‌ها", "tools": "تنظیمات افزونه", @@ -273,6 +366,7 @@ "action": "خواندن با صدا", "clear": "حذف صدا" }, + "untitledAgent": "دستیار بدون نام", "updateAgent": "به‌روزرسانی اطلاعات دستیار", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "حجم فایل ویدئویی نباید از ۲۰ مگابایت بیشتر باشد، حجم فعلی فایل {{actualSize}} است" } }, + "you": "شما", "zenMode": "حالت تمرکز" -} +} diff --git a/locales/fa-IR/error.json b/locales/fa-IR/error.json index de6c3f3e980..552a6340264 100644 --- a/locales/fa-IR/error.json +++ b/locales/fa-IR/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "درخواست سرویس ناموفق بود، لطفاً تنظیمات را بررسی کرده و دوباره تلاش کنید." }, + "supervisor": { + "decisionFailed": "مجری گروه قادر به انجام کار نیست. لطفاً تنظیمات مجری خود را بررسی کنید و مطمئن شوید مدل، کلید API و آدرس API به درستی پیکربندی شده‌اند." + }, "testConnectionFailed": "اتصال آزمایشی ناموفق بود: {{error}}", "tts": { "responseError": "درخواست سرویس ناموفق بود، لطفاً تنظیمات را بررسی کرده و دوباره تلاش کنید." diff --git a/locales/fa-IR/providers.json b/locales/fa-IR/providers.json index cefeb4a17c2..cd37bdf8b61 100644 --- a/locales/fa-IR/providers.json +++ b/locales/fa-IR/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock یک سرویس ارائه شده توسط آمازون AWS است که بر ارائه مدل‌های پیشرفته زبان AI و مدل‌های بصری برای شرکت‌ها تمرکز دارد. خانواده مدل‌های آن شامل سری Claude از Anthropic، سری Llama 3.1 از Meta و غیره است که از مدل‌های سبک تا مدل‌های با عملکرد بالا را پوشش می‌دهد و از وظایفی مانند تولید متن، مکالمه و پردازش تصویر پشتیبانی می‌کند. این سرویس برای برنامه‌های شرکتی با مقیاس‌ها و نیازهای مختلف مناسب است." }, "bfl": { - "description": "آزمایشگاهی پیشرو در پژوهش‌های پیشرفتهٔ هوش مصنوعی که زیرساخت‌های بصریِ فردا را می‌سازد." + "description": "آزمایشگاهی پیشگام در پژوهش‌های پیشرفته هوش مصنوعی که زیرساخت‌های بصری فردا را می‌سازد." + }, + "cerebras": { + "description": "Cerebras یک پلتفرم استنتاج هوش مصنوعی مبتنی بر سیستم اختصاصی CS-3 خود است که با هدف ارائه سریع‌ترین خدمات مدل‌های زبانی بزرگ (LLM) در جهان با پاسخ‌دهی آنی و توان عملیاتی بالا طراحی شده است. این پلتفرم به‌طور ویژه برای حذف تأخیر و تسریع جریان‌های کاری پیچیده هوش مصنوعی مانند تولید کد در زمان واقعی و انجام وظایف نمایندگی طراحی شده است." }, "cerebras": { "description": "Cerebras یک پلتفرم استنتاج هوش مصنوعی مبتنی بر سیستم اختصاصی CS-3 خود است که با هدف ارائه سریع‌ترین خدمات مدل‌های زبانی بزرگ (LLM) در جهان با پاسخ‌دهی آنی و توان عملیاتی بالا طراحی شده است. این پلتفرم به‌طور ویژه برای حذف تأخیر و تسریع جریان‌های کاری پیچیده هوش مصنوعی مانند تولید کد در زمان واقعی و انجام وظایف نمایندگی طراحی شده است." diff --git a/locales/fa-IR/setting.json b/locales/fa-IR/setting.json index 271a4a7e255..374370696b6 100644 --- a/locales/fa-IR/setting.json +++ b/locales/fa-IR/setting.json @@ -35,9 +35,16 @@ "title": "بازنشانی تمام تنظیمات" } }, + "groupTab": { + "chat": "گفت‌وگو", + "members": "اعضا", + "meta": "اطلاعات پایه" + }, "header": { "desc": "ترجیحات و تنظیمات مدل", "global": "تنظیمات کلی", + "group": "تنظیمات گروه چت", + "groupDesc": "مدیریت گروه چت فعلی", "session": "تنظیمات جلسه", "sessionDesc": "تنظیمات نقش و ترجیحات جلسه", "sessionWithName": "تنظیمات جلسه · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "مدل‌های بیشتری در حال <1>برنامه‌ریزی برای اضافه شدن هستند، لطفاً منتظر بمانید" }, + "message": { + "success": "به‌روزرسانی با موفقیت انجام شد" + }, "plugin": { "addMCPPlugin": "افزودن افزونه MCP", "addTooltip": "افزودن افزونه سفارشی", @@ -294,6 +304,101 @@ }, "title": "تنظیمات عمومی" }, + "settingGroup": { + "description": { + "placeholder": "لطفاً توضیح گروه چت را وارد کنید", + "title": "توضیح گروه چت" + }, + "name": { + "placeholder": "لطفاً نام گروه چت را وارد کنید", + "title": "نام گروه چت" + }, + "scene": { + "desc": "انتخاب صحنه چت گروهی", + "options": { + "casual": "غیررسمی", + "productive": "بهره‌ور" + }, + "title": "صحنه چت گروهی" + }, + "submit": "به‌روزرسانی گروه چت", + "systemPrompt": { + "placeholder": "لطفاً متن راهنمای سیستم میزبان را وارد کنید", + "title": "متن راهنمای سیستم میزبان" + }, + "title": "اطلاعات گروه چت" + }, + "settingGroupChat": { + "allowDM": { + "desc": "در صورت غیرفعال بودن، همچنان می‌توانید به صورت مستقیم به دستیار پیام دهید", + "title": "اجازه ارسال پیام خصوصی توسط دستیار" + }, + "enableSupervisor": { + "desc": "با فعال‌سازی نقش مدیر، او روند گفت‌وگوی گروهی را مدیریت خواهد کرد", + "title": "فعال‌سازی مدیر گروه" + }, + "maxResponseInRow": { + "desc": "تعداد پیام‌هایی که اعضا می‌توانند به صورت متوالی پاسخ دهند را انتخاب کنید. تنظیم روی ۰ این محدودیت را غیرفعال می‌کند.", + "title": "تعداد پاسخ‌های متوالی" + }, + "model": { + "desc": "صحبت اعضای گروه تحت تأثیر قرار نمی‌گیرد. برخی مدل‌ها قابل استفاده به عنوان مدل مدیر نیستند.", + "title": "مدل میزبان" + }, + "orchestratorTitle": "تنظیمات میزبان", + "responseOrder": { + "desc": "نماینده‌ها به ترتیب تعیین شده در گروه چت پاسخ خواهند داد", + "options": { + "natural": "طبیعی", + "sequential": "ترتیبی" + }, + "placeholder": "انتخاب ترتیب پاسخ", + "title": "ترتیب پاسخ" + }, + "responseSpeed": { + "desc": "سرعت کلی پیشرفت گروه چت را کنترل کنید", + "options": { + "fast": "سریع", + "medium": "متوسط", + "slow": "کند" + }, + "placeholder": "انتخاب سرعت پاسخ", + "title": "سرعت پاسخ" + }, + "revealDM": { + "desc": "محتوای پیام‌های خصوصی ارسال شده به دیگر اعضا را برای خود قابل مشاهده کنید.", + "title": "نمایش محتوای پیام خصوصی" + }, + "submit": "به‌روزرسانی تنظیمات", + "systemPrompt": { + "desc": "متن راهنمای سیستم سفارشی برای میزبان گفتگوهای گروهی. این ممکن است رفتار پیش‌فرض میزبان را تحت تأثیر قرار دهد.", + "placeholder": "لطفاً متن راهنمای سیستم میزبان سفارشی را وارد کنید...", + "title": "متن راهنمای سیستم میزبان" + }, + "title": "تنظیمات گفتگو" + }, + "settingGroupMembers": { + "addToGroup": "افزودن به گروه", + "availableAgents": "دستیارهای موجود", + "defaultAgent": "دستیار سفارشی", + "disableHost": "غیرفعال کردن دستیار میزبان", + "edit": "ویرایش اعضا", + "empty": "در این گروه چت نماینده‌ای وجود ندارد. برای افزودن عضو روی دکمه + کلیک کنید.", + "enableHost": "فعال کردن دستیار میزبان", + "groupHost": "میزبان گروه", + "groupMembers": "اعضای گروه", + "host": { + "description": "وقتی میزبان در گروه حضور دارد، چت گروهی به صورت خودکار مدیریت می‌شود و برای وظایف خلاقانه مناسب است.", + "title": "میزبان" + }, + "noAvailableAgents": "دستیار موجودی نیست", + "noDescription": "بدون توضیح", + "noMembersInGroup": "گروه هیچ عضوی ندارد", + "owner": "شما (مالک)", + "remove": "حذف عضو", + "removeFromGroup": "خارج کردن از گروه", + "you": "شما" + }, "settingImage": { "defaultCount": { "desc": "تعداد پیش‌فرض تصاویر تولیدشده هنگام ایجاد یک وظیفه جدید را در پنل تولید تصویر تنظیم کنید.", @@ -522,6 +627,11 @@ "modelDesc": "مدلی که برای نام‌گذاری خودکار موضوع نقاشی هوش مصنوعی استفاده می‌شود", "title": "نام‌گذاری خودکار موضوع نقاشی هوش مصنوعی" }, + "groupChatSupervisor": { + "label": "مدل نظارت بر گفتگوهای گروهی", + "modelDesc": "مدلی که برای نظارت و مدیریت گفتگوهای گروهی تعیین شده است", + "title": "مدیریت نظارت بر گفتگوهای گروهی" + }, "helpInfo": "هنگام ایجاد دستیار جدید، تنظیمات پیش‌فرض دستیار به عنوان مقادیر پیش‌فرض استفاده خواهد شد.", "historyCompress": { "label": "مدل تاریخچه گفتگو", diff --git a/locales/fa-IR/welcome.json b/locales/fa-IR/welcome.json index 9733e6df44b..ab5d1adbc21 100644 --- a/locales/fa-IR/welcome.json +++ b/locales/fa-IR/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "من دستیار هوشمند شخصی شما {{appName}} هستم، چطور می‌توانم به شما کمک کنم؟
اگر به دستیارهای حرفه‌ای‌تر یا سفارشی نیاز دارید، می‌توانید با کلیک بر روی یک دستیار سفارشی ایجاد کنید.", "defaultMessageWithoutCreate": "من دستیار هوشمند شخصی شما {{appName}} هستم، چطور می‌توانم به شما کمک کنم؟", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "بحث فنی و بازبینی همتا در مورد تغییرات و پیاده‌سازی کد", + "emoji": "💻", + "prompt": "بیایید با هم کدی را بررسی کنیم. آیا می‌توانید به ما کمک کنید این کدها را تحلیل کنیم و نقاط قابل بهبود را شناسایی کنیم؟", + "title": "بازبینی کد" + }, + "investment": { + "description": "تحلیل بازار، بحث در مورد استراتژی‌های سرمایه‌گذاری و به اشتراک‌گذاری بینش‌های مالی", + "emoji": "📈", + "prompt": "بیایید بازار را با هم تحلیل کنیم. آیا می‌توانید به ما کمک کنید استراتژی‌های سرمایه‌گذاری را بحث کنیم و بینش‌های مالی را به اشتراک بگذاریم؟", + "title": "باشگاه سرمایه‌گذاری" + }, + "research": { + "description": "کاوش مفاهیم علمی، انجام آزمایش‌ها و به اشتراک‌گذاری یافته‌ها", + "emoji": "🔬", + "prompt": "بیایید با هم به کاوش علمی بپردازیم! آیا می‌توانید به ما کمک کنید آزمایش‌ها را انجام دهیم و یافته‌هایمان را به اشتراک بگذاریم؟", + "title": "نمایشگاه علمی" + }, + "study": { + "description": "جلسات یادگیری تعاملی، بحث در مورد مفاهیم و حل مسائل به صورت گروهی", + "emoji": "📚", + "prompt": "بیایید یک گروه مطالعه تشکیل دهیم. آیا می‌توانید به ما کمک کنید این مفاهیم را درک کنیم و مسائل را با هم حل کنیم؟", + "title": "گروه مطالعه" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "خلق، نقد و لذت بردن از انواع هنرهای بصری و دیجیتال", + "emoji": "🖼️", + "prompt": "بیایید یک کارگاه هنری برگزار کنیم! آیا می‌توانید به ما کمک کنید هنرهای مختلف را خلق، نقد و تحسین کنیم؟", + "title": "کارگاه هنری" + }, + "debate": { + "description": "بحث و مناظره ساختاریافته درباره موضوعات مختلف و رویدادهای جاری", + "emoji": "⚖️", + "prompt": "بیایید یک مناظره ساختاریافته برگزار کنیم. آیا می‌توانید به ما کمک کنید یک بحث منطقی درباره این موضوع سازماندهی کنیم؟", + "title": "باشگاه مناظره" + }, + "designReview": { + "description": "جلسات بازخورد تعاملی درباره مفاهیم طراحی، نمونه‌های اولیه یا آثار خلاقانه", + "emoji": "🎨", + "prompt": "ما نیاز به بررسی برخی آثار طراحی داریم. آیا می‌توانید به ما کمک کنید بازخورد سازنده‌ای درباره مفاهیم و نمونه‌های اولیه ارائه دهیم؟", + "title": "بازبینی طراحی" + }, + "ideation": { + "description": "تولید ایده‌های خلاقانه و حل مسئله به صورت تعاملی و چندوجهی", + "emoji": "🧠", + "prompt": "بیایید برای پروژه ایده‌پردازی کنیم. آیا می‌توانید به ما کمک کنید ایده‌ها و راه‌حل‌های خلاقانه تولید کنیم؟", + "title": "ایده‌پردازی" + } + }, + "game": { + "debateClub": { + "description": "بحث و مناظره ساختاریافته درباره موضوعات مختلف و رویدادهای جاری", + "emoji": "⚖️", + "prompt": "بیایید یک مناظره ساختاریافته برگزار کنیم. آیا می‌توانید به ما کمک کنید یک بحث منطقی درباره این موضوع سازماندهی کنیم؟", + "title": "باشگاه مناظره" + }, + "gameNight": { + "description": "بازی‌ها و فعالیت‌های تعاملی سرگرم‌کننده برای ایجاد پیوند تیمی و لذت بردن", + "emoji": "🎲", + "prompt": "شب بازی شروع شده! آیا می‌توانید به ما کمک کنید بازی‌های تعاملی سرگرم‌کننده‌ای برای ایجاد پیوند تیمی سازماندهی کنیم؟", + "title": "شب بازی" + }, + "modelUN": { + "description": "شبیه‌سازی مناظره‌های سازمان ملل و مذاکرات دیپلماتیک درباره مسائل جهانی", + "emoji": "🌍", + "prompt": "بیایید یک مناظره سازمان ملل شبیه‌سازی کنیم. آیا می‌توانید به ما کمک کنید یک مذاکره دیپلماتیک درباره مسائل جهانی تنظیم کنیم؟", + "title": "شبیه‌سازی سازمان ملل" + }, + "werewolf": { + "description": "بازی استدلال اجتماعی که بازیکنان با استراتژی و بحث، گرگینه‌ها را شناسایی می‌کنند", + "emoji": "🐺", + "prompt": "بیایید بازی گرگینه را انجام دهیم! آیا می‌توانید به ما کمک کنید قوانین را تنظیم کنید و این بازی استدلال اجتماعی را مدیریت کنید؟", + "title": "بازی گرگینه" + } + }, + "general": { + "brainstorm": { + "description": "تولید ایده‌های خلاقانه و حل مسئله به صورت تعاملی و چندوجهی", + "emoji": "🧠", + "prompt": "بیایید برای پروژه ایده‌پردازی کنیم. آیا می‌توانید به ما کمک کنید ایده‌ها و راه‌حل‌های خلاقانه تولید کنیم؟", + "title": "ایده‌پردازی" + }, + "debate": { + "description": "بحث و مناظره ساختاریافته درباره موضوعات مختلف و رویدادهای جاری", + "emoji": "⚖️", + "prompt": "بیایید یک مناظره ساختاریافته برگزار کنیم. آیا می‌توانید به ما کمک کنید یک بحث منطقی درباره این موضوع سازماندهی کنیم؟", + "title": "باشگاه مناظره" + }, + "languagePractice": { + "description": "تمرین مکالمه و یادگیری زبان جدید همراه با افراد بومی", + "emoji": "🗣️", + "prompt": "بیایید با هم زبان جدیدی تمرین کنیم. آیا می‌توانید به ما کمک کنید این زبان را یاد بگیریم و تمرین کنیم؟", + "title": "تمرین زبان" + }, + "studyGroup": { + "description": "جلسات یادگیری تعاملی، بحث در مورد مفاهیم و حل مسائل به صورت گروهی", + "emoji": "📚", + "prompt": "بیایید یک گروه مطالعه تشکیل دهیم. آیا می‌توانید به ما کمک کنید این مفاهیم را درک کنیم و مسائل را با هم حل کنیم؟", + "title": "گروه مطالعه" + } + }, + "planning": { + "cookingClass": { + "description": "یادگیری و به اشتراک‌گذاری مهارت‌های آشپزی، دستور پخت و سنت‌های آشپزی", + "emoji": "👨‍🍳", + "prompt": "بیایید کلاس آشپزی برگزار کنیم! آیا می‌توانید به ما کمک کنید دستورهای جدید و مهارت‌های آشپزی را یاد بگیریم؟", + "title": "کلاس آشپزی" + }, + "fitnessChallenge": { + "description": "تعیین اهداف گروهی تناسب اندام، به اشتراک‌گذاری روش‌های تمرینی و انگیزه‌دهی متقابل", + "emoji": "💪", + "prompt": "بیایید چالش تناسب اندام را شروع کنیم! آیا می‌توانید به ما کمک کنید اهداف تعیین کنیم و یکدیگر را برای حفظ سلامتی تشویق کنیم؟", + "title": "چالش تناسب اندام" + }, + "planningPoker": { + "description": "تکنیک برآورد چابک با استفاده از کارت‌ها برای تخمین وظایف و حجم کار پروژه", + "emoji": "🃏", + "prompt": "ما در حال انجام برنامه‌ریزی پوکر برای پروژه هستیم. آیا می‌توانید به ما کمک کنید با استفاده از تکنیک‌های چابک حجم کار این وظایف را تخمین بزنیم؟", + "title": "برنامه‌ریزی پوکر" + }, + "travelPlanning": { + "description": "برنامه‌ریزی سفر، به اشتراک‌گذاری تجربیات سفر و کشف مقاصد جدید", + "emoji": "✈️", + "prompt": "بیایید با هم سفر برنامه‌ریزی کنیم! آیا می‌توانید به ما کمک کنید مقصدها را بررسی کنیم و برنامه سفر را تنظیم کنیم؟", + "title": "برنامه‌ریزی سفر" + } + }, + "product": { + "codeReview": { + "description": "بحث فنی و بازبینی همتا در مورد تغییرات و پیاده‌سازی کد", + "emoji": "💻", + "prompt": "بیایید با هم کدی را بررسی کنیم. آیا می‌توانید به ما کمک کنید این کدها را تحلیل کنیم و نقاط قابل بهبود را شناسایی کنیم؟", + "title": "بازبینی کد" + }, + "designReview": { + "description": "جلسات بازخورد تعاملی درباره مفاهیم طراحی، نمونه‌های اولیه یا آثار خلاقانه", + "emoji": "🎨", + "prompt": "ما نیاز به بررسی برخی آثار طراحی داریم. آیا می‌توانید به ما کمک کنید بازخورد سازنده‌ای درباره مفاهیم و نمونه‌های اولیه ارائه دهیم؟", + "title": "بازبینی طراحی" + }, + "sprintPlanning": { + "description": "تکنیک برآورد چابک با استفاده از کارت‌ها برای تخمین وظایف و حجم کار پروژه", + "emoji": "🃏", + "prompt": "ما در حال انجام برنامه‌ریزی پوکر برای پروژه هستیم. آیا می‌توانید به ما کمک کنید با استفاده از تکنیک‌های چابک حجم کار این وظایف را تخمین بزنیم؟", + "title": "برنامه‌ریزی پوکر" + }, + "techExchange": { + "description": "بحث در مورد فناوری‌های نوظهور، نوآوری‌ها و روندهای صنعت", + "emoji": "🚀", + "prompt": "بیایید تبادل فناوری داشته باشیم! آیا می‌توانید به ما کمک کنید درباره فناوری‌های نوظهور و روندهای صنعت بحث کنیم؟", + "title": "تبادل فناوری" + } + }, + "title": "توصیه‌های استفاده از چت گروهی", + "writing": { + "bookClub": { + "description": "بحث و تحلیل ادبی درباره کتاب‌ها، داستان‌ها و آثار ادبی", + "emoji": "📖", + "prompt": "بیایید بحث باشگاه کتاب را شروع کنیم. آیا می‌توانید به ما کمک کنید این کتاب را تحلیل کنیم و موضوعات آن را بررسی کنیم؟", + "title": "باشگاه کتاب" + }, + "movieClub": { + "description": "تماشای فیلم، مستند و رسانه‌های بصری و بحث درباره آن‌ها", + "emoji": "🎬", + "prompt": "بیایید بحث باشگاه فیلم را شروع کنیم. آیا می‌توانید به ما کمک کنید این فیلم را تحلیل کنیم و موضوعات آن را بررسی کنیم؟", + "title": "باشگاه فیلم" + }, + "musicSession": { + "description": "جلسات همکاری در خلق، به اشتراک‌گذاری و تحسین موسیقی", + "emoji": "🎵", + "prompt": "بیایید اجرای بداهه موسیقی داشته باشیم! آیا می‌توانید به ما کمک کنید موسیقی خلق کنیم و از آن لذت ببریم؟", + "title": "اجرای بداهه موسیقی" + }, + "studyGroup": { + "description": "جلسات یادگیری تعاملی، بحث در مورد مفاهیم و حل مسائل به صورت گروهی", + "emoji": "📚", + "prompt": "بیایید یک گروه مطالعه تشکیل دهیم. آیا می‌توانید به ما کمک کنید این مفاهیم را درک کنیم و مسائل را با هم حل کنیم؟", + "title": "گروه مطالعه" + } + } + }, + "groupMessage": "به چت گروهی خوش آمدید! در یک فضای گفت‌وگوی مشترک با چند دستیار هوش مصنوعی همکاری کنید.", + "groupTemplates": { + "analysis": { + "description": "بینش‌های مبتنی بر داده، تحلیل عمیق و پژوهش", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "شما در پردازش و تفسیر داده‌ها مهارت دارید و از طریق نمودارها و تحلیل‌های آماری، الگوها و روندهای پنهان در پس داده‌ها را آشکار می‌کنید.", + "title": "تحلیلگر داده" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "شما یک متخصص پژوهش هستید که مسئول جمع‌آوری اطلاعات و تحقیقات عمیق می‌باشید و قادر به تحلیل جامع مسائل از زوایای مختلف هستید.", + "title": "متخصص پژوهش" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "شما یک متخصص آمار هستید که در روش‌ها و مدل‌های آماری مهارت دارید و می‌توانید بینش‌های تجاری ارزشمند را از داده‌ها استخراج کنید.", + "title": "متخصص آمار" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "شما یک تحلیلگر کمی هستید که در مدل‌سازی کمی و ارزیابی ریسک تخصص دارید و مسائل پیچیده را با روش‌های ریاضی حل می‌کنید.", + "title": "تحلیلگر کمی" + } + ], + "title": "تیم تحلیل" + }, + "brainstorm": { + "description": "تفکر خلاق چندوجهی، ایجاد امکانات بی‌پایان", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "شما یک مدیر خلاقیت هستید که در هدایت جهت‌گیری خلاقانه از دید کلان مهارت دارید و می‌توانید مفاهیم انتزاعی را به طرح‌های خلاقانه قابل اجرا تبدیل کنید.", + "title": "مدیر خلاقیت" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "شما یک متخصص نوآوری هستید که مسئول کشف راه‌حل‌های نوآورانه و تفکر پیشگامانه می‌باشید و توانایی خروج از چارچوب‌های سنتی را دارید.", + "title": "متخصص نوآوری" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "شما یک متخصص تفکر طراحی هستید که از منظر تجربه کاربری و ارائه بصری به مسائل می‌نگرید و بر بیان خلاقانه و قابل مشاهده تأکید دارید.", + "title": "متخصص تفکر طراحی" + } + ], + "title": "گروه ایده‌پردازی" + }, + "game": { + "description": "لذت بردن از انواع بازی‌های متنی چندنفره، مانند بازی گرگینه و چه کسی جاسوس است", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "شما در شرکت در انواع بازی‌های متنی چندنفره مهارت دارید و می‌توانید بر اساس قوانین بازی، بازی را اجرا کنید.", + "title": "بازیکن بازی" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "شما در شرکت در انواع بازی‌های متنی چندنفره مهارت دارید و می‌توانید بر اساس قوانین بازی، بازی را اجرا کنید.", + "title": "بازیکن بازی" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "شما در شرکت در انواع بازی‌های متنی چندنفره مهارت دارید و می‌توانید بر اساس قوانین بازی، بازی را اجرا کنید.", + "title": "بازیکن بازی" + } + ], + "title": "سالن بازی" + }, + "planning": { + "description": "برنامه‌ریزی استراتژیک و مدیریت پروژه، هماهنگی کلان", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "شما مسئول برنامه‌ریزی کلی پروژه، کنترل پیشرفت و هماهنگی منابع هستید تا اطمینان حاصل شود پروژه به موقع و با کیفیت بالا تکمیل شود.", + "title": "مدیر پروژه" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "شما مسئول تدوین برنامه استراتژیک بلندمدت، تحلیل فرصت‌های بازار و تعیین اهداف و مسیرهای دستیابی هستید.", + "title": "مسئول استراتژی" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "شما مسئول تدوین برنامه اجرایی دقیق، هماهنگی منابع بخش‌های مختلف و اطمینان از قابلیت اجرای برنامه هستید.", + "title": "متخصص توسعه غذا" + } + ], + "title": "تیم توسعه غذا" + }, + "product": { + "description": "طراحی و توسعه محصول، خلق محصولات با کیفیت", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "شما طراح هستید که در طراحی انواع محصولات مهارت دارید و می‌توانید بر اساس نیازهای محصول طراحی انجام دهید.", + "title": "طراح" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "شما مدیر محصول هستید که مسئول برنامه‌ریزی، طراحی، توسعه و نگهداری محصول هستید و کیفیت و تجربه کاربری محصول را تضمین می‌کنید.", + "title": "مدیر محصول" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "شما مهندس فول‌استک با تجربه هستید که در توسعه انواع محصولات مهارت دارید و می‌توانید بر اساس نیازهای محصول توسعه انجام دهید.", + "title": "مهندس فول‌استک" + } + ], + "title": "تیم توسعه محصول" + }, + "writing": { + "description": "تولید محتوا و ویرایش، خلق متون با کیفیت", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "شما در خلق محتوا در انواع سبک‌های نوشتاری مهارت دارید و می‌توانید سبک نوشتار را بر اساس موقعیت و مخاطب تنظیم کنید.", + "title": "نویسنده محتوا" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "شما ویراستار هستید که مسئول بازبینی، اصلاح و بهینه‌سازی متن‌ها هستید و دقت، روانی و حرفه‌ای بودن محتوا را تضمین می‌کنید.", + "title": "ویراستار" + } + ], + "title": "حلقه نویسندگی" + } + }, "qa": { "q01": "LobeHub چیست؟", "q02": "{{appName}} چیست؟", diff --git a/locales/fr-FR/chat.json b/locales/fr-FR/chat.json index 07b75b666ab..7a6df840783 100644 --- a/locales/fr-FR/chat.json +++ b/locales/fr-FR/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Modèle" }, + "active": "Actif", "agentDefaultMessage": "Bonjour, je suis **{{name}}**, vous pouvez commencer à discuter avec moi immédiatement ou vous rendre dans [Paramètres de l'assistant]({{url}}) pour compléter mes informations.", "agentDefaultMessageWithSystemRole": "Bonjour, je suis **{{name}}**, comment puis-je vous aider ?", "agentDefaultMessageWithoutEdit": "Bonjour, je suis **{{name}}**, comment puis-je vous aider ?", @@ -13,17 +14,28 @@ "thought": "Processus de pensée", "unknownTitle": "Œuvre sans nom" }, + "availableAgents": "Assistants disponibles", "backToBottom": "Retour en bas", "chatList": { "longMessageDetail": "Voir les détails" }, "clearCurrentMessages": "Effacer les messages actuels", "confirmClearCurrentMessages": "Vous êtes sur le point d'effacer les messages de cette session. Cette action est irréversible. Veuillez confirmer.", + "confirmRemoveChatGroupItemAlert": "Vous êtes sur le point de supprimer ce groupe de discussion, les membres du groupe ne seront pas affectés, veuillez confirmer votre action", + "confirmRemoveGroupItemAlert": "Vous êtes sur le point de supprimer ce groupe. Après la suppression, les assistants de ce groupe seront déplacés vers la liste par défaut. Veuillez confirmer votre action.", + "confirmRemoveGroupSuccess": "Suppression du groupe réussie", "confirmRemoveSessionItemAlert": "Vous êtes sur le point de supprimer cet agent. Cette action est irréversible. Veuillez confirmer.", "confirmRemoveSessionSuccess": "Agent supprimé avec succès", "defaultAgent": "Agent par défaut", + "defaultGroupChat": "Groupe de discussion", "defaultList": "Liste par défaut", "defaultSession": "Session par défaut", + "dm": { + "placeholder": "Vos messages privés avec {{agentTitle}} s'afficheront ici.", + "tooltip": "Envoyer un message privé", + "visibleTo": "Visible uniquement par {{target}}", + "you": "vous" + }, "duplicateSession": { "loading": "Copie en cours...", "success": "Copie réussie", @@ -58,11 +70,56 @@ "title": "Extraction du contenu des liens web" } }, + "group": { + "desc": "Collaborez avec plusieurs assistants IA dans un espace de conversation partagé.", + "memberTooltip": "Le groupe contient {{count}} membre(s)", + "orchestratorThinking": "L'animateur est en train de réfléchir...", + "removeMember": "Retirer un membre", + "title": "Groupe" + }, + "groupDescription": "Description du groupe", + "groupSidebar": { + "members": { + "addMember": "Ajouter un membre", + "memberSettings": "Paramètres des membres", + "orchestrator": "Animateur", + "orchestratorThinking": "L'animateur est en train de réfléchir...", + "removeMember": "Retirer un membre", + "stopOrchestrator": "Arrêter la réflexion", + "triggerOrchestrator": "Démarrer la discussion de groupe" + }, + "tabs": { + "host": "Hôte", + "members": "Membres", + "role": "Paramètres" + } + }, + "groupWizard": { + "chooseMembers": "Choisir des assistants existants...", + "createGroup": "Créer un groupe", + "existingMembers": "Membres existants", + "groupMembers": "Ces assistants seront également ajoutés à votre liste", + "host": { + "description": "Automatise le fonctionnement du groupe de discussion", + "title": "Animateur", + "tooltip": "Si vous désactivez l'hôte du groupe, vous devrez mentionner manuellement les membres avec @ pour qu'ils puissent répondre" + }, + "memberCount": "{{count}} membres", + "noMatchingTemplates": "Aucun modèle correspondant", + "noSelectedTemplates": "Aucun modèle sélectionné", + "noTemplateMembers": "Aucun membre dans le modèle", + "noTemplates": "Aucun modèle disponible", + "searchTemplates": "Rechercher des modèles...", + "title": "Créer un groupe", + "useTemplate": "Utiliser le modèle" + }, + "hideForYou": "Le contenu du message privé est caché, veuillez activer « Afficher le contenu des messages privés » dans les paramètres pour le voir", "history": { "title": "L'assistant ne se souviendra que des {{count}} derniers messages" }, "historyRange": "Plage d'historique", "historySummary": "Résumé des messages historiques", + "inactive": "Inactif", "inbox": { "desc": "Débloquez le potentiel de votre esprit. Votre agent intelligent est là pour discuter avec vous de tout et de rien.", "title": "Discutons un peu" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "En train de comprendre et d'analyser votre intention..." }, + "inviteMembers": "Inviter des membres", "knowledgeBase": { "all": "Tout le contenu", "allFiles": "Tous les fichiers", @@ -101,12 +159,29 @@ "uploadGuide": "Les fichiers téléchargés peuvent être consultés dans la « Base de connaissances ».", "viewMore": "Voir plus" }, + "memberSelection": { + "addMember": "Ajouter un membre", + "allMembers": "Tous les membres", + "createGroup": "Créer un groupe de discussion", + "noAvailableAgents": "Aucun assistant disponible à inviter", + "noSelectedAgents": "Aucun assistant sélectionné", + "searchAgents": "Rechercher un assistant...", + "setInitialMembers": "Sélectionner les membres du groupe" + }, + "members": "Membres", + "mention": { + "title": "Mentionner un membre" + }, "messageAction": { "delAndRegenerate": "Supprimer et régénérer", "deleteDisabledByThreads": "Il existe des sous-sujets, la suppression n'est pas possible.", "regenerate": "Régénérer" }, "messages": { + "dm": { + "sentTo": "Visible uniquement par {{name}}", + "title": "Message privé" + }, "modelCard": { "credit": "Crédit", "creditPricing": "Tarification", @@ -156,6 +231,13 @@ "previousMessage": "Message précédent" }, "newAgent": "Nouvel agent", + "newGroupChat": "Nouveau groupe de discussion", + "noAgentsYet": "Ce groupe ne contient encore aucun assistant. Cliquez sur le bouton + pour en inviter.", + "noAvailableAgents": "Aucun assistant disponible à inviter", + "noMatchingAgents": "Aucun assistant correspondant", + "noMembersYet": "Ce groupe n'a pas encore de membres. Cliquez sur le bouton + pour inviter des assistants.", + "noSelectedAgents": "Aucun assistant n'a encore été sélectionné", + "owner": "Propriétaire du groupe", "pin": "Épingler", "pinOff": "Désépingler", "rag": { @@ -196,12 +278,16 @@ "title": "Recherche en ligne" }, "searchAgentPlaceholder": "Assistant de recherche...", + "searchAgents": "Assistant de recherche...", + "selectedAgents": "Assistants sélectionnés", "sendPlaceholder": "Saisissez votre message...", "sessionGroup": { "config": "Gestion des groupes", "confirmRemoveGroupAlert": "Vous êtes sur le point de supprimer ce groupe. Une fois supprimé, les agents de ce groupe seront déplacés vers la liste par défaut. Veuillez confirmer votre action.", "createAgentSuccess": "Création de l'agent réussie", "createGroup": "Créer un nouveau groupe", + "createGroupFailed": "Échec de la création du groupe de discussion", + "createGroupSuccess": "Groupe de discussion créé avec succès", "createSuccess": "Création réussie", "creatingAgent": "Création de l'agent en cours...", "inputPlaceholder": "Veuillez saisir le nom du groupe...", @@ -235,6 +321,12 @@ "loading": "En cours de reconnaissance...", "prettifying": "En cours d'embellissement..." }, + "supervisor": { + "todoList": { + "allComplete": "Toutes les tâches sont terminées", + "title": "Tâches terminées" + } + }, "thread": { "divider": "Sous-sujet", "threadMessageCount": "{{messageCount}} messages", @@ -248,6 +340,7 @@ "chats": "Messages de discussion", "historySummary": "Résumé historique", "rest": "Restant disponible", + "supervisor": "Animateur du groupe", "systemRole": "Rôle système", "title": "Détails du jeton", "tools": "Paramètres du plugin", @@ -273,6 +366,7 @@ "action": "Lecture vocale", "clear": "Effacer la voix" }, + "untitledAgent": "Assistant sans nom", "updateAgent": "Mettre à jour les informations de l'agent", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "La taille du fichier vidéo ne peut pas dépasser 20 Mo, la taille actuelle est de {{actualSize}}" } }, + "you": "vous", "zenMode": "Mode de concentration" -} +} diff --git a/locales/fr-FR/error.json b/locales/fr-FR/error.json index e07e7075ae0..139e681cc27 100644 --- a/locales/fr-FR/error.json +++ b/locales/fr-FR/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Échec de la requête de service. Veuillez vérifier la configuration ou réessayer" }, + "supervisor": { + "decisionFailed": "L'animateur du groupe ne peut pas fonctionner. Veuillez vérifier votre configuration d'animateur pour vous assurer que le modèle, la clé API et l'adresse API sont correctement configurés." + }, "testConnectionFailed": "Échec du test de connexion : {{error}}", "tts": { "responseError": "Échec de la requête de service. Veuillez vérifier la configuration ou réessayer" diff --git a/locales/fr-FR/providers.json b/locales/fr-FR/providers.json index 122a6aa3602..db49375f82e 100644 --- a/locales/fr-FR/providers.json +++ b/locales/fr-FR/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock est un service proposé par Amazon AWS, axé sur la fourniture de modèles linguistiques et visuels avancés pour les entreprises. Sa famille de modèles comprend la série Claude d'Anthropic, la série Llama 3.1 de Meta, etc., offrant une variété d'options allant des modèles légers aux modèles haute performance, prenant en charge des tâches telles que la génération de texte, les dialogues et le traitement d'images, adaptées aux applications d'entreprise de différentes tailles et besoins." }, "bfl": { - "description": "Un laboratoire de recherche en intelligence artificielle à la pointe, construisant l'infrastructure visuelle de demain." + "description": "Un laboratoire de recherche en intelligence artificielle de pointe, bâtissant l'infrastructure visuelle de demain." + }, + "cerebras": { + "description": "Cerebras est une plateforme d'inférence IA basée sur son système dédié CS-3, conçue pour offrir les services de LLM les plus rapides au monde, avec une réponse en temps réel et un débit élevé. Elle est spécialement conçue pour éliminer la latence et accélérer les flux de travail IA complexes, tels que la génération de code en temps réel et les tâches d'agents." }, "cerebras": { "description": "Cerebras est une plateforme d'inférence IA basée sur son système dédié CS-3, conçue pour offrir les services de LLM les plus rapides au monde, avec une réponse en temps réel et un débit élevé. Elle est spécialement conçue pour éliminer la latence et accélérer les flux de travail IA complexes, tels que la génération de code en temps réel et les tâches d'agents." diff --git a/locales/fr-FR/setting.json b/locales/fr-FR/setting.json index 72c42350745..7551e26525f 100644 --- a/locales/fr-FR/setting.json +++ b/locales/fr-FR/setting.json @@ -35,9 +35,16 @@ "title": "Réinitialiser tous les paramètres" } }, + "groupTab": { + "chat": "Discussion", + "members": "Membres", + "meta": "Informations de base" + }, "header": { "desc": "Préférences et paramètres du modèle.", "global": "Paramètres globaux", + "group": "Paramètres du groupe", + "groupDesc": "Gérer le groupe actuel", "session": "Paramètres de session", "sessionDesc": "Paramètres de personnage et préférences de session.", "sessionWithName": "Paramètres de session · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Plus de modèles sont en cours de <1>planification pour être ajoutés, restez à l'écoute" }, + "message": { + "success": "Mise à jour réussie" + }, "plugin": { "addMCPPlugin": "Ajouter un plugin MCP", "addTooltip": "Ajouter un plugin personnalisé", @@ -294,6 +304,101 @@ }, "title": "Paramètres généraux" }, + "settingGroup": { + "description": { + "placeholder": "Veuillez saisir la description du groupe", + "title": "Description du groupe" + }, + "name": { + "placeholder": "Veuillez saisir le nom du groupe", + "title": "Nom du groupe" + }, + "scene": { + "desc": "Choisir le scénario de discussion de groupe", + "options": { + "casual": "Décontracté", + "productive": "Productif" + }, + "title": "Scénario de discussion de groupe" + }, + "submit": "Mettre à jour le groupe", + "systemPrompt": { + "placeholder": "Veuillez saisir l'invite système de l'animateur", + "title": "Invite système de l'animateur" + }, + "title": "Informations du groupe" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Une fois désactivé, vous pouvez toujours envoyer un message privé à l’assistant", + "title": "Autoriser les messages privés de l’assistant" + }, + "enableSupervisor": { + "desc": "Activez la fonction de modérateur pour gérer le déroulement des conversations de groupe", + "title": "Activer le modérateur" + }, + "maxResponseInRow": { + "desc": "Choisissez combien de messages un membre peut répondre consécutivement. Réglez sur 0 pour désactiver cette limite.", + "title": "Nombre de réponses consécutives" + }, + "model": { + "desc": "Les interventions des membres du groupe ne seront pas affectées. Certains modèles ne peuvent pas être utilisés comme modérateurs.", + "title": "Modèle de l'animateur" + }, + "orchestratorTitle": "Paramètres de l'animateur", + "responseOrder": { + "desc": "Les agents répondront dans l'ordre défini dans le groupe", + "options": { + "natural": "Naturel", + "sequential": "Séquentiel" + }, + "placeholder": "Choisissez l'ordre des réponses", + "title": "Ordre des réponses" + }, + "responseSpeed": { + "desc": "Contrôle la vitesse globale du groupe", + "options": { + "fast": "Rapide", + "medium": "Moyenne", + "slow": "Lente" + }, + "placeholder": "Choisissez la vitesse de réponse", + "title": "Vitesse de réponse" + }, + "revealDM": { + "desc": "Rendez visibles les messages privés envoyés à d'autres membres.", + "title": "Afficher le contenu des messages privés" + }, + "submit": "Mettre à jour les paramètres", + "systemPrompt": { + "desc": "Invite système personnalisée pour l'animateur de la conversation de groupe. Cela peut influencer le comportement par défaut de l'animateur.", + "placeholder": "Veuillez saisir une invite système personnalisée pour l'animateur...", + "title": "Invite système de l'animateur" + }, + "title": "Paramètres de discussion" + }, + "settingGroupMembers": { + "addToGroup": "Ajouter au groupe", + "availableAgents": "Assistants disponibles", + "defaultAgent": "Assistant personnalisé", + "disableHost": "Désactiver l'assistant hôte", + "edit": "Modifier le membre", + "empty": "Aucun agent dans ce groupe. Cliquez sur le bouton + pour ajouter des membres.", + "enableHost": "Activer l'assistant hôte", + "groupHost": "Hôte du groupe", + "groupMembers": "Membres du groupe", + "host": { + "description": "Lorsque l'hôte est dans le groupe, la discussion de groupe fonctionne automatiquement, adaptée aux tâches créatives.", + "title": "Hôte" + }, + "noAvailableAgents": "Aucun assistant disponible", + "noDescription": "Pas de description", + "noMembersInGroup": "Aucun membre dans le groupe", + "owner": "Vous (propriétaire)", + "remove": "Supprimer le membre", + "removeFromGroup": "Retirer du groupe", + "you": "Vous" + }, "settingImage": { "defaultCount": { "desc": "Définir le nombre d'images générées par défaut lors de la création d'une nouvelle tâche dans le panneau de génération d'images.", @@ -522,6 +627,11 @@ "modelDesc": "Modèle spécifiquement utilisé pour la nomination automatique des sujets de peinture IA", "title": "Nomination automatique des sujets de peinture IA" }, + "groupChatSupervisor": { + "label": "Modèle de supervision des discussions de groupe", + "modelDesc": "Modèle spécialement conçu pour superviser et gérer les conversations de groupe.", + "title": "Supervision et gestion des discussions de groupe" + }, "helpInfo": "Lors de la création d'un nouvel assistant, les paramètres par défaut de l'assistant seront utilisés comme valeurs par défaut.", "historyCompress": { "label": "Modèle d'historique de conversation", diff --git a/locales/fr-FR/welcome.json b/locales/fr-FR/welcome.json index fbc369f697f..e392c5dd571 100644 --- a/locales/fr-FR/welcome.json +++ b/locales/fr-FR/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Je suis votre assistant intelligent personnel {{appName}}. Que puis-je faire pour vous maintenant ?
Si vous avez besoin d'un assistant plus professionnel ou personnalisé, vous pouvez cliquer sur pour créer un assistant sur mesure.", "defaultMessageWithoutCreate": "Je suis votre assistant intelligent personnel {{appName}}. Que puis-je faire pour vous maintenant ?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Discuter techniquement des modifications de code et effectuer des revues par les pairs", + "emoji": "💻", + "prompt": "Examinons ensemble ce code. Peux-tu nous aider à analyser ce code et identifier les points à améliorer ?", + "title": "Revue de code" + }, + "investment": { + "description": "Analyser le marché, discuter des stratégies d'investissement et partager des insights financiers", + "emoji": "📈", + "prompt": "Analysons le marché ensemble. Peux-tu nous aider à discuter des stratégies d'investissement et partager des insights financiers ?", + "title": "Club d'investissement" + }, + "research": { + "description": "Explorer des concepts scientifiques, réaliser des expériences et partager les découvertes", + "emoji": "🔬", + "prompt": "Explorons la science ensemble ! Peux-tu nous aider à réaliser des expériences et partager nos découvertes ?", + "title": "Exposition scientifique" + }, + "study": { + "description": "Sessions d'apprentissage collaboratif, discuter des concepts et résoudre des problèmes ensemble", + "emoji": "📚", + "prompt": "Formons un groupe d'étude. Peux-tu nous aider à comprendre ces concepts et résoudre les problèmes ensemble ?", + "title": "Groupe d'étude" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Créer, commenter et apprécier diverses formes d'art visuel et numérique", + "emoji": "🖼️", + "prompt": "Organisons un atelier d'art ! Peux-tu nous aider à créer, commenter et apprécier différentes formes d'art ?", + "title": "Atelier d'art" + }, + "debate": { + "description": "Discussions structurées et débats sur divers sujets et actualités", + "emoji": "⚖️", + "prompt": "Faisons un débat structuré. Peux-tu nous aider à organiser une discussion argumentée sur ce sujet ?", + "title": "Club de débat" + }, + "designReview": { + "description": "Réunions collaboratives pour donner des retours sur des concepts de design, prototypes ou créations", + "emoji": "🎨", + "prompt": "Nous devons examiner quelques créations design. Peux-tu nous aider à fournir des retours constructifs sur les concepts et prototypes ?", + "title": "Revue de design" + }, + "ideation": { + "description": "Génération d'idées collaborative multi-perspectives et résolution créative de problèmes", + "emoji": "🧠", + "prompt": "Commençons une séance de brainstorming pour le projet. Peux-tu nous aider à générer des idées et solutions créatives ?", + "title": "Brainstorming" + } + }, + "game": { + "debateClub": { + "description": "Discussions structurées et débats sur divers sujets et actualités", + "emoji": "⚖️", + "prompt": "Faisons un débat structuré. Peux-tu nous aider à organiser une discussion argumentée sur ce sujet ?", + "title": "Club de débat" + }, + "gameNight": { + "description": "Jeux interactifs amusants et activités pour renforcer l'esprit d'équipe et s'amuser", + "emoji": "🎲", + "prompt": "La soirée jeux commence ! Peux-tu nous aider à organiser des jeux interactifs amusants pour renforcer l'esprit d'équipe ?", + "title": "Soirée jeux" + }, + "modelUN": { + "description": "Simulation de débats des Nations Unies et négociations diplomatiques sur des enjeux mondiaux", + "emoji": "🌍", + "prompt": "Simulons un débat de l'ONU. Peux-tu nous aider à organiser une négociation diplomatique sur un enjeu mondial ?", + "title": "Simulation de l'ONU" + }, + "werewolf": { + "description": "Jeu social de déduction où les joueurs identifient les loups-garous par stratégie et discussion", + "emoji": "🐺", + "prompt": "Jouons au jeu du loup-garou ! Peux-tu nous aider à définir les règles et animer ce jeu de déduction sociale ?", + "title": "Jeu du loup-garou" + } + }, + "general": { + "brainstorm": { + "description": "Génération d'idées collaborative multi-perspectives et résolution créative de problèmes", + "emoji": "🧠", + "prompt": "Commençons une séance de brainstorming pour le projet. Peux-tu nous aider à générer des idées et solutions créatives ?", + "title": "Brainstorming" + }, + "debate": { + "description": "Discussions structurées et débats sur divers sujets et actualités", + "emoji": "⚖️", + "prompt": "Faisons un débat structuré. Peux-tu nous aider à organiser une discussion argumentée sur ce sujet ?", + "title": "Club de débat" + }, + "languagePractice": { + "description": "Pratiquer la langue avec des locuteurs natifs et apprendre de nouvelles langues", + "emoji": "🗣️", + "prompt": "Pratiquons une nouvelle langue ensemble. Peux-tu nous aider à apprendre et pratiquer cette langue ?", + "title": "Pratique linguistique" + }, + "studyGroup": { + "description": "Sessions d'apprentissage collaboratif, discuter des concepts et résoudre des problèmes ensemble", + "emoji": "📚", + "prompt": "Formons un groupe d'étude. Peux-tu nous aider à comprendre ces concepts et résoudre les problèmes ensemble ?", + "title": "Groupe d'étude" + } + }, + "planning": { + "cookingClass": { + "description": "Apprendre et partager des techniques culinaires, recettes et traditions gastronomiques", + "emoji": "👨‍🍳", + "prompt": "Faisons un cours de cuisine ! Peux-tu nous aider à apprendre de nouvelles recettes et techniques culinaires ?", + "title": "Cours de cuisine" + }, + "fitnessChallenge": { + "description": "Fixer des objectifs de fitness en groupe, partager des méthodes d'entraînement et se motiver mutuellement", + "emoji": "💪", + "prompt": "Commençons un défi fitness ! Peux-tu nous aider à fixer des objectifs et nous motiver à rester en forme ?", + "title": "Défi fitness" + }, + "planningPoker": { + "description": "Technique agile d'estimation des tâches et charges de travail à l'aide de cartes", + "emoji": "🃏", + "prompt": "Nous faisons du planning poker pour le projet. Peux-tu nous aider à estimer la charge de travail des tâches avec cette méthode agile ?", + "title": "Planning poker" + }, + "travelPlanning": { + "description": "Planifier des voyages, partager des expériences et découvrir de nouvelles destinations", + "emoji": "✈️", + "prompt": "Planifions un voyage ensemble ! Peux-tu nous aider à rechercher des destinations et organiser l'itinéraire ?", + "title": "Planification de voyage" + } + }, + "product": { + "codeReview": { + "description": "Discuter techniquement des modifications de code et effectuer des revues par les pairs", + "emoji": "💻", + "prompt": "Examinons ensemble ce code. Peux-tu nous aider à analyser ce code et identifier les points à améliorer ?", + "title": "Revue de code" + }, + "designReview": { + "description": "Réunions collaboratives pour donner des retours sur des concepts de design, prototypes ou créations", + "emoji": "🎨", + "prompt": "Nous devons examiner quelques créations design. Peux-tu nous aider à fournir des retours constructifs sur les concepts et prototypes ?", + "title": "Revue de design" + }, + "sprintPlanning": { + "description": "Technique agile d'estimation des tâches et charges de travail à l'aide de cartes", + "emoji": "🃏", + "prompt": "Nous faisons du planning poker pour le projet. Peux-tu nous aider à estimer la charge de travail des tâches avec cette méthode agile ?", + "title": "Planning poker" + }, + "techExchange": { + "description": "Discuter des technologies émergentes, innovations et tendances sectorielles", + "emoji": "🚀", + "prompt": "Faisons un échange technologique ! Peux-tu nous aider à discuter des technologies émergentes et des tendances du secteur ?", + "title": "Échange technologique" + } + }, + "title": "Recommandations d'utilisation du chat de groupe", + "writing": { + "bookClub": { + "description": "Discussions littéraires et analyses de livres, histoires et œuvres littéraires", + "emoji": "📖", + "prompt": "Commençons la discussion du club de lecture. Peux-tu nous aider à analyser ce livre et explorer ses thèmes ensemble ?", + "title": "Club de lecture" + }, + "movieClub": { + "description": "Regarder et discuter ensemble de films, documentaires et médias visuels", + "emoji": "🎬", + "prompt": "Commençons la discussion du ciné-club. Peux-tu nous aider à analyser ce film et explorer ses thèmes ensemble ?", + "title": "Ciné-club" + }, + "musicSession": { + "description": "Sessions collaboratives de création, partage et appréciation musicale", + "emoji": "🎵", + "prompt": "Faisons une session d'improvisation musicale ! Peux-tu nous aider à créer et apprécier la musique ensemble ?", + "title": "Improvisation musicale" + }, + "studyGroup": { + "description": "Sessions d'apprentissage collaboratif, discuter des concepts et résoudre des problèmes ensemble", + "emoji": "📚", + "prompt": "Formons un groupe d'étude. Peux-tu nous aider à comprendre ces concepts et résoudre les problèmes ensemble ?", + "title": "Groupe d'étude" + } + } + }, + "groupMessage": "Bienvenue dans le chat de groupe ! Collaborez avec plusieurs assistants IA dans un espace de conversation partagé.", + "groupTemplates": { + "analysis": { + "description": "Perspectives basées sur les données, analyses approfondies", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Vous excellez dans le traitement et l’interprétation des données, révélant les schémas et tendances sous-jacents à travers des graphiques et des analyses statistiques.", + "title": "Analyste de données" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Vous êtes un expert en recherche, chargé de la collecte d'informations et des études approfondies, capable d'analyser les problèmes sous plusieurs angles.", + "title": "Expert en recherche" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Vous êtes un statisticien, maîtrisant diverses méthodes et modèles statistiques, capable d'extraire des insights commerciaux précieux à partir des données.", + "title": "Statisticien" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Vous êtes un analyste quantitatif, spécialisé dans la modélisation quantitative et l'évaluation des risques, utilisant des méthodes mathématiques pour résoudre des problèmes complexes.", + "title": "Analyste quantitatif" + } + ], + "title": "Équipe d'analyse" + }, + "brainstorm": { + "description": "Pensée créative multi-perspectives, stimulation d'infinies possibilités", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Vous êtes un directeur créatif, expert dans la gestion de la direction créative à un niveau macro, capable de transformer des concepts abstraits en plans créatifs concrets et réalisables.", + "title": "Directeur créatif" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Vous êtes un expert en innovation, chargé de découvrir des solutions novatrices et des idées révolutionnaires, capable de penser hors des cadres établis.", + "title": "Expert en innovation" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Vous êtes un spécialiste de la pensée design, abordant les problèmes sous l'angle de l'expérience utilisateur et de la présentation visuelle, mettant l'accent sur l'expression créative visuelle.", + "title": "Spécialiste en design thinking" + } + ], + "title": "Groupe de brainstorming" + }, + "game": { + "description": "Jouez à divers jeux de mots multijoueurs, tels que le Loup-Garou et Qui est l'Imposteur", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Tu es expert dans la participation à divers jeux textuels multijoueurs, capable de jouer selon les règles du jeu.", + "title": "Joueur" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Tu es expert dans la participation à divers jeux textuels multijoueurs, capable de jouer selon les règles du jeu.", + "title": "Joueur" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Tu es expert dans la participation à divers jeux textuels multijoueurs, capable de jouer selon les règles du jeu.", + "title": "Joueur" + } + ], + "title": "Salle de jeux" + }, + "planning": { + "description": "Planification stratégique et gestion de projet, coordination globale", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Tu es responsable de la planification globale du projet, du suivi de l'avancement et de la coordination des ressources pour assurer la livraison dans les délais et la qualité.", + "title": "Chef de projet" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Tu es responsable de l'élaboration de la stratégie à long terme, de l'analyse des opportunités de marché, de la définition des objectifs et des plans d'action.", + "title": "Responsable stratégie" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Tu es responsable de la création de plans d'exécution détaillés, de la coordination des ressources inter-départements et de la garantie de la faisabilité des plans.", + "title": "Expert en développement culinaire" + } + ], + "title": "Équipe de développement culinaire" + }, + "product": { + "description": "Conception et développement de produits, création de produits de qualité", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Vous êtes un designer, expert dans la conception de divers types de produits, capable de concevoir selon les besoins du produit.", + "title": "Designer" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Vous êtes un chef de produit, responsable de la planification, conception, développement et maintenance du produit, garantissant la qualité et l'expérience utilisateur.", + "title": "Chef de produit" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Vous êtes un ingénieur full-stack expérimenté, expert dans le développement de divers types de produits, capable de développer selon les besoins du produit.", + "title": "Ingénieur full-stack" + } + ], + "title": "Équipe de développement produit" + }, + "writing": { + "description": "Création et édition de contenu, production de textes de qualité", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Tu excelles dans la création de contenus de divers styles, capable d'adapter ton écriture selon les contextes et les publics.", + "title": "Rédacteur de contenu" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Vous êtes un éditeur, responsable de la relecture, de la correction et de l'optimisation des textes, garantissant l'exactitude, la fluidité et le professionnalisme du contenu.", + "title": "Éditeur" + } + ], + "title": "Cercle d'écriture" + } + }, "qa": { "q01": "Qu'est-ce que LobeHub ?", "q02": "Qu'est-ce que {{appName}} ?", diff --git a/locales/it-IT/chat.json b/locales/it-IT/chat.json index c194a74a014..2f6f2cca859 100644 --- a/locales/it-IT/chat.json +++ b/locales/it-IT/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Modelli" }, + "active": "Attivo", "agentDefaultMessage": "Ciao, sono **{{name}}**, puoi iniziare subito a parlare con me oppure andare su [Impostazioni assistente]({{url}}) per completare le mie informazioni.", "agentDefaultMessageWithSystemRole": "Ciao, sono **{{name}}**, come posso aiutarti?", "agentDefaultMessageWithoutEdit": "Ciao, sono **{{name}}**, come posso aiutarti?", @@ -13,17 +14,28 @@ "thought": "Processo di pensiero", "unknownTitle": "Opera non nominata" }, + "availableAgents": "Assistenti disponibili", "backToBottom": "Torna in fondo", "chatList": { "longMessageDetail": "Visualizza dettagli" }, "clearCurrentMessages": "Cancella messaggi attuali", "confirmClearCurrentMessages": "Stai per cancellare i messaggi attuali, questa operazione non potrà essere annullata. Confermi?", + "confirmRemoveChatGroupItemAlert": "Stai per eliminare questa chat di gruppo, i membri del gruppo non saranno influenzati, conferma la tua azione", + "confirmRemoveGroupItemAlert": "Stai per eliminare questo gruppo. Dopo l'eliminazione, gli assistenti contenuti in esso verranno spostati nell'elenco predefinito. Confermi l'operazione?", + "confirmRemoveGroupSuccess": "Gruppo eliminato con successo", "confirmRemoveSessionItemAlert": "Stai per rimuovere questo assistente, l'operazione non potrà essere annullata. Confermi?", "confirmRemoveSessionSuccess": "Session eliminata con successo", "defaultAgent": "Assistente predefinito", + "defaultGroupChat": "Chat di gruppo", "defaultList": "Lista predefinita", "defaultSession": "Sessione predefinita", + "dm": { + "placeholder": "I tuoi messaggi privati con {{agentTitle}} verranno visualizzati qui.", + "tooltip": "Invia messaggio privato", + "visibleTo": "Visibile solo a {{target}}", + "you": "tu" + }, "duplicateSession": { "loading": "In corso di duplicazione...", "success": "Duplicazione riuscita", @@ -58,11 +70,56 @@ "title": "Estrai contenuto dal link della pagina web" } }, + "group": { + "desc": "Collaborare con più assistenti IA in uno spazio di conversazione condiviso.", + "memberTooltip": "Nel gruppo ci sono {{count}} membri", + "orchestratorThinking": "L'organizzatore sta riflettendo...", + "removeMember": "Rimuovi membro", + "title": "Gruppi" + }, + "groupDescription": "Descrizione del gruppo", + "groupSidebar": { + "members": { + "addMember": "Aggiungi membro", + "memberSettings": "Impostazioni membro", + "orchestrator": "Organizzatore", + "orchestratorThinking": "L'organizzatore sta riflettendo...", + "removeMember": "Rimuovi membro", + "stopOrchestrator": "Interrompi riflessione", + "triggerOrchestrator": "Avvia chat di gruppo" + }, + "tabs": { + "host": "Ospitante", + "members": "Membri", + "role": "Impostazioni" + } + }, + "groupWizard": { + "chooseMembers": "Seleziona assistenti esistenti...", + "createGroup": "Crea gruppo", + "existingMembers": "Assistenti esistenti", + "groupMembers": "Questi assistenti saranno aggiunti anche alla tua lista", + "host": { + "description": "Automatizza il funzionamento della chat di gruppo", + "title": "Moderatore", + "tooltip": "Se disattivi l'ospitante della chat di gruppo, dovrai menzionare manualmente i membri con @ per ottenere una risposta" + }, + "memberCount": "{{count}} membri", + "noMatchingTemplates": "Nessun modello corrispondente", + "noSelectedTemplates": "Nessun modello selezionato", + "noTemplateMembers": "Nessun membro nel modello", + "noTemplates": "Nessun modello disponibile", + "searchTemplates": "Cerca modelli...", + "title": "Crea gruppo", + "useTemplate": "Usa modello" + }, + "hideForYou": "Il contenuto del messaggio privato è stato nascosto, abilita 【Mostra contenuto messaggi privati】 nelle impostazioni per visualizzarlo", "history": { "title": "L'assistente ricorderà solo gli ultimi {{count}} messaggi" }, "historyRange": "Intervallo cronologico", "historySummary": "Riepilogo della storia", + "inactive": "Inattivo", "inbox": { "desc": "Attiva il cluster cerebrale, accendi la scintilla del pensiero. Il tuo assistente intelligente, qui per comunicare con te su tutto.", "title": "Chiacchierata casuale" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Stiamo comprendendo e analizzando la tua intenzione..." }, + "inviteMembers": "Invita membri", "knowledgeBase": { "all": "Tutti i contenuti", "allFiles": "Tutti i file", @@ -101,12 +159,29 @@ "uploadGuide": "I file caricati possono essere visualizzati nella 'Base di conoscenza'.", "viewMore": "Visualizza di più" }, + "memberSelection": { + "addMember": "Aggiungi membro", + "allMembers": "Tutti i membri", + "createGroup": "Crea chat di gruppo", + "noAvailableAgents": "Nessun assistente disponibile da invitare", + "noSelectedAgents": "Nessun assistente selezionato", + "searchAgents": "Cerca assistenti...", + "setInitialMembers": "Seleziona membri del gruppo" + }, + "members": "Membri", + "mention": { + "title": "Menziona membri" + }, "messageAction": { "delAndRegenerate": "Elimina e rigenera", "deleteDisabledByThreads": "Esistono sottoargomenti, non è possibile eliminare", "regenerate": "Rigenera" }, "messages": { + "dm": { + "sentTo": "Visibile solo a {{name}}", + "title": "Messaggio privato" + }, "modelCard": { "credit": "Crediti", "creditPricing": "Prezzo", @@ -156,6 +231,13 @@ "previousMessage": "Messaggio precedente" }, "newAgent": "Nuovo assistente", + "newGroupChat": "Nuova chat di gruppo", + "noAgentsYet": "In questo gruppo non ci sono ancora assistenti. Fai clic sul pulsante + per invitare assistenti.", + "noAvailableAgents": "Nessun assistente disponibile da invitare", + "noMatchingAgents": "Nessun assistente corrispondente", + "noMembersYet": "Questo gruppo non ha ancora membri. Clicca sul pulsante + per invitare assistenti.", + "noSelectedAgents": "Nessun assistente selezionato", + "owner": "Proprietario del gruppo", "pin": "Fissa in alto", "pinOff": "Annulla fissaggio in alto", "rag": { @@ -196,12 +278,16 @@ "title": "Ricerca online" }, "searchAgentPlaceholder": "Assistente di ricerca...", + "searchAgents": "Assistenti di ricerca...", + "selectedAgents": "Assistenti selezionati", "sendPlaceholder": "Inserisci il testo della chat...", "sessionGroup": { "config": "Gestione gruppi", "confirmRemoveGroupAlert": "Stai per rimuovere questo gruppo. Dopo la rimozione, gli assistenti di questo gruppo verranno spostati nella lista predefinita. Confermi l'operazione?", "createAgentSuccess": "Assistente creato con successo", "createGroup": "Aggiungi nuovo gruppo", + "createGroupFailed": "Creazione della chat di gruppo fallita", + "createGroupSuccess": "Chat di gruppo creata con successo", "createSuccess": "Creazione riuscita", "creatingAgent": "Creazione dell'assistente in corso...", "inputPlaceholder": "Inserisci il nome del gruppo...", @@ -235,6 +321,12 @@ "loading": "Riconoscimento in corso...", "prettifying": "Miglioramento in corso..." }, + "supervisor": { + "todoList": { + "allComplete": "Tutti i compiti sono stati completati", + "title": "Compiti completati" + } + }, "thread": { "divider": "Sottoargomento", "threadMessageCount": "{{messageCount}} messaggi", @@ -248,6 +340,7 @@ "chats": "Chat", "historySummary": "Riepilogo storico", "rest": "Rimanenti", + "supervisor": "Organizzatore del gruppo", "systemRole": "Ruolo di sistema", "title": "Dettagli del Token", "tools": "Strumenti", @@ -273,6 +366,7 @@ "action": "Lettura vocale", "clear": "Cancella lettura vocale" }, + "untitledAgent": "Assistente senza nome", "updateAgent": "Aggiorna informazioni assistente", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "La dimensione del file video non può superare i 20MB, la dimensione attuale del file è {{actualSize}}" } }, + "you": "tu", "zenMode": "Modalità di concentrazione" -} +} diff --git a/locales/it-IT/error.json b/locales/it-IT/error.json index 79f5212d5bb..e3bb1c7c7b0 100644 --- a/locales/it-IT/error.json +++ b/locales/it-IT/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Errore nella richiesta del servizio. Verifica la configurazione o riprova" }, + "supervisor": { + "decisionFailed": "Il supervisore del gruppo non riesce a funzionare. Controlla la configurazione del supervisore per assicurarti di aver impostato correttamente il modello, la chiave API e l'indirizzo API." + }, "testConnectionFailed": "Connessione di prova fallita: {{error}}", "tts": { "responseError": "Errore nella richiesta del servizio. Verifica la configurazione o riprova" diff --git a/locales/it-IT/providers.json b/locales/it-IT/providers.json index be92142e236..f54b006ae4d 100644 --- a/locales/it-IT/providers.json +++ b/locales/it-IT/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock è un servizio offerto da Amazon AWS, focalizzato sulla fornitura di modelli linguistici e visivi AI avanzati per le aziende. La sua famiglia di modelli include la serie Claude di Anthropic, la serie Llama 3.1 di Meta e altro, coprendo una varietà di opzioni da leggere a ad alte prestazioni, supportando generazione di testo, dialogo, elaborazione di immagini e altro, adatta a diverse applicazioni aziendali di varie dimensioni e necessità." }, "bfl": { - "description": "Laboratorio di ricerca all'avanguardia nell'intelligenza artificiale, che costruisce l'infrastruttura visiva del domani." + "description": "Un laboratorio di ricerca all'avanguardia nell'intelligenza artificiale, impegnato nella costruzione dell'infrastruttura visiva del domani." + }, + "cerebras": { + "description": "Cerebras è una piattaforma di inferenza AI basata sul suo sistema dedicato CS-3, progettata per offrire il servizio LLM più veloce al mondo, con risposta in tempo reale e un'elevata capacità di elaborazione. È pensata per eliminare la latenza e accelerare i flussi di lavoro AI complessi, come la generazione di codice in tempo reale e le attività degli agenti." }, "cerebras": { "description": "Cerebras è una piattaforma di inferenza AI basata sul suo sistema dedicato CS-3, progettata per offrire il servizio LLM più veloce al mondo, con risposta in tempo reale e un'elevata capacità di elaborazione. È pensata per eliminare la latenza e accelerare i flussi di lavoro AI complessi, come la generazione di codice in tempo reale e le attività degli agenti." diff --git a/locales/it-IT/setting.json b/locales/it-IT/setting.json index ab72b57ebad..a72ecbe4301 100644 --- a/locales/it-IT/setting.json +++ b/locales/it-IT/setting.json @@ -35,9 +35,16 @@ "title": "Ripristina tutte le impostazioni" } }, + "groupTab": { + "chat": "Chat", + "members": "Membri", + "meta": "Informazioni di base" + }, "header": { "desc": "Preferenze e impostazioni del modello.", "global": "Impostazioni globali", + "group": "Impostazioni chat di gruppo", + "groupDesc": "Gestisci la chat di gruppo corrente", "session": "Impostazioni della sessione", "sessionDesc": "Impostazioni del personaggio e preferenze di sessione.", "sessionWithName": "Impostazioni della sessione · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Altri modelli sono in fase di <1> pianificazione per l'integrazione , resta sintonizzato" }, + "message": { + "success": "Aggiornamento riuscito" + }, "plugin": { "addMCPPlugin": "Aggiungi plugin MCP", "addTooltip": "Aggiungi plugin personalizzato", @@ -294,6 +304,101 @@ }, "title": "Impostazioni Generali" }, + "settingGroup": { + "description": { + "placeholder": "Inserisci la descrizione della chat di gruppo", + "title": "Descrizione della chat di gruppo" + }, + "name": { + "placeholder": "Inserisci il nome della chat di gruppo", + "title": "Nome della chat di gruppo" + }, + "scene": { + "desc": "Seleziona la scena della chat di gruppo", + "options": { + "casual": "Informale", + "productive": "Produttivo" + }, + "title": "Scena della chat di gruppo" + }, + "submit": "Aggiorna chat di gruppo", + "systemPrompt": { + "placeholder": "Inserisci il prompt di sistema del moderatore", + "title": "Prompt di sistema del moderatore" + }, + "title": "Informazioni chat di gruppo" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Dopo la disattivazione, puoi comunque inviare messaggi privati all'assistente", + "title": "Consenti messaggi privati dall'assistente" + }, + "enableSupervisor": { + "desc": "Attiva la funzione di moderatore della chat di gruppo; il moderatore gestirà il flusso della conversazione", + "title": "Attiva moderatore" + }, + "maxResponseInRow": { + "desc": "Seleziona quante risposte consecutive un membro può inviare. Imposta a 0 per disabilitare questo limite.", + "title": "Numero di risposte consecutive" + }, + "model": { + "desc": "Gli interventi dei membri del gruppo non saranno influenzati. Alcuni modelli non possono essere utilizzati come moderatori.", + "title": "Modello moderatore" + }, + "orchestratorTitle": "Impostazioni moderatore", + "responseOrder": { + "desc": "Gli agenti risponderanno nell'ordine stabilito nella chat di gruppo", + "options": { + "natural": "Naturale", + "sequential": "Sequenziale" + }, + "placeholder": "Seleziona l'ordine di risposta", + "title": "Ordine di risposta" + }, + "responseSpeed": { + "desc": "Controlla la velocità complessiva della chat di gruppo", + "options": { + "fast": "Veloce", + "medium": "Media", + "slow": "Lenta" + }, + "placeholder": "Seleziona la velocità di risposta", + "title": "Velocità di risposta" + }, + "revealDM": { + "desc": "Rendi visibili i messaggi privati inviati ad altri membri.", + "title": "Mostra contenuti messaggi privati" + }, + "submit": "Aggiorna impostazioni", + "systemPrompt": { + "desc": "Prompt di sistema personalizzato per il moderatore della chat di gruppo. Può influenzare il comportamento predefinito del moderatore.", + "placeholder": "Inserisci un prompt di sistema personalizzato per il moderatore...", + "title": "Prompt di sistema del moderatore" + }, + "title": "Impostazioni chat" + }, + "settingGroupMembers": { + "addToGroup": "Aggiungi al gruppo", + "availableAgents": "Assistenti disponibili", + "defaultAgent": "Assistente personalizzato", + "disableHost": "Disattiva assistente host", + "edit": "Modifica membro", + "empty": "Nessun agente presente in questa chat di gruppo. Clicca il pulsante + per aggiungere membri.", + "enableHost": "Attiva assistente host", + "groupHost": "Host del gruppo", + "groupMembers": "Membri del gruppo", + "host": { + "description": "Quando l'host è nel gruppo, la chat di gruppo funziona in modo automatizzato, adatta a compiti creativi.", + "title": "Host" + }, + "noAvailableAgents": "Nessun assistente disponibile", + "noDescription": "Nessuna descrizione", + "noMembersInGroup": "Nessun membro nel gruppo", + "owner": "Tu (proprietario)", + "remove": "Rimuovi membro", + "removeFromGroup": "Rimuovi dal gruppo", + "you": "Tu" + }, "settingImage": { "defaultCount": { "desc": "Imposta il numero predefinito di immagini da generare quando si crea una nuova attività nel pannello di generazione immagini.", @@ -522,6 +627,11 @@ "modelDesc": "Modello specificato per la denominazione automatica degli argomenti nel disegno AI", "title": "Denominazione automatica argomenti per disegno AI" }, + "groupChatSupervisor": { + "label": "Modello di supervisione per chat di gruppo", + "modelDesc": "Specifica il modello da utilizzare per la supervisione e la gestione delle conversazioni di gruppo", + "title": "Supervisione e gestione delle chat di gruppo" + }, "helpInfo": "Quando crei un nuovo assistente, verranno utilizzate le impostazioni predefinite dell'assistente come valori predefiniti.", "historyCompress": { "label": "Modello di storia delle conversazioni", diff --git a/locales/it-IT/welcome.json b/locales/it-IT/welcome.json index 6698eaabe76..703b418ea27 100644 --- a/locales/it-IT/welcome.json +++ b/locales/it-IT/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Sono il tuo assistente intelligente personale {{appName}}. Come posso aiutarti adesso?
Se hai bisogno di un assistente più professionale o personalizzato, puoi cliccare su per creare un assistente personalizzato.", "defaultMessageWithoutCreate": "Sono il tuo assistente intelligente personale {{appName}}. Come posso aiutarti adesso?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Discussione tecnica e revisione tra pari delle modifiche e implementazioni del codice", + "emoji": "💻", + "prompt": "Esaminiamo insieme del codice. Puoi aiutarci ad analizzarlo e a individuare possibili miglioramenti?", + "title": "Revisione del codice" + }, + "investment": { + "description": "Analisi di mercato, discussione di strategie di investimento e condivisione di approfondimenti finanziari", + "emoji": "📈", + "prompt": "Analizziamo insieme il mercato. Puoi aiutarci a discutere strategie di investimento e a condividere approfondimenti finanziari?", + "title": "Club di investimento" + }, + "research": { + "description": "Esplorazione di concetti scientifici, esperimenti e condivisione di scoperte", + "emoji": "🔬", + "prompt": "Esploriamo la scienza insieme! Puoi aiutarci a condurre esperimenti e a condividere le nostre scoperte?", + "title": "Esposizione scientifica" + }, + "study": { + "description": "Sessioni di studio collaborative per discutere concetti e risolvere problemi insieme", + "emoji": "📚", + "prompt": "Formiamo un gruppo di studio. Puoi aiutarci a comprendere questi concetti e a risolvere i problemi insieme?", + "title": "Gruppo di studio" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Creazione, critica e apprezzamento di varie forme di arte visiva e digitale", + "emoji": "🖼️", + "prompt": "Organizziamo un laboratorio artistico! Puoi aiutarci a creare, commentare e apprezzare diverse forme d'arte?", + "title": "Laboratorio artistico" + }, + "debate": { + "description": "Discussioni strutturate e dibattiti su vari argomenti e attualità", + "emoji": "⚖️", + "prompt": "Facciamo un dibattito strutturato. Puoi aiutarci a organizzare una discussione argomentata su questo tema?", + "title": "Club di dibattito" + }, + "designReview": { + "description": "Sessioni collaborative di feedback su concetti di design, prototipi o opere creative", + "emoji": "🎨", + "prompt": "Dobbiamo rivedere alcuni progetti di design. Puoi aiutarci a fornire feedback costruttivi su concetti e prototipi?", + "title": "Revisione del design" + }, + "ideation": { + "description": "Generazione creativa collaborativa e risoluzione creativa dei problemi da molteplici prospettive", + "emoji": "🧠", + "prompt": "Iniziamo una sessione di brainstorming per il progetto. Puoi aiutarci a generare idee e soluzioni creative?", + "title": "Brainstorming" + } + }, + "game": { + "debateClub": { + "description": "Discussioni strutturate e dibattiti su vari argomenti e attualità", + "emoji": "⚖️", + "prompt": "Facciamo un dibattito strutturato. Puoi aiutarci a organizzare una discussione argomentata su questo tema?", + "title": "Club di dibattito" + }, + "gameNight": { + "description": "Giochi interattivi divertenti e attività per rafforzare il legame di squadra e divertirsi", + "emoji": "🎲", + "prompt": "È iniziata la serata di giochi! Puoi aiutarci a organizzare giochi interattivi divertenti per rafforzare il team?", + "title": "Serata di giochi" + }, + "modelUN": { + "description": "Simulazione di dibattiti ONU e negoziazioni diplomatiche su temi globali", + "emoji": "🌍", + "prompt": "Simuliamo un dibattito delle Nazioni Unite. Puoi aiutarci a organizzare una negoziazione diplomatica su temi globali?", + "title": "Modello ONU" + }, + "werewolf": { + "description": "Gioco sociale di deduzione in cui i giocatori identificano i lupi mannari tramite strategia e discussione", + "emoji": "🐺", + "prompt": "Giochiamo a Lupi Mannari! Puoi aiutarci a impostare le regole e a moderare questo gioco di deduzione sociale?", + "title": "Gioco dei Lupi Mannari" + } + }, + "general": { + "brainstorm": { + "description": "Generazione creativa collaborativa e risoluzione creativa dei problemi da molteplici prospettive", + "emoji": "🧠", + "prompt": "Iniziamo una sessione di brainstorming per il progetto. Puoi aiutarci a generare idee e soluzioni creative?", + "title": "Brainstorming" + }, + "debate": { + "description": "Discussioni strutturate e dibattiti su vari argomenti e attualità", + "emoji": "⚖️", + "prompt": "Facciamo un dibattito strutturato. Puoi aiutarci a organizzare una discussione argomentata su questo tema?", + "title": "Club di dibattito" + }, + "languagePractice": { + "description": "Pratica della conversazione e apprendimento di nuove lingue con madrelingua", + "emoji": "🗣️", + "prompt": "Pratichiamo una nuova lingua insieme. Puoi aiutarci a imparare e praticare questa lingua?", + "title": "Pratica linguistica" + }, + "studyGroup": { + "description": "Sessioni di studio collaborative per discutere concetti e risolvere problemi insieme", + "emoji": "📚", + "prompt": "Formiamo un gruppo di studio. Puoi aiutarci a comprendere questi concetti e a risolvere i problemi insieme?", + "title": "Gruppo di studio" + } + }, + "planning": { + "cookingClass": { + "description": "Apprendimento e condivisione di tecniche di cucina, ricette e tradizioni culinarie", + "emoji": "👨‍🍳", + "prompt": "Facciamo una lezione di cucina! Puoi aiutarci a imparare nuove ricette e tecniche culinarie?", + "title": "Corso di cucina" + }, + "fitnessChallenge": { + "description": "Definizione di obiettivi di fitness di gruppo, condivisione di esercizi e motivazione reciproca", + "emoji": "💪", + "prompt": "Iniziamo una sfida fitness! Puoi aiutarci a fissare obiettivi e a motivarci a mantenere uno stile di vita sano?", + "title": "Sfida fitness" + }, + "planningPoker": { + "description": "Tecnica agile di stima del lavoro e delle attività di progetto usando carte", + "emoji": "🃏", + "prompt": "Stiamo facendo planning poker per il progetto. Puoi aiutarci a stimare il carico di lavoro delle attività usando tecniche agili?", + "title": "Planning poker" + }, + "travelPlanning": { + "description": "Pianificazione di viaggi, condivisione di esperienze e scoperta di nuove destinazioni", + "emoji": "✈️", + "prompt": "Pianifichiamo un viaggio insieme! Puoi aiutarci a ricercare destinazioni e organizzare l'itinerario?", + "title": "Pianificazione viaggi" + } + }, + "product": { + "codeReview": { + "description": "Discussione tecnica e revisione tra pari delle modifiche e implementazioni del codice", + "emoji": "💻", + "prompt": "Esaminiamo insieme del codice. Puoi aiutarci ad analizzarlo e a individuare possibili miglioramenti?", + "title": "Revisione del codice" + }, + "designReview": { + "description": "Sessioni collaborative di feedback su concetti di design, prototipi o opere creative", + "emoji": "🎨", + "prompt": "Dobbiamo rivedere alcuni progetti di design. Puoi aiutarci a fornire feedback costruttivi su concetti e prototipi?", + "title": "Revisione del design" + }, + "sprintPlanning": { + "description": "Tecnica agile di stima del lavoro e delle attività di progetto usando carte", + "emoji": "🃏", + "prompt": "Stiamo facendo planning poker per il progetto. Puoi aiutarci a stimare il carico di lavoro delle attività usando tecniche agili?", + "title": "Planning poker" + }, + "techExchange": { + "description": "Discussione su tecnologie emergenti, innovazione e tendenze del settore", + "emoji": "🚀", + "prompt": "Facciamo uno scambio tecnologico! Puoi aiutarci a discutere di tecnologie emergenti e tendenze del settore?", + "title": "Scambio tecnologico" + } + }, + "title": "Consigli per l'uso delle chat di gruppo", + "writing": { + "bookClub": { + "description": "Discussione e analisi letteraria di libri, storie e opere letterarie", + "emoji": "📖", + "prompt": "Iniziamo la discussione del club del libro. Puoi aiutarci ad analizzare questo libro e a esplorarne i temi?", + "title": "Club del libro" + }, + "movieClub": { + "description": "Visione e discussione di film, documentari e media visivi", + "emoji": "🎬", + "prompt": "Iniziamo la discussione del cineclub. Puoi aiutarci ad analizzare questo film e a esplorarne i temi?", + "title": "Cineclub" + }, + "musicSession": { + "description": "Sessioni collaborative di creazione, condivisione e apprezzamento musicale", + "emoji": "🎵", + "prompt": "Facciamo un'improvvisazione musicale! Puoi aiutarci a creare e apprezzare la musica insieme?", + "title": "Improvvisazione musicale" + }, + "studyGroup": { + "description": "Sessioni di studio collaborative per discutere concetti e risolvere problemi insieme", + "emoji": "📚", + "prompt": "Formiamo un gruppo di studio. Puoi aiutarci a comprendere questi concetti e a risolvere i problemi insieme?", + "title": "Gruppo di studio" + } + } + }, + "groupMessage": "Benvenuti nella chat di gruppo! Collabora con più assistenti AI in uno spazio di conversazione condiviso.", + "groupTemplates": { + "analysis": { + "description": "Approfondimenti guidati dai dati, analisi approfondita e ricerca", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Sei esperto nell'elaborazione e nell'interpretazione dei dati, rivelando schemi e tendenze nascoste attraverso grafici e analisi statistiche.", + "title": "Analista di dati" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Sei un esperto di ricerca, incaricato della raccolta di informazioni e di indagini approfondite, capace di analizzare i problemi da molteplici prospettive.", + "title": "Esperto di ricerca" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Sei uno specialista in statistica, esperto in vari metodi e modelli statistici, capace di estrarre preziose intuizioni commerciali dai dati.", + "title": "Specialista in statistica" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Sei un analista quantitativo, specializzato in modellazione quantitativa e valutazione del rischio, che risolve problemi complessi con metodi matematici.", + "title": "Analista quantitativo" + } + ], + "title": "Squadra di analisi" + }, + "brainstorm": { + "description": "Pensiero creativo multi-prospettico, stimola possibilità infinite", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Sei un direttore creativo, abile nel gestire la direzione creativa da una prospettiva macro, capace di trasformare concetti astratti in piani creativi concreti e realizzabili.", + "title": "Direttore creativo" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Sei un esperto di innovazione, incaricato di scoprire soluzioni innovative e pensieri rivoluzionari, abile a pensare fuori dagli schemi tradizionali.", + "title": "Esperto di innovazione" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Sei uno specialista in design thinking, che considera problemi dal punto di vista dell'esperienza utente e della presentazione visiva, focalizzato sull'espressione creativa visuale.", + "title": "Esperto di design thinking" + } + ], + "title": "Gruppo di brainstorming" + }, + "game": { + "description": "Divertiti con vari giochi di parole multiplayer, come il gioco del lupo mannaro e chi è l'impostore", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Sei esperto nel partecipare a vari giochi di ruolo testuali multiplayer e sai giocare seguendo le regole del gioco.", + "title": "Giocatore" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Sei esperto nel partecipare a vari giochi di ruolo testuali multiplayer e sai giocare seguendo le regole del gioco.", + "title": "Giocatore" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Sei esperto nel partecipare a vari giochi di ruolo testuali multiplayer e sai giocare seguendo le regole del gioco.", + "title": "Giocatore" + } + ], + "title": "Sala giochi" + }, + "planning": { + "description": "Pianificazione strategica e gestione progetti, coordinamento globale", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Sei responsabile della pianificazione generale del progetto, del controllo dei progressi e del coordinamento delle risorse, assicurando il completamento puntuale e di qualità del progetto.", + "title": "Chef" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Sei responsabile della definizione della strategia a lungo termine, dell'analisi delle opportunità di mercato, della definizione degli obiettivi e dei percorsi per raggiungerli.", + "title": "Esperto in approvvigionamento materie prime" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Sei responsabile della definizione di piani esecutivi dettagliati, del coordinamento delle risorse tra i vari dipartimenti e dell'assicurare la fattibilità dei piani.", + "title": "Esperto di sviluppo culinario" + } + ], + "title": "Team di sviluppo culinario" + }, + "product": { + "description": "Progettazione e sviluppo prodotto, creazione di prodotti di alta qualità", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Sei un designer, esperto nella progettazione di vari tipi di prodotti, capace di progettare in base alle esigenze del prodotto.", + "title": "Designer" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Sei un product manager, responsabile della pianificazione, progettazione, sviluppo e manutenzione del prodotto, assicurando qualità e esperienza utente.", + "title": "Product manager" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Sei un ingegnere full-stack esperto, abile nello sviluppo di vari tipi di prodotti, capace di sviluppare in base alle esigenze del prodotto.", + "title": "Ingegnere full-stack" + } + ], + "title": "Team di sviluppo prodotto" + }, + "writing": { + "description": "Creazione e editing di contenuti, realizzazione di testi di alta qualità", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Sei esperto nella creazione di contenuti di vari generi e sai adattare lo stile di scrittura a diversi contesti e pubblici.", + "title": "Autore di contenuti" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Sei un editor, responsabile della revisione, rifinitura e ottimizzazione dei testi, assicurando accuratezza, fluidità e professionalità dei contenuti.", + "title": "Editor" + } + ], + "title": "Cerchia di scrittura" + } + }, "qa": { "q01": "Che cos'è LobeHub?", "q02": "Che cos'è {{appName}}?", diff --git a/locales/ja-JP/chat.json b/locales/ja-JP/chat.json index 02d264625b2..32430542adc 100644 --- a/locales/ja-JP/chat.json +++ b/locales/ja-JP/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "モデル" }, + "active": "アクティブ", "agentDefaultMessage": "こんにちは、私は **{{name}}** です。すぐに私と会話を始めることもできますし、[アシスタント設定]({{url}}) に行って私の情報を充実させることもできます。", "agentDefaultMessageWithSystemRole": "こんにちは、私は **{{name}}** です。何かお手伝いできることはありますか?", "agentDefaultMessageWithoutEdit": "こんにちは、私は **{{name}}** です。何かお手伝いできることはありますか?", @@ -13,17 +14,28 @@ "thought": "思考過程", "unknownTitle": "未命名の作品" }, + "availableAgents": "利用可能なアシスタント", "backToBottom": "現在に戻る", "chatList": { "longMessageDetail": "詳細を見る" }, "clearCurrentMessages": "現在の会話をクリア", "confirmClearCurrentMessages": "現在の会話をクリアします。クリアした後は元に戻すことはできません。操作を確認してください。", + "confirmRemoveChatGroupItemAlert": "このグループチャットを削除しますが、グループメンバーには影響しません。操作を確認してください。", + "confirmRemoveGroupItemAlert": "このグループを削除すると、グループ内のアシスタントはデフォルトの一覧に移動します。操作を続行してもよろしいですか?", + "confirmRemoveGroupSuccess": "グループチャットが正常に削除されました", "confirmRemoveSessionItemAlert": "このエージェントを削除します。削除した後は元に戻すことはできません。操作を確認してください。", "confirmRemoveSessionSuccess": "セッションが正常に削除されました", "defaultAgent": "デフォルトエージェント", + "defaultGroupChat": "グループチャット", "defaultList": "デフォルトリスト", "defaultSession": "デフォルトセッション", + "dm": { + "placeholder": "あなたと{{agentTitle}}のダイレクトメッセージはここに表示されます。", + "tooltip": "メッセージを送る", + "visibleTo": "{{target}} のみが閲覧可能", + "you": "あなた" + }, "duplicateSession": { "loading": "複製中...", "success": "複製に成功しました", @@ -58,11 +70,56 @@ "title": "ウェブリンク内容の抽出" } }, + "group": { + "desc": "複数のAIアシスタントと共有の会話スペースで協力します。", + "memberTooltip": "グループ内に{{count}}人のメンバーがいます", + "orchestratorThinking": "ホストが考え中です...", + "removeMember": "メンバーを削除", + "title": "グループ" + }, + "groupDescription": "グループの説明", + "groupSidebar": { + "members": { + "addMember": "メンバーを追加", + "memberSettings": "メンバー設定", + "orchestrator": "ホスト", + "orchestratorThinking": "ホストが考え中です...", + "removeMember": "メンバーを削除", + "stopOrchestrator": "思考を停止", + "triggerOrchestrator": "グループチャットを開始" + }, + "tabs": { + "host": "ホスト", + "members": "メンバー", + "role": "設定" + } + }, + "groupWizard": { + "chooseMembers": "既存のアシスタントを選択...", + "createGroup": "グループチャットを作成", + "existingMembers": "既存のメンバー", + "groupMembers": "これらのアシスタントもあなたのリストに追加されます", + "host": { + "description": "グループチャットの自動運用を実現する", + "title": "ホスト", + "tooltip": "グループチャットのホストを無効にすると、メンバーに返信してもらうには手動で@メンションする必要があります" + }, + "memberCount": "{{count}} 人のメンバー", + "noMatchingTemplates": "一致するテンプレートがありません", + "noSelectedTemplates": "テンプレートが選択されていません", + "noTemplateMembers": "テンプレートにメンバーがいません", + "noTemplates": "利用可能なテンプレートがありません", + "searchTemplates": "テンプレートを検索...", + "title": "グループチャットの作成", + "useTemplate": "テンプレートを使用する" + }, + "hideForYou": "プライベートメッセージの内容は非表示です。設定で【プライベートメッセージの内容を表示】を有効にしてご覧ください。", "history": { "title": "アシスタントは最後の{{count}}件のメッセージのみを記憶します" }, "historyRange": "履歴範囲", "historySummary": "履歴メッセージの要約", + "inactive": "非アクティブ", "inbox": { "desc": "脳のクラスターを起動し、創造性を引き出しましょう。あなたのスマートアシスタントは、あなたとすべてのことについてここでコミュニケーションします。", "title": "気軽におしゃべり" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "あなたの意図を理解し、分析しています..." }, + "inviteMembers": "メンバーを招待", "knowledgeBase": { "all": "すべてのコンテンツ", "allFiles": "すべてのファイル", @@ -101,12 +159,29 @@ "uploadGuide": "アップロードしたファイルは「知識ベース」で確認できますよ", "viewMore": "さらに表示" }, + "memberSelection": { + "addMember": "メンバーを追加", + "allMembers": "全メンバー", + "createGroup": "グループチャットを作成", + "noAvailableAgents": "招待可能なアシスタントがいません", + "noSelectedAgents": "アシスタントが選択されていません", + "searchAgents": "アシスタントを検索...", + "setInitialMembers": "グループメンバーを選択" + }, + "members": "メンバー", + "mention": { + "title": "メンバーをメンション" + }, "messageAction": { "delAndRegenerate": "削除して再生成", "deleteDisabledByThreads": "サブトピックが存在するため、削除できません。", "regenerate": "再生成" }, "messages": { + "dm": { + "sentTo": "{{name}} のみ閲覧可能", + "title": "ダイレクトメッセージ" + }, "modelCard": { "credit": "クレジット", "creditPricing": "価格設定", @@ -156,6 +231,13 @@ "previousMessage": "前のメッセージ" }, "newAgent": "新しいエージェント", + "newGroupChat": "新しいグループチャットを作成", + "noAgentsYet": "このグループにはまだアシスタントがいません。「+」ボタンをクリックしてアシスタントを招待してください。", + "noAvailableAgents": "招待できるアシスタントがいません", + "noMatchingAgents": "一致するアシスタントが見つかりません", + "noMembersYet": "このグループにはまだメンバーがいません。「+」ボタンをクリックしてアシスタントを招待してください。", + "noSelectedAgents": "まだアシスタントが選択されていません", + "owner": "グループ管理者", "pin": "ピン留め", "pinOff": "ピン留め解除", "rag": { @@ -196,12 +278,16 @@ "title": "ネット接続検索" }, "searchAgentPlaceholder": "検索アシスタント...", + "searchAgents": "検索アシスタント...", + "selectedAgents": "選択済みのアシスタント", "sendPlaceholder": "チャット内容を入力してください...", "sessionGroup": { "config": "グループ設定", "confirmRemoveGroupAlert": "このグループを削除します。削除後、このグループのアシスタントはデフォルトリストに移動されます。操作を確認してください。", "createAgentSuccess": "エージェントの作成に成功しました", "createGroup": "新しいグループを作成", + "createGroupFailed": "グループチャットの作成に失敗しました", + "createGroupSuccess": "グループチャットが作成されました", "createSuccess": "作成が成功しました", "creatingAgent": "エージェントの作成中...", "inputPlaceholder": "グループ名を入力してください...", @@ -235,6 +321,12 @@ "loading": "認識中...", "prettifying": "整形中..." }, + "supervisor": { + "todoList": { + "allComplete": "すべてのタスクが完了しました", + "title": "タスク完了" + } + }, "thread": { "divider": "サブトピック", "threadMessageCount": "{{messageCount}} 件のメッセージ", @@ -248,6 +340,7 @@ "chats": "チャットメッセージ", "historySummary": "履歴の要約", "rest": "残り利用可能", + "supervisor": "グループホスト", "systemRole": "システムロール設定", "title": "コンテキストの詳細", "tools": "ツール設定", @@ -273,6 +366,7 @@ "action": "音声読み上げ", "clear": "音声を削除" }, + "untitledAgent": "名前未設定のアシスタント", "updateAgent": "エージェント情報を更新", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "動画ファイルのサイズは20MBを超えることはできません。現在のファイルサイズは{{actualSize}}です" } }, + "you": "あなた", "zenMode": "集中モード" -} +} diff --git a/locales/ja-JP/error.json b/locales/ja-JP/error.json index 2be8a1be26e..bf3898e1644 100644 --- a/locales/ja-JP/error.json +++ b/locales/ja-JP/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "サービスリクエストが失敗しました。設定を確認するか、もう一度お試しください" }, + "supervisor": { + "decisionFailed": "グループホストが機能していません。ホストの設定を確認し、正しいモデル、APIキー、およびAPIアドレスが設定されていることを確認してください。" + }, "testConnectionFailed": "接続テストに失敗しました:{{error}}", "tts": { "responseError": "サービスリクエストが失敗しました。設定を確認するか、もう一度お試しください" diff --git a/locales/ja-JP/providers.json b/locales/ja-JP/providers.json index afaa26e42df..227b7237c99 100644 --- a/locales/ja-JP/providers.json +++ b/locales/ja-JP/providers.json @@ -30,7 +30,10 @@ "description": "Bedrockは、Amazon AWSが提供するサービスで、企業に先進的なAI言語モデルと視覚モデルを提供することに特化しています。そのモデルファミリーには、AnthropicのClaudeシリーズやMetaのLlama 3.1シリーズなどが含まれ、軽量から高性能までのさまざまな選択肢を提供し、テキスト生成、対話、画像処理などの多様なタスクをサポートし、異なる規模とニーズの企業アプリケーションに適しています。" }, "bfl": { - "description": "最先端の人工知能研究ラボで、次世代の視覚インフラを構築します。" + "description": "最先端のAI研究ラボで、明日の視覚インフラを構築します。" + }, + "cerebras": { + "description": "Cerebras は、専用の CS-3 システムを基盤とした AI 推論プラットフォームであり、世界最速のリアルタイム応答と高スループットの LLM サービスを提供することを目的としています。リアルタイムのコード生成やエージェントタスクなど、複雑な AI ワークフローの遅延を排除し、加速するために設計されています。" }, "cerebras": { "description": "Cerebras は、専用の CS-3 システムを基盤とした AI 推論プラットフォームであり、世界最速のリアルタイム応答と高スループットの LLM サービスを提供することを目的としています。リアルタイムのコード生成やエージェントタスクなど、複雑な AI ワークフローの遅延を排除し、加速するために設計されています。" diff --git a/locales/ja-JP/setting.json b/locales/ja-JP/setting.json index 1c08773a483..4fb9629e0d2 100644 --- a/locales/ja-JP/setting.json +++ b/locales/ja-JP/setting.json @@ -35,9 +35,16 @@ "title": "すべての設定をリセット" } }, + "groupTab": { + "chat": "チャット", + "members": "メンバー", + "meta": "基本情報" + }, "header": { "desc": "設定優先順位和模型設置。", "global": "グローバル設定", + "group": "グループチャット設定", + "groupDesc": "現在のグループチャットを管理", "session": "セッション設定", "sessionDesc": "キャラクター設定とセッションの好み。", "sessionWithName": "セッション設定 · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "さらに多くのモデルが <1>計画されています。お楽しみに" }, + "message": { + "success": "更新に成功しました" + }, "plugin": { "addMCPPlugin": "MCPプラグインを追加", "addTooltip": "カスタムプラグイン", @@ -294,6 +304,101 @@ }, "title": "一般設定" }, + "settingGroup": { + "description": { + "placeholder": "グループチャットの説明を入力してください", + "title": "グループチャットの説明" + }, + "name": { + "placeholder": "グループチャット名を入力してください", + "title": "グループチャット名" + }, + "scene": { + "desc": "グループチャットのシーンを選択", + "options": { + "casual": "カジュアル", + "productive": "生産性" + }, + "title": "グループチャットのシーン" + }, + "submit": "グループチャットを更新", + "systemPrompt": { + "placeholder": "ホストのシステムプロンプトを入力してください", + "title": "ホストのシステムプロンプト" + }, + "title": "グループチャット情報" + }, + "settingGroupChat": { + "allowDM": { + "desc": "オフにしても、あなたからアシスタントへのダイレクトメッセージは可能です", + "title": "アシスタントからのダイレクトメッセージを許可" + }, + "enableSupervisor": { + "desc": "グループチャットの司会機能を有効にすると、司会者が会話の進行を管理します", + "title": "司会者を有効にする" + }, + "maxResponseInRow": { + "desc": "メンバーが連続して返信できるメッセージ数を選択します。0に設定すると制限が無効になります。", + "title": "連続返信メッセージ数" + }, + "model": { + "desc": "グループメンバーの発言には影響しません。一部のモデルは司会者として使用できません。", + "title": "ホストモデル" + }, + "orchestratorTitle": "ホスト設定", + "responseOrder": { + "desc": "代理はグループチャットで設定された順序に従って返信します", + "options": { + "natural": "自然", + "sequential": "順序通り" + }, + "placeholder": "返信順序を選択してください", + "title": "返信順序" + }, + "responseSpeed": { + "desc": "グループチャット全体の進行速度を制御します", + "options": { + "fast": "速い", + "medium": "中程度", + "slow": "遅い" + }, + "placeholder": "返信速度を選択してください", + "title": "返信速度" + }, + "revealDM": { + "desc": "他のメンバーに送信されたプライベートメッセージの内容をあなたに表示します。", + "title": "プライベートメッセージを表示" + }, + "submit": "設定を更新", + "systemPrompt": { + "desc": "グループチャットホストのカスタムシステムプロンプト。デフォルトのホスト動作に影響を与える可能性があります。", + "placeholder": "カスタムホストシステムプロンプトを入力してください...", + "title": "ホストのシステムプロンプト" + }, + "title": "チャット設定" + }, + "settingGroupMembers": { + "addToGroup": "グループに参加", + "availableAgents": "利用可能なアシスタント", + "defaultAgent": "カスタムアシスタント", + "disableHost": "ホストアシスタントを無効にする", + "edit": "メンバーを編集", + "empty": "このグループチャットには代理がいません。+ ボタンをクリックしてメンバーを追加してください。", + "enableHost": "ホストアシスタントを有効にする", + "groupHost": "グループホスト", + "groupMembers": "グループメンバー", + "host": { + "description": "ホストがグループにいるとき、グループチャットは自動化され、発散的なタスクに適しています。", + "title": "ホスト" + }, + "noAvailableAgents": "利用可能なアシスタントがいません", + "noDescription": "説明なし", + "noMembersInGroup": "グループにメンバーがいません", + "owner": "あなた(所有者)", + "remove": "メンバーを削除", + "removeFromGroup": "グループから削除", + "you": "あなた" + }, "settingImage": { "defaultCount": { "desc": "新しいタスクを作成する際に、画像生成パネルでのデフォルト画像数を設定します。", @@ -522,6 +627,11 @@ "modelDesc": "AI絵画の自動トピック命名に使用されるモデルを指定します", "title": "AI絵画自動トピック命名" }, + "groupChatSupervisor": { + "label": "グループチャット監督モデル", + "modelDesc": "グループチャットの会話を監督・管理するために使用するモデルを指定します", + "title": "グループチャットの監督・管理" + }, "helpInfo": "新しいアシスタントを作成するとき、デフォルトのアシスタント設定がプリセット値として使用されます。", "historyCompress": { "label": "会話履歴モデル", diff --git a/locales/ja-JP/welcome.json b/locales/ja-JP/welcome.json index 4605de69d29..ae1e04665dc 100644 --- a/locales/ja-JP/welcome.json +++ b/locales/ja-JP/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "私はあなたのプライベートインテリジェントアシスタント {{appName}} です。今、何をお手伝いできますか?
より専門的またはカスタマイズされたアシスタントが必要な場合は、 をクリックしてカスタムアシスタントを作成してください。", "defaultMessageWithoutCreate": "私はあなたのプライベートインテリジェントアシスタント {{appName}} です。今、何をお手伝いできますか?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "コードの変更と実装について技術的な議論とピアレビューを行う", + "emoji": "💻", + "prompt": "一緒にコードをレビューしましょう。これらのコードを分析し、改善点を見つける手助けをしてもらえますか?", + "title": "コードレビュー" + }, + "investment": { + "description": "市場を分析し、投資戦略を議論し、金融の洞察を共有する", + "emoji": "📈", + "prompt": "一緒に市場を分析しましょう。投資戦略を議論し、金融の洞察を共有する手助けをしてもらえますか?", + "title": "投資クラブ" + }, + "research": { + "description": "科学的な概念を探求し、実験を行い、発見を共有する", + "emoji": "🔬", + "prompt": "一緒に科学を探求しましょう!実験を行い、発見を共有する手助けをしてもらえますか?", + "title": "科学展" + }, + "study": { + "description": "協力して学習会を行い、概念を議論し、共に問題を解決する", + "emoji": "📚", + "prompt": "学習グループを作りましょう。これらの概念を理解し、一緒に問題を解決する手助けをしてもらえますか?", + "title": "学習グループ" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "様々な形式の視覚芸術やデジタルアートを創作、評論、鑑賞する", + "emoji": "🖼️", + "prompt": "アートワークショップを開催しましょう!様々な形式のアートを創作、評論、鑑賞する手助けをしてもらえますか?", + "title": "アートワークショップ" + }, + "debate": { + "description": "様々なトピックや時事問題について構造化された議論と討論を行う", + "emoji": "⚖️", + "prompt": "構造化されたディベートを行いましょう。このトピックについて理論的な議論を組織する手助けをしてもらえますか?", + "title": "ディベートクラブ" + }, + "designReview": { + "description": "デザインのコンセプト、プロトタイプ、クリエイティブ作品に対する協力的なフィードバック会議", + "emoji": "🎨", + "prompt": "いくつかのデザイン作品をレビューする必要があります。デザインのコンセプトやプロトタイプに建設的なフィードバックを提供する手助けをしてもらえますか?", + "title": "デザインレビュー" + }, + "ideation": { + "description": "多角的な協力による創造的なアイデア出しと問題解決", + "emoji": "🧠", + "prompt": "プロジェクトのためにブレインストーミングを始めましょう。創造的なアイデアや解決策を生み出す手助けをしてもらえますか?", + "title": "ブレインストーミング" + } + }, + "game": { + "debateClub": { + "description": "様々なトピックや時事問題について構造化された議論と討論を行う", + "emoji": "⚖️", + "prompt": "構造化されたディベートを行いましょう。このトピックについて理論的な議論を組織する手助けをしてもらえますか?", + "title": "ディベートクラブ" + }, + "gameNight": { + "description": "楽しいインタラクティブゲームやアクティビティでチームの絆を深め、楽しむ", + "emoji": "🎲", + "prompt": "ゲームナイトの始まりです!楽しいインタラクティブゲームを企画してチームの絆を深める手助けをしてもらえますか?", + "title": "ゲームナイト" + }, + "modelUN": { + "description": "国連模擬ディベートとグローバルな課題に関する外交交渉", + "emoji": "🌍", + "prompt": "国連模擬ディベートを行いましょう。グローバルな課題に関する外交交渉の設定を手助けしてもらえますか?", + "title": "模擬国連" + }, + "werewolf": { + "description": "プレイヤーが戦略と議論を通じて人狼を見つけ出すソーシャル推理ゲーム", + "emoji": "🐺", + "prompt": "人狼ゲームをしましょう!ルールの設定とこのソーシャル推理ゲームの進行を手助けしてもらえますか?", + "title": "人狼ゲーム" + } + }, + "general": { + "brainstorm": { + "description": "多角的な協力による創造的なアイデア出しと問題解決", + "emoji": "🧠", + "prompt": "プロジェクトのためにブレインストーミングを始めましょう。創造的なアイデアや解決策を生み出す手助けをしてもらえますか?", + "title": "ブレインストーミング" + }, + "debate": { + "description": "様々なトピックや時事問題について構造化された議論と討論を行う", + "emoji": "⚖️", + "prompt": "構造化されたディベートを行いましょう。このトピックについて理論的な議論を組織する手助けをしてもらえますか?", + "title": "ディベートクラブ" + }, + "languagePractice": { + "description": "ネイティブスピーカーと一緒に会話練習や新しい言語を学ぶ", + "emoji": "🗣️", + "prompt": "一緒に新しい言語を練習しましょう。この言語の学習と会話練習を手助けしてもらえますか?", + "title": "言語練習" + }, + "studyGroup": { + "description": "協力して学習会を行い、概念を議論し、共に問題を解決する", + "emoji": "📚", + "prompt": "学習グループを作りましょう。これらの概念を理解し、一緒に問題を解決する手助けをしてもらえますか?", + "title": "学習グループ" + } + }, + "planning": { + "cookingClass": { + "description": "料理の技術、レシピ、料理の伝統を学び共有する", + "emoji": "👨‍🍳", + "prompt": "料理教室を始めましょう!新しいレシピや料理技術を一緒に学ぶ手助けをしてもらえますか?", + "title": "料理教室" + }, + "fitnessChallenge": { + "description": "グループでフィットネス目標を設定し、トレーニング方法を共有し、互いに励ます", + "emoji": "💪", + "prompt": "フィットネスチャレンジを始めましょう!目標を設定し、健康を維持するために互いに励まし合う手助けをしてもらえますか?", + "title": "フィットネスチャレンジ" + }, + "planningPoker": { + "description": "カードを使ってプロジェクトのタスクや作業量を見積もるアジャイル見積もり技術", + "emoji": "🃏", + "prompt": "プロジェクトのためにプランニングポーカーを行っています。これらのタスクの作業量をアジャイル技術で見積もる手助けをしてもらえますか?", + "title": "プランニングポーカー" + }, + "travelPlanning": { + "description": "旅行の計画、旅行体験の共有、新しい目的地の発見", + "emoji": "✈️", + "prompt": "一緒に旅行の計画を立てましょう!目的地を調査し、旅行の行程を計画する手助けをしてもらえますか?", + "title": "旅行計画" + } + }, + "product": { + "codeReview": { + "description": "コードの変更と実装について技術的な議論とピアレビューを行う", + "emoji": "💻", + "prompt": "一緒にコードをレビューしましょう。これらのコードを分析し、改善点を見つける手助けをしてもらえますか?", + "title": "コードレビュー" + }, + "designReview": { + "description": "デザインのコンセプト、プロトタイプ、クリエイティブ作品に対する協力的なフィードバック会議", + "emoji": "🎨", + "prompt": "いくつかのデザイン作品をレビューする必要があります。デザインのコンセプトやプロトタイプに建設的なフィードバックを提供する手助けをしてもらえますか?", + "title": "デザインレビュー" + }, + "sprintPlanning": { + "description": "カードを使ってプロジェクトのタスクや作業量を見積もるアジャイル見積もり技術", + "emoji": "🃏", + "prompt": "プロジェクトのためにプランニングポーカーを行っています。これらのタスクの作業量をアジャイル技術で見積もる手助けをしてもらえますか?", + "title": "プランニングポーカー" + }, + "techExchange": { + "description": "新興技術、イノベーション、業界動向について議論する", + "emoji": "🚀", + "prompt": "技術交流をしましょう!新興技術や業界動向について議論する手助けをしてもらえますか?", + "title": "技術交流" + } + }, + "title": "グループチャットの使い方のおすすめ", + "writing": { + "bookClub": { + "description": "書籍、物語、文学作品について文学的な議論と分析を行う", + "emoji": "📖", + "prompt": "読書クラブの議論を始めましょう。この本を分析し、そのテーマについて一緒に考察する手助けをしてもらえますか?", + "title": "読書クラブ" + }, + "movieClub": { + "description": "映画、ドキュメンタリー、映像メディアを一緒に鑑賞し議論する", + "emoji": "🎬", + "prompt": "映画クラブの議論を始めましょう。この映画を分析し、そのテーマについて一緒に考察する手助けをしてもらえますか?", + "title": "映画クラブ" + }, + "musicSession": { + "description": "協力して音楽を創作、共有、鑑賞する会議", + "emoji": "🎵", + "prompt": "音楽の即興演奏をしましょう!一緒に音楽を創作し、鑑賞する手助けをしてもらえますか?", + "title": "音楽セッション" + }, + "studyGroup": { + "description": "協力して学習会を行い、概念を議論し、共に問題を解決する", + "emoji": "📚", + "prompt": "学習グループを作りましょう。これらの概念を理解し、一緒に問題を解決する手助けをしてもらえますか?", + "title": "学習グループ" + } + } + }, + "groupMessage": "グループチャットへようこそ!複数のAIアシスタントと共有の会話スペースで協力できます。", + "groupTemplates": { + "analysis": { + "description": "データ駆動の洞察、深度な研究分析", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "あなたはデータの処理と解釈に長けており、グラフや統計分析を通じてデータの背後にある法則や傾向を明らかにします。", + "title": "データアナリスト" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "あなたはリサーチエキスパートです。情報収集と深い調査を専門とし、多角的な視点から問題を包括的に分析できます。", + "title": "リサーチエキスパート" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "あなたは統計の専門家です。様々な統計手法やモデルに精通し、データから価値あるビジネスインサイトを抽出します。", + "title": "統計専門家" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "あなたはクオンツアナリストです。定量モデルの構築とリスク評価を専門とし、数学的手法で複雑な問題を解決します。", + "title": "クオンツアナリスト" + } + ], + "title": "分析チーム" + }, + "brainstorm": { + "description": "多角的な創造的思考、無限の可能性を刺激", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "あなたはクリエイティブディレクターです。マクロな視点から創造の方向性を把握し、抽象的な概念を具体的で実行可能なクリエイティブプランに変換します。", + "title": "クリエイティブディレクター" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "あなたはイノベーションエキスパートです。新しい解決策や画期的な思考を発見することを専門とし、既成概念にとらわれない発想が得意です。", + "title": "イノベーションエキスパート" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "あなたはデザイン思考の専門家です。ユーザー体験と視覚的表現の観点から問題を考え、創造性の可視化に注力します。", + "title": "デザイン思考スペシャリスト" + } + ], + "title": "ブレインストーミンググループ" + }, + "game": { + "description": "様々なマルチプレイヤーテキストゲームを楽しむ、例:人狼やワードウルフ", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "あなたは様々なマルチプレイヤーテキストゲームに参加するのが得意で、ゲームのルールに従ってプレイできます。", + "title": "ゲームプレイヤー" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "あなたは様々なマルチプレイヤーテキストゲームに参加するのが得意で、ゲームのルールに従ってプレイできます。", + "title": "ゲームプレイヤー" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "あなたは様々なマルチプレイヤーテキストゲームに参加するのが得意で、ゲームのルールに従ってプレイできます。", + "title": "ゲームプレイヤー" + } + ], + "title": "ゲームルーム" + }, + "planning": { + "description": "戦略的計画とプロジェクト管理、全体の統括", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "あなたはプロジェクトの全体計画、進捗管理、リソース調整を担当し、プロジェクトを期限内に高品質で完了させます。", + "title": "シェフ" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "あなたは長期的な戦略計画の策定、市場機会の分析、目標と実現方法の設定を担当します。", + "title": "食材調達エキスパート" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "あなたは詳細な実行計画の策定、各部門のリソース調整、計画の実行可能性の確保を担当します。", + "title": "料理開発エキスパート" + } + ], + "title": "料理開発チーム" + }, + "product": { + "description": "製品設計と開発、高品質な製品を創造", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "あなたはデザイナーです。様々なタイプの製品設計に長けており、製品のニーズに応じてデザインを行います。", + "title": "デザイナー" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "あなたはプロダクトマネージャーです。製品の企画、設計、開発、保守を担当し、製品の品質とユーザー体験を確保します。", + "title": "プロダクトマネージャー" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "あなたは経験豊富なフルスタックエンジニアです。様々なタイプの製品開発に長けており、製品のニーズに応じて開発を行います。", + "title": "フルスタックエンジニア" + } + ], + "title": "製品開発チーム" + }, + "writing": { + "description": "コンテンツ制作と編集、高品質なコピーを作成", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "あなたは様々な文体のコンテンツ作成が得意で、異なるシーンや対象に応じて執筆スタイルを調整できます。", + "title": "コンテンツライター" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "あなたは編集者です。テキストの校正、推敲、最適化を担当し、内容の正確性、流暢さ、専門性を確保します。", + "title": "編集者" + } + ], + "title": "ライティングチーム" + } + }, "qa": { "q01": "LobeHub とは何ですか?", "q02": "{{appName}} とは何ですか?", diff --git a/locales/ko-KR/chat.json b/locales/ko-KR/chat.json index 9ede259f140..942f78427af 100644 --- a/locales/ko-KR/chat.json +++ b/locales/ko-KR/chat.json @@ -2,46 +2,58 @@ "ModelSwitch": { "title": "모델" }, - "agentDefaultMessage": "안녕하세요, 저는 **{{name}}**입니다. 지금 바로 대화를 시작하거나 [도우미 설정]({{url}})으로 이동하여 제 정보를 완성할 수 있어요.", - "agentDefaultMessageWithSystemRole": "안녕하세요, 저는 **{{name}}**입니다. 무엇을 도와드릴까요?", - "agentDefaultMessageWithoutEdit": "안녕하세요, 저는 **{{name}}**입니다. 무엇을 도와드릴까요?", + "active": "활성", + "agentDefaultMessage": "안녕하세요, 저는 **{{name}}**입니다. 지금 바로 저와 대화를 시작하시거나 [도우미 설정]({{url}})으로 가셔서 제 정보를 완성하실 수 있습니다.", + "agentDefaultMessageWithSystemRole": "안녕하세요, 저는 **{{name}}**입니다. {{systemRole}}입니다. 대화를 시작해 봅시다!", + "agentDefaultMessageWithoutEdit": "안녕하세요, 저는 **{{name}}**입니다. 대화를 시작해보세요!", "agents": "도우미", "artifact": { "generating": "생성 중", - "inThread": "하위 주제에서는 볼 수 없습니다. 메인 대화 영역으로 전환해 주세요.", + "inThread": "하위 주제에서는 볼 수 없습니다. 주 대화 영역으로 전환하여 열어주세요.", "thinking": "생각 중", "thought": "사고 과정", "unknownTitle": "제목 없음" }, - "backToBottom": "현재 위치로 이동", + "availableAgents": "사용 가능한 도우미", + "backToBottom": "하단으로 이동", "chatList": { "longMessageDetail": "자세히 보기" }, - "clearCurrentMessages": "현재 대화 메시지 삭제", - "confirmClearCurrentMessages": "현재 대화 메시지를 삭제하려고 합니다. 삭제 후 복구할 수 없습니다. 계속하시겠습니까?", - "confirmRemoveSessionItemAlert": "이 도우미를 삭제하려고 합니다. 삭제 후 복구할 수 없습니다. 계속하시겠습니까?", + "clearCurrentMessages": "현재 대화 지우기", + "confirmClearCurrentMessages": "현재 대화를 지우시면 되돌릴 수 없습니다. 작업을 확인하시겠습니까?", + "confirmRemoveChatGroupItemAlert": "이 그룹 채팅을 삭제하려고 합니다. 그룹 채팅 멤버는 영향을 받지 않습니다. 작업을 확인해 주세요.", + "confirmRemoveGroupItemAlert": "해당 그룹을 삭제하려고 합니다. 삭제하면 해당 그룹의 어시스턴트가 기본 목록으로 이동합니다. 계속 진행하시겠습니까?", + "confirmRemoveGroupSuccess": "그룹 채팅이 성공적으로 삭제되었습니다", + "confirmRemoveSessionItemAlert": "이 도우미를 삭제하시면 되돌릴 수 없습니다. 작업을 확인하시겠습니까?", "confirmRemoveSessionSuccess": "도우미가 성공적으로 삭제되었습니다", - "defaultAgent": "사용자 정의 도우미", + "defaultAgent": "기본 도우미", + "defaultGroupChat": "그룹 채팅", "defaultList": "기본 목록", - "defaultSession": "사용자 정의 도우미", + "defaultSession": "기본 도우미", + "dm": { + "placeholder": "당신과 {{agentTitle}}의 개인 메시지가 여기에 표시됩니다.", + "tooltip": "개인 메시지 보내기", + "visibleTo": "{{target}}만 볼 수 있습니다", + "you": "당신" + }, "duplicateSession": { "loading": "복사 중...", - "success": "복사 완료", + "success": "복사 성공", "title": "{{title}} 복사본" }, "duplicateTitle": "{{title}} 복사본", - "emptyAgent": "도우미 없음", + "emptyAgent": "도우미가 없습니다", "extendParams": { "disableContextCaching": { - "desc": "단일 대화 생성 비용 최대 90% 절감, 응답 속도 4배 향상 (<1>자세히 보기). 활성화 시 과거 메시지 수 제한이 자동으로 비활성화됩니다.", - "title": "컨텍스트 캐시 활성화" + "desc": "단일 대화 생성 비용을 최대 90%까지 줄이고, 응답 속도를 4배 향상시킵니다 (<1>자세히 알아보기). 활성화하면 자동으로 이전 메시지 수 제한이 비활성화됩니다.", + "title": "문맥 캐시 활성화" }, "enableReasoning": { - "desc": "Claude Thinking 메커니즘 제한에 따라 (<1>자세히 보기), 활성화 시 과거 메시지 수 제한이 자동으로 비활성화됩니다.", + "desc": "Claude Thinking 메커니즘에 기반한 제한 (<1>자세히 알아보기), 활성화하면 자동으로 이전 메시지 수 제한이 비활성화됩니다.", "title": "심층 사고 활성화" }, "reasoningBudgetToken": { - "title": "사고에 소모되는 토큰" + "title": "사고 소모 토큰" }, "reasoningEffort": { "title": "추론 강도" @@ -54,70 +66,133 @@ }, "title": "모델 확장 기능", "urlContext": { - "desc": "활성화 시 웹 링크를 자동으로 분석하여 실제 웹 페이지의 컨텍스트를 가져옵니다.", + "desc": "활성화하면 실제 웹페이지 컨텍스트 내용을 얻기 위해 웹 링크를 자동으로 분석합니다", "title": "웹 링크 내용 추출" } }, + "group": { + "desc": "여러 AI 어시스턴트와 공유된 대화 공간에서 협업합니다.", + "memberTooltip": "그룹에 {{count}}명의 구성원이 있습니다.", + "orchestratorThinking": "주최자가 생각 중입니다...", + "removeMember": "멤버 제거", + "title": "그룹" + }, + "groupDescription": "그룹 설명", + "groupSidebar": { + "members": { + "addMember": "멤버 추가", + "memberSettings": "멤버 설정", + "orchestrator": "주최자", + "orchestratorThinking": "주최자가 생각 중입니다...", + "removeMember": "멤버 제거", + "stopOrchestrator": "생각 중지", + "triggerOrchestrator": "그룹 채팅 시작" + }, + "tabs": { + "host": "호스트", + "members": "멤버", + "role": "설정" + } + }, + "groupWizard": { + "chooseMembers": "기존 도우미 선택...", + "createGroup": "그룹 채팅 생성", + "existingMembers": "기존 멤버", + "groupMembers": "이 도우미들도 귀하의 목록에 추가됩니다", + "host": { + "description": "그룹 채팅을 자동으로 운영합니다", + "title": "호스트", + "tooltip": "그룹 호스트 기능을 비활성화하면, 멤버가 응답할 수 있도록 수동으로 @멘션해야 합니다" + }, + "memberCount": "{{count}}명 멤버", + "noMatchingTemplates": "일치하는 템플릿이 없습니다", + "noSelectedTemplates": "선택된 템플릿이 없습니다", + "noTemplateMembers": "템플릿에 멤버가 없습니다", + "noTemplates": "사용 가능한 템플릿이 없습니다", + "searchTemplates": "템플릿 검색...", + "title": "그룹 채팅 생성", + "useTemplate": "템플릿 사용" + }, + "hideForYou": "개인 메시지 내용이 숨겨져 있습니다. 설정에서 【개인 메시지 내용 표시】를 켜서 확인하세요.", "history": { - "title": "도우미는 최근 {{count}}개의 메시지만 기억합니다" + "title": "도우미는 마지막 {{count}}개의 메시지만 기억합니다." }, - "historyRange": "기록 범위", - "historySummary": "대화 기록 요약", + "historyRange": "대화 기록 범위", + "historySummary": "역사 메시지 요약", + "inactive": "비활성", "inbox": { - "desc": "브레인 클러스터를 활성화하여 창의적인 사고를 자극하세요. 당신의 지능형 도우미가 여기서 모든 것을 함께합니다.", - "title": "자유롭게 대화하기" + "desc": "뇌 클러스터를 활성화하여 창의적인 아이디어를 끌어내는 인공지능 비서입니다. 여기서 모든 것에 대해 대화합니다.", + "title": "무작위 대화" }, "input": { "addAi": "AI 메시지 추가", "addUser": "사용자 메시지 추가", - "disclaimer": "AI도 실수할 수 있으니 중요한 정보는 꼭 확인하세요", - "errorMsg": "메시지 전송 실패, 네트워크를 확인한 후 다시 시도해 주세요: {{errorMsg}}", - "more": "더보기", - "send": "보내기", - "sendWithCmdEnter": " 키로 전송", - "sendWithEnter": " 키로 전송", + "disclaimer": "AI도 실수를 할 수 있으니 중요한 정보는 꼭 확인하세요", + "errorMsg": "메시지 전송에 실패했습니다. 네트워크를 확인한 후 다시 시도해 주세요: {{errorMsg}}", + "more": "더 많은", + "send": "전송", + "sendWithCmdEnter": " 키를 눌러 전송", + "sendWithEnter": " 키를 눌러 전송", "stop": "중지", - "warp": "줄 바꿈", - "warpWithKey": " 키로 줄 바꿈" + "warp": "줄바꿈", + "warpWithKey": " 키를 눌러 줄 바꿈" }, "intentUnderstanding": { - "title": "의도를 이해하고 분석 중..." + "title": "귀하의 의도를 이해하고 분석하는 중입니다..." }, + "inviteMembers": "구성원 초대", "knowledgeBase": { - "all": "전체", + "all": "모든 내용", "allFiles": "모든 파일", - "allKnowledgeBases": "모든 지식베이스", - "disabled": "현재 배포 모드에서는 지식베이스 대화를 지원하지 않습니다. 사용하려면 서버 데이터베이스 배포로 전환하거나 {{cloud}} 서비스를 이용해 주세요.", + "allKnowledgeBases": "모든 지식 베이스", + "disabled": "현재 배포 모드에서는 지식 기반 대화가 지원되지 않습니다. 사용하려면 서버 데이터베이스 배포로 전환하거나 {{cloud}} 서비스를 이용해 주십시오.", "library": { "action": { "add": "추가", "detail": "상세", "remove": "제거" }, - "title": "파일/지식베이스" + "title": "파일/지식 베이스" }, - "relativeFilesOrKnowledgeBases": "연관된 파일/지식베이스", - "title": "지식베이스", - "uploadGuide": "업로드한 파일은 '지식베이스'에서 확인할 수 있어요", - "viewMore": "더보기" + "relativeFilesOrKnowledgeBases": "관련 파일/지식 베이스", + "title": "지식 베이스", + "uploadGuide": "업로드한 파일은 '지식 베이스'에서 확인할 수 있습니다.", + "viewMore": "더 보기" + }, + "memberSelection": { + "addMember": "멤버 추가", + "allMembers": "전체 멤버", + "createGroup": "그룹 채팅 생성", + "noAvailableAgents": "초대할 보조자가 없습니다", + "noSelectedAgents": "아직 보조자를 선택하지 않았습니다", + "searchAgents": "보조자 검색...", + "setInitialMembers": "그룹 멤버 선택" + }, + "members": "구성원", + "mention": { + "title": "멤버 언급" }, "messageAction": { - "delAndRegenerate": "삭제 후 재생성", - "deleteDisabledByThreads": "하위 주제가 있어 삭제할 수 없습니다", - "regenerate": "재생성" + "delAndRegenerate": "삭제하고 다시 생성", + "deleteDisabledByThreads": "하위 주제가 존재하여 삭제할 수 없습니다.", + "regenerate": "다시 생성" }, "messages": { + "dm": { + "sentTo": "{{name}}만 볼 수 있습니다", + "title": "쪽지" + }, "modelCard": { - "credit": "크레딧", + "credit": "포인트", "creditPricing": "가격", - "creditTooltip": "계산 편의를 위해 $1 = 1M 크레딧으로 환산됩니다. 예: $3/M tokens → 3 크레딧/token", + "creditTooltip": "계산을 용이하게 하기 위해, 1$를 1M 포인트로 환산합니다. 예를 들어, $3/M 토큰은 3포인트/토큰으로 환산됩니다.", "pricing": { - "inputCachedTokens": "입력 캐시 {{amount}}/크레딧 · ${{amount}}/M", + "inputCachedTokens": "캐시된 입력 {{amount}}/포인트 · ${{amount}}/M", "inputCharts": "${{amount}}/M 문자", "inputMinutes": "${{amount}}/분", - "inputTokens": "입력 {{amount}}/크레딧 · ${{amount}}/M", - "outputTokens": "출력 {{amount}}/크레딧 · ${{amount}}/M", - "writeCacheInputTokens": "입력 캐시 쓰기 {{amount}}/크레딧 · ${{amount}}/M" + "inputTokens": "입력 {{amount}}/포인트 · ${{amount}}/M", + "outputTokens": "출력 {{amount}}/포인트 · ${{amount}}/M", + "writeCacheInputTokens": "캐시 입력 쓰기 {{amount}}/포인트 · ${{amount}}/M" } }, "tokenDetails": { @@ -125,29 +200,29 @@ "input": "입력", "inputAudio": "오디오 입력", "inputCached": "입력 캐시", - "inputCitation": "인용 입력", + "inputCitation": "입력 인용", "inputText": "텍스트 입력", - "inputTitle": "입력 상세", - "inputUncached": "비캐시 입력", + "inputTitle": "입력 세부사항", + "inputUncached": "입력 비캐시", "inputWriteCached": "입력 캐시 쓰기", "output": "출력", "outputAudio": "오디오 출력", "outputImage": "이미지 출력", "outputText": "텍스트 출력", - "outputTitle": "출력 상세", + "outputTitle": "출력 세부사항", "reasoning": "심층 사고", "speed": { "tps": { "title": "TPS", - "tooltip": "초당 토큰 수 (Tokens Per Second). 첫 토큰 수신 후부터 계산됩니다." + "tooltip": "초당 토큰 수(TPS). AI가 생성한 콘텐츠의 평균 속도(토큰/초)를 나타내며, 첫 번째 토큰을 수신한 후부터 계산됩니다." }, "ttft": { "title": "TTFT", - "tooltip": "첫 토큰 수신까지 걸린 시간 (Time To First Token). 메시지 전송부터 첫 토큰 수신까지의 시간입니다." + "tooltip": "첫 번째 토큰까지의 시간(Time To First Token, TTFT). 메시지를 전송한 시점부터 클라이언트가 첫 번째 토큰을 수신할 때까지의 시간 간격을 나타냅니다." } }, - "title": "생성 상세", - "total": "총 사용량" + "title": "생성 세부사항", + "total": "총 소모" } }, "minimap": { @@ -155,63 +230,74 @@ "nextMessage": "다음 메시지", "previousMessage": "이전 메시지" }, - "newAgent": "새 도우미 만들기", - "pin": "상단 고정", - "pinOff": "상단 고정 해제", + "newAgent": "새 도우미", + "newGroupChat": "새 그룹 채팅 만들기", + "noAgentsYet": "이 그룹에는 아직 어시스턴트가 없습니다. '+' 버튼을 눌러 어시스턴트를 초대하세요.", + "noAvailableAgents": "초대할 수 있는 어시스턴트가 없습니다.", + "noMatchingAgents": "일치하는 어시스턴트가 없습니다.", + "noMembersYet": "이 그룹에는 아직 구성원이 없습니다. + 버튼을 눌러 어시스턴트를 초대하세요.", + "noSelectedAgents": "아직 어시스턴트를 선택하지 않았습니다", + "owner": "그룹 소유자", + "pin": "고정", + "pinOff": "고정 해제", "rag": { - "referenceChunks": "참조 소스", + "referenceChunks": "참조 조각", "userQuery": { "actions": { - "delete": "Query 재작성 삭제", - "regenerate": "Query 재작성" + "delete": "쿼리 삭제", + "regenerate": "쿼리 재생성" } } }, "regenerate": "재생성", - "roleAndArchive": "역할 및 기록", + "roleAndArchive": "역할 및 아카이브", "search": { "grounding": { "searchQueries": "검색 키워드", - "title": "{{count}}개의 결과 검색됨" + "title": "{{count}}개의 결과가 검색되었습니다" }, "mode": { "auto": { - "desc": "대화 내용을 기반으로 검색 필요 여부를 자동 판단", + "desc": "대화 내용을 기반으로 검색 필요성을 스마트하게 판단", "title": "스마트 연결" }, "off": { - "desc": "모델의 기본 지식만 사용, 인터넷 검색 안 함", + "desc": "모델의 기본 지식만 사용하고 네트워크 검색을 수행하지 않음", "title": "연결 끄기" }, "on": { - "desc": "항상 인터넷 검색을 통해 최신 정보 획득", + "desc": "지속적으로 네트워크 검색을 수행하여 최신 정보를 얻음", "title": "항상 연결" }, "useModelBuiltin": "모델 내장 검색 엔진 사용" }, "searchModel": { - "desc": "현재 모델은 함수 호출을 지원하지 않으므로, 연결 검색을 위해 함수 호출을 지원하는 모델이 필요합니다.", + "desc": "현재 모델은 함수 호출을 지원하지 않으므로 함수 호출을 지원하는 모델과 함께 사용해야 인터넷 검색이 가능합니다.", "title": "검색 보조 모델" }, - "title": "인터넷 검색" + "title": "연결 검색" }, - "searchAgentPlaceholder": "도우미 검색...", - "sendPlaceholder": "대화 내용을 입력하세요...", + "searchAgentPlaceholder": "검색 도우미...", + "searchAgents": "검색 도우미...", + "selectedAgents": "선택된 도우미", + "sendPlaceholder": "채팅 내용 입력...", "sessionGroup": { - "config": "그룹 관리", - "confirmRemoveGroupAlert": "이 그룹을 삭제하려고 합니다. 삭제 시 해당 그룹의 도우미는 기본 목록으로 이동됩니다. 계속하시겠습니까?", - "createAgentSuccess": "도우미 생성 완료", + "config": "그룹 설정", + "confirmRemoveGroupAlert": "이 그룹을 삭제하려고 합니다. 삭제 후 이 그룹의 도우미는 기본 목록으로 이동됩니다. 작업을 확인하십시오.", + "createAgentSuccess": "에이전트 생성 성공", "createGroup": "새 그룹 추가", - "createSuccess": "그룹 생성 완료", - "creatingAgent": "도우미 생성 중...", + "createGroupFailed": "그룹 채팅 생성 실패", + "createGroupSuccess": "그룹 채팅 생성 성공", + "createSuccess": "생성 성공", + "creatingAgent": "에이전트 생성 중...", "inputPlaceholder": "그룹 이름을 입력하세요...", "moveGroup": "그룹으로 이동", "newGroup": "새 그룹", "rename": "그룹 이름 변경", - "renameSuccess": "이름 변경 완료", - "sortSuccess": "정렬 완료", + "renameSuccess": "이름 변경 성공", + "sortSuccess": "다시 정렬 성공", "sorting": "그룹 정렬 업데이트 중...", - "tooLong": "그룹 이름은 1~20자 이내여야 합니다" + "tooLong": "그룹 이름은 1-20자여야 합니다" }, "shareModal": { "copy": "복사", @@ -228,12 +314,18 @@ "withFooter": "푸터 포함", "withPluginInfo": "플러그인 정보 포함", "withRole": "메시지 역할 포함", - "withSystemRole": "도우미 역할 설정 포함" + "withSystemRole": "도우미 역할 포함" }, "stt": { "action": "음성 입력", "loading": "인식 중...", - "prettifying": "다듬는 중..." + "prettifying": "정제 중..." + }, + "supervisor": { + "todoList": { + "allComplete": "모든 작업이 완료되었습니다", + "title": "작업 완료" + } }, "thread": { "divider": "하위 주제", @@ -245,24 +337,25 @@ "on": "와이드 스크린 모드 켜기" }, "tokenDetails": { - "chats": "대화 메시지", - "historySummary": "기록 요약", + "chats": "채팅 메시지", + "historySummary": "역사 요약", "rest": "남은 사용량", - "systemRole": "역할 설정", - "title": "컨텍스트 상세", - "tools": "플러그인 설정", - "total": "총 사용 가능", - "used": "총 사용량" + "supervisor": "그룹 주최자", + "systemRole": "시스템 역할", + "title": "컨텍스트 세부 정보", + "tools": "도구 설정", + "total": "총 사용량", + "used": "총 사용" }, "tokenTag": { - "overload": "제한 초과", + "overload": "한도 초과", "remained": "남음", "used": "사용됨" }, "topic": { - "checkOpenNewTopic": "새 주제를 시작하시겠습니까?", + "checkOpenNewTopic": "새 주제를 열까요?", "checkSaveCurrentMessages": "현재 대화를 주제로 저장하시겠습니까?", - "openNewTopic": "새 주제 시작", + "openNewTopic": "새 주제 열기", "saveCurrentMessages": "현재 대화를 주제로 저장" }, "translate": { @@ -273,24 +366,25 @@ "action": "음성 읽기", "clear": "음성 삭제" }, + "untitledAgent": "이름 없는 에이전트", "updateAgent": "도우미 정보 업데이트", "upload": { "action": { "fileUpload": "파일 업로드", "folderUpload": "폴더 업로드", - "imageDisabled": "현재 모델은 시각 인식을 지원하지 않습니다. 모델을 변경해 주세요.", + "imageDisabled": "현재 모델은 시각 인식을 지원하지 않습니다. 모델을 변경한 후 사용하세요.", "imageUpload": "이미지 업로드", "tooltip": "업로드" }, "clientMode": { "actionFiletip": "파일 업로드", "actionTooltip": "업로드", - "disabled": "현재 모델은 시각 인식 및 파일 분석을 지원하지 않습니다. 모델을 변경해 주세요.", - "fileNotSupported": "브라우저 모드에서는 파일 업로드가 지원되지 않으며, 이미지만 업로드할 수 있습니다.", - "visionNotSupported": "현재 모델은 시각 인식을 지원하지 않습니다. 모델을 변경해 주세요." + "disabled": "현재 모델은 시각 인식 및 파일 분석을 지원하지 않습니다. 모델을 변경한 후 사용하세요.", + "fileNotSupported": "브라우저 모드에서는 파일 업로드를 지원하지 않으며, 이미지 업로드만 가능합니다", + "visionNotSupported": "현재 모델은 시각 인식을 지원하지 않습니다. 모델을 변경한 후 사용해 주세요" }, "preview": { - "prepareTasks": "분할 준비 중...", + "prepareTasks": "청크 준비 중...", "status": { "pending": "업로드 준비 중...", "processing": "파일 처리 중..." @@ -300,5 +394,6 @@ "videoSizeExceeded": "비디오 파일 크기는 20MB를 초과할 수 없습니다. 현재 파일 크기: {{actualSize}}" } }, + "you": "당신", "zenMode": "집중 모드" -} +} diff --git a/locales/ko-KR/error.json b/locales/ko-KR/error.json index 983d846d729..ef7f0039351 100644 --- a/locales/ko-KR/error.json +++ b/locales/ko-KR/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "서비스 요청이 실패했습니다. 구성을 확인하거나 다시 시도해주세요." }, + "supervisor": { + "decisionFailed": "그룹 진행자가 작동하지 않습니다. 진행자 구성을 확인하여 올바른 모델, API 키 및 API 주소가 설정되었는지 확인하세요." + }, "testConnectionFailed": "연결 테스트 실패: {{error}}", "tts": { "responseError": "서비스 요청이 실패했습니다. 구성을 확인하거나 다시 시도해주세요." diff --git a/locales/ko-KR/providers.json b/locales/ko-KR/providers.json index a85364e60b6..6436a959620 100644 --- a/locales/ko-KR/providers.json +++ b/locales/ko-KR/providers.json @@ -1,36 +1,39 @@ { "ai21": { - "description": "AI21 Labs는 기업을 위한 기초 모델과 인공지능 시스템을 구축하여 생성형 AI의 실무 적용을 가속화합니다." + "description": "AI21 Labs는 기업을 위해 기본 모델과 인공지능 시스템을 구축하여 생성적 인공지능의 생산적 활용을 가속화합니다." }, "ai302": { - "description": "302.AI는 종량제 방식의 AI 애플리케이션 플랫폼으로, 가장 다양한 AI API와 온라인 AI 애플리케이션을 제공합니다." + "description": "302.AI는 필요에 따라 비용을 지불하는 AI 애플리케이션 플랫폼으로, 시장에서 가장 포괄적인 AI API와 AI 온라인 애플리케이션을 제공합니다" }, "ai360": { - "description": "360 AI는 360사가 출시한 AI 모델 및 서비스 플랫폼으로, 360GPT2 Pro, 360GPT Pro, 360GPT Turbo, 360GPT Turbo Responsibility 8K 등 다양한 고급 자연어 처리 모델을 제공합니다. 이들 모델은 대규모 파라미터와 멀티모달 기능을 결합하여 텍스트 생성, 의미 이해, 대화 시스템, 코드 생성 등 다양한 분야에 활용됩니다. 유연한 가격 정책을 통해 다양한 사용자 요구를 충족시키며, 개발자 통합을 지원하여 지능형 애플리케이션의 혁신과 발전을 촉진합니다." + "description": "360 AI는 360 회사가 출시한 AI 모델 및 서비스 플랫폼으로, 360GPT2 Pro, 360GPT Pro, 360GPT Turbo 및 360GPT Turbo Responsibility 8K를 포함한 다양한 고급 자연어 처리 모델을 제공합니다. 이러한 모델은 대규모 매개변수와 다중 모드 능력을 결합하여 텍스트 생성, 의미 이해, 대화 시스템 및 코드 생성 등 다양한 분야에 널리 사용됩니다. 유연한 가격 전략을 통해 360 AI는 다양한 사용자 요구를 충족하고 개발자가 통합할 수 있도록 지원하여 스마트화 응용 프로그램의 혁신과 발전을 촉진합니다." }, "aihubmix": { "description": "AiHubMix는 통합 API 인터페이스를 통해 다양한 AI 모델에 대한 접근을 제공합니다." }, "akashchat": { - "description": "Akash는 허가가 필요 없는 클라우드 리소스 마켓으로, 전통적인 클라우드 제공업체에 비해 경쟁력 있는 가격을 자랑합니다." + "description": "Akash는 허가가 필요 없는 클라우드 자원 시장으로, 전통적인 클라우드 제공업체에 비해 경쟁력 있는 가격을 제공합니다." }, "anthropic": { - "description": "Anthropic은 인공지능 연구 및 개발에 집중하는 기업으로, Claude 3.5 Sonnet, Claude 3 Sonnet, Claude 3 Opus, Claude 3 Haiku 등 고급 언어 모델을 제공합니다. 이들 모델은 지능, 속도, 비용 간의 이상적인 균형을 이루며, 기업용 워크로드부터 빠른 응답이 필요한 다양한 애플리케이션에 적합합니다. 최신 모델인 Claude 3.5 Sonnet은 여러 평가에서 우수한 성능을 보이며 높은 가성비를 유지합니다." + "description": "Anthropic은 인공지능 연구 및 개발에 집중하는 회사로, Claude 3.5 Sonnet, Claude 3 Sonnet, Claude 3 Opus 및 Claude 3 Haiku와 같은 고급 언어 모델을 제공합니다. 이러한 모델은 지능, 속도 및 비용 간의 이상적인 균형을 이루며, 기업급 작업 부하에서부터 빠른 응답이 필요한 다양한 응용 프로그램에 적합합니다. Claude 3.5 Sonnet은 최신 모델로, 여러 평가에서 우수한 성능을 보이며 높은 비용 효율성을 유지하고 있습니다." }, "azure": { - "description": "Azure는 GPT-3.5 및 최신 GPT-4 시리즈를 포함한 다양한 고급 AI 모델을 제공하며, 다양한 데이터 유형과 복잡한 작업을 지원합니다. 안전하고 신뢰할 수 있으며 지속 가능한 AI 솔루션을 지향합니다." + "description": "Azure는 GPT-3.5 및 최신 GPT-4 시리즈를 포함한 다양한 고급 AI 모델을 제공하며, 다양한 데이터 유형과 복잡한 작업을 지원하고 안전하고 신뢰할 수 있으며 지속 가능한 AI 솔루션을 목표로 하고 있습니다." }, "azureai": { - "description": "Azure는 GPT-3.5 및 최신 GPT-4 시리즈를 포함한 다양한 고급 AI 모델을 제공하며, 다양한 데이터 유형과 복잡한 작업을 지원합니다. 안전하고 신뢰할 수 있으며 지속 가능한 AI 솔루션을 지향합니다." + "description": "Azure는 GPT-3.5 및 최신 GPT-4 시리즈를 포함한 다양한 고급 AI 모델을 제공하며, 다양한 데이터 유형과 복잡한 작업을 지원하고 안전하고 신뢰할 수 있으며 지속 가능한 AI 솔루션을 위해 노력합니다." }, "baichuan": { - "description": "바이촨 인텔리전스는 대형 AI 모델 개발에 집중하는 기업으로, 중국어 기반의 백과 지식, 장문 처리 및 창작 생성 등에서 뛰어난 성능을 보이며 해외 주요 모델을 능가합니다. 또한 업계 선도적인 멀티모달 기능을 갖추고 있으며, 다양한 권위 있는 평가에서 우수한 성과를 거두었습니다. 주요 모델로는 Baichuan 4, Baichuan 3 Turbo, Baichuan 3 Turbo 128k 등이 있으며, 다양한 응용 시나리오에 맞춰 최적화되어 높은 가성비를 제공합니다." + "description": "百川智能은 인공지능 대형 모델 연구 개발에 집중하는 회사로, 그 모델은 국내 지식 백과, 긴 텍스트 처리 및 생성 창작 등 중국어 작업에서 뛰어난 성능을 보이며, 해외 주류 모델을 초월합니다. 百川智能은 업계 선도적인 다중 모드 능력을 갖추고 있으며, 여러 권위 있는 평가에서 우수한 성능을 보였습니다. 그 모델에는 Baichuan 4, Baichuan 3 Turbo 및 Baichuan 3 Turbo 128k 등이 포함되어 있으며, 각각 다른 응용 시나리오에 최적화되어 비용 효율적인 솔루션을 제공합니다." }, "bedrock": { - "description": "Bedrock은 아마존 AWS에서 제공하는 서비스로, 기업을 위한 고급 AI 언어 및 비전 모델을 제공합니다. Anthropic의 Claude 시리즈, Meta의 Llama 3.1 시리즈 등 다양한 모델을 포함하며, 텍스트 생성, 대화, 이미지 처리 등 다양한 작업을 지원합니다. 기업의 규모와 요구에 맞는 다양한 선택지를 제공합니다." + "description": "Bedrock은 아마존 AWS가 제공하는 서비스로, 기업에 고급 AI 언어 모델과 비주얼 모델을 제공합니다. 그 모델 가족에는 Anthropic의 Claude 시리즈, Meta의 Llama 3.1 시리즈 등이 포함되어 있으며, 경량형부터 고성능까지 다양한 선택지를 제공하고 텍스트 생성, 대화, 이미지 처리 등 여러 작업을 지원하여 다양한 규모와 요구의 기업 응용 프로그램에 적합합니다." }, "bfl": { - "description": "미래의 비전 인프라를 구축하는 선도적인 첨단 인공지능 연구소입니다." + "description": "선도적인 최첨단 인공지능 연구소로서 미래의 비전 인프라를 구축합니다." + }, + "cerebras": { + "description": "Cerebras는 전용 CS-3 시스템을 기반으로 한 AI 추론 플랫폼으로, 전 세계에서 가장 빠르고 실시간 반응이 가능한 고처리량 LLM 서비스를 제공하도록 설계되었습니다. 이 플랫폼은 지연을 제거하고 실시간 코드 생성 및 에이전트 작업과 같은 복잡한 AI 워크플로우를 가속화하기 위해 특별히 설계되었습니다." }, "cerebras": { "description": "Cerebras는 전용 CS-3 시스템을 기반으로 한 AI 추론 플랫폼으로, 전 세계에서 가장 빠르고 실시간 반응이 가능한 고처리량 LLM 서비스를 제공하도록 설계되었습니다. 이 플랫폼은 지연을 제거하고 실시간 코드 생성 및 에이전트 작업과 같은 복잡한 AI 워크플로우를 가속화하기 위해 특별히 설계되었습니다." @@ -39,159 +42,159 @@ "description": "Cloudflare의 글로벌 네트워크에서 서버리스 GPU로 구동되는 머신러닝 모델을 실행합니다." }, "cohere": { - "description": "Cohere는 최첨단 다국어 모델, 고급 검색 기능, 현대 기업을 위한 맞춤형 AI 작업 공간을 하나의 안전한 플랫폼에 통합하여 제공합니다." + "description": "Cohere는 최첨단 다국어 모델, 고급 검색 기능 및 현대 기업을 위해 맞춤 설계된 AI 작업 공간을 제공합니다 — 모든 것이 안전한 플랫폼에 통합되어 있습니다." }, "cometapi": { - "description": "CometAPI는 OpenAI, Anthropic, Google 등 다양한 최첨단 대형 모델 인터페이스를 제공하는 서비스 플랫폼으로, 다양한 개발 및 응용 요구에 적합합니다. 사용자는 자신의 필요에 따라 최적의 모델과 가격을 유연하게 선택할 수 있어 AI 경험을 향상시킵니다." + "description": "CometAPI는 OpenAI, Anthropic, Google 등 다양한 최첨단 대형 모델 인터페이스를 제공하는 서비스 플랫폼으로, 다양한 개발 및 응용 요구에 적합합니다. 사용자는 자신의 필요에 따라 최적의 모델과 가격을 유연하게 선택하여 AI 경험 향상을 도울 수 있습니다." }, "deepseek": { - "description": "DeepSeek는 인공지능 기술 연구 및 응용에 집중하는 기업으로, 최신 모델 DeepSeek-V3는 여러 평가에서 Qwen2.5-72B 및 Llama-3.1-405B 등 오픈소스 모델을 능가하며, GPT-4o 및 Claude-3.5-Sonnet과 같은 선도적인 폐쇄형 모델과 성능이 유사합니다." + "description": "DeepSeek는 인공지능 기술 연구 및 응용에 집중하는 회사로, 최신 모델인 DeepSeek-V2.5는 일반 대화 및 코드 처리 능력을 통합하고 인간의 선호 정렬, 작문 작업 및 지시 따르기 등에서 상당한 향상을 이루었습니다." }, "fal": { "description": "개발자를 위한 생성형 미디어 플랫폼" }, "fireworksai": { - "description": "Fireworks AI는 함수 호출 및 멀티모달 처리에 특화된 고급 언어 모델 서비스 제공업체입니다. 최신 모델 Firefunction V2는 Llama-3 기반으로 함수 호출, 대화 및 명령어 추종에 최적화되어 있습니다. 시각 언어 모델 FireLLaVA-13B는 이미지와 텍스트의 혼합 입력을 지원합니다. 그 외에도 Llama 시리즈와 Mixtral 시리즈 등 다양한 모델을 통해 다국어 명령어 추종 및 생성 기능을 제공합니다." + "description": "Fireworks AI는 기능 호출 및 다중 모드 처리를 전문으로 하는 선도적인 고급 언어 모델 서비스 제공업체입니다. 최신 모델인 Firefunction V2는 Llama-3를 기반으로 하며, 함수 호출, 대화 및 지시 따르기에 최적화되어 있습니다. 비주얼 언어 모델인 FireLLaVA-13B는 이미지와 텍스트 혼합 입력을 지원합니다. 기타 주목할 만한 모델로는 Llama 시리즈와 Mixtral 시리즈가 있으며, 효율적인 다국어 지시 따르기 및 생성 지원을 제공합니다." }, "giteeai": { - "description": "Gitee AI의 Serverless API는 AI 개발자에게 즉시 사용할 수 있는 대형 모델 추론 API 서비스를 제공합니다." + "description": "Gitee AI의 Serverless API는 AI 개발자에게 즉시 사용할 수 있는 대형 모델 추론 API 서비스를 제공한다." }, "github": { - "description": "GitHub 모델을 통해 개발자는 AI 엔지니어가 되어 업계 최고 수준의 AI 모델을 활용한 개발이 가능합니다." + "description": "GitHub 모델을 통해 개발자는 AI 엔지니어가 되어 업계 최고의 AI 모델로 구축할 수 있습니다." }, "google": { - "description": "Google의 Gemini 시리즈는 Google DeepMind가 개발한 가장 진보된 범용 AI 모델로, 텍스트, 코드, 이미지, 오디오, 비디오를 원활하게 이해하고 처리할 수 있도록 설계된 멀티모달 모델입니다. 데이터 센터부터 모바일 기기까지 다양한 환경에 적합하며, AI 모델의 효율성과 활용 범위를 크게 향상시킵니다." + "description": "Google의 Gemini 시리즈는 Google DeepMind가 개발한 가장 진보된 범용 AI 모델로, 다중 모드 설계를 통해 텍스트, 코드, 이미지, 오디오 및 비디오의 원활한 이해 및 처리를 지원합니다. 데이터 센터에서 모바일 장치에 이르기까지 다양한 환경에 적합하며 AI 모델의 효율성과 응용 범위를 크게 향상시킵니다." }, "groq": { - "description": "Groq의 LPU 추론 엔진은 최신 독립 대형 언어 모델(LLM) 벤치마크에서 뛰어난 성능을 보이며, 놀라운 속도와 효율성으로 AI 솔루션의 새로운 기준을 제시합니다. Groq는 실시간 추론 속도의 대표주자로, 클라우드 기반 배포에서 우수한 성능을 발휘합니다." + "description": "Groq의 LPU 추론 엔진은 최신 독립 대형 언어 모델(LLM) 벤치마크 테스트에서 뛰어난 성능을 보이며, 놀라운 속도와 효율성으로 AI 솔루션의 기준을 재정의하고 있습니다. Groq는 즉각적인 추론 속도의 대표주자로, 클라우드 기반 배포에서 우수한 성능을 보여줍니다." }, "higress": { - "description": "Higress는 알리바바 내부에서 Tengine reload가 장기 연결 서비스에 미치는 영향을 해결하고, gRPC/Dubbo의 부하 분산 기능 부족 문제를 해결하기 위해 개발된 클라우드 네이티브 API 게이트웨이입니다." + "description": "Higress는 클라우드 네이티브 API 게이트웨이로, 알리 내부에서 Tengine reload가 장기 연결 비즈니스에 미치는 영향을 해결하고 gRPC/Dubbo의 로드 밸런싱 능력이 부족한 문제를 해결하기 위해 탄생했습니다." }, "huggingface": { - "description": "HuggingFace Inference API는 수천 개의 모델을 빠르고 무료로 탐색할 수 있는 방법을 제공합니다. 새로운 애플리케이션을 위한 프로토타입을 만들거나 머신러닝 기능을 실험할 때, 이 API를 통해 다양한 분야의 고성능 모델에 즉시 접근할 수 있습니다." + "description": "HuggingFace Inference API는 수천 개의 모델을 탐색할 수 있는 빠르고 무료의 방법을 제공합니다. 새로운 애플리케이션을 프로토타입 하거나 머신러닝의 기능을 시도하는 경우, 이 API는 여러 분야의 고성능 모델에 즉시 접근할 수 있게 해줍니다." }, "hunyuan": { - "description": "텐센트가 개발한 대형 언어 모델로, 강력한 중국어 창작 능력, 복잡한 문맥에서의 논리적 추론 능력, 신뢰할 수 있는 작업 수행 능력을 갖추고 있습니다." + "description": "텐센트가 개발한 대형 언어 모델로, 강력한 한국어 창작 능력과 복잡한 맥락에서의 논리적 추론 능력, 그리고 신뢰할 수 있는 작업 수행 능력을 갖추고 있습니다." }, "infiniai": { - "description": "애플리케이션 개발자를 위해 고성능, 사용이 간편하며 안전하고 신뢰할 수 있는 대형 모델 서비스를 제공하며, 모델 개발부터 서비스화 배포까지 전 과정을 포괄합니다." + "description": "애플리케이션 개발자에게 고성능, 사용하기 쉬운, 안전하고 신뢰할 수 있는 대형 모델 서비스를 제공하며, 대형 모델 개발부터 서비스 배포까지의 전체 프로세스를 지원합니다." }, "internlm": { - "description": "대형 모델 연구 및 개발 도구 체인을 위한 오픈소스 조직으로, 모든 AI 개발자에게 효율적이고 사용하기 쉬운 오픈소스 플랫폼을 제공하여 최첨단 대형 모델과 알고리즘 기술을 손쉽게 활용할 수 있도록 합니다." + "description": "대규모 모델 연구 및 개발 도구 체인에 전념하는 오픈 소스 조직입니다. 모든 AI 개발자에게 효율적이고 사용하기 쉬운 오픈 소스 플랫폼을 제공하여 최첨단 대규모 모델 및 알고리즘 기술을 손쉽게 이용할 수 있도록 합니다." }, "jina": { - "description": "Jina AI는 2020년에 설립된 선도적인 검색 AI 기업으로, 벡터 모델, 리랭커, 소형 언어 모델을 포함한 검색 기반 플랫폼을 통해 기업이 신뢰할 수 있고 고품질의 생성형 AI 및 멀티모달 검색 애플리케이션을 구축할 수 있도록 지원합니다." + "description": "Jina AI는 2020년에 설립된 선도적인 검색 AI 회사입니다. 우리의 검색 기반 플랫폼은 기업이 신뢰할 수 있고 고품질의 생성적 AI 및 다중 모드 검색 애플리케이션을 구축할 수 있도록 돕는 벡터 모델, 재배치기 및 소형 언어 모델을 포함하고 있습니다." }, "lmstudio": { - "description": "LM Studio는 사용자의 컴퓨터에서 LLM을 개발하고 실험할 수 있는 데스크탑 애플리케이션입니다." + "description": "LM Studio는 귀하의 컴퓨터에서 LLM을 개발하고 실험하기 위한 데스크탑 애플리케이션입니다." }, "minimax": { - "description": "MiniMax는 2021년에 설립된 범용 인공지능 기술 기업으로, 사용자와 함께 지능을 창조하는 것을 목표로 합니다. 자체적으로 다양한 모달의 범용 대형 모델을 개발하였으며, 조 단위 파라미터의 MoE 텍스트 모델, 음성 모델, 이미지 모델 등을 포함하고 있습니다. 또한 '소라 AI'와 같은 애플리케이션도 출시하였습니다." + "description": "MiniMax는 2021년에 설립된 일반 인공지능 기술 회사로, 사용자와 함께 지능을 공동 창출하는 데 전념하고 있습니다. MiniMax는 다양한 모드의 일반 대형 모델을 독자적으로 개발하였으며, 여기에는 조 단위의 MoE 텍스트 대형 모델, 음성 대형 모델 및 이미지 대형 모델이 포함됩니다. 또한 해마 AI와 같은 응용 프로그램을 출시하였습니다." }, "mistral": { - "description": "Mistral은 고급 범용, 전문 및 연구용 모델을 제공하며, 복잡한 추론, 다국어 작업, 코드 생성 등 다양한 분야에 활용됩니다. 기능 호출 인터페이스를 통해 사용자는 맞춤형 기능을 통합하여 특정 애플리케이션을 구현할 수 있습니다." + "description": "Mistral은 고급 일반, 전문 및 연구형 모델을 제공하며, 복잡한 추론, 다국어 작업, 코드 생성 등 다양한 분야에 널리 사용됩니다. 기능 호출 인터페이스를 통해 사용자는 사용자 정의 기능을 통합하여 특정 응용 프로그램을 구현할 수 있습니다." }, "modelscope": { - "description": "ModelScope는 알리바바 클라우드가 출시한 모델 서비스 플랫폼으로, 다양한 AI 모델과 추론 서비스를 제공합니다." + "description": "ModelScope는 알리바바 클라우드에서 출시한 모델 서비스 플랫폼으로, 풍부한 AI 모델과 추론 서비스를 제공합니다." }, "moonshot": { - "description": "Moonshot은 베이징 월지암면과학기술유한회사가 출시한 오픈소스 플랫폼으로, 다양한 자연어 처리 모델을 제공하며, 콘텐츠 제작, 학술 연구, 지능형 추천, 의료 진단 등 다양한 분야에 활용됩니다. 장문 처리 및 복잡한 생성 작업을 지원합니다." + "description": "Moonshot은 베이징 월의 어두운 면 기술 회사가 출시한 오픈 소스 플랫폼으로, 다양한 자연어 처리 모델을 제공하며, 콘텐츠 창작, 학술 연구, 스마트 추천, 의료 진단 등 다양한 분야에 적용됩니다. 긴 텍스트 처리 및 복잡한 생성 작업을 지원합니다." }, "nebius": { - "description": "Nebius는 대규모 GPU 클러스터와 수직 통합 클라우드 플랫폼을 구축하여 전 세계 AI 혁신가에게 고성능 인프라를 제공합니다." + "description": "Nebius는 대규모 GPU 클러스터와 수직 통합 클라우드 플랫폼을 구축하여 전 세계 AI 혁신가들에게 고성능 인프라를 제공합니다." }, "newapi": { - "description": "여러 오픈소스 AI 서비스를 통합하여 일관되게 전달하는 플랫폼" + "description": "오픈 소스 다중 AI 서비스 통합 전달 플랫폼" }, "novita": { - "description": "Novita AI는 다양한 대형 언어 모델과 AI 이미지 생성을 위한 API 서비스를 제공하는 플랫폼으로, 유연하고 신뢰할 수 있으며 비용 효율적입니다. Llama3, Mistral 등 최신 오픈소스 모델을 지원하며, 생성형 AI 애플리케이션 개발을 위한 포괄적이고 사용자 친화적이며 자동 확장 가능한 API 솔루션을 제공합니다. AI 스타트업의 빠른 성장을 지원합니다." + "description": "Novita AI는 다양한 대형 언어 모델과 AI 이미지 생성을 제공하는 API 서비스 플랫폼으로, 유연하고 신뢰할 수 있으며 비용 효율적입니다. Llama3, Mistral 등 최신 오픈 소스 모델을 지원하며, 생성적 AI 응용 프로그램 개발을 위한 포괄적이고 사용자 친화적이며 자동 확장 가능한 API 솔루션을 제공하여 AI 스타트업의 빠른 발전에 적합합니다." }, "nvidia": { - "description": "NVIDIA NIM™은 GPU 가속 추론 마이크로서비스를 위한 컨테이너를 제공하며, 클라우드, 데이터 센터, RTX™ AI 개인용 컴퓨터 및 워크스테이션에서 사전 학습된 모델과 사용자 정의 AI 모델을 배포할 수 있습니다." + "description": "NVIDIA NIM™은 클라우드, 데이터 센터, RTX™ AI 개인용 컴퓨터 및 워크스테이션에서 사전 훈련된 AI 모델과 사용자 정의 AI 모델을 배포할 수 있도록 지원하는 컨테이너를 제공합니다." }, "ollama": { - "description": "Ollama는 코드 생성, 수학 연산, 다국어 처리, 대화형 상호작용 등 다양한 분야를 포괄하는 모델을 제공하며, 기업용 및 로컬 배포 요구를 모두 지원합니다." + "description": "Ollama가 제공하는 모델은 코드 생성, 수학 연산, 다국어 처리 및 대화 상호작용 등 다양한 분야를 포괄하며, 기업급 및 로컬 배포의 다양한 요구를 지원합니다." }, "ollamacloud": { - "description": "Ollama Cloud는 공식적으로 호스팅되는 추론 서비스를 제공하며, Ollama 모델 라이브러리에 즉시 접근할 수 있고 OpenAI 호환 인터페이스를 지원합니다." + "description": "Ollama Cloud는 공식 호스팅 추론 서비스를 제공하며, 즉시 사용 가능한 Ollama 모델 라이브러리에 접근할 수 있고 OpenAI 호환 인터페이스를 지원합니다." }, "openai": { - "description": "OpenAI는 세계를 선도하는 인공지능 연구 기관으로, GPT 시리즈와 같은 모델을 통해 자연어 처리의 최전선을 이끌고 있습니다. 혁신적이고 효율적인 AI 솔루션을 통해 다양한 산업을 변화시키고 있으며, 연구, 비즈니스, 혁신적 응용 분야에서 뛰어난 성능과 경제성을 자랑합니다." + "description": "OpenAI는 세계 최고의 인공지능 연구 기관으로, 개발한 모델인 GPT 시리즈는 자연어 처리의 최전선에서 혁신을 이끌고 있습니다. OpenAI는 혁신적이고 효율적인 AI 솔루션을 통해 여러 산업을 변화시키는 데 전념하고 있습니다. 그들의 제품은 뛰어난 성능과 경제성을 갖추고 있어 연구, 비즈니스 및 혁신적인 응용 프로그램에서 널리 사용됩니다." }, "openrouter": { - "description": "OpenRouter는 OpenAI, Anthropic, LLaMA 등 다양한 최첨단 대형 모델 인터페이스를 제공하는 서비스 플랫폼으로, 다양한 개발 및 응용 요구에 적합합니다. 사용자는 자신의 필요에 따라 최적의 모델과 가격을 유연하게 선택할 수 있어 AI 경험을 향상시킵니다." + "description": "OpenRouter는 OpenAI, Anthropic, LLaMA 등 다양한 최첨단 대형 모델 인터페이스를 제공하는 서비스 플랫폼으로, 다양한 개발 및 응용 요구에 적합합니다. 사용자는 자신의 필요에 따라 최적의 모델과 가격을 유연하게 선택하여 AI 경험을 향상시킬 수 있습니다." }, "perplexity": { - "description": "Perplexity는 고급 대화형 생성 모델 제공업체로, 다양한 Llama 3.1 모델을 제공하며, 온라인 및 오프라인 애플리케이션에 적합하고 복잡한 자연어 처리 작업에 특히 효과적입니다." + "description": "Perplexity는 선도적인 대화 생성 모델 제공업체로, 다양한 고급 Llama 3.1 모델을 제공하며, 온라인 및 오프라인 응용 프로그램을 지원하고 복잡한 자연어 처리 작업에 특히 적합합니다." }, "ppio": { - "description": "PPIO는 안정적이고 가성비 높은 오픈소스 모델 API 서비스를 제공하며, DeepSeek 전 시리즈, Llama, Qwen 등 업계 선도 모델을 지원합니다." + "description": "PPIO 파이오 클라우드는 안정적이고 비용 효율적인 오픈 소스 모델 API 서비스를 제공하며, DeepSeek 전 시리즈, Llama, Qwen 등 업계 선도 대모델을 지원합니다." }, "qiniu": { - "description": "치우는 오랜 역사를 가진 클라우드 서비스 제공업체로, 실시간 및 배치 AI 추론 서비스를 안정적이고 가성비 높게 제공하며, 사용이 간편합니다." + "description": "Qiniu는 대형 모델 서비스를 제공하는 대형 모델 플랫폼으로, 안정적이고 비용 효율적인 오픈 소스 모델 API 서비스를 제공하며, DeepSeek 전 시리즈, Llama, Qwen 등 업계 선도 대모델을 지원합니다." }, "qwen": { - "description": "통의천문은 알리바바 클라우드가 자체 개발한 초대형 언어 모델로, 강력한 자연어 이해 및 생성 능력을 갖추고 있습니다. 다양한 질문에 답변하고, 텍스트를 창작하며, 의견을 표현하고, 코드를 작성하는 등 여러 분야에서 활용됩니다." + "description": "통의천문은 알리바바 클라우드가 자주 개발한 초대형 언어 모델로, 강력한 자연어 이해 및 생성 능력을 갖추고 있습니다. 다양한 질문에 답변하고, 텍스트 콘텐츠를 창작하며, 의견을 표현하고, 코드를 작성하는 등 여러 분야에서 활용됩니다." }, "sambanova": { - "description": "SambaNova Cloud는 개발자가 최고의 오픈소스 모델을 손쉽게 사용하고, 가장 빠른 추론 속도를 경험할 수 있도록 지원합니다." + "description": "SambaNova Cloud는 개발자가 최고의 오픈 소스 모델을 쉽게 사용하고 가장 빠른 추론 속도를 즐길 수 있도록 합니다." }, "search1api": { - "description": "Search1API는 DeepSeek 시리즈 모델에 대한 온디맨드 네트워크 연결 기능을 제공하며, 표준 버전과 고속 버전을 포함하고 다양한 파라미터 규모의 모델 선택을 지원합니다." + "description": "Search1API는 필요에 따라 연결할 수 있는 DeepSeek 시리즈 모델에 대한 액세스를 제공하며, 표준 버전과 빠른 버전을 포함하고 다양한 매개변수 규모의 모델 선택을 지원합니다." }, "sensenova": { - "description": "상탕일일신은 상탕대장치의 강력한 인프라를 기반으로 효율적이고 사용하기 쉬운 풀스택 대형 모델 서비스를 제공합니다." + "description": "상탕의 일일 혁신은 상탕의 강력한 기반 지원을 바탕으로 효율적이고 사용하기 쉬운 전체 스택 대모델 서비스를 제공합니다." }, "siliconcloud": { - "description": "SiliconCloud는 우수한 오픈소스 기반 모델을 활용한 고성능/가성비 GenAI 클라우드 서비스입니다." + "description": "SiliconFlow는 AGI를 가속화하여 인류에 혜택을 주기 위해 사용하기 쉽고 비용이 저렴한 GenAI 스택을 통해 대규모 AI 효율성을 향상시키는 데 전념하고 있습니다." }, "spark": { - "description": "iFLYTEK의 Spark 대형 모델은 다양한 분야와 언어에서 강력한 AI 기능을 제공하며, 첨단 자연어 처리 기술을 활용하여 스마트 하드웨어, 스마트 헬스케어, 스마트 금융 등 다양한 수직 분야의 혁신적인 애플리케이션을 구축합니다." + "description": "科大讯飞星火 대모델은 다중 분야 및 다국어의 강력한 AI 능력을 제공하며, 고급 자연어 처리 기술을 활용하여 스마트 하드웨어, 스마트 의료, 스마트 금융 등 다양한 수직 분야에 적합한 혁신적인 응용 프로그램을 구축합니다." }, "stepfun": { - "description": "계급성신 대형 모델은 업계 최고 수준의 멀티모달 및 복잡한 추론 능력을 갖추고 있으며, 초장문 이해와 강력한 자율 검색 엔진 기능을 지원합니다." + "description": "阶级星辰 대모델은 업계 선도적인 다중 모드 및 복잡한 추론 능력을 갖추고 있으며, 초장 텍스트 이해 및 강력한 자율 스케줄링 검색 엔진 기능을 지원합니다." }, "taichu": { - "description": "중국과학원 자동화연구소와 우한 인공지능연구원이 공동 개발한 차세대 멀티모달 대형 모델로, 다중 회차 질의응답, 텍스트 생성, 이미지 생성, 3D 이해, 신호 분석 등 다양한 작업을 지원하며, 뛰어난 인지, 이해, 창작 능력을 통해 새로운 상호작용 경험을 제공합니다." + "description": "중국과학원 자동화 연구소와 우한 인공지능 연구원이 출시한 차세대 다중 모드 대형 모델은 다중 회차 질문 응답, 텍스트 창작, 이미지 생성, 3D 이해, 신호 분석 등 포괄적인 질문 응답 작업을 지원하며, 더 강력한 인지, 이해 및 창작 능력을 갖추고 있어 새로운 상호작용 경험을 제공합니다." }, "tencentcloud": { - "description": "지식 엔진 원자 능력(LLM Knowledge Engine Atomic Power)은 지식 엔진 기반의 전방위 질의응답 기능을 제공하며, 기업과 개발자를 위한 유연한 모델 애플리케이션 구성 및 개발을 지원합니다. 문서 분석, 분할, 임베딩, 다중 회차 재작성 등 다양한 서비스를 조합하여 기업 맞춤형 AI 비즈니스를 구축할 수 있습니다." + "description": "지식 엔진 원자 능력(LLM Knowledge Engine Atomic Power)은 지식 엔진을 기반으로 개발된 지식 질문 응답의 전체 링크 능력으로, 기업 및 개발자를 대상으로 하여 유연한 모델 응용 프로그램 구성 및 개발 능력을 제공합니다. 여러 원자 능력을 통해 귀하만의 모델 서비스를 구성하고, 문서 분석, 분할, 임베딩, 다중 회차 수정 등의 서비스를 호출하여 조합하여 기업 전용 AI 비즈니스를 맞춤화할 수 있습니다." }, "togetherai": { - "description": "Together AI는 혁신적인 AI 모델을 통해 최고의 성능을 실현하고, 빠른 확장성과 직관적인 배포 프로세스를 포함한 다양한 맞춤형 기능을 제공하여 기업의 다양한 요구를 충족시킵니다." + "description": "Together AI는 혁신적인 AI 모델을 통해 선도적인 성능을 달성하는 데 전념하며, 빠른 확장 지원 및 직관적인 배포 프로세스를 포함한 광범위한 사용자 정의 기능을 제공하여 기업의 다양한 요구를 충족합니다." }, "upstage": { - "description": "Upstage는 Solar LLM과 문서 AI를 포함한 다양한 비즈니스 요구에 맞춘 AI 모델을 개발하며, 인공 일반 지능(AGI)을 실현하는 것을 목표로 합니다. Chat API를 통해 간단한 대화형 에이전트를 만들 수 있으며, 기능 호출, 번역, 임베딩 및 특정 도메인 애플리케이션을 지원합니다." + "description": "Upstage는 Solar LLM 및 문서 AI를 포함하여 다양한 비즈니스 요구를 위한 AI 모델 개발에 집중하고 있으며, 인공지능 일반 지능(AGI)을 실현하는 것을 목표로 하고 있습니다. Chat API를 통해 간단한 대화 에이전트를 생성하고 기능 호출, 번역, 임베딩 및 특정 분야 응용 프로그램을 지원합니다." }, "v0": { - "description": "v0는 페어 프로그래밍 도우미로, 자연어로 아이디어를 설명하면 프로젝트에 필요한 코드와 사용자 인터페이스(UI)를 생성해줍니다." + "description": "v0는 페어 프로그래밍 도우미로, 자연어로 아이디어를 설명하기만 하면 프로젝트에 필요한 코드와 사용자 인터페이스(UI)를 생성해 줍니다." }, "vercelaigateway": { - "description": "Vercel AI Gateway는 OpenAI, Anthropic, Google 등 다양한 제공업체의 100개 이상의 모델에 단일 엔드포인트를 통해 접근할 수 있는 통합 API를 제공합니다. 예산 설정, 사용 모니터링, 요청 부하 분산 및 장애 조치 기능을 지원합니다." + "description": "Vercel AI Gateway는 100개 이상의 모델에 접근할 수 있는 통합 API를 제공합니다. 단일 엔드포인트를 통해 OpenAI, Anthropic, Google 등 다양한 공급자의 모델을 사용할 수 있습니다. 예산 설정, 사용 모니터링, 요청 부하 분산 및 장애 조치를 지원합니다." }, "vertexai": { - "description": "Google의 Gemini 시리즈는 Google DeepMind가 개발한 가장 진보된 범용 AI 모델로, 텍스트, 코드, 이미지, 오디오, 비디오를 원활하게 이해하고 처리할 수 있도록 설계된 멀티모달 모델입니다. 데이터 센터부터 모바일 기기까지 다양한 환경에 적합하며, AI 모델의 효율성과 활용 범위를 크게 향상시킵니다." + "description": "구글의 제미니 시리즈는 구글 딥마인드가 개발한 최첨단 범용 AI 모델로, 다중 모드에 맞춰 설계되어 텍스트, 코드, 이미지, 오디오 및 비디오의 원활한 이해와 처리를 지원합니다. 데이터 센터에서 모바일 장치에 이르기까지 다양한 환경에 적합하며, AI 모델의 효율성과 응용 범위를 크게 향상시킵니다." }, "vllm": { "description": "vLLM은 LLM 추론 및 서비스를 위한 빠르고 사용하기 쉬운 라이브러리입니다." }, "volcengine": { - "description": "바이트댄스가 출시한 대형 모델 서비스 개발 플랫폼으로, 기능이 풍부하고 안전하며 경쟁력 있는 가격의 모델 호출 서비스를 제공합니다. 또한 모델 데이터, 파인튜닝, 추론, 평가 등 엔드투엔드 기능을 제공하여 AI 애플리케이션 개발을 전방위로 지원합니다." + "description": "바이트댄스가 출시한 대형 모델 서비스 개발 플랫폼으로, 기능이 풍부하고 안전하며 가격 경쟁력이 있는 모델 호출 서비스를 제공합니다. 또한 모델 데이터, 세밀 조정, 추론, 평가 등 엔드 투 엔드 기능을 제공하여 귀하의 AI 애플리케이션 개발을 전방위적으로 지원합니다." }, "wenxin": { - "description": "기업용 원스톱 대형 모델 및 AI 네이티브 애플리케이션 개발 및 서비스 플랫폼으로, 가장 포괄적이고 사용하기 쉬운 생성형 AI 모델 개발 및 애플리케이션 개발 전 과정을 위한 도구 체인을 제공합니다." + "description": "기업용 원스톱 대형 모델 및 AI 네이티브 애플리케이션 개발 및 서비스 플랫폼으로, 가장 포괄적이고 사용하기 쉬운 생성적 인공지능 모델 개발 및 애플리케이션 개발 전체 프로세스 도구 체인을 제공합니다." }, "xai": { - "description": "xAI는 인류의 과학적 발견을 가속화하기 위한 인공지능을 구축하는 데 전념하는 회사입니다. 우리의 사명은 우주에 대한 공동의 이해를 증진하는 것입니다." + "description": "xAI는 인류의 과학적 발견을 가속화하기 위해 인공지능을 구축하는 데 전념하는 회사입니다. 우리의 사명은 우주에 대한 공동의 이해를 증진하는 것입니다." }, "xinference": { - "description": "Xorbits Inference(Xinference)는 다양한 AI 모델의 실행과 통합을 간소화하는 오픈소스 플랫폼입니다. Xinference를 통해 클라우드 또는 로컬 환경에서 오픈소스 LLM, 임베딩 모델, 멀티모달 모델을 실행하고 강력한 AI 애플리케이션을 구축할 수 있습니다." + "description": "Xorbits 추론(Xinference)은 다양한 AI 모델의 실행 및 통합을 단순화하기 위한 오픈소스 플랫폼입니다. Xinference를 사용하면 클라우드 또는 로컬 환경에서 오픈소스 LLM, 임베딩 모델 및 멀티모달 모델을 활용하여 추론을 실행하고 강력한 AI 애플리케이션을 구축할 수 있습니다." }, "zeroone": { - "description": "제로원은 인간 중심의 AI 2.0 기술 혁신을 추진하며, 대형 언어 모델을 통해 막대한 경제적·사회적 가치를 창출하고 새로운 AI 생태계와 비즈니스 모델을 개척하는 것을 목표로 합니다." + "description": "01.AI는 AI 2.0 시대의 인공지능 기술에 집중하며, '인간 + 인공지능'의 혁신과 응용을 적극적으로 추진하고, 초강력 모델과 고급 AI 기술을 활용하여 인간의 생산성을 향상시키고 기술의 힘을 실현합니다." }, "zhipu": { - "description": "Zhipu AI는 멀티모달 및 언어 모델을 위한 개방형 플랫폼을 제공하며, 텍스트 처리, 이미지 이해, 프로그래밍 지원 등 다양한 AI 응용 시나리오를 지원합니다." + "description": "智谱 AI는 다중 모드 및 언어 모델의 개방형 플랫폼을 제공하며, 텍스트 처리, 이미지 이해 및 프로그래밍 지원 등 광범위한 AI 응용 프로그램 시나리오를 지원합니다." } } diff --git a/locales/ko-KR/setting.json b/locales/ko-KR/setting.json index 50fb409cd92..80c2fd5148a 100644 --- a/locales/ko-KR/setting.json +++ b/locales/ko-KR/setting.json @@ -35,9 +35,16 @@ "title": "모든 설정 초기화" } }, + "groupTab": { + "chat": "채팅", + "members": "구성원", + "meta": "기본 정보" + }, "header": { "desc": "환경설정 및 모델 설정", "global": "전역 설정", + "group": "그룹 채팅 설정", + "groupDesc": "현재 그룹 채팅 관리", "session": "세션 설정", "sessionDesc": "역할 프롬프트 및 세션 환경설정", "sessionWithName": "세션 설정 · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "더 많은 모델이 <1>도입 예정입니다. 기대해 주세요." }, + "message": { + "success": "업데이트 성공" + }, "plugin": { "addMCPPlugin": "MCP 플러그인 추가", "addTooltip": "사용자 정의 플러그인", @@ -294,6 +304,101 @@ }, "title": "일반 설정" }, + "settingGroup": { + "description": { + "placeholder": "그룹 채팅 설명을 입력하세요", + "title": "그룹 채팅 설명" + }, + "name": { + "placeholder": "그룹 채팅 이름을 입력하세요", + "title": "그룹 채팅 이름" + }, + "scene": { + "desc": "그룹 채팅 환경 선택", + "options": { + "casual": "캐주얼", + "productive": "생산성" + }, + "title": "그룹 채팅 환경" + }, + "submit": "그룹 채팅 업데이트", + "systemPrompt": { + "placeholder": "호스트 시스템 프롬프트를 입력하세요", + "title": "호스트 시스템 프롬프트" + }, + "title": "그룹 채팅 정보" + }, + "settingGroupChat": { + "allowDM": { + "desc": "비활성화해도, 당신은 여전히 어시스턴트에게 직접 메시지를 보낼 수 있습니다", + "title": "어시스턴트의 DM 허용" + }, + "enableSupervisor": { + "desc": "그룹 채팅 진행을 관리할 수 있는 진행자 기능을 활성화합니다", + "title": "진행자 활성화" + }, + "maxResponseInRow": { + "desc": "멤버가 연속으로 답변할 수 있는 메시지 수를 선택하세요. 0으로 설정하면 제한이 해제됩니다.", + "title": "연속 답변 메시지 수" + }, + "model": { + "desc": "그룹 구성원의 발언에는 영향을 주지 않습니다. 일부 모델은 진행자 모델로 사용할 수 없습니다.", + "title": "호스트 모델" + }, + "orchestratorTitle": "호스트 설정", + "responseOrder": { + "desc": "에이전트가 그룹 채팅에서 설정된 순서대로 답변합니다.", + "options": { + "natural": "자연스러운", + "sequential": "순차적인" + }, + "placeholder": "답변 순서 선택", + "title": "답변 순서" + }, + "responseSpeed": { + "desc": "그룹 채팅의 전체 진행 속도를 조절합니다.", + "options": { + "fast": "빠름", + "medium": "보통", + "slow": "느림" + }, + "placeholder": "답변 속도 선택", + "title": "답변 속도" + }, + "revealDM": { + "desc": "다른 멤버에게 보낸 비공개 메시지 내용을 볼 수 있게 합니다.", + "title": "비공개 메시지 내용 표시" + }, + "submit": "설정 업데이트", + "systemPrompt": { + "desc": "그룹 채팅 대화 호스트의 맞춤 시스템 프롬프트입니다. 기본 호스트 동작에 영향을 줄 수 있습니다.", + "placeholder": "맞춤 호스트 시스템 프롬프트를 입력하세요...", + "title": "호스트 시스템 프롬프트" + }, + "title": "채팅 설정" + }, + "settingGroupMembers": { + "addToGroup": "그룹에 추가", + "availableAgents": "사용 가능한 어시스턴트", + "defaultAgent": "맞춤 어시스턴트", + "disableHost": "호스트 도우미 비활성화", + "edit": "멤버 편집", + "empty": "이 그룹 채팅에는 에이전트가 없습니다. + 버튼을 눌러 멤버를 추가하세요.", + "enableHost": "호스트 도우미 활성화", + "groupHost": "그룹 호스트", + "groupMembers": "그룹 멤버", + "host": { + "description": "호스트가 그룹에 있을 때 그룹 채팅이 자동으로 운영되며, 창의적인 작업에 적합합니다.", + "title": "호스트" + }, + "noAvailableAgents": "사용 가능한 어시스턴트가 없습니다", + "noDescription": "설명 없음", + "noMembersInGroup": "그룹에 멤버가 없습니다", + "owner": "당신 (소유자)", + "remove": "멤버 제거", + "removeFromGroup": "그룹에서 제거", + "you": "당신" + }, "settingImage": { "defaultCount": { "desc": "새 작업을 생성할 때 이미지 생성 패널의 기본 이미지 수를 설정합니다.", @@ -522,6 +627,11 @@ "modelDesc": "AI 그림 자동 주제 명명에 사용되는 모델 지정", "title": "AI 그림 자동 주제 명명" }, + "groupChatSupervisor": { + "label": "그룹 채팅 감독 모델", + "modelDesc": "그룹 채팅 대화를 감독하고 관리하기 위해 지정된 모델", + "title": "그룹 채팅 감독 및 관리" + }, "helpInfo": "새 도우미를 생성할 때 기본 도우미 설정이 기본값으로 사용됩니다.", "historyCompress": { "label": "대화 기록 모델", diff --git a/locales/ko-KR/welcome.json b/locales/ko-KR/welcome.json index 297a7282b1a..23ab6694cf8 100644 --- a/locales/ko-KR/welcome.json +++ b/locales/ko-KR/welcome.json @@ -1,45 +1,379 @@ { "guide": { "agents": { - "replaceBtn": "다른 추천 보기", - "title": "새로운 어시스턴트 추천:" + "replaceBtn": "다른 것으로 바꾸기", + "title": "새로운 보조 추천: " + }, + "defaultMessage": "저는 당신의 개인 스마트 어시스턴트 {{appName}}입니다. 지금 무엇을 도와드릴까요?
더 전문적이거나 맞춤형 어시스턴트가 필요하시면 를 클릭하여 사용자 정의 어시스턴트를 생성하세요.", + "defaultMessageWithoutCreate": "저는 당신의 개인 스마트 어시스턴트 {{appName}}입니다. 지금 무엇을 도와드릴까요?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "코드 변경 및 구현에 대한 기술 토론과 동료 검토", + "emoji": "💻", + "prompt": "함께 코드를 검토해 봅시다. 이 코드를 분석하고 개선할 부분을 찾아줄 수 있나요?", + "title": "코드 리뷰" + }, + "investment": { + "description": "시장 분석, 투자 전략 토론 및 금융 인사이트 공유", + "emoji": "📈", + "prompt": "함께 시장을 분석해 봅시다. 투자 전략을 논의하고 금융 인사이트를 공유하는 데 도움을 줄 수 있나요?", + "title": "투자 클럽" + }, + "research": { + "description": "과학 개념 탐구, 실험 수행 및 발견 공유", + "emoji": "🔬", + "prompt": "함께 과학을 탐구해 봅시다! 실험을 도와주고 우리의 발견을 공유할 수 있나요?", + "title": "과학 전시" + }, + "study": { + "description": "협력 학습 모임, 개념 토론 및 문제 공동 해결", + "emoji": "📚", + "prompt": "학습 그룹을 만들어 봅시다. 이 개념들을 이해하고 함께 문제를 해결하는 데 도움을 줄 수 있나요?", + "title": "학습 그룹" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "다양한 형태의 시각 및 디지털 아트 창작, 비평 및 감상", + "emoji": "🖼️", + "prompt": "아트 워크숍을 열어 봅시다! 다양한 형태의 예술을 창작하고 비평하며 감상하는 데 도움을 줄 수 있나요?", + "title": "아트 워크숍" + }, + "debate": { + "description": "다양한 주제와 시사에 대한 구조화된 토론 및 논쟁", + "emoji": "⚖️", + "prompt": "구조화된 토론을 진행해 봅시다. 이 주제에 대해 논리적이고 근거 있는 토론을 조직하는 데 도움을 줄 수 있나요?", + "title": "토론 클럽" + }, + "designReview": { + "description": "디자인 개념, 프로토타입 또는 창작물에 대한 협력 피드백 회의", + "emoji": "🎨", + "prompt": "디자인 작품을 검토해야 합니다. 디자인 개념과 프로토타입에 건설적인 피드백을 제공하는 데 도움을 줄 수 있나요?", + "title": "디자인 리뷰" + }, + "ideation": { + "description": "다양한 관점에서 협력하는 창의적 아이디어 생성 및 문제 해결", + "emoji": "🧠", + "prompt": "프로젝트를 위한 브레인스토밍을 시작합시다. 창의적인 아이디어와 해결책을 제안하는 데 도움을 줄 수 있나요?", + "title": "브레인스토밍" + } + }, + "game": { + "debateClub": { + "description": "다양한 주제와 시사에 대한 구조화된 토론 및 논쟁", + "emoji": "⚖️", + "prompt": "구조화된 토론을 진행해 봅시다. 이 주제에 대해 논리적이고 근거 있는 토론을 조직하는 데 도움을 줄 수 있나요?", + "title": "토론 클럽" + }, + "gameNight": { + "description": "재미있는 인터랙티브 게임과 활동으로 팀 유대감 형성 및 즐거움 제공", + "emoji": "🎲", + "prompt": "게임의 밤이 시작됩니다! 팀 유대감을 형성할 재미있는 인터랙티브 게임을 조직하는 데 도움을 줄 수 있나요?", + "title": "게임의 밤" + }, + "modelUN": { + "description": "모의 유엔 토론 및 글로벌 이슈에 대한 외교 협상", + "emoji": "🌍", + "prompt": "모의 유엔 토론을 해 봅시다. 글로벌 이슈에 대한 외교 협상을 설정하는 데 도움을 줄 수 있나요?", + "title": "모의 유엔" + }, + "werewolf": { + "description": "플레이어가 전략과 토론을 통해 늑대인을 찾아내는 소셜 추리 게임", + "emoji": "🐺", + "prompt": "늑대인간 게임을 해 봅시다! 규칙을 설정하고 이 소셜 추리 게임을 진행하는 데 도움을 줄 수 있나요?", + "title": "늑대인간 게임" + } + }, + "general": { + "brainstorm": { + "description": "다양한 관점에서 협력하는 창의적 아이디어 생성 및 문제 해결", + "emoji": "🧠", + "prompt": "프로젝트를 위한 브레인스토밍을 시작합시다. 창의적인 아이디어와 해결책을 제안하는 데 도움을 줄 수 있나요?", + "title": "브레인스토밍" + }, + "debate": { + "description": "다양한 주제와 시사에 대한 구조화된 토론 및 논쟁", + "emoji": "⚖️", + "prompt": "구조화된 토론을 진행해 봅시다. 이 주제에 대해 논리적이고 근거 있는 토론을 조직하는 데 도움을 줄 수 있나요?", + "title": "토론 클럽" + }, + "languagePractice": { + "description": "원어민과 함께 말하기 연습 및 새로운 언어 학습", + "emoji": "🗣️", + "prompt": "함께 새로운 언어를 연습해 봅시다. 이 언어를 배우고 말하는 연습을 하는 데 도움을 줄 수 있나요?", + "title": "언어 연습" + }, + "studyGroup": { + "description": "협력 학습 모임, 개념 토론 및 문제 공동 해결", + "emoji": "📚", + "prompt": "학습 그룹을 만들어 봅시다. 이 개념들을 이해하고 함께 문제를 해결하는 데 도움을 줄 수 있나요?", + "title": "학습 그룹" + } + }, + "planning": { + "cookingClass": { + "description": "요리 기술, 레시피 및 요리 전통 학습과 공유", + "emoji": "👨‍🍳", + "prompt": "요리 수업을 시작합시다! 새로운 레시피와 요리 기술을 함께 배우는 데 도움을 줄 수 있나요?", + "title": "요리 교실" + }, + "fitnessChallenge": { + "description": "단체 피트니스 목표 설정, 운동 방법 공유 및 상호 격려", + "emoji": "💪", + "prompt": "피트니스 챌린지를 시작합시다! 목표를 설정하고 건강을 유지하도록 서로 격려하는 데 도움을 줄 수 있나요?", + "title": "피트니스 챌린지" + }, + "planningPoker": { + "description": "카드를 사용해 프로젝트 작업과 업무량을 추정하는 애자일 추정 기법", + "emoji": "🃏", + "prompt": "프로젝트를 위한 플래닝 포커를 진행 중입니다. 애자일 기법을 사용해 작업량을 추정하는 데 도움을 줄 수 있나요?", + "title": "플래닝 포커" + }, + "travelPlanning": { + "description": "여행 계획, 여행 경험 공유 및 새로운 목적지 발견", + "emoji": "✈️", + "prompt": "함께 여행을 계획해 봅시다! 목적지를 조사하고 여행 일정을 계획하는 데 도움을 줄 수 있나요?", + "title": "여행 계획" + } + }, + "product": { + "codeReview": { + "description": "코드 변경 및 구현에 대한 기술 토론과 동료 검토", + "emoji": "💻", + "prompt": "함께 코드를 검토해 봅시다. 이 코드를 분석하고 개선할 부분을 찾아줄 수 있나요?", + "title": "코드 리뷰" + }, + "designReview": { + "description": "디자인 개념, 프로토타입 또는 창작물에 대한 협력 피드백 회의", + "emoji": "🎨", + "prompt": "디자인 작품을 검토해야 합니다. 디자인 개념과 프로토타입에 건설적인 피드백을 제공하는 데 도움을 줄 수 있나요?", + "title": "디자인 리뷰" + }, + "sprintPlanning": { + "description": "카드를 사용해 프로젝트 작업과 업무량을 추정하는 애자일 추정 기법", + "emoji": "🃏", + "prompt": "프로젝트를 위한 플래닝 포커를 진행 중입니다. 애자일 기법을 사용해 작업량을 추정하는 데 도움을 줄 수 있나요?", + "title": "플래닝 포커" + }, + "techExchange": { + "description": "신기술, 혁신 및 업계 동향 토론", + "emoji": "🚀", + "prompt": "기술 교류를 해 봅시다! 신기술과 업계 동향에 대해 토론하는 데 도움을 줄 수 있나요?", + "title": "기술 교류" + } + }, + "title": "그룹 채팅 사용 추천", + "writing": { + "bookClub": { + "description": "책, 이야기 및 문학 작품에 대한 문학적 토론과 분석", + "emoji": "📖", + "prompt": "독서 클럽 토론을 시작합시다. 이 책을 분석하고 주제를 함께 탐구하는 데 도움을 줄 수 있나요?", + "title": "독서 클럽" + }, + "movieClub": { + "description": "영화, 다큐멘터리 및 시각 매체 함께 감상 및 토론", + "emoji": "🎬", + "prompt": "영화 클럽 토론을 시작합시다. 이 영화를 분석하고 주제를 함께 탐구하는 데 도움을 줄 수 있나요?", + "title": "영화 클럽" + }, + "musicSession": { + "description": "협력 음악 창작, 공유 및 감상 모임", + "emoji": "🎵", + "prompt": "즉흥 음악 세션을 해 봅시다! 함께 음악을 창작하고 감상하는 데 도움을 줄 수 있나요?", + "title": "즉흥 음악" + }, + "studyGroup": { + "description": "협력 학습 모임, 개념 토론 및 문제 공동 해결", + "emoji": "📚", + "prompt": "학습 그룹을 만들어 봅시다. 이 개념들을 이해하고 함께 문제를 해결하는 데 도움을 줄 수 있나요?", + "title": "학습 그룹" + } + } + }, + "groupMessage": "그룹 채팅에 오신 것을 환영합니다! 여러 AI 어시스턴트와 공유 대화 공간에서 협업할 수 있습니다.", + "groupTemplates": { + "analysis": { + "description": "데이터 기반 인사이트, 심층 연구 분석", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "당신은 데이터를 다루고 해석하는 데 능숙하며, 차트와 통계 분석을 통해 데이터 이면의 규칙과 트렌드를 밝혀냅니다.", + "title": "데이터 분석가" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "당신은 연구 전문가로, 정보 수집과 심층 조사를 담당하며, 다양한 관점에서 문제를 종합적으로 분석할 수 있습니다.", + "title": "연구 전문가" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "당신은 통계 전문가로, 다양한 통계 방법과 모델에 능통하며, 데이터에서 가치 있는 비즈니스 인사이트를 도출할 수 있습니다.", + "title": "통계 전문가" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "당신은 정량 분석가로, 정량 모델링과 리스크 평가를 전문으로 하며, 수학적 방법으로 복잡한 문제를 해결합니다.", + "title": "정량 분석가" + } + ], + "title": "분석 팀" + }, + "brainstorm": { + "description": "다각도의 창의적 사고, 무한한 가능성 자극", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "당신은 크리에이티브 디렉터로, 거시적 관점에서 창의적 방향을 조율하며, 추상적 개념을 구체적 실행 가능한 창의안으로 전환할 수 있습니다.", + "title": "크리에이티브 디렉터" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "당신은 혁신 전문가로, 참신한 해결책과 획기적 사고를 발견하는 데 능하며, 고정관념을 벗어나 문제를 사고합니다.", + "title": "혁신 전문가" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "당신은 디자인 씽킹 전문가로, 사용자 경험과 시각적 표현 관점에서 문제를 고민하며, 창의성의 시각적 표현에 중점을 둡니다.", + "title": "디자인 씽킹 전문가" + } + ], + "title": "브레인스토밍 그룹" + }, + "game": { + "description": "여러 명이 즐기는 다양한 텍스트 게임, 예를 들어 마피아 게임과 스파이 게임", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "다양한 다인용 텍스트 게임에 능숙하며 게임 규칙에 따라 게임을 진행할 수 있습니다.", + "title": "게임 플레이어" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "다양한 다인용 텍스트 게임에 능숙하며 게임 규칙에 따라 게임을 진행할 수 있습니다.", + "title": "게임 플레이어" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "다양한 다인용 텍스트 게임에 능숙하며 게임 규칙에 따라 게임을 진행할 수 있습니다.", + "title": "게임 플레이어" + } + ], + "title": "게임룸" + }, + "planning": { + "description": "전략 기획 및 프로젝트 관리, 전반적 조율", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "프로젝트의 전체 계획, 일정 관리 및 자원 조정을 담당하여 프로젝트가 제시간에 고품질로 완료되도록 합니다.", + "title": "셰프" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "장기 전략 계획을 수립하고 시장 기회를 분석하며 목표와 실행 경로를 설정합니다.", + "title": "재료 구매 전문가" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "상세 실행 계획을 수립하고 부서 간 자원을 조정하여 계획의 실행 가능성을 보장합니다.", + "title": "요리 연구 개발 전문가" + } + ], + "title": "요리 연구 개발 팀" + }, + "product": { + "description": "제품 설계 및 개발, 고품질 제품 제작", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "당신은 디자이너로, 다양한 유형의 제품 설계에 능숙하며 제품 요구사항에 따라 디자인합니다.", + "title": "디자이너" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "당신은 제품 매니저로, 제품의 기획, 설계, 개발 및 유지 관리를 담당하며 제품 품질과 사용자 경험을 보장합니다.", + "title": "제품 매니저" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "당신은 경험 많은 풀스택 엔지니어로, 다양한 유형의 제품 개발에 능숙하며 제품 요구사항에 따라 개발합니다.", + "title": "풀스택 엔지니어" + } + ], + "title": "제품 개발 팀" + }, + "writing": { + "description": "콘텐츠 창작 및 편집, 고품질 문안 제작", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "다양한 문체의 콘텐츠 창작에 능숙하며 상황과 대상에 따라 글쓰기 스타일을 조정할 수 있습니다.", + "title": "콘텐츠 작가" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "당신은 편집자로, 텍스트 교정, 다듬기 및 최적화를 담당하며 콘텐츠의 정확성, 유창성 및 전문성을 보장합니다.", + "title": "편집자" + } + ], + "title": "글쓰기 그룹" + } }, - "defaultMessage": "저는 당신의 개인 인공지능 어시스턴트 {{appName}}입니다. 무엇을 도와드릴까요?
더 전문적이거나 맞춤형 어시스턴트가 필요하시면 를 클릭하여 직접 만들어보세요.", - "defaultMessageWithoutCreate": "저는 당신의 개인 인공지능 어시스턴트 {{appName}}입니다. 무엇을 도와드릴까요?", "qa": { - "q01": "LobeHub이란 무엇인가요?", - "q02": "{{appName}}이란 무엇인가요?", - "q03": "{{appName}}에 커뮤니티 지원이 있나요?", - "q04": "{{appName}}은 어떤 기능을 지원하나요?", - "q05": "{{appName}}은 어떻게 배포하고 사용하나요?", - "q06": "{{appName}}의 요금제는 어떻게 되나요?", - "q07": "{{appName}}은 무료인가요?", + "q01": "LobeHub란 무엇인가요?", + "q02": "{{appName}}란 무엇인가요?", + "q03": "{{appName}}는 커뮤니티 지원이 있나요?", + "q04": "{{appName}}는 어떤 기능을 지원하나요?", + "q05": "{{appName}}는 어떻게 배포하고 사용하나요?", + "q06": "{{appName}}의 가격은 어떻게 되나요?", + "q07": "{{appName}}는 무료인가요?", "q08": "클라우드 서비스 버전이 있나요?", "q09": "로컬 언어 모델을 지원하나요?", - "q10": "이미지 인식 및 생성을 지원하나요?", - "q11": "음성 합성과 음성 인식을 지원하나요?", + "q10": "이미지 인식 및 생성 기능을 지원하나요?", + "q11": "음성 합성 및 음성 인식을 지원하나요?", "q12": "플러그인 시스템을 지원하나요?", - "q13": "GPT를 얻을 수 있는 자체 마켓이 있나요?", - "q14": "다양한 AI 서비스 제공업체를 지원하나요?", + "q13": "GPT를 얻기 위한 자체 마켓이 있나요?", + "q14": "여러 AI 서비스 제공업체를 지원하나요?", "q15": "사용 중 문제가 발생하면 어떻게 해야 하나요?" }, "questions": { "moreBtn": "더 알아보기", - "title": "자주 묻는 질문:" + "title": "자주 묻는 질문: " }, "welcome": { - "afternoon": "좋은 오후입니다", - "morning": "좋은 아침입니다", - "night": "좋은 저녁입니다", - "noon": "좋은 점심입니다" + "afternoon": "안녕하세요", + "morning": "좋은 아침", + "night": "안녕히 주무세요", + "noon": "안녕하세요" } }, "header": "환영합니다", - "pickAgent": "또는 아래 어시스턴트 템플릿 중에서 선택하세요", + "pickAgent": "또는 다음 도우미 템플릿 중 하나를 선택하세요", "skip": "생성 건너뛰기", "slogan": { - "desc1": "두뇌 클러스터를 열고, 사고의 불꽃을 일으키세요. 당신의 스마트 어시스턴트는 항상 함께합니다.", - "desc2": "당신의 첫 번째 어시스턴트를 만들어보세요. 지금 시작해볼까요~", - "title": "더 똑똑한 두뇌를 위한 선택" + "desc1": "뇌 클러스터를 시작하여 아이디어를 자극하세요. 당신의 지능형 어시스턴트가 항상 여기에 있습니다.", + "desc2": "첫 번째 어시스턴트를 만들어 보세요. 시작해 봅시다~", + "title": "더 똑똑한 뇌를 위해 스스로에게 선물하세요" } } diff --git a/locales/nl-NL/chat.json b/locales/nl-NL/chat.json index 8a656dfa992..e8fdfd95037 100644 --- a/locales/nl-NL/chat.json +++ b/locales/nl-NL/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Modelen" }, + "active": "Actief", "agentDefaultMessage": "Hallo, ik ben **{{name}}**. Je kunt meteen met me beginnen praten, of je kunt naar [Assistentinstellingen]({{url}}) gaan om mijn informatie aan te vullen.", "agentDefaultMessageWithSystemRole": "Hallo, ik ben **{{name}}**. Waarmee kan ik u van dienst zijn?", "agentDefaultMessageWithoutEdit": "Hallo, ik ben **{{name}}**. Waarmee kan ik u van dienst zijn?", @@ -13,17 +14,28 @@ "thought": "Denken proces", "unknownTitle": "Onbenoemd werk" }, + "availableAgents": "Beschikbare assistenten", "backToBottom": "Terug naar onderen", "chatList": { "longMessageDetail": "Bekijk details" }, "clearCurrentMessages": "Huidige berichten wissen", "confirmClearCurrentMessages": "Huidige berichten worden gewist en kunnen niet worden hersteld. Bevestig je actie.", + "confirmRemoveChatGroupItemAlert": "Deze groepschat wordt verwijderd, de groepsleden worden niet beïnvloed. Bevestig je actie alstublieft.", + "confirmRemoveGroupItemAlert": "Je staat op het punt deze groep te verwijderen. Nadat de groep is verwijderd, worden de assistenten uit deze groep verplaatst naar de standaardlijst. Bevestig je actie.", + "confirmRemoveGroupSuccess": "Groepschat succesvol verwijderd", "confirmRemoveSessionItemAlert": "Deze assistent wordt verwijderd en kan niet worden hersteld. Bevestig je actie.", "confirmRemoveSessionSuccess": "Sessie succesvol verwijderd", "defaultAgent": "Standaard assistent", + "defaultGroupChat": "Groepschat", "defaultList": "Standaardlijst", "defaultSession": "Standaard assistent", + "dm": { + "placeholder": "Je privéberichten met {{agentTitle}} worden hier weergegeven.", + "tooltip": "Stuur privébericht", + "visibleTo": "Alleen zichtbaar voor {{target}}", + "you": "jij" + }, "duplicateSession": { "loading": "Bezig met kopiëren...", "success": "Kopiëren gelukt", @@ -58,11 +70,56 @@ "title": "Inhoud van webkoppeling extraheren" } }, + "group": { + "desc": "Samenwerken met meerdere AI-assistenten in een gedeelde gespreksruimte.", + "memberTooltip": "De groep heeft {{count}} leden", + "orchestratorThinking": "De organisator denkt na...", + "removeMember": "Lid verwijderen", + "title": "Groep" + }, + "groupDescription": "Groepsbeschrijving", + "groupSidebar": { + "members": { + "addMember": "Lid toevoegen", + "memberSettings": "Lidinstellingen", + "orchestrator": "Organisator", + "orchestratorThinking": "De organisator denkt na...", + "removeMember": "Lid verwijderen", + "stopOrchestrator": "Stop met nadenken", + "triggerOrchestrator": "Start groepschat" + }, + "tabs": { + "host": "Gastheer", + "members": "Leden", + "role": "Instellingen" + } + }, + "groupWizard": { + "chooseMembers": "Kies bestaande assistenten...", + "createGroup": "Groepschat aanmaken", + "existingMembers": "Bestaande assistenten", + "groupMembers": "Deze assistenten worden ook aan uw lijst toegevoegd", + "host": { + "description": "Automatiseer groepschat", + "title": "Gastheer", + "tooltip": "Als de groepsgastheer is uitgeschakeld, moet je handmatig leden @vermelden om een reactie van hen te krijgen" + }, + "memberCount": "{{count}} leden", + "noMatchingTemplates": "Geen overeenkomende sjablonen", + "noSelectedTemplates": "Geen sjablonen geselecteerd", + "noTemplateMembers": "Geen leden in de sjabloon", + "noTemplates": "Geen sjablonen beschikbaar", + "searchTemplates": "Zoek sjablonen...", + "title": "Groepschat aanmaken", + "useTemplate": "Sjabloon gebruiken" + }, + "hideForYou": "Privéberichten zijn verborgen. Schakel 'Toon privéberichten' in de instellingen in om ze te bekijken.", "history": { "title": "De assistent onthoudt alleen de laatste {{count}} berichten" }, "historyRange": "Geschiedenisbereik", "historySummary": "Geschiedenis samenvatting", + "inactive": "inactief", "inbox": { "desc": "Activeer de hersencluster en laat de vonken van gedachten overslaan. Je slimme assistent, hier om met je over alles te praten.", "title": "Praat maar raak" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Bezig met het begrijpen en analyseren van uw intentie..." }, + "inviteMembers": "Leden uitnodigen", "knowledgeBase": { "all": "Alle inhoud", "allFiles": "Alle bestanden", @@ -101,12 +159,29 @@ "uploadGuide": "Geüploade bestanden kunnen worden bekeken in de 'Kennisbank'.", "viewMore": "Bekijk meer" }, + "memberSelection": { + "addMember": "Lid toevoegen", + "allMembers": "Alle leden", + "createGroup": "Groepschat aanmaken", + "noAvailableAgents": "Geen assistenten beschikbaar om uit te nodigen", + "noSelectedAgents": "Nog geen assistenten geselecteerd", + "searchAgents": "Assistenten zoeken...", + "setInitialMembers": "Selecteer groepsleden" + }, + "members": "Leden", + "mention": { + "title": "Leden vermelden" + }, "messageAction": { "delAndRegenerate": "Verwijderen en opnieuw genereren", "deleteDisabledByThreads": "Er zijn subonderwerpen, verwijderen is niet mogelijk.", "regenerate": "Opnieuw genereren" }, "messages": { + "dm": { + "sentTo": "Alleen zichtbaar voor {{name}}", + "title": "Privébericht" + }, "modelCard": { "credit": "Credits", "creditPricing": "Prijsstelling", @@ -156,6 +231,13 @@ "previousMessage": "Vorig bericht" }, "newAgent": "Nieuwe assistent", + "newGroupChat": "Nieuwe groepschat", + "noAgentsYet": "Deze groep heeft nog geen assistenten. Klik op de +‑knop om een assistent uit te nodigen.", + "noAvailableAgents": "Geen beschikbare assistenten om uit te nodigen", + "noMatchingAgents": "Geen bijpassende assistenten gevonden", + "noMembersYet": "Deze groep heeft nog geen leden. Klik op de + knop om assistenten uit te nodigen.", + "noSelectedAgents": "Nog geen assistent geselecteerd", + "owner": "Groepseigenaar", "pin": "Vastzetten", "pinOff": "Vastzetten uitschakelen", "rag": { @@ -196,12 +278,16 @@ "title": "Online zoeken" }, "searchAgentPlaceholder": "Zoekassistent...", + "searchAgents": "Zoekassistent...", + "selectedAgents": "Geselecteerde assistenten", "sendPlaceholder": "Voer chatbericht in...", "sessionGroup": { "config": "Groepsbeheer", "confirmRemoveGroupAlert": "Je staat op het punt deze groep te verwijderen. Na verwijdering zullen de assistenten van deze groep worden verplaatst naar de standaardlijst. Bevestig je actie.", "createAgentSuccess": "Assistent succesvol aangemaakt", "createGroup": "Nieuwe groep toevoegen", + "createGroupFailed": "Het aanmaken van de groepschat is mislukt", + "createGroupSuccess": "Groepschat succesvol aangemaakt", "createSuccess": "Succesvol aangemaakt", "creatingAgent": "Assistent wordt aangemaakt...", "inputPlaceholder": "Voer de naam van de groep in...", @@ -235,6 +321,12 @@ "loading": "Bezig met herkennen...", "prettifying": "Aan het verfraaien..." }, + "supervisor": { + "todoList": { + "allComplete": "Alle taken zijn voltooid", + "title": "Taken voltooid" + } + }, "thread": { "divider": "Subonderwerp", "threadMessageCount": "{{messageCount}} berichten", @@ -248,6 +340,7 @@ "chats": "Chats", "historySummary": "Geschiedenis samenvatting", "rest": "Rust", + "supervisor": "Groepsorganisator", "systemRole": "Systeemrol", "title": "Contextuele details", "tools": "Tools", @@ -273,6 +366,7 @@ "action": "Tekst-naar-spraak", "clear": "Spraak verwijderen" }, + "untitledAgent": "Naamloze assistent", "updateAgent": "Assistentgegevens bijwerken", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "De grootte van het videobestand mag niet groter zijn dan 20MB, de huidige bestandsgrootte is {{actualSize}}" } }, + "you": "jij", "zenMode": "Focusmodus" -} +} diff --git a/locales/nl-NL/error.json b/locales/nl-NL/error.json index 13eeae794b0..fa014b5d3c2 100644 --- a/locales/nl-NL/error.json +++ b/locales/nl-NL/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Serviceverzoek mislukt. Controleer de configuratie of probeer opnieuw" }, + "supervisor": { + "decisionFailed": "De groepsbeheerder kan niet functioneren. Controleer je beheerderconfiguratie en zorg ervoor dat het juiste model, de API-sleutel en het API-adres zijn ingesteld." + }, "testConnectionFailed": "Verbindingstest mislukt: {{error}}", "tts": { "responseError": "Serviceverzoek mislukt. Controleer de configuratie of probeer opnieuw" diff --git a/locales/nl-NL/providers.json b/locales/nl-NL/providers.json index 5a5b39ae237..267375cb139 100644 --- a/locales/nl-NL/providers.json +++ b/locales/nl-NL/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock is een dienst van Amazon AWS die zich richt op het bieden van geavanceerde AI-taalmodellen en visuele modellen voor bedrijven. De modellenfamilie omvat de Claude-serie van Anthropic, de Llama 3.1-serie van Meta, en meer, met opties variërend van lichtgewicht tot hoge prestaties, en ondersteunt tekstgeneratie, dialogen, beeldverwerking en meer, geschikt voor bedrijfsapplicaties van verschillende schalen en behoeften." }, "bfl": { - "description": "Een toonaangevend, grensverleggend onderzoeksinstituut voor kunstmatige intelligentie dat de visuele infrastructuur van morgen bouwt." + "description": "Een toonaangevend, grensverleggend onderzoeksinstituut voor kunstmatige intelligentie dat de visuele infrastructuur van morgen opbouwt." + }, + "cerebras": { + "description": "Cerebras is een AI-inferentieplatform gebaseerd op het speciale CS-3-systeem, ontworpen om 's werelds snelste, realtime reagerende en hoog-throughput LLM-diensten te leveren. Het is speciaal ontwikkeld om vertragingen te elimineren en complexe AI-workflows te versnellen, zoals realtime codegeneratie en agenttaken." }, "cerebras": { "description": "Cerebras is een AI-inferentieplatform gebaseerd op het speciale CS-3-systeem, ontworpen om 's werelds snelste, realtime reagerende en hoog-throughput LLM-diensten te leveren. Het is speciaal ontwikkeld om vertragingen te elimineren en complexe AI-workflows te versnellen, zoals realtime codegeneratie en agenttaken." diff --git a/locales/nl-NL/setting.json b/locales/nl-NL/setting.json index 2e916115603..dd64af00e23 100644 --- a/locales/nl-NL/setting.json +++ b/locales/nl-NL/setting.json @@ -35,9 +35,16 @@ "title": "Alle instellingen resetten" } }, + "groupTab": { + "chat": "Chat", + "members": "Leden", + "meta": "Basisinformatie" + }, "header": { "desc": "Voorkeuren en modelinstellingen.", "global": "Algemene instellingen", + "group": "Groepschatinstellingen", + "groupDesc": "Beheer de huidige groepschat", "session": "Sessie-instellingen", "sessionDesc": "Rolinstellingen en sessievoorkeuren.", "sessionWithName": "Sessie-instellingen · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Meer modellen worden <1>gepland om te worden toegevoegd, dus blijf op de hoogte" }, + "message": { + "success": "Succesvol bijgewerkt" + }, "plugin": { "addMCPPlugin": "MCP-plug-in toevoegen", "addTooltip": "Voeg aangepaste plug-in toe", @@ -294,6 +304,101 @@ }, "title": "Algemene instellingen" }, + "settingGroup": { + "description": { + "placeholder": "Voer een groepschatbeschrijving in", + "title": "Groepschatbeschrijving" + }, + "name": { + "placeholder": "Voer een groepschatnaam in", + "title": "Groepschatnaam" + }, + "scene": { + "desc": "Kies groepschatscenario", + "options": { + "casual": "Informeel", + "productive": "Productief" + }, + "title": "Groepschatscenario" + }, + "submit": "Groepschat bijwerken", + "systemPrompt": { + "placeholder": "Voer de systeemopdracht van de host in", + "title": "Systeemopdracht van de host" + }, + "title": "Groepschatinformatie" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Wanneer uitgeschakeld, kun je nog steeds zelf privéberichten naar de assistent sturen", + "title": "Sta privéberichten van assistent toe" + }, + "enableSupervisor": { + "desc": "Schakel de moderatorfunctie in voor groepschats; de moderator beheert het verloop van het gesprek", + "title": "Moderator inschakelen" + }, + "maxResponseInRow": { + "desc": "Kies hoeveel berichten een lid achter elkaar kan beantwoorden. Stel in op 0 om deze beperking uit te schakelen.", + "title": "Aantal opeenvolgende antwoorden" + }, + "model": { + "desc": "De bijdragen van groepsleden worden niet beïnvloed. Sommige modellen kunnen niet als moderator worden gebruikt.", + "title": "Hostmodel" + }, + "orchestratorTitle": "Hostinstellingen", + "responseOrder": { + "desc": "De agent zal antwoorden in de volgorde die in de groepschat is ingesteld", + "options": { + "natural": "Natuurlijk", + "sequential": "Opeenvolgend" + }, + "placeholder": "Kies de antwoordvolgorde", + "title": "Antwoordvolgorde" + }, + "responseSpeed": { + "desc": "Beheert het algemene tempo van de groepschat", + "options": { + "fast": "Snel", + "medium": "Gemiddeld", + "slow": "Langzaam" + }, + "placeholder": "Kies de reactiesnelheid", + "title": "Reactiesnelheid" + }, + "revealDM": { + "desc": "Maak privéberichten die naar andere leden zijn gestuurd zichtbaar voor jou.", + "title": "Privéberichten tonen" + }, + "submit": "Instellingen bijwerken", + "systemPrompt": { + "desc": "Aangepaste systeemopdracht voor de host van de groepschat. Dit kan het standaardgedrag van de host beïnvloeden.", + "placeholder": "Voer een aangepaste systeemopdracht voor de host in...", + "title": "Systeemopdracht van de host" + }, + "title": "Chatinstellingen" + }, + "settingGroupMembers": { + "addToGroup": "Toevoegen aan groep", + "availableAgents": "Beschikbare assistenten", + "defaultAgent": "Aangepaste assistent", + "disableHost": "Host-assistent uitschakelen", + "edit": "Lid bewerken", + "empty": "Er zijn momenteel geen agenten in deze groepschat. Klik op de + knop om leden toe te voegen.", + "enableHost": "Host-assistent inschakelen", + "groupHost": "Groepshost", + "groupMembers": "Groepsleden", + "host": { + "description": "Wanneer de host in de groep is, wordt de groepschat automatisch beheerd, geschikt voor creatieve taken.", + "title": "Host" + }, + "noAvailableAgents": "Geen beschikbare assistenten", + "noDescription": "Geen beschrijving", + "noMembersInGroup": "Geen leden in de groep", + "owner": "Jij (eigenaar)", + "remove": "Lid verwijderen", + "removeFromGroup": "Verwijderen uit groep", + "you": "Jij" + }, "settingImage": { "defaultCount": { "desc": "Stel het standaard aantal afbeeldingen in dat wordt gegenereerd wanneer een nieuwe taak wordt aangemaakt.", @@ -522,6 +627,11 @@ "modelDesc": "Model aangewezen voor het automatisch benoemen van onderwerpen in AI-schilderijen", "title": "Automatisch onderwerp naamgeven voor AI-schilderijen" }, + "groupChatSupervisor": { + "label": "Model voor groepschattoezicht", + "modelDesc": "Speciaal model voor het toezicht en beheer van groepschatgesprekken", + "title": "Groepschattoezicht en -beheer" + }, "helpInfo": "Wanneer je een nieuwe assistent maakt, worden de standaard assistentinstellingen als standaardwaarden gebruikt.", "historyCompress": { "label": "Gespreksgeschiedenismodel", diff --git a/locales/nl-NL/welcome.json b/locales/nl-NL/welcome.json index 3ae6c56d86f..757419be84b 100644 --- a/locales/nl-NL/welcome.json +++ b/locales/nl-NL/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Ik ben uw persoonlijke slimme assistent {{appName}}. Hoe kan ik u nu helpen?
Als u een meer professionele of op maat gemaakte assistent nodig heeft, kunt u op klikken om een aangepaste assistent te maken.", "defaultMessageWithoutCreate": "Ik ben uw persoonlijke slimme assistent {{appName}}. Hoe kan ik u nu helpen?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Technische discussie en peer review van codewijzigingen en implementaties", + "emoji": "💻", + "prompt": "Laten we samen wat code reviewen. Kun je ons helpen deze code te analyseren en verbeterpunten te identificeren?", + "title": "Code Review" + }, + "investment": { + "description": "Marktanalyse, bespreken van investeringsstrategieën en delen van financiële inzichten", + "emoji": "📈", + "prompt": "Laten we samen de markt analyseren. Kun je ons helpen investeringsstrategieën te bespreken en financiële inzichten te delen?", + "title": "Investeringsclub" + }, + "research": { + "description": "Wetenschappelijke concepten verkennen, experimenten uitvoeren en bevindingen delen", + "emoji": "🔬", + "prompt": "Laten we samen wetenschap ontdekken! Kun je ons helpen experimenten uit te voeren en onze bevindingen te delen?", + "title": "Wetenschapsbeurs" + }, + "study": { + "description": "Samen leren, concepten bespreken en problemen gezamenlijk oplossen", + "emoji": "📚", + "prompt": "Laten we een studiegroep vormen. Kun je ons helpen deze concepten te begrijpen en samen problemen op te lossen?", + "title": "Studiegroep" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Creëren, bespreken en waarderen van diverse vormen van visuele en digitale kunst", + "emoji": "🖼️", + "prompt": "Laten we een kunstworkshop organiseren! Kun je ons helpen bij het creëren, bespreken en waarderen van verschillende kunstvormen?", + "title": "Kunstworkshop" + }, + "debate": { + "description": "Gestructureerde discussies en debatten over diverse onderwerpen en actuele zaken", + "emoji": "⚖️", + "prompt": "Laten we een gestructureerd debat houden. Kun je ons helpen een goed onderbouwde discussie over dit onderwerp te organiseren?", + "title": "Debatclub" + }, + "designReview": { + "description": "Samen feedback geven op ontwerpconcepten, prototypes of creatieve werken", + "emoji": "🎨", + "prompt": "We moeten wat ontwerpen beoordelen. Kun je ons helpen constructieve feedback te geven op ontwerpconcepten en prototypes?", + "title": "Ontwerpbeoordeling" + }, + "ideation": { + "description": "Creatieve ideeën genereren en probleemoplossing vanuit meerdere perspectieven", + "emoji": "🧠", + "prompt": "Laten we beginnen met brainstormen voor het project. Kun je ons helpen ideeën en oplossingen te bedenken?", + "title": "Brainstormen" + } + }, + "game": { + "debateClub": { + "description": "Gestructureerde discussies en debatten over diverse onderwerpen en actuele zaken", + "emoji": "⚖️", + "prompt": "Laten we een gestructureerd debat houden. Kun je ons helpen een goed onderbouwde discussie over dit onderwerp te organiseren?", + "title": "Debatclub" + }, + "gameNight": { + "description": "Leuke interactieve spellen en activiteiten om teamverband te versterken en plezier te hebben", + "emoji": "🎲", + "prompt": "Spelletjesavond begint! Kun je ons helpen leuke interactieve spellen te organiseren om het team te versterken?", + "title": "Spelletjesavond" + }, + "modelUN": { + "description": "Simulatie van VN-debatten en diplomatieke onderhandelingen over wereldwijde kwesties", + "emoji": "🌍", + "prompt": "Laten we een VN-debat simuleren. Kun je ons helpen een diplomatiek overleg over wereldwijde kwesties op te zetten?", + "title": "Model Verenigde Naties" + }, + "werewolf": { + "description": "Sociaal deductiespel waarbij spelers door strategie en discussie de weerwolven proberen te ontmaskeren", + "emoji": "🐺", + "prompt": "Laten we het weerwolvenspel spelen! Kun je ons helpen de regels op te stellen en het spel te leiden?", + "title": "Weerwolvenspel" + } + }, + "general": { + "brainstorm": { + "description": "Creatieve ideeën genereren en probleemoplossing vanuit meerdere perspectieven", + "emoji": "🧠", + "prompt": "Laten we beginnen met brainstormen voor het project. Kun je ons helpen ideeën en oplossingen te bedenken?", + "title": "Brainstormen" + }, + "debate": { + "description": "Gestructureerde discussies en debatten over diverse onderwerpen en actuele zaken", + "emoji": "⚖️", + "prompt": "Laten we een gestructureerd debat houden. Kun je ons helpen een goed onderbouwde discussie over dit onderwerp te organiseren?", + "title": "Debatclub" + }, + "languagePractice": { + "description": "Oefenen van spreekvaardigheid en het leren van nieuwe talen met moedertaalsprekers", + "emoji": "🗣️", + "prompt": "Laten we samen een nieuwe taal oefenen. Kun je ons helpen deze taal te leren en te spreken?", + "title": "Taal oefenen" + }, + "studyGroup": { + "description": "Samen leren, concepten bespreken en problemen gezamenlijk oplossen", + "emoji": "📚", + "prompt": "Laten we een studiegroep vormen. Kun je ons helpen deze concepten te begrijpen en samen problemen op te lossen?", + "title": "Studiegroep" + } + }, + "planning": { + "cookingClass": { + "description": "Kooktechnieken, recepten en culinaire tradities leren en delen", + "emoji": "👨‍🍳", + "prompt": "Laten we een kookles volgen! Kun je ons helpen nieuwe recepten en kooktechnieken te leren?", + "title": "Kookles" + }, + "fitnessChallenge": { + "description": "Groepsfitnessdoelen stellen, trainingsmethoden delen en elkaar motiveren", + "emoji": "💪", + "prompt": "Laten we een fitnessuitdaging starten! Kun je ons helpen doelen te stellen en elkaar te motiveren gezond te blijven?", + "title": "Fitnessuitdaging" + }, + "planningPoker": { + "description": "Agile schattingstechniek met kaarten om projecttaken en werklast te beoordelen", + "emoji": "🃏", + "prompt": "We doen planning poker voor het project. Kun je ons helpen deze taken met agile technieken te schatten?", + "title": "Planning Poker" + }, + "travelPlanning": { + "description": "Reizen plannen, reiservaringen delen en nieuwe bestemmingen ontdekken", + "emoji": "✈️", + "prompt": "Laten we samen een reis plannen! Kun je ons helpen bestemmingen te onderzoeken en de reisroute te plannen?", + "title": "Reisplanning" + } + }, + "product": { + "codeReview": { + "description": "Technische discussie en peer review van codewijzigingen en implementaties", + "emoji": "💻", + "prompt": "Laten we samen wat code reviewen. Kun je ons helpen deze code te analyseren en verbeterpunten te identificeren?", + "title": "Code Review" + }, + "designReview": { + "description": "Samen feedback geven op ontwerpconcepten, prototypes of creatieve werken", + "emoji": "🎨", + "prompt": "We moeten wat ontwerpen beoordelen. Kun je ons helpen constructieve feedback te geven op ontwerpconcepten en prototypes?", + "title": "Ontwerpbeoordeling" + }, + "sprintPlanning": { + "description": "Agile schattingstechniek met kaarten om projecttaken en werklast te beoordelen", + "emoji": "🃏", + "prompt": "We doen planning poker voor het project. Kun je ons helpen deze taken met agile technieken te schatten?", + "title": "Planning Poker" + }, + "techExchange": { + "description": "Bespreken van opkomende technologieën, innovatie en trends in de industrie", + "emoji": "🚀", + "prompt": "Laten we een technische uitwisseling houden! Kun je ons helpen opkomende technologieën en trends te bespreken?", + "title": "Technische uitwisseling" + } + }, + "title": "Aanbevelingen voor groepschatgebruik", + "writing": { + "bookClub": { + "description": "Literair bespreken en analyseren van boeken, verhalen en literaire werken", + "emoji": "📖", + "prompt": "Laten we beginnen met de leesclubdiscussie. Kun je ons helpen dit boek te analyseren en de thema's te bespreken?", + "title": "Leesclub" + }, + "movieClub": { + "description": "Samen films, documentaires en visuele media bekijken en bespreken", + "emoji": "🎬", + "prompt": "Laten we beginnen met de filmclubdiscussie. Kun je ons helpen deze film te analyseren en de thema's te bespreken?", + "title": "Filmclub" + }, + "musicSession": { + "description": "Samen muziek creëren, delen en waarderen", + "emoji": "🎵", + "prompt": "Laten we een muzikale improvisatiesessie houden! Kun je ons helpen samen muziek te maken en te waarderen?", + "title": "Muziekimprovisatie" + }, + "studyGroup": { + "description": "Samen leren, concepten bespreken en problemen gezamenlijk oplossen", + "emoji": "📚", + "prompt": "Laten we een studiegroep vormen. Kun je ons helpen deze concepten te begrijpen en samen problemen op te lossen?", + "title": "Studiegroep" + } + } + }, + "groupMessage": "Welkom bij groepschat! Werk samen met meerdere AI-assistenten in een gedeelde gespreksruimte。", + "groupTemplates": { + "analysis": { + "description": "Data-gedreven inzichten, diepgaande onderzoeksanalyse", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Je bent bedreven in het verwerken en interpreteren van gegevens, en onthult patronen en trends achter de data via grafieken en statistische analyses.", + "title": "Data-analist" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Je bent een onderzoeksspecialist, verantwoordelijk voor het verzamelen van informatie en diepgaand onderzoek, en kunt problemen vanuit meerdere dimensies grondig analyseren.", + "title": "Onderzoeksspecialist" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Je bent een statistisch expert, bedreven in diverse statistische methoden en modellen, en kunt waardevolle zakelijke inzichten uit data halen.", + "title": "Statistisch expert" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Je bent een kwantitatief analist, gespecialiseerd in kwantitatieve modellering en risicobeoordeling, en lost complexe problemen op met wiskundige methoden.", + "title": "Kwantitatief analist" + } + ], + "title": "Analyseteam" + }, + "brainstorm": { + "description": "Creatief denken vanuit meerdere perspectieven, ontketen eindeloze mogelijkheden", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Je bent een creatief directeur, bedreven in het sturen van creatieve richtingen vanuit een macro-perspectief, en kunt abstracte concepten omzetten in concrete uitvoerbare creatieve plannen.", + "title": "Creatief directeur" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Je bent een innovatiespecialist, verantwoordelijk voor het ontdekken van nieuwe oplossingen en baanbrekend denken, en bent vaardig in het doorbreken van vaste denkkaders.", + "title": "Innovatiespecialist" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Je bent een design thinking expert, die problemen benadert vanuit gebruikerservaring en visuele presentatie, met nadruk op de visuele expressie van creativiteit.", + "title": "Design thinking expert" + } + ], + "title": "Brainstormgroep" + }, + "game": { + "description": "Speel diverse multiplayer tekstspellen, zoals Weerwolven en Wie is de Mol", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Je bent bedreven in het deelnemen aan diverse multiplayer tekstgebaseerde spellen en kunt spelen volgens de spelregels.", + "title": "Speler" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Je bent bedreven in het deelnemen aan diverse multiplayer tekstgebaseerde spellen en kunt spelen volgens de spelregels.", + "title": "Speler" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Je bent bedreven in het deelnemen aan diverse multiplayer tekstgebaseerde spellen en kunt spelen volgens de spelregels.", + "title": "Speler" + } + ], + "title": "Spelhal" + }, + "planning": { + "description": "Strategische planning en projectmanagement, overzicht houden", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Je bent verantwoordelijk voor de algehele projectplanning, voortgangsbewaking en resourcecoördinatie om het project op tijd en met hoge kwaliteit af te ronden.", + "title": "Chef-kok" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Je bent verantwoordelijk voor het opstellen van langetermijnstrategieën, het analyseren van markt kansen en het formuleren van doelen en realisatiepaden.", + "title": "Inkoop specialist" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Je bent verantwoordelijk voor het opstellen van gedetailleerde uitvoeringsplannen, het coördineren van middelen tussen afdelingen en het waarborgen van de uitvoerbaarheid van het plan.", + "title": "Culinaire ontwikkelingsspecialist" + } + ], + "title": "Culinaire ontwikkelteam" + }, + "product": { + "description": "Productontwerp en -ontwikkeling, creëren van hoogwaardige producten", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Je bent een ontwerper, gespecialiseerd in het ontwerpen van diverse soorten producten en kunt ontwerpen maken op basis van productvereisten.", + "title": "Ontwerper" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Je bent een productmanager, verantwoordelijk voor de planning, het ontwerp, de ontwikkeling en het onderhoud van producten, en zorgt voor productkwaliteit en gebruikerservaring.", + "title": "Productmanager" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Je bent een ervaren full-stack engineer, bedreven in het ontwikkelen van diverse soorten producten en kunt ontwikkelen op basis van productvereisten.", + "title": "Full-stack engineer" + } + ], + "title": "Productontwikkelingsteam" + }, + "writing": { + "description": "Contentcreatie en redactie, creëren van hoogwaardige teksten", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Je bent bedreven in het creëren van content in diverse stijlen en kunt je schrijfstijl aanpassen aan verschillende scenario's en doelgroepen.", + "title": "Content schrijver" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Je bent een redacteur, verantwoordelijk voor het proeflezen, redigeren en optimaliseren van teksten, en zorgt voor nauwkeurigheid, vloeiendheid en professionaliteit van de inhoud.", + "title": "Redacteur" + } + ], + "title": "Schrijfkring" + } + }, "qa": { "q01": "Wat is LobeHub?", "q02": "Wat is {{appName}}?", diff --git a/locales/pl-PL/chat.json b/locales/pl-PL/chat.json index 6f3965e5950..c30d448ed0e 100644 --- a/locales/pl-PL/chat.json +++ b/locales/pl-PL/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Przełącz model" }, + "active": "aktywny", "agentDefaultMessage": "Cześć, jestem **{{name}}**, możesz od razu rozpocząć ze mną rozmowę lub przejść do [ustawień asystenta]({{url}}), aby uzupełnić moje informacje.", "agentDefaultMessageWithSystemRole": "Cześć, jestem **{{name}}**. W czym mogę pomóc?", "agentDefaultMessageWithoutEdit": "Cześć, jestem **{{name}}**. W czym mogę pomóc?", @@ -13,17 +14,28 @@ "thought": "Proces myślenia", "unknownTitle": "Nienazwane dzieło" }, + "availableAgents": "Dostępni asystenci", "backToBottom": "Przewiń na dół", "chatList": { "longMessageDetail": "Zobacz szczegóły" }, "clearCurrentMessages": "Wyczyść bieżącą rozmowę", "confirmClearCurrentMessages": "Czy na pewno chcesz wyczyścić bieżącą rozmowę? Tej operacji nie można cofnąć.", + "confirmRemoveChatGroupItemAlert": "Grupa czatu zostanie usunięta, członkowie grupy nie zostaną dotknięci, potwierdź swoją operację", + "confirmRemoveGroupItemAlert": "Zaraz zostanie usunięta ta grupa. Po jej usunięciu asystenci z tej grupy zostaną przeniesieni do listy domyślnej. Potwierdź swoją operację", + "confirmRemoveGroupSuccess": "Grupa czatu została pomyślnie usunięta", "confirmRemoveSessionItemAlert": "Czy na pewno chcesz usunąć tego asystenta? Tej operacji nie można cofnąć.", "confirmRemoveSessionSuccess": "Sesja usunięta pomyślnie", "defaultAgent": "Domyślny asystent", + "defaultGroupChat": "Grupa czatu", "defaultList": "Domyślna lista", "defaultSession": "Domyślna sesja", + "dm": { + "placeholder": "Twoje prywatne wiadomości z {{agentTitle}} będą tutaj wyświetlane.", + "tooltip": "Wyślij prywatną wiadomość", + "visibleTo": "Widoczne tylko dla {{target}}", + "you": "Ty" + }, "duplicateSession": { "loading": "Kopiowanie...", "success": "Kopiowanie zakończone powodzeniem", @@ -58,11 +70,56 @@ "title": "Wyodrębnij zawartość linku do strony" } }, + "group": { + "desc": "Współpracuj z wieloma asystentami AI w wspólnej przestrzeni konwersacji.", + "memberTooltip": "W grupie jest {{count}} członków", + "orchestratorThinking": "Organizator myśli...", + "removeMember": "Usuń członka", + "title": "Grupa" + }, + "groupDescription": "Opis grupy", + "groupSidebar": { + "members": { + "addMember": "Dodaj członka", + "memberSettings": "Ustawienia członka", + "orchestrator": "Organizator", + "orchestratorThinking": "Organizator myśli...", + "removeMember": "Usuń członka", + "stopOrchestrator": "Zatrzymaj myślenie", + "triggerOrchestrator": "Rozpocznij czat grupowy" + }, + "tabs": { + "host": "Gospodarz", + "members": "Członkowie", + "role": "Ustawienia" + } + }, + "groupWizard": { + "chooseMembers": "Wybierz istniejących asystentów...", + "createGroup": "Utwórz grupę czatu", + "existingMembers": "Istniejący członkowie", + "groupMembers": "Ci asystenci zostaną również dodani do Twojej listy", + "host": { + "description": "Automatyzuje działanie czatu grupowego", + "title": "Gospodarz", + "tooltip": "Jeśli wyłączysz gospodarza czatu grupowego, będziesz musiał ręcznie oznaczać członków za pomocą @, aby mogli odpowiedzieć" + }, + "memberCount": "{{count}} członków", + "noMatchingTemplates": "Brak pasujących szablonów", + "noSelectedTemplates": "Nie wybrano szablonów", + "noTemplateMembers": "Brak członków w szablonie", + "noTemplates": "Brak dostępnych szablonów", + "searchTemplates": "Szukaj szablonów...", + "title": "Utwórz grupę czatu", + "useTemplate": "Użyj szablonu" + }, + "hideForYou": "Treść prywatnej wiadomości została ukryta, włącz opcję 【Pokaż treść prywatnych wiadomości】 w ustawieniach, aby zobaczyć", "history": { "title": "Asystent zapamięta tylko ostatnie {{count}} wiadomości" }, "historyRange": "Zakres historii", "historySummary": "Podsumowanie wiadomości historycznych", + "inactive": "Nieaktywny", "inbox": { "desc": "Włącz klastry mózgów, rozpal iskrę myślenia. Twój inteligentny asystent, gotowy do rozmowy o wszystkim.", "title": "Pogadajmy sobie" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Rozumiemy i analizujemy Twoje intencje..." }, + "inviteMembers": "Zaproś członków", "knowledgeBase": { "all": "Wszystkie treści", "allFiles": "Wszystkie pliki", @@ -101,12 +159,29 @@ "uploadGuide": "Przesłane pliki można przeglądać w „Bazie wiedzy”", "viewMore": "Zobacz więcej" }, + "memberSelection": { + "addMember": "Dodaj członka", + "allMembers": "Wszyscy członkowie", + "createGroup": "Utwórz grupę czatu", + "noAvailableAgents": "Brak dostępnych asystentów do zaproszenia", + "noSelectedAgents": "Nie wybrano jeszcze asystentów", + "searchAgents": "Szukaj asystentów...", + "setInitialMembers": "Wybierz członków grupy" + }, + "members": "Członkowie", + "mention": { + "title": "Wzmianka o członkach" + }, "messageAction": { "delAndRegenerate": "Usuń i wygeneruj ponownie", "deleteDisabledByThreads": "Istnieją podwątki, nie można usunąć", "regenerate": "Wygeneruj ponownie" }, "messages": { + "dm": { + "sentTo": "Widoczne tylko dla {{name}}", + "title": "Wiadomość prywatna" + }, "modelCard": { "credit": "Punkty", "creditPricing": "Cennik", @@ -156,6 +231,13 @@ "previousMessage": "Poprzednia wiadomość" }, "newAgent": "Nowy asystent", + "newGroupChat": "Utwórz nowy czat grupowy", + "noAgentsYet": "W tej grupie nie ma jeszcze asystenta. Kliknij przycisk „+”, aby zaprosić asystenta.", + "noAvailableAgents": "Brak dostępnych asystentów do zaproszenia", + "noMatchingAgents": "Brak pasujących asystentów", + "noMembersYet": "W tej grupie nie ma jeszcze żadnych członków. Kliknij przycisk +, aby zaprosić asystentów.", + "noSelectedAgents": "Nie wybrano jeszcze asystenta", + "owner": "Właściciel grupy", "pin": "Przypnij", "pinOff": "Odepnij", "rag": { @@ -196,12 +278,16 @@ "title": "Wyszukiwanie w sieci" }, "searchAgentPlaceholder": "Wyszukaj pomocnika...", + "searchAgents": "Asystent wyszukiwania...", + "selectedAgents": "Wybrani asystenci", "sendPlaceholder": "Wpisz treść rozmowy...", "sessionGroup": { "config": "Zarządzanie grupami", "confirmRemoveGroupAlert": "Czy na pewno chcesz usunąć tę grupę? Po usunięciu asystenci z tej grupy zostaną przeniesieni do domyślnej listy. Potwierdź swoje działanie.", "createAgentSuccess": "Utworzenie asystenta zakończone sukcesem", "createGroup": "Dodaj nową grupę", + "createGroupFailed": "Nie udało się utworzyć grupy czatu", + "createGroupSuccess": "Grupa czatu została utworzona pomyślnie", "createSuccess": "Utworzono pomyślnie", "creatingAgent": "Tworzenie asystenta...", "inputPlaceholder": "Wprowadź nazwę grupy...", @@ -235,6 +321,12 @@ "loading": "Rozpoznawanie...", "prettifying": "Upiększanie..." }, + "supervisor": { + "todoList": { + "allComplete": "Wszystkie zadania zostały ukończone", + "title": "Zadania ukończone" + } + }, "thread": { "divider": "Podwątek", "threadMessageCount": "{{messageCount}} wiadomości", @@ -248,6 +340,7 @@ "chats": "Rozmowy", "historySummary": "Podsumowanie historii", "rest": "Pozostałe", + "supervisor": "Organizator grupy", "systemRole": "Rola systemowa", "title": "Szczegóły tokena", "tools": "Narzędzia", @@ -273,6 +366,7 @@ "action": "Czytaj tekst", "clear": "Wyczyść czytanie" }, + "untitledAgent": "Asystent bez nazwy", "updateAgent": "Aktualizuj informacje asystenta", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "Rozmiar pliku wideo nie może przekraczać 20MB, aktualny rozmiar pliku to {{actualSize}}" } }, + "you": "ty", "zenMode": "Tryb skupienia" -} +} diff --git a/locales/pl-PL/error.json b/locales/pl-PL/error.json index 079e799ddca..8b7e2faa6cf 100644 --- a/locales/pl-PL/error.json +++ b/locales/pl-PL/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Błąd żądania usługi. Proszę sprawdź konfigurację i spróbuj ponownie" }, + "supervisor": { + "decisionFailed": "Moderator grupy nie działa. Sprawdź konfigurację moderatora, aby upewnić się, że poprawnie ustawiono model, klucz API i adres API." + }, "testConnectionFailed": "Test połączenia nie powiódł się: {{error}}", "tts": { "responseError": "Błąd żądania usługi. Proszę sprawdź konfigurację i spróbuj ponownie" diff --git a/locales/pl-PL/providers.json b/locales/pl-PL/providers.json index a2c32c09807..4be5e0e0bd8 100644 --- a/locales/pl-PL/providers.json +++ b/locales/pl-PL/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock to usługa oferowana przez Amazon AWS, skoncentrowana na dostarczaniu zaawansowanych modeli językowych i wizualnych dla przedsiębiorstw. Jej rodzina modeli obejmuje serię Claude od Anthropic, serię Llama 3.1 od Meta i inne, oferując różnorodne opcje od lekkich do wysokowydajnych, wspierając generowanie tekstu, dialogi, przetwarzanie obrazów i inne zadania, odpowiednie dla różnych skal i potrzeb aplikacji biznesowych." }, "bfl": { - "description": "Wiodące, przełomowe laboratorium badawcze sztucznej inteligencji, tworzące wizualną infrastrukturę jutra." + "description": "Wiodące, pionierskie laboratorium badań nad sztuczną inteligencją, tworzące wizualną infrastrukturę jutra." + }, + "cerebras": { + "description": "Cerebras to platforma do wnioskowania AI oparta na dedykowanym systemie CS-3, zaprojektowana w celu zapewnienia najszybszej na świecie, reakcji w czasie rzeczywistym oraz wysokiej przepustowości usług LLM. Stworzona została, aby eliminować opóźnienia i przyspieszać złożone przepływy pracy AI, takie jak generowanie kodu w czasie rzeczywistym i zadania agentowe." }, "cerebras": { "description": "Cerebras to platforma do wnioskowania AI oparta na dedykowanym systemie CS-3, zaprojektowana w celu zapewnienia najszybszej na świecie, reakcji w czasie rzeczywistym oraz wysokiej przepustowości usług LLM. Stworzona została, aby eliminować opóźnienia i przyspieszać złożone przepływy pracy AI, takie jak generowanie kodu w czasie rzeczywistym i zadania agentowe." diff --git a/locales/pl-PL/setting.json b/locales/pl-PL/setting.json index a4ba97647d7..e35b88aeb0b 100644 --- a/locales/pl-PL/setting.json +++ b/locales/pl-PL/setting.json @@ -35,9 +35,16 @@ "title": "Zresetuj wszystkie ustawienia" } }, + "groupTab": { + "chat": "Czaty", + "members": "Członkowie", + "meta": "Informacje podstawowe" + }, "header": { "desc": "Preferencje i ustawienia modelu.", "global": "Ustawienia globalne", + "group": "Ustawienia czatu grupowego", + "groupDesc": "Zarządzaj bieżącym czatem grupowym", "session": "Ustawienia sesji", "sessionDesc": "Ustawienia postaci i preferencje sesji.", "sessionWithName": "Ustawienia sesji · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Więcej modeli jest obecnie w <1>planach dołączenia, prosimy o cierpliwość" }, + "message": { + "success": "Pomyślnie zaktualizowano" + }, "plugin": { "addMCPPlugin": "Dodaj wtyczkę MCP", "addTooltip": "Dodaj niestandardowy dodatek", @@ -294,6 +304,101 @@ }, "title": "Ustawienia ogólne" }, + "settingGroup": { + "description": { + "placeholder": "Wprowadź opis czatu grupowego", + "title": "Opis czatu grupowego" + }, + "name": { + "placeholder": "Wprowadź nazwę czatu grupowego", + "title": "Nazwa czatu grupowego" + }, + "scene": { + "desc": "Wybierz scenariusz czatu grupowego", + "options": { + "casual": "Nieformalny", + "productive": "Produktywność" + }, + "title": "Scenariusz czatu grupowego" + }, + "submit": "Aktualizuj czat grupowy", + "systemPrompt": { + "placeholder": "Wprowadź systemową wskazówkę prowadzącego", + "title": "Systemowa wskazówka prowadzącego" + }, + "title": "Informacje o czacie grupowym" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Po wyłączeniu nadal możesz samodzielnie wysyłać wiadomości prywatne do asystenta", + "title": "Zezwól asystentowi na wysyłanie wiadomości prywatnych" + }, + "enableSupervisor": { + "desc": "Włącz funkcję moderatora czatu grupowego — moderator będzie zarządzać przebiegiem rozmowy", + "title": "Włącz moderatora" + }, + "maxResponseInRow": { + "desc": "Wybierz, ile wiadomości członek może odpowiedzieć z rzędu. Ustaw na 0, aby wyłączyć to ograniczenie.", + "title": "Liczba kolejnych odpowiedzi" + }, + "model": { + "desc": "Wypowiedzi członków grupy nie będą ograniczane. Niektóre modele nie mogą być używane jako modele moderatora.", + "title": "Model prowadzącego" + }, + "orchestratorTitle": "Ustawienia prowadzącego", + "responseOrder": { + "desc": "Agent będzie odpowiadał zgodnie z kolejnością ustaloną w czacie grupowym", + "options": { + "natural": "Naturalna", + "sequential": "Sekwencyjna" + }, + "placeholder": "Wybierz kolejność odpowiedzi", + "title": "Kolejność odpowiedzi" + }, + "responseSpeed": { + "desc": "Kontroluj ogólne tempo czatu grupowego", + "options": { + "fast": "Szybkie", + "medium": "Średnie", + "slow": "Wolne" + }, + "placeholder": "Wybierz prędkość odpowiedzi", + "title": "Prędkość odpowiedzi" + }, + "revealDM": { + "desc": "Umożliw wyświetlanie prywatnych wiadomości wysłanych do innych członków.", + "title": "Pokaż treść prywatnych wiadomości" + }, + "submit": "Aktualizuj ustawienia", + "systemPrompt": { + "desc": "Niestandardowa systemowa wskazówka dla prowadzącego rozmowę w czacie grupowym. Może wpłynąć na domyślne zachowanie prowadzącego.", + "placeholder": "Wprowadź niestandardową systemową wskazówkę prowadzącego...", + "title": "Systemowa wskazówka prowadzącego" + }, + "title": "Ustawienia czatu" + }, + "settingGroupMembers": { + "addToGroup": "Dołącz do grupy", + "availableAgents": "Dostępni asystenci", + "defaultAgent": "Niestandardowy asystent", + "disableHost": "Wyłącz asystenta gospodarza", + "edit": "Edytuj członka", + "empty": "Brak agentów w tym czacie grupowym. Kliknij przycisk +, aby dodać członków.", + "enableHost": "Włącz asystenta gospodarza", + "groupHost": "Gospodarz grupy", + "groupMembers": "Członkowie grupy", + "host": { + "description": "Gdy gospodarz jest w grupie, czat grupowy działa automatycznie, co jest odpowiednie dla zadań twórczych.", + "title": "Gospodarz" + }, + "noAvailableAgents": "Brak dostępnych asystentów", + "noDescription": "Brak opisu", + "noMembersInGroup": "Brak członków w grupie", + "owner": "Ty (właściciel)", + "remove": "Usuń członka", + "removeFromGroup": "Usuń z grupy", + "you": "Ty" + }, "settingImage": { "defaultCount": { "desc": "Ustaw domyślną liczbę obrazów generowanych podczas tworzenia nowego zadania.", @@ -522,6 +627,11 @@ "modelDesc": "Model przeznaczony do automatycznego nadawania nazw tematom w AI malarskim", "title": "Automatyczne nadawanie nazw tematom w AI malarskim" }, + "groupChatSupervisor": { + "label": "Model nadzoru czatu grupowego", + "modelDesc": "Model przeznaczony do nadzorowania i zarządzania rozmowami w czatach grupowych", + "title": "Nadzór i zarządzanie czatem grupowym" + }, "helpInfo": "Podczas tworzenia nowego asystenta, domyślne ustawienia asystenta będą używane jako wartości wstępne.", "historyCompress": { "label": "Model historii rozmów", diff --git a/locales/pl-PL/welcome.json b/locales/pl-PL/welcome.json index be8cef9ff5d..8c698c88d93 100644 --- a/locales/pl-PL/welcome.json +++ b/locales/pl-PL/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Jestem Twoim osobistym inteligentnym asystentem {{appName}}. W czym mogę Ci teraz pomóc?
Jeśli potrzebujesz bardziej profesjonalnego lub dostosowanego asystenta, kliknij , aby utworzyć niestandardowego asystenta.", "defaultMessageWithoutCreate": "Jestem Twoim osobistym inteligentnym asystentem {{appName}}. W czym mogę Ci teraz pomóc?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Techniczna dyskusja i przegląd kodu oraz jego zmian", + "emoji": "💻", + "prompt": "Przejrzyjmy razem trochę kodu. Czy możesz pomóc nam przeanalizować ten kod i wskazać miejsca do poprawy?", + "title": "Przegląd kodu" + }, + "investment": { + "description": "Analiza rynku, dyskusja o strategiach inwestycyjnych i dzielenie się spostrzeżeniami finansowymi", + "emoji": "📈", + "prompt": "Przeanalizujmy razem rynek. Czy możesz pomóc nam omówić strategie inwestycyjne i podzielić się finansowymi spostrzeżeniami?", + "title": "Klub inwestycyjny" + }, + "research": { + "description": "Eksploracja koncepcji naukowych, przeprowadzanie eksperymentów i dzielenie się odkryciami", + "emoji": "🔬", + "prompt": "Zbadajmy razem naukę! Czy możesz pomóc nam przeprowadzić eksperymenty i podzielić się naszymi odkryciami?", + "title": "Wystawa naukowa" + }, + "study": { + "description": "Wspólne sesje nauki, dyskusja nad koncepcjami i rozwiązywanie problemów", + "emoji": "📚", + "prompt": "Utwórzmy grupę naukową. Czy możesz pomóc nam zrozumieć te koncepcje i wspólnie rozwiązać problemy?", + "title": "Grupa naukowa" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Tworzenie, komentowanie i docenianie różnych form sztuki wizualnej i cyfrowej", + "emoji": "🖼️", + "prompt": "Zorganizujmy warsztaty artystyczne! Czy możesz pomóc nam tworzyć, komentować i doceniać różne formy sztuki?", + "title": "Warsztaty artystyczne" + }, + "debate": { + "description": "Strukturalne dyskusje i debaty na różne tematy i aktualności", + "emoji": "⚖️", + "prompt": "Przeprowadźmy zorganizowaną debatę. Czy możesz pomóc nam zorganizować rzeczową dyskusję na ten temat?", + "title": "Klub debat" + }, + "designReview": { + "description": "Wspólne sesje feedbacku dotyczące koncepcji projektowych, prototypów lub dzieł kreatywnych", + "emoji": "🎨", + "prompt": "Musimy przejrzeć kilka projektów. Czy możesz pomóc nam udzielić konstruktywnej informacji zwrotnej na temat koncepcji i prototypów?", + "title": "Przegląd projektów" + }, + "ideation": { + "description": "Wieloperspektywiczne, współpracujące generowanie pomysłów i kreatywne rozwiązywanie problemów", + "emoji": "🧠", + "prompt": "Zacznijmy burzę mózgów dla projektu. Czy możesz pomóc nam wygenerować pomysły i rozwiązania?", + "title": "Burza mózgów" + } + }, + "game": { + "debateClub": { + "description": "Strukturalne dyskusje i debaty na różne tematy i aktualności", + "emoji": "⚖️", + "prompt": "Przeprowadźmy zorganizowaną debatę. Czy możesz pomóc nam zorganizować rzeczową dyskusję na ten temat?", + "title": "Klub debat" + }, + "gameNight": { + "description": "Zabawne interaktywne gry i aktywności, budujące więzi zespołowe i dostarczające rozrywki", + "emoji": "🎲", + "prompt": "Noc gier zaczyna się! Czy możesz pomóc nam zorganizować kilka zabawnych interaktywnych gier, aby zbudować więzi zespołowe?", + "title": "Noc gier" + }, + "modelUN": { + "description": "Symulacja debat ONZ i negocjacji dyplomatycznych na tematy globalne", + "emoji": "🌍", + "prompt": "Zagrajmy w symulację debaty ONZ. Czy możesz pomóc nam przygotować negocjacje dyplomatyczne na temat globalnych problemów?", + "title": "Model ONZ" + }, + "werewolf": { + "description": "Gra towarzyska polegająca na dedukcji i dyskusji, w której gracze próbują zidentyfikować wilkołaki", + "emoji": "🐺", + "prompt": "Zagrajmy w grę w wilkołaka! Czy możesz pomóc nam ustalić zasady i poprowadzić tę grę towarzyską?", + "title": "Gra w wilkołaka" + } + }, + "general": { + "brainstorm": { + "description": "Wieloperspektywiczne, współpracujące generowanie pomysłów i kreatywne rozwiązywanie problemów", + "emoji": "🧠", + "prompt": "Zacznijmy burzę mózgów dla projektu. Czy możesz pomóc nam wygenerować pomysły i rozwiązania?", + "title": "Burza mózgów" + }, + "debate": { + "description": "Strukturalne dyskusje i debaty na różne tematy i aktualności", + "emoji": "⚖️", + "prompt": "Przeprowadźmy zorganizowaną debatę. Czy możesz pomóc nam zorganizować rzeczową dyskusję na ten temat?", + "title": "Klub debat" + }, + "languagePractice": { + "description": "Ćwiczenie mówienia i nauka nowego języka z native speakerami", + "emoji": "🗣️", + "prompt": "Poćwiczmy razem nowy język. Czy możesz pomóc nam uczyć się i ćwiczyć mówienie w tym języku?", + "title": "Ćwiczenie językowe" + }, + "studyGroup": { + "description": "Wspólne sesje nauki, dyskusja nad koncepcjami i rozwiązywanie problemów", + "emoji": "📚", + "prompt": "Utwórzmy grupę naukową. Czy możesz pomóc nam zrozumieć te koncepcje i wspólnie rozwiązać problemy?", + "title": "Grupa naukowa" + } + }, + "planning": { + "cookingClass": { + "description": "Nauka i dzielenie się umiejętnościami kulinarnymi, przepisami i tradycjami gotowania", + "emoji": "👨‍🍳", + "prompt": "Weźmy udział w lekcji gotowania! Czy możesz pomóc nam nauczyć się nowych przepisów i technik kulinarnych?", + "title": "Lekcje gotowania" + }, + "fitnessChallenge": { + "description": "Ustalanie grupowych celów fitness, dzielenie się metodami ćwiczeń i wzajemna motywacja", + "emoji": "💪", + "prompt": "Zacznijmy wyzwanie fitness! Czy możesz pomóc nam ustalić cele i wzajemnie się motywować do zdrowia?", + "title": "Wyzwanie fitness" + }, + "planningPoker": { + "description": "Technika szacowania zadań projektowych i nakładu pracy za pomocą kart w metodyce Agile", + "emoji": "🃏", + "prompt": "Przeprowadzamy planowanie pokerowe dla projektu. Czy możesz pomóc nam oszacować nakład pracy tych zadań za pomocą technik Agile?", + "title": "Planowanie pokerowe" + }, + "travelPlanning": { + "description": "Planowanie podróży, dzielenie się doświadczeniami i odkrywanie nowych miejsc", + "emoji": "✈️", + "prompt": "Zaplanujmy razem podróż! Czy możesz pomóc nam zbadać cele podróży i zaplanować trasę?", + "title": "Planowanie podróży" + } + }, + "product": { + "codeReview": { + "description": "Techniczna dyskusja i przegląd kodu oraz jego zmian", + "emoji": "💻", + "prompt": "Przejrzyjmy razem trochę kodu. Czy możesz pomóc nam przeanalizować ten kod i wskazać miejsca do poprawy?", + "title": "Przegląd kodu" + }, + "designReview": { + "description": "Wspólne sesje feedbacku dotyczące koncepcji projektowych, prototypów lub dzieł kreatywnych", + "emoji": "🎨", + "prompt": "Musimy przejrzeć kilka projektów. Czy możesz pomóc nam udzielić konstruktywnej informacji zwrotnej na temat koncepcji i prototypów?", + "title": "Przegląd projektów" + }, + "sprintPlanning": { + "description": "Technika szacowania zadań projektowych i nakładu pracy za pomocą kart w metodyce Agile", + "emoji": "🃏", + "prompt": "Przeprowadzamy planowanie pokerowe dla projektu. Czy możesz pomóc nam oszacować nakład pracy tych zadań za pomocą technik Agile?", + "title": "Planowanie pokerowe" + }, + "techExchange": { + "description": "Dyskusja o nowych technologiach, innowacjach i trendach branżowych", + "emoji": "🚀", + "prompt": "Zorganizujmy wymianę technologiczną! Czy możesz pomóc nam omówić nowe technologie i trendy w branży?", + "title": "Wymiana technologiczna" + } + }, + "title": "Zalecenia dotyczące korzystania z czatu grupowego", + "writing": { + "bookClub": { + "description": "Literackie dyskusje i analizy książek, opowiadań i dzieł literackich", + "emoji": "📖", + "prompt": "Rozpocznijmy dyskusję klubu książki. Czy możesz pomóc nam przeanalizować tę książkę i omówić jej tematy?", + "title": "Klub książki" + }, + "movieClub": { + "description": "Wspólne oglądanie i dyskusja filmów, dokumentów i mediów wizualnych", + "emoji": "🎬", + "prompt": "Rozpocznijmy dyskusję klubu filmowego. Czy możesz pomóc nam przeanalizować ten film i omówić jego tematy?", + "title": "Klub filmowy" + }, + "musicSession": { + "description": "Wspólne tworzenie muzyki, dzielenie się i docenianie", + "emoji": "🎵", + "prompt": "Zagrajmy muzyczną improwizację! Czy możesz pomóc nam tworzyć i doceniać muzykę razem?", + "title": "Improwizacja muzyczna" + }, + "studyGroup": { + "description": "Wspólne sesje nauki, dyskusja nad koncepcjami i rozwiązywanie problemów", + "emoji": "📚", + "prompt": "Utwórzmy grupę naukową. Czy możesz pomóc nam zrozumieć te koncepcje i wspólnie rozwiązać problemy?", + "title": "Grupa naukowa" + } + } + }, + "groupMessage": "Witamy w czacie grupowym! Współpracuj z wieloma asystentami AI w udostępnionej przestrzeni konwersacyjnej.", + "groupTemplates": { + "analysis": { + "description": "Wgląd oparty na danych, dogłębne badania i analizy", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Specjalizujesz się w przetwarzaniu i interpretacji danych, ujawniając wzorce i trendy za pomocą wykresów i analiz statystycznych.", + "title": "Analityk danych" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Jesteś ekspertem badawczym, odpowiedzialnym za zbieranie informacji i dogłębne badania, potrafisz analizować problemy z wielu perspektyw.", + "title": "Ekspert badawczy" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Jesteś ekspertem statystycznym, biegłym w różnych metodach i modelach statystycznych, potrafisz wydobywać wartościowe spostrzeżenia biznesowe z danych.", + "title": "Ekspert statystyczny" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Jesteś analitykiem ilościowym, specjalizujesz się w modelowaniu ilościowym i ocenie ryzyka, rozwiązując złożone problemy za pomocą metod matematycznych.", + "title": "Analityk ilościowy" + } + ], + "title": "Zespół analityczny" + }, + "brainstorm": { + "description": "Kreatywne myślenie z wielu perspektyw, pobudzanie nieograniczonych możliwości", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Jesteś dyrektorem kreatywnym, potrafisz kierować kierunkiem kreatywnym z perspektywy makro, przekształcając abstrakcyjne koncepcje w konkretne, wykonalne pomysły.", + "title": "Dyrektor kreatywny" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Jesteś ekspertem innowacji, odpowiedzialnym za odkrywanie nowatorskich rozwiązań i przełomowego myślenia, potrafisz myśleć poza utartymi schematami.", + "title": "Ekspert innowacji" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Jesteś specjalistą myślenia projektowego, analizujesz problemy z perspektywy doświadczenia użytkownika i wizualnej prezentacji, kładąc nacisk na wizualizację kreatywności.", + "title": "Specjalista myślenia projektowego" + } + ], + "title": "Grupa burzy mózgów" + }, + "game": { + "description": "Graj w różne wieloosobowe gry tekstowe, takie jak Wilkołak i Kto jest zdrajcą", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Jesteś ekspertem w różnych wieloosobowych grach tekstowych i potrafisz grać zgodnie z zasadami gry.", + "title": "Gracz" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Jesteś ekspertem w różnych wieloosobowych grach tekstowych i potrafisz grać zgodnie z zasadami gry.", + "title": "Gracz" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Jesteś ekspertem w różnych wieloosobowych grach tekstowych i potrafisz grać zgodnie z zasadami gry.", + "title": "Gracz" + } + ], + "title": "Sala gier" + }, + "planning": { + "description": "Planowanie strategiczne i zarządzanie projektami, koordynacja całości", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Odpowiadasz za ogólne planowanie projektu, kontrolę postępów i koordynację zasobów, zapewniając terminową i wysoką jakość realizacji.", + "title": "Kucharz" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Odpowiadasz za opracowanie długoterminowej strategii, analizę rynkowych możliwości, ustalanie celów i ścieżek realizacji.", + "title": "Ekspert ds. zaopatrzenia surowców" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Odpowiadasz za szczegółowe planowanie wykonawcze, koordynację zasobów między działami i zapewnienie wykonalności planu.", + "title": "Ekspert ds. rozwoju kulinarnego" + } + ], + "title": "Zespół ds. rozwoju kulinarnego" + }, + "product": { + "description": "Projektowanie i rozwój produktów, tworzenie wysokiej jakości produktów", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Jesteś projektantem, specjalizujesz się w projektowaniu różnych typów produktów, potrafisz projektować zgodnie z wymaganiami produktu.", + "title": "Projektant" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Jesteś menedżerem produktu, odpowiedzialnym za planowanie, projektowanie, rozwój i utrzymanie produktu, zapewniając jego jakość i doświadczenie użytkownika.", + "title": "Menedżer produktu" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Jesteś doświadczonym inżynierem full-stack, specjalizujesz się w tworzeniu różnych typów produktów, potrafisz rozwijać produkty zgodnie z wymaganiami.", + "title": "Inżynier full-stack" + } + ], + "title": "Zespół ds. rozwoju produktu" + }, + "writing": { + "description": "Tworzenie i redagowanie treści, tworzenie wysokiej jakości tekstów", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Jesteś biegły w tworzeniu treści w różnych stylach i potrafisz dostosować styl pisania do różnych scenariuszy i odbiorców.", + "title": "Autor treści" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Jesteś redaktorem, odpowiedzialnym za korektę, redakcję i optymalizację tekstów, zapewniając ich dokładność, płynność i profesjonalizm.", + "title": "Redaktor" + } + ], + "title": "Krąg pisarski" + } + }, "qa": { "q01": "Czym jest LobeHub?", "q02": "Czym jest {{appName}}?", diff --git a/locales/pt-BR/chat.json b/locales/pt-BR/chat.json index b5bd1027bba..b7047e2669b 100644 --- a/locales/pt-BR/chat.json +++ b/locales/pt-BR/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Modelo" }, + "active": "Ativo", "agentDefaultMessage": "Olá, eu sou **{{name}}**, você pode começar a conversar comigo agora ou ir para [Configurações do Assistente]({{url}}) para completar minhas informações.", "agentDefaultMessageWithSystemRole": "Olá, eu sou **{{name}}**. Como posso ajudar você?", "agentDefaultMessageWithoutEdit": "Olá, eu sou **{{name}}**. Como posso ajudar você?", @@ -13,17 +14,28 @@ "thought": "Processo de pensamento", "unknownTitle": "Obra sem título" }, + "availableAgents": "Assistentes disponíveis", "backToBottom": "Voltar para o início", "chatList": { "longMessageDetail": "Ver detalhes" }, "clearCurrentMessages": "Limpar mensagens atuais", "confirmClearCurrentMessages": "Você está prestes a limpar as mensagens desta sessão. Depois de limpar, não será possível recuperá-las. Por favor, confirme sua ação.", + "confirmRemoveChatGroupItemAlert": "Você está prestes a excluir este grupo de chat, os membros do grupo não serão afetados, por favor confirme sua ação", + "confirmRemoveGroupItemAlert": "Você está prestes a excluir este grupo. Após a exclusão, os assistentes deste grupo serão movidos para a lista padrão. Por favor, confirme sua ação.", + "confirmRemoveGroupSuccess": "Grupo removido com sucesso", "confirmRemoveSessionItemAlert": "Você está prestes a remover este assistente. Depois de remover, não será possível recuperá-lo. Por favor, confirme sua ação.", "confirmRemoveSessionSuccess": "Sessão removida com sucesso", "defaultAgent": "Assistente Padrão", + "defaultGroupChat": "Grupo de chat", "defaultList": "Lista padrão", "defaultSession": "Sessão Padrão", + "dm": { + "placeholder": "Suas mensagens privadas com {{agentTitle}} serão exibidas aqui.", + "tooltip": "Enviar mensagem privada", + "visibleTo": "Visível apenas para {{target}}", + "you": "você" + }, "duplicateSession": { "loading": "Copiando...", "success": "Cópia bem-sucedida", @@ -58,11 +70,56 @@ "title": "Extrair conteúdo do link da web" } }, + "group": { + "desc": "Colabore com vários assistentes de IA em um espaço de conversa compartilhado.", + "memberTooltip": "Há {{count}} membros no grupo", + "orchestratorThinking": "O anfitrião está pensando...", + "removeMember": "Remover membro", + "title": "Grupo" + }, + "groupDescription": "Descrição do grupo", + "groupSidebar": { + "members": { + "addMember": "Adicionar membro", + "memberSettings": "Configurações do membro", + "orchestrator": "Anfitrião", + "orchestratorThinking": "O anfitrião está pensando...", + "removeMember": "Remover membro", + "stopOrchestrator": "Parar de pensar", + "triggerOrchestrator": "Iniciar chat em grupo" + }, + "tabs": { + "host": "Anfitrião", + "members": "Membros", + "role": "Configuração" + } + }, + "groupWizard": { + "chooseMembers": "Escolha assistentes existentes...", + "createGroup": "Criar grupo", + "existingMembers": "Assistentes existentes", + "groupMembers": "Estes assistentes também serão adicionados à sua lista", + "host": { + "description": "Automatiza o funcionamento do grupo de chat", + "title": "Anfitrião", + "tooltip": "Se o anfitrião do grupo for desativado, você precisará mencionar manualmente os membros com @ para que eles possam responder" + }, + "memberCount": "{{count}} membros", + "noMatchingTemplates": "Nenhum modelo correspondente", + "noSelectedTemplates": "Nenhum modelo selecionado", + "noTemplateMembers": "Nenhum membro no modelo", + "noTemplates": "Nenhum modelo disponível", + "searchTemplates": "Pesquisar modelos...", + "title": "Criar grupo", + "useTemplate": "Usar modelo" + }, + "hideForYou": "O conteúdo da mensagem privada foi ocultado, por favor ative 【Mostrar conteúdo da mensagem privada】 nas configurações para visualizar", "history": { "title": "O assistente lembrará apenas das últimas {{count}} mensagens" }, "historyRange": "Intervalo de Histórico", "historySummary": "Resumo das mensagens históricas", + "inactive": "Inativo", "inbox": { "desc": "Ative o cluster cerebral, inspire faíscas de pensamento. Seu assistente inteligente, aqui para conversar sobre tudo.", "title": "Conversa Aleatória" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Entendendo e analisando sua intenção..." }, + "inviteMembers": "Convidar membros", "knowledgeBase": { "all": "Todo conteúdo", "allFiles": "Todos os arquivos", @@ -101,12 +159,29 @@ "uploadGuide": "Os arquivos enviados podem ser visualizados em 'Banco de Conhecimento'.", "viewMore": "Ver mais" }, + "memberSelection": { + "addMember": "Adicionar membro", + "allMembers": "Todos os membros", + "createGroup": "Criar grupo de chat", + "noAvailableAgents": "Nenhum assistente disponível para convidar", + "noSelectedAgents": "Nenhum assistente selecionado ainda", + "searchAgents": "Pesquisar assistentes...", + "setInitialMembers": "Selecionar membros do grupo" + }, + "members": "Membros", + "mention": { + "title": "Mencionar membros" + }, "messageAction": { "delAndRegenerate": "Excluir e Regenerar", "deleteDisabledByThreads": "Existem subtópicos, não é possível deletar.", "regenerate": "Regenerar" }, "messages": { + "dm": { + "sentTo": "Visível apenas para {{name}}", + "title": "Mensagem direta" + }, "modelCard": { "credit": "Créditos", "creditPricing": "Precificação", @@ -156,6 +231,13 @@ "previousMessage": "Mensagem anterior" }, "newAgent": "Novo Assistente", + "newGroupChat": "Criar novo grupo", + "noAgentsYet": "Este grupo ainda não tem assistentes. Clique no botão + para convidar assistentes.", + "noAvailableAgents": "Não há assistentes disponíveis para convidar", + "noMatchingAgents": "Nenhum assistente compatível", + "noMembersYet": "Este grupo ainda não tem membros. Clique no botão + para convidar assistentes.", + "noSelectedAgents": "Nenhum assistente selecionado", + "owner": "Proprietário do grupo", "pin": "Fixar", "pinOff": "Desafixar", "rag": { @@ -196,12 +278,16 @@ "title": "Pesquisa Conectada" }, "searchAgentPlaceholder": "Assistente de busca...", + "searchAgents": "Assistente de busca...", + "selectedAgents": "Assistentes selecionados", "sendPlaceholder": "Digite a mensagem...", "sessionGroup": { "config": "Gerenciar grupos", "confirmRemoveGroupAlert": "Você está prestes a excluir este grupo. Após a exclusão, os assistentes deste grupo serão movidos para a lista padrão. Por favor, confirme sua operação.", "createAgentSuccess": "Assistente criado com sucesso", "createGroup": "Criar novo grupo", + "createGroupFailed": "Falha ao criar grupo de chat", + "createGroupSuccess": "Grupo de chat criado com sucesso", "createSuccess": "Criado com sucesso", "creatingAgent": "Criando assistente...", "inputPlaceholder": "Digite o nome do grupo...", @@ -235,6 +321,12 @@ "loading": "Reconhecendo...", "prettifying": "Embelezando..." }, + "supervisor": { + "todoList": { + "allComplete": "Todas as tarefas foram concluídas", + "title": "Tarefas concluídas" + } + }, "thread": { "divider": "Subtópico", "threadMessageCount": "{{messageCount}} mensagens", @@ -248,6 +340,7 @@ "chats": "Mensagens de bate-papo", "historySummary": "Resumo Histórico", "rest": "Restante disponível", + "supervisor": "Anfitrião do grupo", "systemRole": "Configuração de papel do sistema", "title": "Detalhes do Token", "tools": "Configuração de plug-ins", @@ -273,6 +366,7 @@ "action": "Leitura de Voz", "clear": "Limpar Leitura" }, + "untitledAgent": "Assistente sem nome", "updateAgent": "Atualizar Informações do Assistente", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "O tamanho do arquivo de vídeo não pode exceder 20MB, o tamanho atual do arquivo é {{actualSize}}" } }, + "you": "você", "zenMode": "Modo de Foco" -} +} diff --git a/locales/pt-BR/components.json b/locales/pt-BR/components.json index dfaf9eebcb2..aa8fcefb771 100644 --- a/locales/pt-BR/components.json +++ b/locales/pt-BR/components.json @@ -1,8 +1,8 @@ { "ArgsInput": { - "addArgument": "Adicionar argumento", - "argumentPlaceholder": "Argumento {{index}}", - "enterFirstArgument": "Digite o primeiro argumento..." + "addArgument": "Adicionar parâmetro", + "argumentPlaceholder": "Parâmetro {{index}}", + "enterFirstArgument": "Digite o primeiro parâmetro..." }, "DragUpload": { "dragDesc": "Arraste os arquivos para cá, suportando o upload de várias imagens.", @@ -146,8 +146,8 @@ }, "validation": { "fileSizeExceeded": "Tamanho do arquivo excede o limite", - "fileSizeExceededDetail": "{{fileName}} ({{actualSize}}) excede o limite máximo de {{maxSize}}", - "fileSizeExceededMultiple": "{{count}} arquivos excedem o limite máximo de {{maxSize}}: {{fileList}}", + "fileSizeExceededDetail": "{{fileName}} ({{actualSize}}) excede o tamanho máximo permitido de {{maxSize}}", + "fileSizeExceededMultiple": "{{count}} arquivos excedem o tamanho máximo permitido de {{maxSize}}: {{fileList}}", "imageCountExceeded": "Número de imagens excede o limite" } }, diff --git a/locales/pt-BR/error.json b/locales/pt-BR/error.json index c6acdfa584a..12a41b2bd9a 100644 --- a/locales/pt-BR/error.json +++ b/locales/pt-BR/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Falha na solicitação de serviço. Verifique a configuração ou tente novamente" }, + "supervisor": { + "decisionFailed": "O anfitrião do grupo não está funcionando. Por favor, verifique sua configuração de anfitrião para garantir que o modelo correto, a chave API e o endereço da API estejam configurados." + }, "testConnectionFailed": "Falha ao testar a conexão: {{error}}", "tts": { "responseError": "Falha na solicitação de serviço. Verifique a configuração ou tente novamente" diff --git a/locales/pt-BR/providers.json b/locales/pt-BR/providers.json index 71eb1470fcf..c77ca50f5e6 100644 --- a/locales/pt-BR/providers.json +++ b/locales/pt-BR/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock é um serviço oferecido pela Amazon AWS, focado em fornecer modelos de linguagem e visão de IA avançados para empresas. Sua família de modelos inclui a série Claude da Anthropic, a série Llama 3.1 da Meta, entre outros, abrangendo uma variedade de opções, desde modelos leves até de alto desempenho, suportando geração de texto, diálogos, processamento de imagens e outras tarefas, adequando-se a aplicações empresariais de diferentes escalas e necessidades." }, "bfl": { - "description": "Laboratório líder de pesquisa de ponta em inteligência artificial, construindo a infraestrutura visual do amanhã." + "description": "Laboratório de pesquisa em inteligência artificial de ponta, construindo a infraestrutura visual do amanhã." + }, + "cerebras": { + "description": "Cerebras é uma plataforma de inferência de IA baseada em seu sistema dedicado CS-3, projetada para oferecer o serviço de LLM mais rápido do mundo, com resposta em tempo real e alta taxa de transferência. Foi desenvolvida para eliminar a latência e acelerar fluxos de trabalho complexos de IA, como geração de código em tempo real e tarefas de agentes." }, "cerebras": { "description": "Cerebras é uma plataforma de inferência de IA baseada em seu sistema dedicado CS-3, projetada para oferecer o serviço de LLM mais rápido do mundo, com resposta em tempo real e alta taxa de transferência. Foi desenvolvida para eliminar a latência e acelerar fluxos de trabalho complexos de IA, como geração de código em tempo real e tarefas de agentes." diff --git a/locales/pt-BR/setting.json b/locales/pt-BR/setting.json index 0a1b13555ed..4509983890d 100644 --- a/locales/pt-BR/setting.json +++ b/locales/pt-BR/setting.json @@ -35,9 +35,16 @@ "title": "Redefinir Todas as Configurações" } }, + "groupTab": { + "chat": "Bate-papo", + "members": "Membros", + "meta": "Informações básicas" + }, "header": { "desc": "Preferências e configurações do modelo.", "global": "Configurações Globais", + "group": "Configurações do Grupo", + "groupDesc": "Gerenciar o grupo atual", "session": "Configurações de Sessão", "sessionDesc": "Configurações de personagem e preferências de sessão.", "sessionWithName": "Configurações de Sessão · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Mais modelos estão sendo <1>planejados para serem adicionados, aguarde ansiosamente" }, + "message": { + "success": "Atualização bem-sucedida" + }, "plugin": { "addMCPPlugin": "Adicionar plugin MCP", "addTooltip": "Adicionar plug-in personalizado", @@ -294,6 +304,101 @@ }, "title": "Configurações Comuns" }, + "settingGroup": { + "description": { + "placeholder": "Por favor, insira a descrição do grupo", + "title": "Descrição do Grupo" + }, + "name": { + "placeholder": "Por favor, insira o nome do grupo", + "title": "Nome do Grupo" + }, + "scene": { + "desc": "Escolha o cenário do chat em grupo", + "options": { + "casual": "Casual", + "productive": "Produtivo" + }, + "title": "Cenário do chat em grupo" + }, + "submit": "Atualizar Grupo", + "systemPrompt": { + "placeholder": "Por favor, insira a frase de comando do sistema do anfitrião", + "title": "Frase de Comando do Sistema do Anfitrião" + }, + "title": "Informações do Grupo" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Ao desativar, você ainda poderá enviar mensagens diretas ao assistente", + "title": "Permitir mensagens diretas do assistente" + }, + "enableSupervisor": { + "desc": "Ative a função de moderador para que ele gerencie o fluxo da conversa no grupo", + "title": "Ativar moderador" + }, + "maxResponseInRow": { + "desc": "Escolha quantas mensagens um membro pode responder consecutivamente. Defina como 0 para desativar essa limitação.", + "title": "Número de Respostas Consecutivas" + }, + "model": { + "desc": "As falas dos membros do grupo não serão afetadas. Alguns modelos não podem ser usados como moderadores.", + "title": "Modelo do Anfitrião" + }, + "orchestratorTitle": "Configurações do Anfitrião", + "responseOrder": { + "desc": "O agente responderá na ordem definida na conversa do grupo", + "options": { + "natural": "Natural", + "sequential": "Sequencial" + }, + "placeholder": "Selecione a ordem de resposta", + "title": "Ordem de Resposta" + }, + "responseSpeed": { + "desc": "Controle a velocidade geral da conversa do grupo", + "options": { + "fast": "Rápido", + "medium": "Médio", + "slow": "Lento" + }, + "placeholder": "Selecione a velocidade de resposta", + "title": "Velocidade de Resposta" + }, + "revealDM": { + "desc": "Torne visível para você o conteúdo das mensagens privadas enviadas a outros membros.", + "title": "Mostrar Conteúdo das Mensagens Privadas" + }, + "submit": "Atualizar Configurações", + "systemPrompt": { + "desc": "Frase de comando personalizada do sistema para o anfitrião da conversa do grupo. Isso pode afetar o comportamento padrão do anfitrião.", + "placeholder": "Por favor, insira a frase de comando personalizada do sistema do anfitrião...", + "title": "Frase de Comando do Sistema do Anfitrião" + }, + "title": "Configurações do Chat" + }, + "settingGroupMembers": { + "addToGroup": "Adicionar ao Grupo", + "availableAgents": "Assistentes Disponíveis", + "defaultAgent": "Assistente Personalizado", + "disableHost": "Desativar assistente do anfitrião", + "edit": "Editar Membro", + "empty": "Não há agentes neste grupo. Clique no botão + para adicionar membros.", + "enableHost": "Ativar assistente do anfitrião", + "groupHost": "Anfitrião do grupo", + "groupMembers": "Membros do Grupo", + "host": { + "description": "Quando o anfitrião está no grupo, o chat em grupo funcionará automaticamente, adequado para tarefas criativas.", + "title": "Anfitrião" + }, + "noAvailableAgents": "Nenhum assistente disponível", + "noDescription": "Sem descrição", + "noMembersInGroup": "Nenhum membro no grupo", + "owner": "Você (Proprietário)", + "remove": "Remover Membro", + "removeFromGroup": "Remover do Grupo", + "you": "Você" + }, "settingImage": { "defaultCount": { "desc": "Defina o número padrão de imagens ao criar uma nova tarefa no painel de geração de imagens.", @@ -522,6 +627,11 @@ "modelDesc": "Modelo designado para nomeação automática de tópicos em pintura AI", "title": "Nomeação Automática de Tópicos para Pintura AI" }, + "groupChatSupervisor": { + "label": "Modelo de supervisão de chats em grupo", + "modelDesc": "Modelo designado para supervisionar e gerenciar conversas em grupo", + "title": "Supervisão de chats em grupo" + }, "helpInfo": "Ao criar um novo assistente, as configurações padrão do assistente serão usadas como valores predefinidos.", "historyCompress": { "label": "Modelo de Histórico de Conversa", diff --git a/locales/pt-BR/welcome.json b/locales/pt-BR/welcome.json index 864214e5652..3117b41b31f 100644 --- a/locales/pt-BR/welcome.json +++ b/locales/pt-BR/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Eu sou seu assistente inteligente pessoal {{appName}}. Como posso ajudá-lo agora?
Se você precisar de um assistente mais profissional ou personalizado, clique em para criar um assistente personalizado.", "defaultMessageWithoutCreate": "Eu sou seu assistente inteligente pessoal {{appName}}. Como posso ajudá-lo agora?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Discussão técnica e revisão por pares de alterações e implementações de código", + "emoji": "💻", + "prompt": "Vamos revisar algum código juntos. Você pode nos ajudar a analisar esse código e identificar áreas para melhoria?", + "title": "Revisão de Código" + }, + "investment": { + "description": "Analisar o mercado, discutir estratégias de investimento e compartilhar insights financeiros", + "emoji": "📈", + "prompt": "Vamos analisar o mercado juntos. Você pode nos ajudar a discutir estratégias de investimento e compartilhar insights financeiros?", + "title": "Clube de Investimento" + }, + "research": { + "description": "Explorar conceitos científicos, realizar experimentos e compartilhar descobertas", + "emoji": "🔬", + "prompt": "Vamos explorar a ciência juntos! Você pode nos ajudar a realizar experimentos e compartilhar nossas descobertas?", + "title": "Exposição Científica" + }, + "study": { + "description": "Sessões colaborativas de estudo para discutir conceitos e resolver problemas em conjunto", + "emoji": "📚", + "prompt": "Vamos formar um grupo de estudo. Você pode nos ajudar a entender esses conceitos e resolver problemas juntos?", + "title": "Grupo de Estudo" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Criar, comentar e apreciar diversas formas de arte visual e digital", + "emoji": "🖼️", + "prompt": "Vamos realizar uma oficina de arte! Você pode nos ajudar a criar, comentar e apreciar várias formas de arte?", + "title": "Oficina de Arte" + }, + "debate": { + "description": "Discussões estruturadas e debates sobre diversos temas e atualidades", + "emoji": "⚖️", + "prompt": "Vamos realizar um debate estruturado. Você pode nos ajudar a organizar uma discussão fundamentada sobre este tema?", + "title": "Clube de Debate" + }, + "designReview": { + "description": "Sessões colaborativas de feedback para conceitos de design, protótipos ou criações", + "emoji": "🎨", + "prompt": "Precisamos revisar alguns trabalhos de design. Você pode nos ajudar a fornecer feedback construtivo sobre conceitos e protótipos?", + "title": "Revisão de Design" + }, + "ideation": { + "description": "Geração colaborativa de ideias sob múltiplas perspectivas e resolução criativa de problemas", + "emoji": "🧠", + "prompt": "Vamos começar uma sessão de brainstorming para o projeto. Você pode nos ajudar a gerar ideias e soluções criativas?", + "title": "Brainstorming" + } + }, + "game": { + "debateClub": { + "description": "Discussões estruturadas e debates sobre diversos temas e atualidades", + "emoji": "⚖️", + "prompt": "Vamos realizar um debate estruturado. Você pode nos ajudar a organizar uma discussão fundamentada sobre este tema?", + "title": "Clube de Debate" + }, + "gameNight": { + "description": "Jogos interativos divertidos e atividades para fortalecer vínculos de equipe e se divertir", + "emoji": "🎲", + "prompt": "A noite de jogos começou! Você pode nos ajudar a organizar jogos interativos divertidos para fortalecer os laços da equipe?", + "title": "Noite de Jogos" + }, + "modelUN": { + "description": "Simulação de debates da ONU e negociações diplomáticas sobre questões globais", + "emoji": "🌍", + "prompt": "Vamos simular um debate da ONU. Você pode nos ajudar a organizar uma negociação diplomática sobre questões globais?", + "title": "Simulação da ONU" + }, + "werewolf": { + "description": "Jogo social de dedução onde os jogadores usam estratégia e discussão para identificar os lobisomens", + "emoji": "🐺", + "prompt": "Vamos jogar o jogo do lobisomem! Você pode nos ajudar a definir as regras e moderar este jogo social de dedução?", + "title": "Jogo do Lobisomem" + } + }, + "general": { + "brainstorm": { + "description": "Geração colaborativa de ideias sob múltiplas perspectivas e resolução criativa de problemas", + "emoji": "🧠", + "prompt": "Vamos começar uma sessão de brainstorming para o projeto. Você pode nos ajudar a gerar ideias e soluções criativas?", + "title": "Brainstorming" + }, + "debate": { + "description": "Discussões estruturadas e debates sobre diversos temas e atualidades", + "emoji": "⚖️", + "prompt": "Vamos realizar um debate estruturado. Você pode nos ajudar a organizar uma discussão fundamentada sobre este tema?", + "title": "Clube de Debate" + }, + "languagePractice": { + "description": "Praticar conversação e aprender novos idiomas com falantes nativos", + "emoji": "🗣️", + "prompt": "Vamos praticar um novo idioma juntos. Você pode nos ajudar a aprender e praticar a fala deste idioma?", + "title": "Prática de Idiomas" + }, + "studyGroup": { + "description": "Sessões colaborativas de estudo para discutir conceitos e resolver problemas em conjunto", + "emoji": "📚", + "prompt": "Vamos formar um grupo de estudo. Você pode nos ajudar a entender esses conceitos e resolver problemas juntos?", + "title": "Grupo de Estudo" + } + }, + "planning": { + "cookingClass": { + "description": "Aprender e compartilhar técnicas culinárias, receitas e tradições gastronômicas", + "emoji": "👨‍🍳", + "prompt": "Vamos fazer uma aula de culinária! Você pode nos ajudar a aprender novas receitas e técnicas de cozinha?", + "title": "Aula de Culinária" + }, + "fitnessChallenge": { + "description": "Estabelecer metas de fitness em grupo, compartilhar métodos de treino e motivar uns aos outros", + "emoji": "💪", + "prompt": "Vamos começar um desafio fitness! Você pode nos ajudar a definir metas e motivar uns aos outros a manter a saúde?", + "title": "Desafio Fitness" + }, + "planningPoker": { + "description": "Técnica ágil de estimativa usando cartas para avaliar tarefas e cargas de trabalho do projeto", + "emoji": "🃏", + "prompt": "Estamos fazendo planejamento poker para o projeto. Você pode nos ajudar a estimar a carga de trabalho dessas tarefas usando técnicas ágeis?", + "title": "Planning Poker" + }, + "travelPlanning": { + "description": "Planejar viagens, compartilhar experiências e descobrir novos destinos", + "emoji": "✈️", + "prompt": "Vamos planejar uma viagem juntos! Você pode nos ajudar a pesquisar destinos e organizar o roteiro?", + "title": "Planejamento de Viagem" + } + }, + "product": { + "codeReview": { + "description": "Discussão técnica e revisão por pares de alterações e implementações de código", + "emoji": "💻", + "prompt": "Vamos revisar algum código juntos. Você pode nos ajudar a analisar esse código e identificar áreas para melhoria?", + "title": "Revisão de Código" + }, + "designReview": { + "description": "Sessões colaborativas de feedback para conceitos de design, protótipos ou criações", + "emoji": "🎨", + "prompt": "Precisamos revisar alguns trabalhos de design. Você pode nos ajudar a fornecer feedback construtivo sobre conceitos e protótipos?", + "title": "Revisão de Design" + }, + "sprintPlanning": { + "description": "Técnica ágil de estimativa usando cartas para avaliar tarefas e cargas de trabalho do projeto", + "emoji": "🃏", + "prompt": "Estamos fazendo planejamento poker para o projeto. Você pode nos ajudar a estimar a carga de trabalho dessas tarefas usando técnicas ágeis?", + "title": "Planning Poker" + }, + "techExchange": { + "description": "Discutir tecnologias emergentes, inovação e tendências do setor", + "emoji": "🚀", + "prompt": "Vamos fazer uma troca de conhecimentos tecnológicos! Você pode nos ajudar a discutir tecnologias emergentes e tendências do setor?", + "title": "Troca Tecnológica" + } + }, + "title": "Recomendações para Uso de Chats em Grupo", + "writing": { + "bookClub": { + "description": "Discussões literárias e análises de livros, histórias e obras literárias", + "emoji": "📖", + "prompt": "Vamos começar a discussão do clube do livro. Você pode nos ajudar a analisar este livro e explorar seus temas juntos?", + "title": "Clube do Livro" + }, + "movieClub": { + "description": "Assistir e discutir filmes, documentários e mídias visuais juntos", + "emoji": "🎬", + "prompt": "Vamos começar a discussão do clube de cinema. Você pode nos ajudar a analisar este filme e explorar seus temas juntos?", + "title": "Clube de Cinema" + }, + "musicSession": { + "description": "Sessões colaborativas de criação, compartilhamento e apreciação musical", + "emoji": "🎵", + "prompt": "Vamos fazer uma jam session musical! Você pode nos ajudar a criar e apreciar música juntos?", + "title": "Jam Musical" + }, + "studyGroup": { + "description": "Sessões colaborativas de estudo para discutir conceitos e resolver problemas em conjunto", + "emoji": "📚", + "prompt": "Vamos formar um grupo de estudo. Você pode nos ajudar a entender esses conceitos e resolver problemas juntos?", + "title": "Grupo de Estudo" + } + } + }, + "groupMessage": "Bem-vindo ao chat em grupo! Colabore com múltiplos assistentes de IA em um espaço de conversa compartilhado.", + "groupTemplates": { + "analysis": { + "description": "Insights orientados por dados, pesquisa e análise aprofundada", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Você é especialista em lidar com dados e interpretá-los, revelando padrões e tendências por meio de gráficos e análises estatísticas.", + "title": "Analista de Dados" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Você é um especialista em pesquisa, responsável pela coleta de informações e investigações aprofundadas, capaz de analisar problemas de múltiplas dimensões de forma abrangente.", + "title": "Especialista em Pesquisa" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Você é um especialista em estatística, mestre em diversos métodos e modelos estatísticos, capaz de extrair insights comerciais valiosos dos dados.", + "title": "Especialista em Estatística" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Você é um analista quantitativo, especializado em modelagem quantitativa e avaliação de riscos, usando métodos matemáticos para resolver problemas complexos.", + "title": "Analista Quantitativo" + } + ], + "title": "Equipe de Análise" + }, + "brainstorm": { + "description": "Pensamento criativo multidimensional, estimulando possibilidades infinitas", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Você é um diretor criativo, habilidoso em controlar a direção criativa de forma macro, capaz de transformar conceitos abstratos em planos criativos concretos e executáveis.", + "title": "Diretor Criativo" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Você é um especialista em inovação, responsável por descobrir soluções inovadoras e pensamentos disruptivos, habilidoso em pensar fora da caixa.", + "title": "Especialista em Inovação" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Você é um especialista em design thinking, que pensa a partir da experiência do usuário e da apresentação visual, focando na expressão visual da criatividade.", + "title": "Especialista em Design Thinking" + } + ], + "title": "Grupo de Brainstorming" + }, + "game": { + "description": "Divirta-se com vários jogos de texto multiplayer, como Mafia e Quem é o Traidor", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Você é especialista em participar de diversos jogos de texto multiplayer, capaz de jogar conforme as regras do jogo.", + "title": "Jogador" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Você é especialista em participar de diversos jogos de texto multiplayer, capaz de jogar conforme as regras do jogo.", + "title": "Jogador" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Você é especialista em participar de diversos jogos de texto multiplayer, capaz de jogar conforme as regras do jogo.", + "title": "Jogador" + } + ], + "title": "Salão de Jogos" + }, + "planning": { + "description": "Planejamento estratégico e gestão de projetos, coordenando o panorama geral", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Você é responsável pelo planejamento geral do projeto, controle de progresso e coordenação de recursos, garantindo a entrega pontual e de alta qualidade.", + "title": "Chef" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Você é responsável por definir o planejamento estratégico de longo prazo, analisar oportunidades de mercado, estabelecer metas e caminhos para alcançá-las.", + "title": "Especialista em Aquisição de Ingredientes" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Você é responsável por elaborar planos detalhados de execução, coordenar recursos entre departamentos e garantir a viabilidade do plano.", + "title": "Especialista em Desenvolvimento Culinário" + } + ], + "title": "Equipe de Desenvolvimento Culinário" + }, + "product": { + "description": "Design e desenvolvimento de produtos, criando produtos de alta qualidade", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Você é um designer, especializado em projetar diversos tipos de produtos, capaz de desenhar conforme as necessidades do produto.", + "title": "Designer" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Você é um gerente de produto, responsável pelo planejamento, design, desenvolvimento e manutenção do produto, garantindo qualidade e experiência do usuário.", + "title": "Gerente de Produto" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Você é um engenheiro full stack experiente, habilidoso em desenvolver diversos tipos de produtos, capaz de desenvolver conforme as necessidades do produto.", + "title": "Engenheiro Full Stack" + } + ], + "title": "Equipe de Desenvolvimento de Produto" + }, + "writing": { + "description": "Criação e edição de conteúdo, produzindo textos de alta qualidade", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Você é especialista em criar conteúdos de diversos estilos, capaz de ajustar o tom de escrita conforme o cenário e público.", + "title": "Redator de Conteúdo" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Você é um editor, responsável pela revisão, polimento e otimização dos textos, garantindo precisão, fluidez e profissionalismo do conteúdo.", + "title": "Editor" + } + ], + "title": "Círculo de Escrita" + } + }, "qa": { "q01": "O que é o LobeHub?", "q02": "O que é {{appName}}?", diff --git a/locales/ru-RU/chat.json b/locales/ru-RU/chat.json index e46011ce1e4..f778916aa3a 100644 --- a/locales/ru-RU/chat.json +++ b/locales/ru-RU/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Модель" }, + "active": "Активный", "agentDefaultMessage": "Здравствуйте, я **{{name}}**. Вы можете сразу начать со мной разговор или перейти в [настройки помощника]({{url}}), чтобы дополнить мою информацию.", "agentDefaultMessageWithSystemRole": "Здравствуйте, я **{{name}}**, чем могу помочь?", "agentDefaultMessageWithoutEdit": "Здравствуйте, я **{{name}}**, чем могу помочь?", @@ -13,17 +14,28 @@ "thought": "Процесс мышления", "unknownTitle": "Безымянное произведение" }, + "availableAgents": "Доступные помощники", "backToBottom": "Вернуться вниз", "chatList": { "longMessageDetail": "Посмотреть детали" }, "clearCurrentMessages": "Очистить текущий разговор", "confirmClearCurrentMessages": "Вы уверены, что хотите очистить текущий разговор? После этого его нельзя будет восстановить.", + "confirmRemoveChatGroupItemAlert": "Вы собираетесь удалить этот групповой чат, участники чата не пострадают, пожалуйста, подтвердите ваше действие", + "confirmRemoveGroupItemAlert": "Вы собираетесь удалить эту группу. После удаления помощники из этой группы будут перемещены в список по умолчанию. Пожалуйста, подтвердите ваше действие.", + "confirmRemoveGroupSuccess": "Групповой чат успешно удалён", "confirmRemoveSessionItemAlert": "Вы уверены, что хотите удалить этого помощника? После этого его нельзя будет восстановить.", "confirmRemoveSessionSuccess": "Сеанс удален успешно", "defaultAgent": "Пользовательский помощник", + "defaultGroupChat": "Групповой чат", "defaultList": "Список по умолчанию", "defaultSession": "Пользовательский помощник", + "dm": { + "placeholder": "Ваши личные сообщения с {{agentTitle}} будут отображаться здесь.", + "tooltip": "Отправить личное сообщение", + "visibleTo": "Видно только для {{target}}", + "you": "вы" + }, "duplicateSession": { "loading": "Копирование...", "success": "Копирование завершено", @@ -58,11 +70,56 @@ "title": "Извлечение содержимого веб-ссылки" } }, + "group": { + "desc": "Сотрудничайте с несколькими ассистентами ИИ в общем пространстве диалога.", + "memberTooltip": "В группе {{count}} участников", + "orchestratorThinking": "Ведущий обдумывает...", + "removeMember": "Удалить участника", + "title": "Группа" + }, + "groupDescription": "Описание группы", + "groupSidebar": { + "members": { + "addMember": "Добавить участника", + "memberSettings": "Настройки участника", + "orchestrator": "Ведущий", + "orchestratorThinking": "Ведущий обдумывает...", + "removeMember": "Удалить участника", + "stopOrchestrator": "Прекратить размышления", + "triggerOrchestrator": "Начать групповой чат" + }, + "tabs": { + "host": "Ведущий", + "members": "Участники", + "role": "Настройка" + } + }, + "groupWizard": { + "chooseMembers": "Выберите существующих помощников...", + "createGroup": "Создать групповой чат", + "existingMembers": "Существующие помощники", + "groupMembers": "Эти помощники также будут добавлены в ваш список", + "host": { + "description": "Автоматизация работы группового чата", + "title": "Ведущий", + "tooltip": "Если отключить функцию ведущего в групповом чате, вам нужно будет вручную упоминать участников с помощью @, чтобы они могли ответить" + }, + "memberCount": "{{count}} участников", + "noMatchingTemplates": "Нет подходящих шаблонов", + "noSelectedTemplates": "Шаблоны не выбраны", + "noTemplateMembers": "В шаблоне нет участников", + "noTemplates": "Шаблоны недоступны", + "searchTemplates": "Поиск шаблонов...", + "title": "Создание группового чата", + "useTemplate": "Использовать шаблон" + }, + "hideForYou": "Содержимое личных сообщений скрыто, включите «Показывать содержимое личных сообщений» в настройках для просмотра", "history": { "title": "Ассистент будет помнить только последние {{count}} сообщений" }, "historyRange": "История сообщений", "historySummary": "Сводка исторических сообщений", + "inactive": "Неактивен", "inbox": { "desc": "Зажги искру мысли, открой кластер мозгов. Твой виртуальный ассистент, готовый обсудить все с тобой.", "title": "Просто поболтаем" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Мы понимаем и анализируем ваше намерение..." }, + "inviteMembers": "Пригласить участников", "knowledgeBase": { "all": "Все содержимое", "allFiles": "Все файлы", @@ -101,12 +159,29 @@ "uploadGuide": "Загруженные файлы можно просмотреть в «Базе знаний»", "viewMore": "Посмотреть больше" }, + "memberSelection": { + "addMember": "Добавить участника", + "allMembers": "Все участники", + "createGroup": "Создать групповой чат", + "noAvailableAgents": "Нет доступных помощников для приглашения", + "noSelectedAgents": "Помощники не выбраны", + "searchAgents": "Поиск помощников...", + "setInitialMembers": "Выберите участников группы" + }, + "members": "Участники", + "mention": { + "title": "Упомянуть участника" + }, "messageAction": { "delAndRegenerate": "Удалить и пересоздать", "deleteDisabledByThreads": "Существуют подтемы, удаление невозможно", "regenerate": "Пересоздать" }, "messages": { + "dm": { + "sentTo": "Видно только {{name}}", + "title": "Личное сообщение" + }, "modelCard": { "credit": "Кредиты", "creditPricing": "Ценообразование", @@ -156,6 +231,13 @@ "previousMessage": "Предыдущее сообщение" }, "newAgent": "Создать помощника", + "newGroupChat": "Создать групповой чат", + "noAgentsYet": "В этой группе ещё нет ассистентов. Нажмите кнопку «+», чтобы пригласить ассистентов.", + "noAvailableAgents": "Нет доступных ассистентов для приглашения", + "noMatchingAgents": "Нет подходящих ассистентов", + "noMembersYet": "В этой группе ещё нет участников. Нажмите кнопку «+», чтобы пригласить помощников.", + "noSelectedAgents": "Помощник не выбран", + "owner": "Владелец группы", "pin": "Закрепить", "pinOff": "Открепить", "rag": { @@ -196,12 +278,16 @@ "title": "Поиск в сети" }, "searchAgentPlaceholder": "Поиск помощника...", + "searchAgents": "Помощник поиска...", + "selectedAgents": "Выбранные помощники", "sendPlaceholder": "Введите сообщение...", "sessionGroup": { "config": "Управление группами", "confirmRemoveGroupAlert": "Вы уверены, что хотите удалить эту группу? После удаления помощники из этой группы будут перемещены в список по умолчанию.", "createAgentSuccess": "Агент успешно создан", "createGroup": "Создать новую группу", + "createGroupFailed": "Не удалось создать групповой чат", + "createGroupSuccess": "Групповой чат успешно создан", "createSuccess": "Создание успешно", "creatingAgent": "Создание агента...", "inputPlaceholder": "Введите название группы...", @@ -235,6 +321,12 @@ "loading": "Распознавание...", "prettifying": "Форматирование..." }, + "supervisor": { + "todoList": { + "allComplete": "Все задачи выполнены", + "title": "Задачи выполнены" + } + }, "thread": { "divider": "Подтема", "threadMessageCount": "{{messageCount}} сообщений", @@ -248,6 +340,7 @@ "chats": "Чаты", "historySummary": "Историческое резюме", "rest": "Остаток", + "supervisor": "Ведущий группы", "systemRole": "Роль системы", "title": "Детали контекста", "tools": "Инструменты", @@ -273,6 +366,7 @@ "action": "Озвучить текст", "clear": "Удалить озвучку" }, + "untitledAgent": "Безымянный помощник", "updateAgent": "Обновить информацию помощника", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "Размер видеофайла не должен превышать 20 МБ, текущий размер файла: {{actualSize}}" } }, + "you": "ты", "zenMode": "Режим концентрации" -} +} diff --git a/locales/ru-RU/error.json b/locales/ru-RU/error.json index 18f495fdb3d..79578a34af0 100644 --- a/locales/ru-RU/error.json +++ b/locales/ru-RU/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Ошибка запроса сервиса. Пожалуйста, проверьте конфигурацию или повторите попытку" }, + "supervisor": { + "decisionFailed": "Работа ведущего группы невозможна. Пожалуйста, проверьте настройки ведущего, убедитесь, что правильно указана модель, API-ключ и адрес API." + }, "testConnectionFailed": "Не удалось проверить соединение: {{error}}", "tts": { "responseError": "Ошибка запроса сервиса. Пожалуйста, проверьте конфигурацию или повторите попытку" diff --git a/locales/ru-RU/setting.json b/locales/ru-RU/setting.json index 067216a4322..3d9e80dfba9 100644 --- a/locales/ru-RU/setting.json +++ b/locales/ru-RU/setting.json @@ -35,9 +35,16 @@ "title": "Сброс всех настроек" } }, + "groupTab": { + "chat": "Чат", + "members": "Участники", + "meta": "Основная информация" + }, "header": { "desc": "Настройки предпочтений и моделей.", "global": "Глобальные настройки", + "group": "Настройки группового чата", + "groupDesc": "Управление текущим групповым чатом", "session": "Настройки сеанса", "sessionDesc": "Настройки персонажа и предпочтения сессии.", "sessionWithName": "Настройки сеанса · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Больше моделей доступно в <1>плане подключения, ожидайте" }, + "message": { + "success": "Успешно обновлено" + }, "plugin": { "addMCPPlugin": "Добавить плагин MCP", "addTooltip": "Добавить настраиваемый плагин", @@ -294,6 +304,101 @@ }, "title": "Общие настройки" }, + "settingGroup": { + "description": { + "placeholder": "Введите описание группового чата", + "title": "Описание группового чата" + }, + "name": { + "placeholder": "Введите название группового чата", + "title": "Название группового чата" + }, + "scene": { + "desc": "Выберите сценарий группового чата", + "options": { + "casual": "Неформальный", + "productive": "Продуктивный" + }, + "title": "Сценарий группового чата" + }, + "submit": "Обновить групповой чат", + "systemPrompt": { + "placeholder": "Введите системное сообщение ведущего", + "title": "Системное сообщение ведущего" + }, + "title": "Информация о групповом чате" + }, + "settingGroupChat": { + "allowDM": { + "desc": "После отключения вы всё равно сможете отправлять личные сообщения помощнику", + "title": "Разрешить личные сообщения от помощника" + }, + "enableSupervisor": { + "desc": "Включите функцию модератора чата — модератор будет управлять ходом беседы", + "title": "Включить модератора" + }, + "maxResponseInRow": { + "desc": "Выберите, сколько сообщений подряд может отправить участник. Установите 0 для отключения ограничения.", + "title": "Количество последовательных ответов" + }, + "model": { + "desc": "Высказывания участников чата не ограничиваются. Некоторые модели не могут использоваться в роли модератора.", + "title": "Модель ведущего" + }, + "orchestratorTitle": "Настройки ведущего", + "responseOrder": { + "desc": "Агент будет отвечать в порядке, установленном в групповом чате", + "options": { + "natural": "Естественный", + "sequential": "Последовательный" + }, + "placeholder": "Выберите порядок ответов", + "title": "Порядок ответов" + }, + "responseSpeed": { + "desc": "Управление общей скоростью ведения группового чата", + "options": { + "fast": "Быстро", + "medium": "Средне", + "slow": "Медленно" + }, + "placeholder": "Выберите скорость ответов", + "title": "Скорость ответов" + }, + "revealDM": { + "desc": "Позволяет видеть личные сообщения, отправленные другим участникам.", + "title": "Показывать личные сообщения" + }, + "submit": "Обновить настройки", + "systemPrompt": { + "desc": "Пользовательское системное сообщение ведущего группового чата. Может влиять на поведение ведущего по умолчанию.", + "placeholder": "Введите пользовательское системное сообщение ведущего...", + "title": "Системное сообщение ведущего" + }, + "title": "Настройки чата" + }, + "settingGroupMembers": { + "addToGroup": "Добавить в группу", + "availableAgents": "Доступные помощники", + "defaultAgent": "Пользовательский помощник", + "disableHost": "Отключить помощника ведущего", + "edit": "Редактировать участника", + "empty": "В этом групповом чате нет агентов. Нажмите кнопку +, чтобы добавить участников.", + "enableHost": "Включить помощника ведущего", + "groupHost": "Ведущий группы", + "groupMembers": "Участники группы", + "host": { + "description": "Когда ведущий в группе, групповой чат работает автоматически, что подходит для творческих задач.", + "title": "Ведущий" + }, + "noAvailableAgents": "Нет доступных помощников", + "noDescription": "Описание отсутствует", + "noMembersInGroup": "В группе нет участников", + "owner": "Вы (владелец)", + "remove": "Удалить участника", + "removeFromGroup": "Исключить из группы", + "you": "Вы" + }, "settingImage": { "defaultCount": { "desc": "Установите количество изображений по умолчанию, создаваемых при запуске новой задачи генерации изображений.", @@ -522,6 +627,11 @@ "modelDesc": "Модель, предназначенная для автоматического именования тем в AI-рисовании", "title": "Автоматическое именование тем для AI-рисования" }, + "groupChatSupervisor": { + "label": "Модель надзора за групповыми чатами", + "modelDesc": "Модель, предназначенная для наблюдения и управления диалогами в групповых чатах", + "title": "Надзор и управление групповыми чатами" + }, "helpInfo": "При создании нового помощника будут использоваться настройки по умолчанию в качестве предустановленных значений.", "historyCompress": { "label": "Модель истории беседы", diff --git a/locales/ru-RU/welcome.json b/locales/ru-RU/welcome.json index 44d63240e06..1dde2da68b5 100644 --- a/locales/ru-RU/welcome.json +++ b/locales/ru-RU/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Я ваш личный интеллектуальный помощник {{appName}}. Чем я могу вам помочь сейчас?
Если вам нужен более профессиональный или индивидуальный помощник, нажмите , чтобы создать кастомного помощника.", "defaultMessageWithoutCreate": "Я ваш личный интеллектуальный помощник {{appName}}. Чем я могу вам помочь сейчас?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Техническое обсуждение и коллегиальный обзор изменений и реализации кода", + "emoji": "💻", + "prompt": "Давайте вместе рассмотрим код. Можете ли вы помочь нам проанализировать этот код и выявить возможные улучшения?", + "title": "Код-ревью" + }, + "investment": { + "description": "Анализ рынка, обсуждение инвестиционных стратегий и обмен финансовыми инсайтами", + "emoji": "📈", + "prompt": "Давайте вместе проанализируем рынок. Можете ли вы помочь нам обсудить инвестиционные стратегии и поделиться финансовыми инсайтами?", + "title": "Инвестиционный клуб" + }, + "research": { + "description": "Изучение научных концепций, проведение экспериментов и обмен открытиями", + "emoji": "🔬", + "prompt": "Давайте вместе исследовать науку! Можете ли вы помочь нам провести эксперименты и поделиться нашими открытиями?", + "title": "Научная выставка" + }, + "study": { + "description": "Совместные учебные сессии, обсуждение концепций и совместное решение задач", + "emoji": "📚", + "prompt": "Давайте создадим учебную группу. Можете ли вы помочь нам понять эти концепции и решить задачи вместе?", + "title": "Учебная группа" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Создание, обсуждение и оценка различных форм визуального и цифрового искусства", + "emoji": "🖼️", + "prompt": "Давайте проведём художественную мастерскую! Можете ли вы помочь нам создавать, обсуждать и оценивать различные формы искусства?", + "title": "Художественная мастерская" + }, + "debate": { + "description": "Структурированные дискуссии и дебаты на различные темы и актуальные вопросы", + "emoji": "⚖️", + "prompt": "Давайте проведём структурированные дебаты. Можете ли вы помочь нам организовать аргументированное обсуждение по этой теме?", + "title": "Дебатный клуб" + }, + "designReview": { + "description": "Совместные сессии обратной связи по дизайнерским концепциям, прототипам или творческим работам", + "emoji": "🎨", + "prompt": "Нам нужно рассмотреть несколько дизайнерских работ. Можете ли вы помочь нам дать конструктивную обратную связь по концепциям и прототипам?", + "title": "Дизайн-ревью" + }, + "ideation": { + "description": "Совместное генерирование идей с разных точек зрения и творческое решение проблем", + "emoji": "🧠", + "prompt": "Давайте начнём мозговой штурм для проекта. Можете ли вы помочь нам придумать идеи и решения?", + "title": "Мозговой штурм" + } + }, + "game": { + "debateClub": { + "description": "Структурированные дискуссии и дебаты на различные темы и актуальные вопросы", + "emoji": "⚖️", + "prompt": "Давайте проведём структурированные дебаты. Можете ли вы помочь нам организовать аргументированное обсуждение по этой теме?", + "title": "Дебатный клуб" + }, + "gameNight": { + "description": "Весёлые интерактивные игры и мероприятия для укрепления командных связей и получения удовольствия", + "emoji": "🎲", + "prompt": "Начинается игровая ночь! Можете ли вы помочь нам организовать интересные интерактивные игры для укрепления команды?", + "title": "Игровая ночь" + }, + "modelUN": { + "description": "Моделирование дебатов ООН и дипломатических переговоров по глобальным вопросам", + "emoji": "🌍", + "prompt": "Давайте смоделируем дебаты ООН. Можете ли вы помочь нам организовать дипломатические переговоры по глобальным вопросам?", + "title": "Модель ООН" + }, + "werewolf": { + "description": "Социальная игра с дедукцией, где игроки с помощью стратегии и обсуждений выявляют волков", + "emoji": "🐺", + "prompt": "Давайте сыграем в Мафию! Можете ли вы помочь нам установить правила и провести эту социальную игру с дедукцией?", + "title": "Игра Мафия" + } + }, + "general": { + "brainstorm": { + "description": "Совместное генерирование идей с разных точек зрения и творческое решение проблем", + "emoji": "🧠", + "prompt": "Давайте начнём мозговой штурм для проекта. Можете ли вы помочь нам придумать идеи и решения?", + "title": "Мозговой штурм" + }, + "debate": { + "description": "Структурированные дискуссии и дебаты на различные темы и актуальные вопросы", + "emoji": "⚖️", + "prompt": "Давайте проведём структурированные дебаты. Можете ли вы помочь нам организовать аргументированное обсуждение по этой теме?", + "title": "Дебатный клуб" + }, + "languagePractice": { + "description": "Практика разговорной речи и изучение новых языков с носителями", + "emoji": "🗣️", + "prompt": "Давайте вместе практиковать новый язык. Можете ли вы помочь нам учиться и практиковать разговорные навыки?", + "title": "Языковая практика" + }, + "studyGroup": { + "description": "Совместные учебные сессии, обсуждение концепций и совместное решение задач", + "emoji": "📚", + "prompt": "Давайте создадим учебную группу. Можете ли вы помочь нам понять эти концепции и решить задачи вместе?", + "title": "Учебная группа" + } + }, + "planning": { + "cookingClass": { + "description": "Изучение и обмен кулинарными навыками, рецептами и традициями", + "emoji": "👨‍🍳", + "prompt": "Давайте проведём кулинарный мастер-класс! Можете ли вы помочь нам изучить новые рецепты и кулинарные техники?", + "title": "Кулинарный класс" + }, + "fitnessChallenge": { + "description": "Установка групповых фитнес-целей, обмен методами тренировок и взаимная мотивация", + "emoji": "💪", + "prompt": "Давайте начнём фитнес-челлендж! Можете ли вы помочь нам ставить цели и мотивировать друг друга оставаться здоровыми?", + "title": "Фитнес-челлендж" + }, + "planningPoker": { + "description": "Использование карточек для оценки задач и объёма работы в проекте по методике Agile", + "emoji": "🃏", + "prompt": "Мы проводим планирование с помощью покера. Можете ли вы помочь нам оценить объём работы по Agile?", + "title": "Планирование покером" + }, + "travelPlanning": { + "description": "Планирование путешествий, обмен опытом и открытие новых направлений", + "emoji": "✈️", + "prompt": "Давайте вместе спланируем путешествие! Можете ли вы помочь нам исследовать направления и составить маршрут?", + "title": "Планирование путешествий" + } + }, + "product": { + "codeReview": { + "description": "Техническое обсуждение и коллегиальный обзор изменений и реализации кода", + "emoji": "💻", + "prompt": "Давайте вместе рассмотрим код. Можете ли вы помочь нам проанализировать этот код и выявить возможные улучшения?", + "title": "Код-ревью" + }, + "designReview": { + "description": "Совместные сессии обратной связи по дизайнерским концепциям, прототипам или творческим работам", + "emoji": "🎨", + "prompt": "Нам нужно рассмотреть несколько дизайнерских работ. Можете ли вы помочь нам дать конструктивную обратную связь по концепциям и прототипам?", + "title": "Дизайн-ревью" + }, + "sprintPlanning": { + "description": "Использование карточек для оценки задач и объёма работы в проекте по методике Agile", + "emoji": "🃏", + "prompt": "Мы проводим планирование с помощью покера. Можете ли вы помочь нам оценить объём работы по Agile?", + "title": "Планирование покером" + }, + "techExchange": { + "description": "Обсуждение новых технологий, инноваций и тенденций отрасли", + "emoji": "🚀", + "prompt": "Давайте проведём технический обмен! Можете ли вы помочь нам обсудить новые технологии и тенденции отрасли?", + "title": "Технический обмен" + } + }, + "title": "Рекомендации по использованию группового чата", + "writing": { + "bookClub": { + "description": "Литературные обсуждения и анализ книг, рассказов и литературных произведений", + "emoji": "📖", + "prompt": "Давайте начнём обсуждение в книжном клубе. Можете ли вы помочь нам проанализировать эту книгу и обсудить её темы?", + "title": "Книжный клуб" + }, + "movieClub": { + "description": "Совместный просмотр и обсуждение фильмов, документальных и визуальных медиа", + "emoji": "🎬", + "prompt": "Давайте начнём обсуждение в киноклубе. Можете ли вы помочь нам проанализировать этот фильм и обсудить его темы?", + "title": "Киноклуб" + }, + "musicSession": { + "description": "Совместное музыкальное творчество, обмен и прослушивание", + "emoji": "🎵", + "prompt": "Давайте устроим музыкальный джем! Можете ли вы помочь нам создавать и наслаждаться музыкой вместе?", + "title": "Музыкальный джем" + }, + "studyGroup": { + "description": "Совместные учебные сессии, обсуждение концепций и совместное решение задач", + "emoji": "📚", + "prompt": "Давайте создадим учебную группу. Можете ли вы помочь нам понять эти концепции и решить задачи вместе?", + "title": "Учебная группа" + } + } + }, + "groupMessage": "Добро пожаловать в групповой чат! Сотрудничайте с несколькими ИИ-помощниками в общем диалоговом пространстве.", + "groupTemplates": { + "analysis": { + "description": "Аналитика на основе данных, глубокое исследование и анализ", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Вы отлично справляетесь с обработкой и интерпретацией данных, выявляя закономерности и тенденции с помощью графиков и статистического анализа.", + "title": "Аналитик данных" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Вы исследователь, специализируетесь на сборе информации и глубоком анализе, способны всесторонне рассматривать проблему с разных точек зрения.", + "title": "Исследователь" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Вы специалист по статистике, владеете различными статистическими методами и моделями, извлекаете ценные бизнес-инсайты из данных.", + "title": "Статистик" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Вы количественный аналитик, специализируетесь на количественном моделировании и оценке рисков, решаете сложные задачи с помощью математических методов.", + "title": "Количественный аналитик" + } + ], + "title": "Команда аналитиков" + }, + "brainstorm": { + "description": "Многогранное креативное мышление, вдохновение без границ", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Вы креативный директор, умеете управлять творческим направлением с макроуровня, превращая абстрактные идеи в конкретные реализуемые проекты.", + "title": "Креативный директор" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Вы эксперт по инновациям, находите новые решения и прорывные идеи, умеете мыслить вне рамок.", + "title": "Эксперт по инновациям" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Вы специалист по дизайн-мышлению, рассматриваете задачи с точки зрения пользовательского опыта и визуального представления, уделяете внимание визуализации идей.", + "title": "Дизайнер мышления" + } + ], + "title": "Группа для мозгового штурма" + }, + "game": { + "description": "Играйте в различные многопользовательские текстовые игры, например, Мафия и Кто шпион", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Вы опытны в участии в различных многопользовательских текстовых играх и умеете играть согласно правилам.", + "title": "Игрок" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Вы опытны в участии в различных многопользовательских текстовых играх и умеете играть согласно правилам.", + "title": "Игрок" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Вы опытны в участии в различных многопользовательских текстовых играх и умеете играть согласно правилам.", + "title": "Игрок" + } + ], + "title": "Игровая комната" + }, + "planning": { + "description": "Стратегическое планирование и управление проектами, координация процессов", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Вы отвечаете за общее планирование проекта, контроль сроков и координацию ресурсов, обеспечивая своевременное и качественное выполнение.", + "title": "Менеджер проекта" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Вы отвечаете за разработку долгосрочной стратегической планировки, анализ рыночных возможностей, постановку целей и путей их достижения.", + "title": "Стратег" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Вы отвечаете за разработку детальных планов исполнения, координацию ресурсов различных отделов и обеспечение выполнимости планов.", + "title": "Специалист по разработке продуктов питания" + } + ], + "title": "Команда разработки продуктов питания" + }, + "product": { + "description": "Дизайн и разработка продуктов, создание качественных товаров", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Вы дизайнер, умеете создавать дизайн различных продуктов, ориентируясь на требования к продукту.", + "title": "Дизайнер" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Вы менеджер продукта, отвечаете за планирование, дизайн, разработку и поддержку продукта, обеспечивая качество и удобство для пользователей.", + "title": "Менеджер продукта" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Вы опытный full-stack разработчик, умеете создавать различные продукты, ориентируясь на требования к продукту.", + "title": "Full-stack разработчик" + } + ], + "title": "Команда разработки продукта" + }, + "writing": { + "description": "Создание и редактирование контента, создание качественных текстов", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Вы мастер создания контента в различных жанрах и умеете адаптировать стиль письма под разные ситуации и аудитории.", + "title": "Контент-райтер" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Вы редактор, отвечаете за корректуру, улучшение и оптимизацию текстов, обеспечивая точность, плавность и профессионализм.", + "title": "Редактор" + } + ], + "title": "Круг писателей" + } + }, "qa": { "q01": "Что такое LobeHub?", "q02": "Что такое {{appName}}?", diff --git a/locales/tr-TR/chat.json b/locales/tr-TR/chat.json index e707c2312dd..d895aace1eb 100644 --- a/locales/tr-TR/chat.json +++ b/locales/tr-TR/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Model Değiştir" }, + "active": "Aktif", "agentDefaultMessage": "Merhaba, ben **{{name}}**. Hemen benimle konuşmaya başlayabilir veya [Asistan Ayarları]({{url}}) sayfasına giderek bilgilerimi güncelleyebilirsin.", "agentDefaultMessageWithSystemRole": "Merhaba, ben **{{name}}**. Size nasıl yardımcı olabilirim?", "agentDefaultMessageWithoutEdit": "Merhaba, ben **{{name}}**. Size nasıl yardımcı olabilirim?", @@ -13,17 +14,28 @@ "thought": "Düşünce Süreci", "unknownTitle": "İsimsiz Eser" }, + "availableAgents": "Kullanılabilir asistanlar", "backToBottom": "En alta git", "chatList": { "longMessageDetail": "Detayları görüntüle" }, "clearCurrentMessages": "Mevcut oturum mesajlarını temizle", "confirmClearCurrentMessages": "Mevcut oturum mesajlarını temizlemek üzeresiniz. Temizlendikten sonra geri alınamazlar. Lütfen eyleminizi onaylayın.", + "confirmRemoveChatGroupItemAlert": "Bu grup sohbeti silinecek, grup üyeleri etkilenmeyecektir, lütfen işleminizi onaylayın", + "confirmRemoveGroupItemAlert": "Bu grubu silmek üzeresiniz; silindikten sonra bu gruba ait asistanlar varsayılan listeye taşınacaktır. Lütfen işlemi onaylayın.", + "confirmRemoveGroupSuccess": "Grup sohbeti başarıyla silindi", "confirmRemoveSessionItemAlert": "Bu asistanı silmek üzeresiniz. Silindikten sonra geri alınamaz. Lütfen eyleminizi onaylayın.", "confirmRemoveSessionSuccess": "Oturum başarıyla kaldırıldı", "defaultAgent": "Varsayılan Asistan", + "defaultGroupChat": "Grup Sohbeti", "defaultList": "Varsayılan Liste", "defaultSession": "Varsayılan Asistan", + "dm": { + "placeholder": "{{agentTitle}} ile olan özel mesajlarınız burada gösterilecek.", + "tooltip": "Özel mesaj gönder", + "visibleTo": "Yalnızca {{target}} tarafından görülebilir", + "you": "sen" + }, "duplicateSession": { "loading": "Kopyalanıyor...", "success": "Kopyalama başarılı", @@ -58,11 +70,56 @@ "title": "Web Bağlantısı İçeriğini Çıkar" } }, + "group": { + "desc": "Birden fazla yapay zeka asistanıyla paylaşılan bir sohbet alanında işbirliği yapın.", + "memberTooltip": "Bu grupta {{count}} üye var", + "orchestratorThinking": "Yönetici düşünüyor...", + "removeMember": "Üyeyi Kaldır", + "title": "Grup" + }, + "groupDescription": "Grup açıklaması", + "groupSidebar": { + "members": { + "addMember": "Üye Ekle", + "memberSettings": "Üye Ayarları", + "orchestrator": "Yönetici", + "orchestratorThinking": "Yönetici düşünüyor...", + "removeMember": "Üyeyi Kaldır", + "stopOrchestrator": "Düşünmeyi Durdur", + "triggerOrchestrator": "Grup Sohbetini Başlat" + }, + "tabs": { + "host": "Sunucu", + "members": "Üyeler", + "role": "Ayarla" + } + }, + "groupWizard": { + "chooseMembers": "Mevcut asistanları seçin...", + "createGroup": "Grup sohbeti oluştur", + "existingMembers": "Mevcut Yardımcılar", + "groupMembers": "Bu asistanlar listenize de eklenecek", + "host": { + "description": "Grup sohbetini otomatik olarak yönetir", + "title": "Ev Sahibi", + "tooltip": "Grup sohbeti sunucusu devre dışı bırakılırsa, üyelerin yanıt vermesini sağlamak için onları manuel olarak @etiketlemeniz gerekir" + }, + "memberCount": "{{count}} üye", + "noMatchingTemplates": "Eşleşen şablon yok", + "noSelectedTemplates": "Şablon seçilmedi", + "noTemplateMembers": "Şablonda üye yok", + "noTemplates": "Kullanılabilir şablon yok", + "searchTemplates": "Şablonlarda ara...", + "title": "Grup sohbeti oluştur", + "useTemplate": "Şablon Kullan" + }, + "hideForYou": "Özel mesaj içeriği gizlendi, görüntülemek için ayarlardan 【Özel Mesaj İçeriğini Göster】 seçeneğini açın", "history": { "title": "Asistan yalnızca son {{count}} mesajı hatırlayacak" }, "historyRange": "Geçmiş Aralığı", "historySummary": "Tarihsel haber özeti", + "inactive": "Etkin değil", "inbox": { "desc": "Beyin fırtınasını başlatın ve yaratıcı düşünmeye başlayın. Sanal asistanınız burada, her konuda sizinle iletişim kurmak için hazır.", "title": "Sohbet Et" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Niyetinizi anlama ve analiz etme aşamasındayız..." }, + "inviteMembers": "Üyeleri davet et", "knowledgeBase": { "all": "Tüm İçerik", "allFiles": "Tüm Dosyalar", @@ -101,12 +159,29 @@ "uploadGuide": "Yüklenen dosyaları 'Bilgi Tabanı' içinde görebilirsiniz.", "viewMore": "Daha Fazla Gör" }, + "memberSelection": { + "addMember": "Üye Ekle", + "allMembers": "Tüm üyeler", + "createGroup": "Grup Sohbeti Oluştur", + "noAvailableAgents": "Davet edilecek asistan yok", + "noSelectedAgents": "Henüz asistan seçilmedi", + "searchAgents": "Asistan ara...", + "setInitialMembers": "Grup üyelerini seçin" + }, + "members": "Üyeler", + "mention": { + "title": "Üyeleri Etiketle" + }, "messageAction": { "delAndRegenerate": "Sil ve Yeniden Oluştur", "deleteDisabledByThreads": "Alt konular mevcut, silinemez", "regenerate": "Yeniden Oluştur" }, "messages": { + "dm": { + "sentTo": "Sadece {{name}} tarafından görülebilir", + "title": "Özel Mesaj" + }, "modelCard": { "credit": "Kredi", "creditPricing": "Fiyatlandırma", @@ -156,6 +231,13 @@ "previousMessage": "Önceki mesaj" }, "newAgent": "Yeni Asistan", + "newGroupChat": "Yeni grup sohbeti oluştur", + "noAgentsYet": "Bu grupta henüz asistan yok. Asistan davet etmek için + simgesine tıklayın.", + "noAvailableAgents": "Davet edilebilecek asistan yok.", + "noMatchingAgents": "Eşleşen asistan yok", + "noMembersYet": "Bu grupta henüz üye yok. Asistanı davet etmek için + düğmesine tıklayın.", + "noSelectedAgents": "Henüz bir asistan seçilmedi", + "owner": "Grup sahibi", "pin": "Pin", "pinOff": "Unpin", "rag": { @@ -196,12 +278,16 @@ "title": "Ağ Araması" }, "searchAgentPlaceholder": "Arama Asistanı...", + "searchAgents": "Arama asistanı...", + "selectedAgents": "Seçili Asistanlar", "sendPlaceholder": "Mesajınızı buraya yazın...", "sessionGroup": { "config": "Grup Yönetimi", "confirmRemoveGroupAlert": "Bu grup silinecek, silindikten sonra bu grubun yardımcıları varsayılan listeye taşınacak, işleminizi onaylıyor musunuz?", "createAgentSuccess": "Yardımcı oluşturuldu", "createGroup": "Yeni Grup Ekle", + "createGroupFailed": "Grup sohbeti oluşturulamadı", + "createGroupSuccess": "Grup sohbeti başarıyla oluşturuldu", "createSuccess": "Oluşturma Başarılı", "creatingAgent": "Yardımcı oluşturuluyor...", "inputPlaceholder": "Grup adını girin...", @@ -235,6 +321,12 @@ "loading": "Tanımlanıyor...", "prettifying": "İyileştiriliyor..." }, + "supervisor": { + "todoList": { + "allComplete": "Tüm görevler tamamlandı", + "title": "Görevler tamamlandı" + } + }, "thread": { "divider": "Alt konu", "threadMessageCount": "{{messageCount}} mesaj", @@ -248,6 +340,7 @@ "chats": "Sohbetler", "historySummary": "Tarih Özeti", "rest": "Kalan", + "supervisor": "Grup Yöneticisi", "systemRole": "Sistem Rolü", "title": "Bağlam Detayları", "tools": "Araçlar", @@ -273,6 +366,7 @@ "action": "Text-to-Speech", "clear": "Clear Speech" }, + "untitledAgent": "Adsız Asistan", "updateAgent": "Asistan Bilgilerini Güncelle", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "Video dosyası boyutu 20MB'ı geçemez, mevcut dosya boyutu {{actualSize}}" } }, + "you": "sen", "zenMode": "Odak Modu" -} +} diff --git a/locales/tr-TR/components.json b/locales/tr-TR/components.json index 08f7088470d..aa84ab631a5 100644 --- a/locales/tr-TR/components.json +++ b/locales/tr-TR/components.json @@ -1,8 +1,8 @@ { "ArgsInput": { - "addArgument": "Argüman ekle", - "argumentPlaceholder": "Argüman {{index}}", - "enterFirstArgument": "İlk argümanı girin..." + "addArgument": "Parametre ekle", + "argumentPlaceholder": "Parametre {{index}}", + "enterFirstArgument": "İlk parametreyi girin..." }, "DragUpload": { "dragDesc": "Dosyaları buraya sürükleyin, birden fazla resim yüklemeyi destekler.", @@ -146,8 +146,8 @@ }, "validation": { "fileSizeExceeded": "Dosya boyutu sınırı aşıldı", - "fileSizeExceededDetail": "{{fileName}} ({{actualSize}}), izin verilen maksimum boyut olan {{maxSize}}'ı aşıyor", - "fileSizeExceededMultiple": "{{count}} dosya, izin verilen maksimum boyut olan {{maxSize}}'ı aşıyor: {{fileList}}", + "fileSizeExceededDetail": "{{fileName}} ({{actualSize}}) maksimum boyut sınırı olan {{maxSize}}'yi aşıyor", + "fileSizeExceededMultiple": "{{count}} dosya, maksimum boyut sınırı olan {{maxSize}}'yi aşıyor: {{fileList}}", "imageCountExceeded": "Resim sayısı sınırı aşıldı" } }, diff --git a/locales/tr-TR/error.json b/locales/tr-TR/error.json index 08e98d8a339..482f00d0e43 100644 --- a/locales/tr-TR/error.json +++ b/locales/tr-TR/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "Hizmet isteği başarısız oldu, lütfen yapılandırmayı kontrol edin veya tekrar deneyin" }, + "supervisor": { + "decisionFailed": "Grup yöneticisi çalışamıyor. Lütfen yönetici yapılandırmanızı kontrol edin ve doğru model, API Anahtarı ve API adresinin yapılandırıldığından emin olun." + }, "testConnectionFailed": "Bağlantı testi başarısız: {{error}}", "tts": { "responseError": "Hizmet isteği başarısız oldu, lütfen yapılandırmayı kontrol edin veya tekrar deneyin" diff --git a/locales/tr-TR/providers.json b/locales/tr-TR/providers.json index b80be8906e8..dd513092713 100644 --- a/locales/tr-TR/providers.json +++ b/locales/tr-TR/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock, Amazon AWS tarafından sunulan bir hizmettir ve işletmelere gelişmiş yapay zeka dil modelleri ve görsel modeller sağlamaya odaklanmaktadır. Model ailesi, Anthropic'in Claude serisi, Meta'nın Llama 3.1 serisi gibi seçenekleri içermekte olup, metin üretimi, diyalog, görüntü işleme gibi çeşitli görevleri desteklemektedir. Farklı ölçek ve ihtiyaçlara uygun kurumsal uygulamalar için geniş bir yelpaze sunmaktadır." }, "bfl": { - "description": "Önde gelen bir ileri düzey yapay zeka araştırma laboratuvarı; yarının görsel altyapısını inşa ediyor." + "description": "Öncü bir ileri düzey yapay zeka araştırma laboratuvarı, yarının görsel altyapısını inşa ediyor." + }, + "cerebras": { + "description": "Cerebras, özel CS-3 sistemi üzerine kurulu bir yapay zeka çıkarım platformudur. Gerçek zamanlı yanıtlar ve yüksek veri işleme kapasitesiyle dünyanın en hızlı LLM hizmetini sunmayı hedefler. Gecikmeleri ortadan kaldırmak ve gerçek zamanlı kod üretimi ile aracı görevler gibi karmaşık yapay zeka iş akışlarını hızlandırmak için tasarlanmıştır." }, "cerebras": { "description": "Cerebras, özel CS-3 sistemi üzerine kurulu bir yapay zeka çıkarım platformudur. Gerçek zamanlı yanıtlar ve yüksek veri işleme kapasitesiyle dünyanın en hızlı LLM hizmetini sunmayı hedefler. Gecikmeleri ortadan kaldırmak ve gerçek zamanlı kod üretimi ile aracı görevler gibi karmaşık yapay zeka iş akışlarını hızlandırmak için tasarlanmıştır." diff --git a/locales/tr-TR/setting.json b/locales/tr-TR/setting.json index 2c53e681ddf..b5376fe9a4a 100644 --- a/locales/tr-TR/setting.json +++ b/locales/tr-TR/setting.json @@ -35,9 +35,16 @@ "title": "Tüm Ayarları Sıfırla" } }, + "groupTab": { + "chat": "Sohbet", + "members": "Üyeler", + "meta": "Temel Bilgiler" + }, "header": { "desc": "Tercihler ve model ayarları.", "global": "Genel Ayarlar", + "group": "Grup Sohbeti Ayarları", + "groupDesc": "Mevcut grup sohbetini yönet", "session": "Oturum Ayarları", "sessionDesc": "Karakter ayarları ve oturum tercihleri.", "sessionWithName": "Oturum Ayarları · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Daha fazla model eklenmesi planlanıyor" }, + "message": { + "success": "Güncelleme başarılı" + }, "plugin": { "addMCPPlugin": "MCP Eklentisi Ekle", "addTooltip": "Eklenti Ekle", @@ -294,6 +304,101 @@ }, "title": "Genel Ayarlar" }, + "settingGroup": { + "description": { + "placeholder": "Lütfen grup sohbeti açıklamasını girin", + "title": "Grup Sohbeti Açıklaması" + }, + "name": { + "placeholder": "Lütfen grup sohbeti adını girin", + "title": "Grup Sohbeti Adı" + }, + "scene": { + "desc": "Grup sohbeti sahnesini seçin", + "options": { + "casual": "Rahat", + "productive": "Verimli" + }, + "title": "Grup Sohbeti Sahnesi" + }, + "submit": "Grup Sohbetini Güncelle", + "systemPrompt": { + "placeholder": "Lütfen moderatör sistem istemini girin", + "title": "Moderatör Sistem İstemi" + }, + "title": "Grup Sohbeti Bilgisi" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Kapattıktan sonra bile, yine de asistanlara özel mesaj gönderebilirsiniz", + "title": "Asistanların özel mesaj göndermesine izin ver" + }, + "enableSupervisor": { + "desc": "Grup sohbeti moderatörlüğü özelliğini etkinleştirerek, moderatör sohbet akışını yönetecektir", + "title": "Moderatörü etkinleştir" + }, + "maxResponseInRow": { + "desc": "Üyelerin kaç mesajı ardışık olarak yanıtlayabileceğini seçin. 0 olarak ayarlanırsa bu kısıtlama devre dışı bırakılır.", + "title": "Ardışık Yanıt Mesaj Sayısı" + }, + "model": { + "desc": "Grup üyelerinin konuşmaları etkilenmez. Bazı modeller moderatör modeli olarak kullanılamaz.", + "title": "Moderatör Modeli" + }, + "orchestratorTitle": "Moderatör Ayarları", + "responseOrder": { + "desc": "Temsilci, grup sohbetinde ayarlanan sıraya göre yanıt verecektir", + "options": { + "natural": "Doğal", + "sequential": "Sıralı" + }, + "placeholder": "Yanıt sırasını seçin", + "title": "Yanıt Sırası" + }, + "responseSpeed": { + "desc": "Grup sohbetinin genel hızını kontrol edin", + "options": { + "fast": "Hızlı", + "medium": "Orta", + "slow": "Yavaş" + }, + "placeholder": "Yanıt hızını seçin", + "title": "Yanıt Hızı" + }, + "revealDM": { + "desc": "Diğer üyelere gönderilen özel mesajların içeriğini sizin için görünür yapar.", + "title": "Özel Mesaj İçeriğini Göster" + }, + "submit": "Ayarları Güncelle", + "systemPrompt": { + "desc": "Grup sohbeti moderatörünün özel sistem istemi. Bu, varsayılan moderatör davranışını etkileyebilir.", + "placeholder": "Lütfen özel moderatör sistem istemini girin...", + "title": "Moderatör Sistem İstemi" + }, + "title": "Sohbet Ayarları" + }, + "settingGroupMembers": { + "addToGroup": "Gruba Ekle", + "availableAgents": "Mevcut Asistanlar", + "defaultAgent": "Özel Asistan", + "disableHost": "Sunucu Yardımcısını Kapat", + "edit": "Üyeyi Düzenle", + "empty": "Bu grup sohbetinde henüz temsilci yok. Üye eklemek için + butonuna tıklayın.", + "enableHost": "Sunucu Yardımcısını Etkinleştir", + "groupHost": "Grup Sunucusu", + "groupMembers": "Grup Üyeleri", + "host": { + "description": "Sunucu grupta olduğunda, grup sohbeti otomatik olarak çalışır ve yaratıcı görevler için uygundur.", + "title": "Sunucu" + }, + "noAvailableAgents": "Mevcut asistan yok", + "noDescription": "Açıklama yok", + "noMembersInGroup": "Grup üyesi yok", + "owner": "Siz (Sahip)", + "remove": "Üyeyi Kaldır", + "removeFromGroup": "Grup Dışına Çıkar", + "you": "Siz" + }, "settingImage": { "defaultCount": { "desc": "Yeni bir görev oluşturulurken, görsel oluşturma panelinde varsayılan olarak üretilecek görsel sayısını ayarlayın.", @@ -522,6 +627,11 @@ "modelDesc": "Yapay zeka resimlerinin otomatik konu isimlendirmesi için belirlenen model", "title": "Yapay Zeka Resim Otomatik Konu İsimlendirme" }, + "groupChatSupervisor": { + "label": "Grup Sohbet Denetim Modeli", + "modelDesc": "Grup sohbeti diyaloglarını denetlemek ve yönetmek için kullanılan model", + "title": "Grup Sohbet Denetimi ve Yönetimi" + }, "helpInfo": "Yeni bir asistan oluşturduğunuzda, varsayılan asistan ayarları ön ayar olarak kullanılacaktır.", "historyCompress": { "label": "Oturum Geçmişi Modeli", diff --git a/locales/tr-TR/welcome.json b/locales/tr-TR/welcome.json index 16b0f846258..624005e9de1 100644 --- a/locales/tr-TR/welcome.json +++ b/locales/tr-TR/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Ben sizin özel akıllı asistanınız {{appName}}. Şu anda size nasıl yardımcı olabilirim?
Daha profesyonel veya özel bir asistan istiyorsanız, özel asistan oluşturmak için butonuna tıklayabilirsiniz.", "defaultMessageWithoutCreate": "Ben sizin özel akıllı asistanınız {{appName}}. Şu anda size nasıl yardımcı olabilirim?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Kod değişiklikleri ve uygulamalar üzerinde teknik tartışma ve eş değerlendirme", + "emoji": "💻", + "prompt": "Haydi birlikte bazı kodları inceleyelim. Bu kodları analiz edip geliştirme alanlarını belirlememize yardımcı olabilir misin?", + "title": "Kod İncelemesi" + }, + "investment": { + "description": "Piyasa analizi, yatırım stratejileri tartışması ve finansal içgörü paylaşımı", + "emoji": "📈", + "prompt": "Haydi birlikte piyasayı analiz edelim. Yatırım stratejilerini tartışmamıza ve finansal içgörüler paylaşmamıza yardımcı olabilir misin?", + "title": "Yatırım Kulübü" + }, + "research": { + "description": "Bilimsel kavramları keşfetme, deneyler yapma ve bulguları paylaşma", + "emoji": "🔬", + "prompt": "Haydi birlikte bilimi keşfedelim! Deneyler yapmamıza ve bulgularımızı paylaşmamıza yardımcı olabilir misin?", + "title": "Bilim Sergisi" + }, + "study": { + "description": "Ortak öğrenme toplantıları, kavramları tartışma ve birlikte problem çözme", + "emoji": "📚", + "prompt": "Bir çalışma grubu oluşturalım. Bu kavramları anlamamıza ve birlikte sorunları çözmemize yardımcı olabilir misin?", + "title": "Çalışma Grubu" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Çeşitli görsel ve dijital sanat biçimlerini yaratma, yorumlama ve takdir etme", + "emoji": "🖼️", + "prompt": "Haydi bir sanat atölyesi düzenleyelim! Çeşitli sanat biçimlerini yaratmamıza, yorumlamamıza ve takdir etmemize yardımcı olabilir misin?", + "title": "Sanat Atölyesi" + }, + "debate": { + "description": "Çeşitli konular ve güncel olaylar üzerine yapılandırılmış tartışma ve münazara", + "emoji": "⚖️", + "prompt": "Yapılandırılmış bir münazara yapalım. Bu konuda mantıklı ve sağlam bir tartışma düzenlememize yardımcı olabilir misin?", + "title": "Münazara Kulübü" + }, + "designReview": { + "description": "Tasarım kavramları, prototipler veya yaratıcı çalışmalar üzerine ortak geri bildirim toplantısı", + "emoji": "🎨", + "prompt": "Bazı tasarımları incelememiz gerekiyor. Tasarım kavramları ve prototipler hakkında yapıcı geri bildirim vermemize yardımcı olabilir misin?", + "title": "Tasarım İncelemesi" + }, + "ideation": { + "description": "Çoklu bakış açısıyla işbirlikçi yaratıcı fikir üretimi ve yaratıcı problem çözme", + "emoji": "🧠", + "prompt": "Projeye yönelik beyin fırtınasına başlayalım. Yaratıcı fikirler ve çözümler üretmemize yardımcı olabilir misin?", + "title": "Beyin Fırtınası" + } + }, + "game": { + "debateClub": { + "description": "Çeşitli konular ve güncel olaylar üzerine yapılandırılmış tartışma ve münazara", + "emoji": "⚖️", + "prompt": "Yapılandırılmış bir münazara yapalım. Bu konuda mantıklı ve sağlam bir tartışma düzenlememize yardımcı olabilir misin?", + "title": "Münazara Kulübü" + }, + "gameNight": { + "description": "Eğlenceli etkileşimli oyunlar ve aktivitelerle takım bağlarını güçlendirme ve keyif alma", + "emoji": "🎲", + "prompt": "Oyun gecesi başlıyor! Takım bağlarını güçlendirmek için eğlenceli etkileşimli oyunlar düzenlememize yardımcı olabilir misin?", + "title": "Oyun Gecesi" + }, + "modelUN": { + "description": "Birleşmiş Milletler simülasyonu ve küresel konular üzerine diplomatik müzakereler", + "emoji": "🌍", + "prompt": "Bir BM münazarası simüle edelim. Küresel konular üzerine diplomatik müzakereler düzenlememize yardımcı olabilir misin?", + "title": "BM Simülasyonu" + }, + "werewolf": { + "description": "Oyuncuların strateji ve tartışma yoluyla kurt adamları bulmaya çalıştığı sosyal çıkarım oyunu", + "emoji": "🐺", + "prompt": "Haydi kurt adam oyunu oynayalım! Kuralları belirlememize ve bu sosyal çıkarım oyununu yönetmemize yardımcı olabilir misin?", + "title": "Kurt Adam Oyunu" + } + }, + "general": { + "brainstorm": { + "description": "Çoklu bakış açısıyla işbirlikçi yaratıcı fikir üretimi ve yaratıcı problem çözme", + "emoji": "🧠", + "prompt": "Projeye yönelik beyin fırtınasına başlayalım. Yaratıcı fikirler ve çözümler üretmemize yardımcı olabilir misin?", + "title": "Beyin Fırtınası" + }, + "debate": { + "description": "Çeşitli konular ve güncel olaylar üzerine yapılandırılmış tartışma ve münazara", + "emoji": "⚖️", + "prompt": "Yapılandırılmış bir münazara yapalım. Bu konuda mantıklı ve sağlam bir tartışma düzenlememize yardımcı olabilir misin?", + "title": "Münazara Kulübü" + }, + "languagePractice": { + "description": "Ana dili konuşanlarla birlikte konuşma pratiği yapma ve yeni dil öğrenme", + "emoji": "🗣️", + "prompt": "Haydi birlikte yeni bir dil pratiği yapalım. Bu dili öğrenmemize ve konuşma pratiği yapmamıza yardımcı olabilir misin?", + "title": "Dil Pratiği" + }, + "studyGroup": { + "description": "Ortak öğrenme toplantıları, kavramları tartışma ve birlikte problem çözme", + "emoji": "📚", + "prompt": "Bir çalışma grubu oluşturalım. Bu kavramları anlamamıza ve birlikte sorunları çözmemize yardımcı olabilir misin?", + "title": "Çalışma Grubu" + } + }, + "planning": { + "cookingClass": { + "description": "Yemek pişirme becerileri, tarifler ve yemek geleneklerini öğrenme ve paylaşma", + "emoji": "👨‍🍳", + "prompt": "Haydi yemek pişirme dersine katılalım! Yeni tarifler ve pişirme teknikleri öğrenmemize yardımcı olabilir misin?", + "title": "Yemek Pişirme Dersi" + }, + "fitnessChallenge": { + "description": "Grup fitness hedefleri belirleme, egzersiz yöntemleri paylaşma ve birbirini motive etme", + "emoji": "💪", + "prompt": "Haydi fitness meydan okumasına başlayalım! Hedefler belirlememize ve sağlıklı kalmak için birbirimizi motive etmemize yardımcı olabilir misin?", + "title": "Fitness Meydan Okuması" + }, + "planningPoker": { + "description": "Projelerde görev ve iş yükünü kartlarla tahmin etmeye yönelik çevik tahmin tekniği", + "emoji": "🃏", + "prompt": "Projede planlama pokeri yapıyoruz. Bu görevlerin iş yükünü çevik tekniklerle tahmin etmemize yardımcı olabilir misin?", + "title": "Planlama Pokeri" + }, + "travelPlanning": { + "description": "Seyahat planlama, seyahat deneyimleri paylaşma ve yeni destinasyonlar keşfetme", + "emoji": "✈️", + "prompt": "Haydi birlikte seyahat planlayalım! Gideceğimiz yerleri araştırmamıza ve seyahat programı hazırlamamıza yardımcı olabilir misin?", + "title": "Seyahat Planlaması" + } + }, + "product": { + "codeReview": { + "description": "Kod değişiklikleri ve uygulamalar üzerinde teknik tartışma ve eş değerlendirme", + "emoji": "💻", + "prompt": "Haydi birlikte bazı kodları inceleyelim. Bu kodları analiz edip geliştirme alanlarını belirlememize yardımcı olabilir misin?", + "title": "Kod İncelemesi" + }, + "designReview": { + "description": "Tasarım kavramları, prototipler veya yaratıcı çalışmalar üzerine ortak geri bildirim toplantısı", + "emoji": "🎨", + "prompt": "Bazı tasarımları incelememiz gerekiyor. Tasarım kavramları ve prototipler hakkında yapıcı geri bildirim vermemize yardımcı olabilir misin?", + "title": "Tasarım İncelemesi" + }, + "sprintPlanning": { + "description": "Projelerde görev ve iş yükünü kartlarla tahmin etmeye yönelik çevik tahmin tekniği", + "emoji": "🃏", + "prompt": "Projede planlama pokeri yapıyoruz. Bu görevlerin iş yükünü çevik tekniklerle tahmin etmemize yardımcı olabilir misin?", + "title": "Planlama Pokeri" + }, + "techExchange": { + "description": "Yenilikçi teknolojiler, inovasyon ve sektör trendlerini tartışma", + "emoji": "🚀", + "prompt": "Haydi teknoloji alışverişi yapalım! Yeni teknolojiler ve sektör trendlerini tartışmamıza yardımcı olabilir misin?", + "title": "Teknoloji Alışverişi" + } + }, + "title": "Grup Sohbeti Kullanım Önerileri", + "writing": { + "bookClub": { + "description": "Kitaplar, hikayeler ve edebi eserler üzerine edebi tartışma ve analiz", + "emoji": "📖", + "prompt": "Haydi kitap kulübü tartışmasına başlayalım. Bu kitabı analiz edip temalarını birlikte keşfetmemize yardımcı olabilir misin?", + "title": "Kitap Kulübü" + }, + "movieClub": { + "description": "Birlikte film, belgesel ve görsel medya izleme ve tartışma", + "emoji": "🎬", + "prompt": "Haydi film kulübü tartışmasına başlayalım. Bu filmi analiz edip temalarını birlikte keşfetmemize yardımcı olabilir misin?", + "title": "Film Kulübü" + }, + "musicSession": { + "description": "Ortak müzik yaratımı, paylaşımı ve takdir toplantısı", + "emoji": "🎵", + "prompt": "Haydi müzik doğaçlaması yapalım! Birlikte müzik yaratmamıza ve takdir etmemize yardımcı olabilir misin?", + "title": "Müzik Doğaçlaması" + }, + "studyGroup": { + "description": "Ortak öğrenme toplantıları, kavramları tartışma ve birlikte problem çözme", + "emoji": "📚", + "prompt": "Bir çalışma grubu oluşturalım. Bu kavramları anlamamıza ve birlikte sorunları çözmemize yardımcı olabilir misin?", + "title": "Çalışma Grubu" + } + } + }, + "groupMessage": "Grup sohbetine hoş geldiniz! Paylaşılan bir konuşma alanında birden fazla yapay zeka asistanıyla işbirliği yapın。", + "groupTemplates": { + "analysis": { + "description": "Veri odaklı içgörüler, derinlemesine araştırma ve analiz", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Verileri işleme ve yorumlama konusunda uzmansınız; grafikler ve istatistiksel analizler yoluyla verilerin ardındaki kalıpları ve eğilimleri ortaya çıkarırsınız.", + "title": "Veri Analisti" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Sen bir araştırma uzmanısın, bilgi toplama ve derinlemesine araştırma yapmaktan sorumlusun, sorunları çok boyutlu olarak kapsamlı bir şekilde analiz edebilirsin.", + "title": "Araştırma Uzmanı" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Sen bir istatistik uzmanısın, çeşitli istatistik yöntemleri ve modellerinde uzmansın, verilerden değerli ticari içgörüler çıkarabilirsin.", + "title": "İstatistik Uzmanı" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Sen bir nicel analistsin, nicel modelleme ve risk değerlendirmesi yaparsın, karmaşık problemleri matematiksel yöntemlerle çözersin.", + "title": "Nicel Analist" + } + ], + "title": "Analiz Ekibi" + }, + "brainstorm": { + "description": "Çoklu bakış açısıyla yaratıcı düşünce, sonsuz olasılıkları tetikle", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Sen bir yaratıcı yönetmensin, yaratıcı yönü makro açıdan kontrol etmede uzmansın, soyut kavramları somut ve uygulanabilir yaratıcı çözümlere dönüştürebilirsin.", + "title": "Yaratıcı Yönetmen" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Sen bir yenilik uzmanısın, yeni çözümler ve çığır açan düşünceler keşfetmekle sorumlusun, kalıpların dışına çıkarak düşünme becerisine sahipsin.", + "title": "Yenilik Uzmanı" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Sen bir tasarım düşüncesi uzmanısın, kullanıcı deneyimi ve görsel sunum açısından düşünürsün, yaratıcılığın görselleştirilmesine önem verirsin.", + "title": "Tasarım Düşüncesi Uzmanı" + } + ], + "title": "Beyin Fırtınası Grubu" + }, + "game": { + "description": "Çeşitli çok oyunculu metin oyunlarının keyfini çıkar, örneğin Kurt Adam ve Kim Casus", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Çeşitli çok oyunculu metin tabanlı oyunlara katılmada uzmansın ve oyun kurallarına göre oynayabilirsin.", + "title": "Oyuncu" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Çeşitli çok oyunculu metin tabanlı oyunlara katılmada uzmansın ve oyun kurallarına göre oynayabilirsin.", + "title": "Oyuncu" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Çeşitli çok oyunculu metin tabanlı oyunlara katılmada uzmansın ve oyun kurallarına göre oynayabilirsin.", + "title": "Oyuncu" + } + ], + "title": "Oyun Salonu" + }, + "planning": { + "description": "Stratejik planlama ve proje yönetimi, genel durumu koordine etme", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Projelerin genel planlaması, ilerleme takibi ve kaynak koordinasyonundan sorumlusun, projenin zamanında ve yüksek kalitede tamamlanmasını sağlıyorsun.", + "title": "Şef" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Uzun vadeli stratejik planlama yapmaktan, pazar fırsatlarını analiz etmekten, hedefler ve gerçekleştirme yolları belirlemekten sorumlusun.", + "title": "Malzeme Tedarik Uzmanı" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Detaylı uygulama planları hazırlamaktan, departmanlar arası kaynakları koordine etmekten ve planların uygulanabilirliğini sağlamaktan sorumlusun.", + "title": "Gastronomi Ar-Ge Uzmanı" + } + ], + "title": "Gastronomi Ar-Ge Takımı" + }, + "product": { + "description": "Ürün tasarımı ve geliştirme, kaliteli ürünler yaratma", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Sen bir tasarımcısın, çeşitli ürün türlerini tasarlamada uzmansın, ürün gereksinimlerine göre tasarım yapabilirsin.", + "title": "Tasarımcı" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Sen bir ürün yöneticisisin, ürünün planlaması, tasarımı, geliştirilmesi ve bakımından sorumlusun, ürün kalitesi ve kullanıcı deneyimini sağlarsın.", + "title": "Ürün Yöneticisi" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Sen deneyimli bir tam yığın mühendisisin, çeşitli ürün türlerini geliştirmede uzmansın, ürün gereksinimlerine göre geliştirme yapabilirsin.", + "title": "Tam Yığın Mühendis" + } + ], + "title": "Ürün Ar-Ge Takımı" + }, + "writing": { + "description": "İçerik oluşturma ve düzenleme, kaliteli metinler yaratma", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Çeşitli yazım türlerinde içerik üretmede uzmansın ve farklı senaryolara ve hedef kitlelere göre yazım tarzını ayarlayabilirsin.", + "title": "İçerik Yazarı" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Sen bir editörsün, metinlerin düzeltme, parlatma ve optimizasyonundan sorumlusun, içeriğin doğruluğunu, akıcılığını ve profesyonelliğini sağlarsın.", + "title": "Editör" + } + ], + "title": "Yazım Çemberi" + } + }, "qa": { "q01": "LobeHub nedir?", "q02": "{{appName}} nedir?", diff --git a/locales/vi-VN/chat.json b/locales/vi-VN/chat.json index 934230ce5c0..e268746699a 100644 --- a/locales/vi-VN/chat.json +++ b/locales/vi-VN/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "Mô hình" }, + "active": "Hoạt động", "agentDefaultMessage": "Xin chào, tôi là **{{name}}**, bạn có thể bắt đầu trò chuyện với tôi ngay bây giờ, hoặc bạn có thể đến [Cài đặt trợ lý]({{url}}) để hoàn thiện thông tin của tôi.", "agentDefaultMessageWithSystemRole": "Xin chào, tôi là **{{name}}**, tôi có thể giúp gì cho bạn?", "agentDefaultMessageWithoutEdit": "Xin chào, tôi là **{{name}}**, tôi có thể giúp gì cho bạn?", @@ -13,17 +14,28 @@ "thought": "Quá trình suy nghĩ", "unknownTitle": "Tác phẩm chưa được đặt tên" }, + "availableAgents": "Trợ lý có sẵn", "backToBottom": "Quay về dưới cùng", "chatList": { "longMessageDetail": "Xem chi tiết" }, "clearCurrentMessages": "Xóa tin nhắn hiện tại", "confirmClearCurrentMessages": "Bạn sắp xóa tin nhắn hiện tại. Hành động này không thể hoàn tác, vui lòng xác nhận.", + "confirmRemoveChatGroupItemAlert": "Bạn sắp xóa nhóm trò chuyện này, các thành viên trong nhóm sẽ không bị ảnh hưởng, vui lòng xác nhận thao tác của bạn", + "confirmRemoveGroupItemAlert": "Bạn sắp xóa nhóm này. Sau khi xóa, các trợ lý trong nhóm sẽ được chuyển sang danh sách mặc định. Vui lòng xác nhận hành động của bạn.", + "confirmRemoveGroupSuccess": "Xóa nhóm trò chuyện thành công", "confirmRemoveSessionItemAlert": "Bạn sắp xóa trợ lý này. Hành động này không thể hoàn tác, vui lòng xác nhận.", "confirmRemoveSessionSuccess": "Xóa trợ lý thành công", "defaultAgent": "Trợ lý mặc định", + "defaultGroupChat": "Nhóm trò chuyện", "defaultList": "Danh sách mặc định", "defaultSession": "Trợ lý mặc định", + "dm": { + "placeholder": "Tin nhắn riêng tư giữa bạn và {{agentTitle}} sẽ được hiển thị ở đây.", + "tooltip": "Gửi tin nhắn riêng", + "visibleTo": "Chỉ hiển thị với {{target}}", + "you": "bạn" + }, "duplicateSession": { "loading": "Đang sao chép...", "success": "Sao chép thành công", @@ -58,11 +70,56 @@ "title": "Trích xuất nội dung liên kết trang web" } }, + "group": { + "desc": "Cộng tác với nhiều trợ lý AI trong không gian hội thoại chung。", + "memberTooltip": "Nhóm có {{count}} thành viên", + "orchestratorThinking": "Người điều phối đang suy nghĩ...", + "removeMember": "Xóa thành viên", + "title": "Nhóm" + }, + "groupDescription": "Mô tả nhóm", + "groupSidebar": { + "members": { + "addMember": "Thêm thành viên", + "memberSettings": "Cài đặt thành viên", + "orchestrator": "Người điều phối", + "orchestratorThinking": "Người điều phối đang suy nghĩ...", + "removeMember": "Xóa thành viên", + "stopOrchestrator": "Dừng suy nghĩ", + "triggerOrchestrator": "Bắt đầu nhóm trò chuyện" + }, + "tabs": { + "host": "Người chủ trì", + "members": "Thành viên", + "role": "Thiết lập" + } + }, + "groupWizard": { + "chooseMembers": "Chọn trợ lý hiện có...", + "createGroup": "Tạo nhóm trò chuyện", + "existingMembers": "Trợ lý hiện có", + "groupMembers": "Những trợ lý này cũng sẽ được thêm vào danh sách của bạn", + "host": { + "description": "Tự động hóa hoạt động nhóm chat", + "title": "Người dẫn chương trình", + "tooltip": "Nếu tắt người chủ trì nhóm, bạn cần @đề cập thành viên theo cách thủ công để họ có thể trả lời" + }, + "memberCount": "{{count}} thành viên", + "noMatchingTemplates": "Không có mẫu phù hợp", + "noSelectedTemplates": "Chưa chọn mẫu nào", + "noTemplateMembers": "Không có thành viên trong mẫu", + "noTemplates": "Không có mẫu nào khả dụng", + "searchTemplates": "Tìm kiếm mẫu...", + "title": "Tạo nhóm trò chuyện", + "useTemplate": "Sử dụng mẫu" + }, + "hideForYou": "Nội dung tin nhắn riêng tư đã bị ẩn, vui lòng bật 【Hiển thị nội dung tin nhắn riêng tư】 trong cài đặt để xem", "history": { "title": "Trợ lý sẽ chỉ nhớ {{count}} tin nhắn cuối cùng" }, "historyRange": "Phạm vi lịch sử", "historySummary": "Tóm tắt tin tức lịch sử", + "inactive": "Không hoạt động", "inbox": { "desc": "Kích hoạt cụm não, khơi dậy tia lửa tư duy. Trợ lý thông minh của bạn, ở đây để trò chuyện với bạn về mọi thứ.", "title": "Chuyện phiếm" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "Đang hiểu và phân tích ý định của bạn..." }, + "inviteMembers": "Mời thành viên", "knowledgeBase": { "all": "Tất cả nội dung", "allFiles": "Tất cả tệp", @@ -101,12 +159,29 @@ "uploadGuide": "Các tệp đã tải lên có thể được xem trong 'Kho kiến thức'", "viewMore": "Xem thêm" }, + "memberSelection": { + "addMember": "Thêm thành viên", + "allMembers": "Tất cả thành viên", + "createGroup": "Tạo nhóm trò chuyện", + "noAvailableAgents": "Không có trợ lý nào để mời", + "noSelectedAgents": "Chưa chọn trợ lý nào", + "searchAgents": "Tìm trợ lý...", + "setInitialMembers": "Chọn thành viên nhóm" + }, + "members": "Thành viên", + "mention": { + "title": "Nhắc đến thành viên" + }, "messageAction": { "delAndRegenerate": "Xóa và tạo lại", "deleteDisabledByThreads": "Có chủ đề con, không thể xóa", "regenerate": "Tạo lại" }, "messages": { + "dm": { + "sentTo": "Chỉ hiển thị với {{name}}", + "title": "Tin nhắn riêng" + }, "modelCard": { "credit": "Điểm", "creditPricing": "Định giá", @@ -156,6 +231,13 @@ "previousMessage": "Tin nhắn trước" }, "newAgent": "Tạo trợ lý mới", + "newGroupChat": "Tạo nhóm mới", + "noAgentsYet": "Nhóm này chưa có trợ lý. Nhấn nút + để mời trợ lý.", + "noAvailableAgents": "Không có trợ lý nào để mời", + "noMatchingAgents": "Không có trợ lý phù hợp", + "noMembersYet": "Nhóm này chưa có thành viên nào. Nhấp vào nút + để mời trợ lý.", + "noSelectedAgents": "Chưa chọn trợ lý nào", + "owner": "Chủ nhóm", "pin": "Ghim", "pinOff": "Bỏ ghim", "rag": { @@ -196,12 +278,16 @@ "title": "Tìm kiếm trực tuyến" }, "searchAgentPlaceholder": "Trợ lý tìm kiếm...", + "searchAgents": "Trợ lý tìm kiếm...", + "selectedAgents": "Trợ lý đã chọn", "sendPlaceholder": "Nhập nội dung trò chuyện...", "sessionGroup": { "config": "Quản lý nhóm", "confirmRemoveGroupAlert": "Bạn sẽ xóa nhóm này, sau khi xóa, trợ lý của nhóm sẽ được di chuyển vào danh sách mặc định, vui lòng xác nhận hành động của bạn", "createAgentSuccess": "Tạo trợ lý thành công", "createGroup": "Thêm nhóm mới", + "createGroupFailed": "Tạo nhóm trò chuyện thất bại", + "createGroupSuccess": "Tạo nhóm trò chuyện thành công", "createSuccess": "Tạo thành công", "creatingAgent": "Đang tạo trợ lý...", "inputPlaceholder": "Vui lòng nhập tên nhóm...", @@ -235,6 +321,12 @@ "loading": "Đang nhận dạng...", "prettifying": "Đang tinh chỉnh..." }, + "supervisor": { + "todoList": { + "allComplete": "Tất cả nhiệm vụ đã hoàn thành", + "title": "Nhiệm vụ đã hoàn thành" + } + }, "thread": { "divider": "Chủ đề con", "threadMessageCount": "{{messageCount}} tin nhắn", @@ -248,6 +340,7 @@ "chats": "Tin nhắn trò chuyện", "historySummary": "Tóm tắt lịch sử", "rest": "Còn lại", + "supervisor": "Người điều phối nhóm", "systemRole": "Vai trò hệ thống", "title": "Chi tiết Ngữ cảnh", "tools": "Công cụ", @@ -273,6 +366,7 @@ "action": "Đọc bằng giọng nói", "clear": "Xóa giọng nói" }, + "untitledAgent": "Trợ lý chưa đặt tên", "updateAgent": "Cập nhật thông tin trợ lý", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "Kích thước tệp video không được vượt quá 20MB, kích thước tệp hiện tại là {{actualSize}}" } }, + "you": "bạn", "zenMode": "Chế độ tập trung" -} +} diff --git a/locales/vi-VN/error.json b/locales/vi-VN/error.json index dc5fe8ccf7f..08870c3e562 100644 --- a/locales/vi-VN/error.json +++ b/locales/vi-VN/error.json @@ -86,15 +86,15 @@ "ExceededContextWindow": "Nội dung yêu cầu hiện tại vượt quá độ dài mà mô hình có thể xử lý, vui lòng giảm khối lượng nội dung và thử lại", "FreePlanLimit": "Hiện tại bạn đang sử dụng tài khoản miễn phí, không thể sử dụng tính năng này. Vui lòng nâng cấp lên gói trả phí để tiếp tục sử dụng.", "GoogleAIBlockReason": { - "BLOCKLIST": "Nội dung của bạn chứa các từ bị cấm. Vui lòng kiểm tra và chỉnh sửa nội dung rồi thử lại.", - "IMAGE_SAFETY": "Nội dung hình ảnh được tạo đã bị chặn vì lý do an toàn. Vui lòng thử chỉnh sửa yêu cầu tạo ảnh.", - "LANGUAGE": "Ngôn ngữ bạn đang sử dụng hiện chưa được hỗ trợ. Vui lòng thử dùng tiếng Anh hoặc ngôn ngữ khác được hỗ trợ để hỏi lại.", - "OTHER": "Nội dung đã bị chặn vì lý do không rõ. Vui lòng thử diễn đạt lại yêu cầu.", - "PROHIBITED_CONTENT": "Yêu cầu của bạn có thể chứa nội dung bị cấm. Vui lòng điều chỉnh yêu cầu để đảm bảo tuân thủ quy định sử dụng.", - "RECITATION": "Nội dung của bạn có thể vi phạm bản quyền và đã bị chặn. Vui lòng thử sử dụng nội dung nguyên bản hoặc diễn đạt lại yêu cầu.", - "SAFETY": "Nội dung của bạn đã bị chặn do chính sách an toàn. Vui lòng điều chỉnh yêu cầu, tránh chứa nội dung có thể gây hại hoặc không phù hợp.", - "SPII": "Nội dung của bạn có thể chứa thông tin cá nhân nhạy cảm. Để bảo vệ quyền riêng tư, vui lòng loại bỏ các thông tin nhạy cảm rồi thử lại.", - "default": "Nội dung bị chặn: {{blockReason}}. Vui lòng điều chỉnh yêu cầu rồi thử lại." + "BLOCKLIST": "Nội dung của bạn chứa từ ngữ bị cấm. Vui lòng kiểm tra và chỉnh sửa đầu vào rồi thử lại.", + "IMAGE_SAFETY": "Nội dung hình ảnh được tạo đã bị chặn vì lý do an toàn. Vui lòng thử chỉnh sửa yêu cầu tạo ảnh của bạn。", + "LANGUAGE": "Ngôn ngữ bạn sử dụng hiện chưa được hỗ trợ. Vui lòng thử dùng tiếng Anh hoặc một ngôn ngữ khác được hỗ trợ.", + "OTHER": "Nội dung bị chặn vì lý do không rõ. Vui lòng thử diễn đạt lại yêu cầu của bạn.", + "PROHIBITED_CONTENT": "Yêu cầu của bạn có thể chứa nội dung bị cấm. Vui lòng điều chỉnh yêu cầu để đảm bảo tuân thủ các quy định sử dụng.", + "RECITATION": "Nội dung của bạn có thể bị chặn vì liên quan đến vấn đề bản quyền. Vui lòng thử dùng nội dung gốc hoặc diễn đạt lại yêu cầu.", + "SAFETY": "Nội dung của bạn bị chặn theo chính sách an toàn. Vui lòng điều chỉnh yêu cầu, tránh chứa các nội dung có thể gây hại hoặc không phù hợp.", + "SPII": "Nội dung của bạn có thể chứa thông tin cá nhân nhạy cảm. Để bảo vệ quyền riêng tư, vui lòng loại bỏ các thông tin nhạy cảm liên quan rồi thử lại.", + "default": "Nội dung bị chặn: {{blockReason}}。Vui lòng điều chỉnh yêu cầu rồi thử lại。" }, "InsufficientQuota": "Xin lỗi, hạn mức của khóa này đã đạt giới hạn, vui lòng kiểm tra số dư tài khoản của bạn hoặc tăng hạn mức khóa trước khi thử lại", "InvalidAccessCode": "Mật khẩu truy cập không hợp lệ hoặc trống, vui lòng nhập mật khẩu truy cập đúng hoặc thêm Khóa API tùy chỉnh", @@ -134,6 +134,9 @@ "stt": { "responseError": "Yêu cầu dịch vụ thất bại, vui lòng kiểm tra cấu hình hoặc thử lại" }, + "supervisor": { + "decisionFailed": "Người điều hành nhóm không thể hoạt động. Vui lòng kiểm tra cấu hình người điều hành của bạn, đảm bảo rằng mô hình, API Key và địa chỉ API đã được cấu hình chính xác." + }, "testConnectionFailed": "Kiểm tra kết nối thất bại: {{error}}", "tts": { "responseError": "Yêu cầu dịch vụ thất bại, vui lòng kiểm tra cấu hình hoặc thử lại" diff --git a/locales/vi-VN/providers.json b/locales/vi-VN/providers.json index d63caeb8ec0..073f9672f16 100644 --- a/locales/vi-VN/providers.json +++ b/locales/vi-VN/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock là dịch vụ do Amazon AWS cung cấp, tập trung vào việc cung cấp các mô hình ngôn ngữ AI và mô hình hình ảnh tiên tiến cho doanh nghiệp. Gia đình mô hình của nó bao gồm dòng Claude của Anthropic, dòng Llama 3.1 của Meta, v.v., bao quát nhiều lựa chọn từ nhẹ đến hiệu suất cao, hỗ trợ nhiều nhiệm vụ như tạo văn bản, đối thoại, xử lý hình ảnh, phù hợp cho các ứng dụng doanh nghiệp với quy mô và nhu cầu khác nhau." }, "bfl": { - "description": "Phòng thí nghiệm nghiên cứu trí tuệ nhân tạo tiên phong dẫn đầu, kiến tạo cơ sở hạ tầng thị giác cho ngày mai." + "description": "Phòng thí nghiệm nghiên cứu trí tuệ nhân tạo tiên phong hàng đầu, kiến tạo hạ tầng thị giác cho ngày mai." + }, + "cerebras": { + "description": "Cerebras là một nền tảng suy luận AI dựa trên hệ thống chuyên dụng CS-3, được thiết kế để cung cấp dịch vụ LLM nhanh nhất thế giới, phản hồi theo thời gian thực và thông lượng cao, nhằm loại bỏ độ trễ và tăng tốc các quy trình làm việc AI phức tạp như tạo mã theo thời gian thực và các tác vụ đại lý." }, "cerebras": { "description": "Cerebras là một nền tảng suy luận AI dựa trên hệ thống chuyên dụng CS-3, được thiết kế để cung cấp dịch vụ LLM nhanh nhất thế giới, phản hồi theo thời gian thực và thông lượng cao, nhằm loại bỏ độ trễ và tăng tốc các quy trình làm việc AI phức tạp như tạo mã theo thời gian thực và các tác vụ đại lý." diff --git a/locales/vi-VN/setting.json b/locales/vi-VN/setting.json index 8cb9536bbc1..c378ea0ff81 100644 --- a/locales/vi-VN/setting.json +++ b/locales/vi-VN/setting.json @@ -35,9 +35,16 @@ "title": "Đặt lại tất cả cài đặt" } }, + "groupTab": { + "chat": "Trò chuyện", + "members": "Thành viên", + "meta": "Thông tin cơ bản" + }, "header": { "desc": "Thiết lập Ưu tiên và Mô hình.", "global": "Cài đặt toàn cầu", + "group": "Cài đặt nhóm trò chuyện", + "groupDesc": "Quản lý nhóm trò chuyện hiện tại", "session": "Cài đặt cuộc trò chuyện", "sessionDesc": "Thiết lập nhân vật và ưu tiên phiên hội thoại.", "sessionWithName": "Cài đặt cuộc trò chuyện · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "Có thêm mô hình đang <1>được lên kế hoạch tích hợp, hãy chờ đợi" }, + "message": { + "success": "Cập nhật thành công" + }, "plugin": { "addMCPPlugin": "Thêm plugin MCP", "addTooltip": "Thêm tiện ích", @@ -294,6 +304,101 @@ }, "title": "Cài đặt chung" }, + "settingGroup": { + "description": { + "placeholder": "Vui lòng nhập mô tả nhóm trò chuyện", + "title": "Mô tả nhóm trò chuyện" + }, + "name": { + "placeholder": "Vui lòng nhập tên nhóm trò chuyện", + "title": "Tên nhóm trò chuyện" + }, + "scene": { + "desc": "Chọn bối cảnh trò chuyện nhóm", + "options": { + "casual": "Thư giãn", + "productive": "Năng suất" + }, + "title": "Bối cảnh trò chuyện nhóm" + }, + "submit": "Cập nhật nhóm trò chuyện", + "systemPrompt": { + "placeholder": "Vui lòng nhập từ khóa hệ thống cho người dẫn chương trình", + "title": "Từ khóa hệ thống người dẫn chương trình" + }, + "title": "Thông tin nhóm trò chuyện" + }, + "settingGroupChat": { + "allowDM": { + "desc": "Sau khi tắt, bạn vẫn có thể chủ động gửi tin nhắn riêng cho trợ lý", + "title": "Cho phép trợ lý gửi tin nhắn riêng" + }, + "enableSupervisor": { + "desc": "Bật chức năng người điều phối nhóm, người điều phối sẽ quản lý luồng hội thoại trong nhóm", + "title": "Bật người điều phối" + }, + "maxResponseInRow": { + "desc": "Chọn số lượng tin nhắn thành viên có thể trả lời liên tiếp. Đặt là 0 để vô hiệu hóa giới hạn này.", + "title": "Số tin nhắn trả lời liên tiếp" + }, + "model": { + "desc": "Phát ngôn của thành viên nhóm sẽ không bị ảnh hưởng. Một số mô hình không thể được sử dụng làm mô hình điều phối.", + "title": "Mô hình người dẫn chương trình" + }, + "orchestratorTitle": "Cài đặt người dẫn chương trình", + "responseOrder": { + "desc": "Đại diện sẽ trả lời theo thứ tự được thiết lập trong nhóm trò chuyện", + "options": { + "natural": "Tự nhiên", + "sequential": "Tuần tự" + }, + "placeholder": "Chọn thứ tự trả lời", + "title": "Thứ tự trả lời" + }, + "responseSpeed": { + "desc": "Điều khiển tốc độ tổng thể của cuộc trò chuyện nhóm", + "options": { + "fast": "Nhanh", + "medium": "Trung bình", + "slow": "Chậm" + }, + "placeholder": "Chọn tốc độ trả lời", + "title": "Tốc độ trả lời" + }, + "revealDM": { + "desc": "Hiển thị nội dung tin nhắn riêng gửi cho các thành viên khác cho bạn xem.", + "title": "Hiển thị nội dung tin nhắn riêng" + }, + "submit": "Cập nhật cài đặt", + "systemPrompt": { + "desc": "Từ khóa hệ thống tùy chỉnh cho người dẫn chương trình trong cuộc trò chuyện nhóm. Điều này có thể ảnh hưởng đến hành vi mặc định của người dẫn.", + "placeholder": "Vui lòng nhập từ khóa hệ thống người dẫn chương trình tùy chỉnh...", + "title": "Từ khóa hệ thống người dẫn chương trình" + }, + "title": "Cài đặt trò chuyện" + }, + "settingGroupMembers": { + "addToGroup": "Thêm vào nhóm", + "availableAgents": "Trợ lý có sẵn", + "defaultAgent": "Trợ lý tùy chỉnh", + "disableHost": "Tắt trợ lý chủ trì", + "edit": "Chỉnh sửa thành viên", + "empty": "Hiện chưa có đại diện trong nhóm này. Nhấn nút + để thêm thành viên.", + "enableHost": "Bật trợ lý chủ trì", + "groupHost": "Chủ trì nhóm", + "groupMembers": "Thành viên nhóm", + "host": { + "description": "Khi chủ trì có mặt trong nhóm, trò chuyện nhóm sẽ được tự động hóa, phù hợp với các nhiệm vụ sáng tạo.", + "title": "Chủ trì" + }, + "noAvailableAgents": "Không có trợ lý khả dụng", + "noDescription": "Chưa có mô tả", + "noMembersInGroup": "Nhóm chưa có thành viên", + "owner": "Bạn (chủ sở hữu)", + "remove": "Xóa thành viên", + "removeFromGroup": "Loại khỏi nhóm", + "you": "Bạn" + }, "settingImage": { "defaultCount": { "desc": "Thiết lập số lượng hình ảnh mặc định được tạo khi bắt đầu một tác vụ mới trong bảng tạo hình ảnh.", @@ -522,6 +627,11 @@ "modelDesc": "Mô hình được chỉ định để tự động đặt tên chủ đề cho vẽ AI", "title": "Tự động đặt tên chủ đề vẽ AI" }, + "groupChatSupervisor": { + "label": "Mô hình giám sát cuộc trò chuyện nhóm", + "modelDesc": "Mô hình được chỉ định để giám sát và quản lý các cuộc trò chuyện nhóm", + "title": "Quản lý giám sát cuộc trò chuyện nhóm" + }, "helpInfo": "Khi tạo trợ lý mới, sẽ sử dụng cài đặt trợ lý mặc định làm giá trị mặc định.", "historyCompress": { "label": "Mô hình lịch sử cuộc trò chuyện", diff --git a/locales/vi-VN/welcome.json b/locales/vi-VN/welcome.json index 63fdbfdb2de..6f3a9c3fde7 100644 --- a/locales/vi-VN/welcome.json +++ b/locales/vi-VN/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "Tôi là trợ lý thông minh cá nhân của bạn {{appName}}. Xin hỏi tôi có thể giúp gì cho bạn ngay bây giờ?
Nếu bạn cần một trợ lý chuyên nghiệp hoặc tùy chỉnh hơn, hãy nhấp vào để tạo trợ lý tùy chỉnh.", "defaultMessageWithoutCreate": "Tôi là trợ lý thông minh cá nhân của bạn {{appName}}. Xin hỏi tôi có thể giúp gì cho bạn ngay bây giờ?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "Thảo luận kỹ thuật và đánh giá đồng nghiệp về các thay đổi và triển khai mã nguồn", + "emoji": "💻", + "prompt": "Hãy cùng nhau xem xét một số mã nguồn. Bạn có thể giúp chúng tôi phân tích mã này và nhận diện các điểm cần cải thiện không?", + "title": "Đánh giá mã nguồn" + }, + "investment": { + "description": "Phân tích thị trường, thảo luận chiến lược đầu tư và chia sẻ những hiểu biết về tài chính", + "emoji": "📈", + "prompt": "Hãy cùng phân tích thị trường. Bạn có thể giúp chúng tôi thảo luận chiến lược đầu tư và chia sẻ những hiểu biết về tài chính không?", + "title": "Câu lạc bộ đầu tư" + }, + "research": { + "description": "Khám phá các khái niệm khoa học, tiến hành thí nghiệm và chia sẻ phát hiện", + "emoji": "🔬", + "prompt": "Hãy cùng khám phá khoa học! Bạn có thể giúp chúng tôi tiến hành thí nghiệm và chia sẻ những phát hiện không?", + "title": "Triển lãm khoa học" + }, + "study": { + "description": "Cuộc họp học tập hợp tác, thảo luận các khái niệm và cùng nhau giải quyết vấn đề", + "emoji": "📚", + "prompt": "Hãy thành lập một nhóm học tập. Bạn có thể giúp chúng tôi hiểu các khái niệm này và cùng nhau giải quyết vấn đề không?", + "title": "Nhóm học tập" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "Sáng tạo, bình luận và thưởng thức các hình thức nghệ thuật thị giác và kỹ thuật số", + "emoji": "🖼️", + "prompt": "Hãy tổ chức một workshop nghệ thuật! Bạn có thể giúp chúng tôi sáng tạo, bình luận và thưởng thức các hình thức nghệ thuật không?", + "title": "Workshop nghệ thuật" + }, + "debate": { + "description": "Thảo luận và tranh luận có cấu trúc về nhiều chủ đề và sự kiện thời sự", + "emoji": "⚖️", + "prompt": "Hãy tổ chức một cuộc tranh luận có cấu trúc. Bạn có thể giúp chúng tôi tổ chức một cuộc thảo luận có lý lẽ về chủ đề này không?", + "title": "Câu lạc bộ tranh luận" + }, + "designReview": { + "description": "Cuộc họp phản hồi hợp tác về các khái niệm thiết kế, nguyên mẫu hoặc tác phẩm sáng tạo", + "emoji": "🎨", + "prompt": "Chúng tôi cần xem xét một số tác phẩm thiết kế. Bạn có thể giúp chúng tôi cung cấp phản hồi mang tính xây dựng về các khái niệm và nguyên mẫu thiết kế không?", + "title": "Đánh giá thiết kế" + }, + "ideation": { + "description": "Sáng tạo ý tưởng hợp tác đa chiều và giải quyết vấn đề sáng tạo", + "emoji": "🧠", + "prompt": "Hãy bắt đầu phiên động não cho dự án. Bạn có thể giúp chúng tôi tạo ra ý tưởng và giải pháp sáng tạo không?", + "title": "Động não" + } + }, + "game": { + "debateClub": { + "description": "Thảo luận và tranh luận có cấu trúc về nhiều chủ đề và sự kiện thời sự", + "emoji": "⚖️", + "prompt": "Hãy tổ chức một cuộc tranh luận có cấu trúc. Bạn có thể giúp chúng tôi tổ chức một cuộc thảo luận có lý lẽ về chủ đề này không?", + "title": "Câu lạc bộ tranh luận" + }, + "gameNight": { + "description": "Trò chơi tương tác vui nhộn và hoạt động xây dựng tinh thần đồng đội", + "emoji": "🎲", + "prompt": "Đêm trò chơi bắt đầu rồi! Bạn có thể giúp chúng tôi tổ chức một số trò chơi tương tác vui nhộn để xây dựng tinh thần đồng đội không?", + "title": "Đêm trò chơi" + }, + "modelUN": { + "description": "Mô phỏng tranh luận Liên Hợp Quốc và đàm phán ngoại giao về các vấn đề toàn cầu", + "emoji": "🌍", + "prompt": "Hãy mô phỏng một cuộc tranh luận Liên Hợp Quốc. Bạn có thể giúp chúng tôi thiết lập một cuộc đàm phán ngoại giao về các vấn đề toàn cầu không?", + "title": "Mô phỏng Liên Hợp Quốc" + }, + "werewolf": { + "description": "Trò chơi suy luận xã hội nơi người chơi tìm ra người sói thông qua chiến lược và thảo luận", + "emoji": "🐺", + "prompt": "Hãy chơi trò chơi Ma Sói! Bạn có thể giúp chúng tôi thiết lập luật chơi và điều hành trò chơi suy luận xã hội này không?", + "title": "Trò chơi Ma Sói" + } + }, + "general": { + "brainstorm": { + "description": "Sáng tạo ý tưởng hợp tác đa chiều và giải quyết vấn đề sáng tạo", + "emoji": "🧠", + "prompt": "Hãy bắt đầu phiên động não cho dự án. Bạn có thể giúp chúng tôi tạo ra ý tưởng và giải pháp sáng tạo không?", + "title": "Động não" + }, + "debate": { + "description": "Thảo luận và tranh luận có cấu trúc về nhiều chủ đề và sự kiện thời sự", + "emoji": "⚖️", + "prompt": "Hãy tổ chức một cuộc tranh luận có cấu trúc. Bạn có thể giúp chúng tôi tổ chức một cuộc thảo luận có lý lẽ về chủ đề này không?", + "title": "Câu lạc bộ tranh luận" + }, + "languagePractice": { + "description": "Luyện nói và học ngôn ngữ mới cùng người bản ngữ", + "emoji": "🗣️", + "prompt": "Hãy cùng luyện tập ngôn ngữ mới. Bạn có thể giúp chúng tôi học và luyện nói ngôn ngữ này không?", + "title": "Luyện tập ngôn ngữ" + }, + "studyGroup": { + "description": "Cuộc họp học tập hợp tác, thảo luận các khái niệm và cùng nhau giải quyết vấn đề", + "emoji": "📚", + "prompt": "Hãy thành lập một nhóm học tập. Bạn có thể giúp chúng tôi hiểu các khái niệm này và cùng nhau giải quyết vấn đề không?", + "title": "Nhóm học tập" + } + }, + "planning": { + "cookingClass": { + "description": "Học và chia sẻ kỹ năng nấu ăn, công thức và truyền thống ẩm thực", + "emoji": "👨‍🍳", + "prompt": "Hãy tham gia lớp học nấu ăn! Bạn có thể giúp chúng tôi học các công thức và kỹ năng nấu ăn mới không?", + "title": "Lớp học nấu ăn" + }, + "fitnessChallenge": { + "description": "Đặt mục tiêu thể dục nhóm, chia sẻ phương pháp tập luyện và động viên nhau", + "emoji": "💪", + "prompt": "Hãy bắt đầu thử thách thể dục! Bạn có thể giúp chúng tôi đặt mục tiêu và động viên nhau giữ gìn sức khỏe không?", + "title": "Thử thách thể dục" + }, + "planningPoker": { + "description": "Kỹ thuật ước lượng dự án sử dụng thẻ bài để đánh giá nhiệm vụ và khối lượng công việc theo Agile", + "emoji": "🃏", + "prompt": "Chúng tôi đang tiến hành Planning Poker cho dự án. Bạn có thể giúp chúng tôi sử dụng kỹ thuật Agile để ước lượng khối lượng công việc của các nhiệm vụ này không?", + "title": "Planning Poker" + }, + "travelPlanning": { + "description": "Lên kế hoạch du lịch, chia sẻ trải nghiệm và khám phá điểm đến mới", + "emoji": "✈️", + "prompt": "Hãy cùng lên kế hoạch du lịch! Bạn có thể giúp chúng tôi nghiên cứu điểm đến và lên lịch trình chuyến đi không?", + "title": "Lên kế hoạch du lịch" + } + }, + "product": { + "codeReview": { + "description": "Thảo luận kỹ thuật và đánh giá đồng nghiệp về các thay đổi và triển khai mã nguồn", + "emoji": "💻", + "prompt": "Hãy cùng nhau xem xét một số mã nguồn. Bạn có thể giúp chúng tôi phân tích mã này và nhận diện các điểm cần cải thiện không?", + "title": "Đánh giá mã nguồn" + }, + "designReview": { + "description": "Cuộc họp phản hồi hợp tác về các khái niệm thiết kế, nguyên mẫu hoặc tác phẩm sáng tạo", + "emoji": "🎨", + "prompt": "Chúng tôi cần xem xét một số tác phẩm thiết kế. Bạn có thể giúp chúng tôi cung cấp phản hồi mang tính xây dựng về các khái niệm và nguyên mẫu thiết kế không?", + "title": "Đánh giá thiết kế" + }, + "sprintPlanning": { + "description": "Kỹ thuật ước lượng dự án sử dụng thẻ bài để đánh giá nhiệm vụ và khối lượng công việc theo Agile", + "emoji": "🃏", + "prompt": "Chúng tôi đang tiến hành Planning Poker cho dự án. Bạn có thể giúp chúng tôi sử dụng kỹ thuật Agile để ước lượng khối lượng công việc của các nhiệm vụ này không?", + "title": "Planning Poker" + }, + "techExchange": { + "description": "Thảo luận về công nghệ mới nổi, đổi mới và xu hướng ngành", + "emoji": "🚀", + "prompt": "Hãy cùng trao đổi công nghệ! Bạn có thể giúp chúng tôi thảo luận về công nghệ mới nổi và xu hướng ngành không?", + "title": "Trao đổi công nghệ" + } + }, + "title": "Gợi ý sử dụng trò chuyện nhóm", + "writing": { + "bookClub": { + "description": "Thảo luận và phân tích văn học về sách, truyện và tác phẩm văn học", + "emoji": "📖", + "prompt": "Hãy bắt đầu thảo luận câu lạc bộ sách. Bạn có thể giúp chúng tôi phân tích cuốn sách này và cùng khám phá các chủ đề không?", + "title": "Câu lạc bộ sách" + }, + "movieClub": { + "description": "Xem và thảo luận phim, phim tài liệu và phương tiện truyền thông hình ảnh cùng nhau", + "emoji": "🎬", + "prompt": "Hãy bắt đầu thảo luận câu lạc bộ phim. Bạn có thể giúp chúng tôi phân tích bộ phim này và cùng khám phá các chủ đề không?", + "title": "Câu lạc bộ phim" + }, + "musicSession": { + "description": "Phiên hợp tác sáng tác, chia sẻ và thưởng thức âm nhạc", + "emoji": "🎵", + "prompt": "Hãy cùng chơi nhạc ngẫu hứng! Bạn có thể giúp chúng tôi sáng tác và thưởng thức âm nhạc cùng nhau không?", + "title": "Nhạc ngẫu hứng" + }, + "studyGroup": { + "description": "Cuộc họp học tập hợp tác, thảo luận các khái niệm và cùng nhau giải quyết vấn đề", + "emoji": "📚", + "prompt": "Hãy thành lập một nhóm học tập. Bạn có thể giúp chúng tôi hiểu các khái niệm này và cùng nhau giải quyết vấn đề không?", + "title": "Nhóm học tập" + } + } + }, + "groupMessage": "Chào mừng đến với chat nhóm! Hợp tác với nhiều trợ lý AI trong không gian hội thoại chung。", + "groupTemplates": { + "analysis": { + "description": "Phân tích sâu sắc dựa trên dữ liệu, nghiên cứu chuyên sâu", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "Bạn giỏi xử lý và phân tích dữ liệu, khám phá các quy luật và xu hướng ẩn sau dữ liệu thông qua biểu đồ và phân tích thống kê.", + "title": "Nhà phân tích dữ liệu" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "Bạn là chuyên gia nghiên cứu, chịu trách nhiệm thu thập thông tin và nghiên cứu sâu, có khả năng phân tích vấn đề toàn diện từ nhiều góc độ.", + "title": "Chuyên gia nghiên cứu" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "Bạn là chuyên gia thống kê, thành thạo các phương pháp và mô hình thống kê, có thể rút ra những hiểu biết kinh doanh giá trị từ dữ liệu.", + "title": "Chuyên gia thống kê" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "Bạn là nhà phân tích định lượng, chuyên xây dựng mô hình định lượng và đánh giá rủi ro, sử dụng phương pháp toán học để giải quyết các vấn đề phức tạp.", + "title": "Nhà phân tích định lượng" + } + ], + "title": "Đội phân tích" + }, + "brainstorm": { + "description": "Tư duy sáng tạo đa chiều, kích thích vô hạn khả năng", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "Bạn là giám đốc sáng tạo, giỏi kiểm soát hướng đi sáng tạo từ góc nhìn tổng thể, có thể biến ý tưởng trừu tượng thành các kế hoạch sáng tạo cụ thể và khả thi.", + "title": "Giám đốc sáng tạo" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Bạn là chuyên gia đổi mới, chuyên tìm kiếm giải pháp mới mẻ và tư duy đột phá, giỏi thoát khỏi khuôn khổ truyền thống để suy nghĩ vấn đề.", + "title": "Chuyên gia đổi mới" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Bạn là chuyên gia tư duy thiết kế, suy nghĩ vấn đề từ góc độ trải nghiệm người dùng và trình bày hình ảnh, chú trọng biểu đạt sáng tạo bằng hình ảnh.", + "title": "Chuyên gia tư duy thiết kế" + } + ], + "title": "Nhóm động não" + }, + "game": { + "description": "Chơi các trò chơi chữ nhiều người như Ma sói và Ai là gián điệp", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "Bạn giỏi tham gia các trò chơi chữ nhiều người và có thể chơi theo luật của trò chơi.", + "title": "Người chơi" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Bạn giỏi tham gia các trò chơi chữ nhiều người và có thể chơi theo luật của trò chơi.", + "title": "Người chơi" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Bạn giỏi tham gia các trò chơi chữ nhiều người và có thể chơi theo luật của trò chơi.", + "title": "Người chơi" + } + ], + "title": "Phòng trò chơi" + }, + "planning": { + "description": "Lập kế hoạch chiến lược và quản lý dự án, điều phối tổng thể", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "Bạn chịu trách nhiệm lập kế hoạch tổng thể dự án, kiểm soát tiến độ và điều phối nguồn lực để đảm bảo dự án hoàn thành đúng hạn và chất lượng cao.", + "title": "Đầu bếp" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "Bạn chịu trách nhiệm xây dựng kế hoạch chiến lược dài hạn, phân tích cơ hội thị trường, đặt mục tiêu và lộ trình thực hiện.", + "title": "Chuyên gia mua nguyên liệu" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "Bạn chịu trách nhiệm xây dựng kế hoạch thực thi chi tiết, phối hợp nguồn lực các phòng ban để đảm bảo tính khả thi của kế hoạch.", + "title": "Chuyên gia phát triển ẩm thực" + } + ], + "title": "Đội phát triển ẩm thực" + }, + "product": { + "description": "Thiết kế và phát triển sản phẩm, tạo ra sản phẩm chất lượng cao", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "Bạn là nhà thiết kế, giỏi thiết kế các loại sản phẩm, có thể thiết kế theo yêu cầu sản phẩm.", + "title": "Nhà thiết kế" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "Bạn là quản lý sản phẩm, chịu trách nhiệm lập kế hoạch, thiết kế, phát triển và bảo trì sản phẩm, đảm bảo chất lượng và trải nghiệm người dùng.", + "title": "Quản lý sản phẩm" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "Bạn là kỹ sư full-stack giàu kinh nghiệm, giỏi phát triển các loại sản phẩm, có thể phát triển theo yêu cầu sản phẩm.", + "title": "Kỹ sư full-stack" + } + ], + "title": "Đội phát triển sản phẩm" + }, + "writing": { + "description": "Sáng tạo và biên tập nội dung, tạo ra bản sao chất lượng cao", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "Bạn giỏi sáng tác nội dung đa thể loại và có thể điều chỉnh phong cách viết phù hợp với các bối cảnh và đối tượng khác nhau.", + "title": "Người viết nội dung" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "Bạn là biên tập viên, chịu trách nhiệm hiệu đính, chỉnh sửa và tối ưu văn bản, đảm bảo nội dung chính xác, mạch lạc và chuyên nghiệp.", + "title": "Biên tập viên" + } + ], + "title": "Cộng đồng viết" + } + }, "qa": { "q01": "LobeHub là gì?", "q02": "{{appName}} là gì?", diff --git a/locales/zh-CN/chat.json b/locales/zh-CN/chat.json index 2ae7c429ea9..82a9e3fc874 100644 --- a/locales/zh-CN/chat.json +++ b/locales/zh-CN/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "模型" }, + "active": "活跃", "agentDefaultMessage": "你好,我是 **{{name}}**,你可以立即与我开始对话,也可以前往 [助手设置]({{url}}) 完善我的信息。", "agentDefaultMessageWithSystemRole": "你好,我是 **{{name}}**,有什么我可以帮忙的吗?", "agentDefaultMessageWithoutEdit": "你好,我是 **{{name}}**,有什么我可以帮忙的吗?", @@ -13,17 +14,28 @@ "thought": "思考过程", "unknownTitle": "未命名作品" }, + "availableAgents": "可用助手", "backToBottom": "跳转至当前", "chatList": { "longMessageDetail": "查看详情" }, "clearCurrentMessages": "清空当前会话消息", "confirmClearCurrentMessages": "即将清空当前会话消息,清空后将无法找回,请确认你的操作", + "confirmRemoveChatGroupItemAlert": "即将删除该群聊,群聊成员不受影响,请确认你的操作", + "confirmRemoveGroupItemAlert": "即将删除该分组,删除后该分组的助手将移动到默认列表,请确认你的操作", + "confirmRemoveGroupSuccess": "群聊删除成功", "confirmRemoveSessionItemAlert": "即将删除该助手,删除后该将无法找回,请确认你的操作", "confirmRemoveSessionSuccess": "助手删除成功", "defaultAgent": "自定义助手", + "defaultGroupChat": "群聊", "defaultList": "默认列表", "defaultSession": "自定义助手", + "dm": { + "placeholder": "你与 {{agentTitle}} 的私信将显示在这里。", + "tooltip": "发私信", + "visibleTo": "仅 {{target}} 可见", + "you": "你" + }, "duplicateSession": { "loading": "复制中...", "success": "复制成功", @@ -58,11 +70,56 @@ "title": "提取网页链接内容" } }, + "group": { + "desc": "与多个 AI 助手在共享的对话空间中协作。", + "memberTooltip": "群内有 {{count}} 个成员", + "orchestratorThinking": "主持人正在思考中...", + "removeMember": "移除成员", + "title": "群组" + }, + "groupDescription": "群组描述", + "groupSidebar": { + "members": { + "addMember": "添加成员", + "memberSettings": "成员设置", + "orchestrator": "主持人", + "orchestratorThinking": "主持人正在思考中...", + "removeMember": "移除成员", + "stopOrchestrator": "停止思考", + "triggerOrchestrator": "开始群聊" + }, + "tabs": { + "host": "主持人", + "members": "成员", + "role": "设定" + } + }, + "groupWizard": { + "chooseMembers": "选择现有助手...", + "createGroup": "创建群聊", + "existingMembers": "已有助手", + "groupMembers": "这些助手也将被添加到您的列表中", + "host": { + "description": "使群聊自动化运行", + "title": "主持人", + "tooltip": "如果禁用群聊主持人,您需要手动@提及成员才能让他们回复" + }, + "memberCount": "{{count}} 个成员", + "noMatchingTemplates": "没有匹配的模板", + "noSelectedTemplates": "没有选择模板", + "noTemplateMembers": "模板中没有成员", + "noTemplates": "没有可用的模板", + "searchTemplates": "搜索模板...", + "title": "创建群聊", + "useTemplate": "使用模板" + }, + "hideForYou": "私信内容已经隐藏,请在设置中开启【显示私信内容】以查看", "history": { "title": "助手将只记住最后{{count}}条消息" }, "historyRange": "历史范围", "historySummary": "历史消息总结", + "inactive": "不活跃", "inbox": { "desc": "开启大脑集群,激发思维火花。你的智能助理,在这里与你交流一切", "title": "随便聊聊" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "正在理解并分析您的意图..." }, + "inviteMembers": "邀请成员", "knowledgeBase": { "all": "所有内容", "allFiles": "所有文件", @@ -101,12 +159,29 @@ "uploadGuide": "上传过的文件可以在「知识库」中查看哦", "viewMore": "查看更多" }, + "memberSelection": { + "addMember": "添加成员", + "allMembers": "全体成员", + "createGroup": "创建群聊", + "noAvailableAgents": "没有可邀请的助手", + "noSelectedAgents": "还未选择助手", + "searchAgents": "搜索助手...", + "setInitialMembers": "选择群成员" + }, + "members": "Members", + "mention": { + "title": "提及成员" + }, "messageAction": { "delAndRegenerate": "删除并重新生成", "deleteDisabledByThreads": "存在子话题,不能删除", "regenerate": "重新生成" }, "messages": { + "dm": { + "sentTo": "仅对{{name}}可见", + "title": "私信" + }, "modelCard": { "credit": "积分", "creditPricing": "定价", @@ -156,6 +231,13 @@ "previousMessage": "上一条消息" }, "newAgent": "新建助手", + "newGroupChat": "新建群聊", + "noAgentsYet": "此群组还没有助手。点击 + 按钮邀请助手。", + "noAvailableAgents": "没有可邀请的助手", + "noMatchingAgents": "没有匹配的助手", + "noMembersYet": "此群组还没有成员。点击 + 按钮邀请助手。", + "noSelectedAgents": "还未选择助手", + "owner": "群主", "pin": "置顶", "pinOff": "取消置顶", "rag": { @@ -196,12 +278,16 @@ "title": "联网搜索" }, "searchAgentPlaceholder": "搜索助手...", + "searchAgents": "搜索助手...", + "selectedAgents": "已选助手", "sendPlaceholder": "输入聊天内容...", "sessionGroup": { "config": "分组管理", "confirmRemoveGroupAlert": "即将删除该分组,删除后该分组的助手将移动到默认列表,请确认你的操作", "createAgentSuccess": "助手创建成功", "createGroup": "添加新分组", + "createGroupFailed": "群聊创建失败", + "createGroupSuccess": "群聊创建成功", "createSuccess": "分组创建成功", "creatingAgent": "助手创建中...", "inputPlaceholder": "请输入分组名称...", @@ -235,6 +321,12 @@ "loading": "识别中...", "prettifying": "润色中..." }, + "supervisor": { + "todoList": { + "allComplete": "所有任务已完成", + "title": "任务已完成" + } + }, "thread": { "divider": "子话题", "threadMessageCount": "{{messageCount}} 条消息", @@ -248,6 +340,7 @@ "chats": "会话消息", "historySummary": "历史总结", "rest": "剩余可用", + "supervisor": "群组主持", "systemRole": "角色设定", "title": "上下文明细", "tools": "插件设定", @@ -273,6 +366,7 @@ "action": "语音朗读", "clear": "删除语音" }, + "untitledAgent": "未命名助手", "updateAgent": "更新助理信息", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "视频文件大小不能超过 20MB,当前文件大小为 {{actualSize}}" } }, + "you": "你", "zenMode": "专注模式" } diff --git a/locales/zh-CN/error.json b/locales/zh-CN/error.json index f7883f1d3a8..e36d9804c14 100644 --- a/locales/zh-CN/error.json +++ b/locales/zh-CN/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "服务请求失败,请检查配置或重试" }, + "supervisor": { + "decisionFailed": "群组主持人无法工作。请检查你的主持人配置,确保配置了正确的模型、API Key 和 API 地址。" + }, "testConnectionFailed": "测试连接失败:{{error}}", "tts": { "responseError": "服务请求失败,请检查配置或重试" diff --git a/locales/zh-CN/setting.json b/locales/zh-CN/setting.json index 0caeb93864f..d4b1d9bb144 100644 --- a/locales/zh-CN/setting.json +++ b/locales/zh-CN/setting.json @@ -35,9 +35,16 @@ "title": "重置所有设置" } }, + "groupTab": { + "chat": "聊天", + "members": "成员", + "meta": "基本信息" + }, "header": { "desc": "偏好与模型设置", "global": "全局设置", + "group": "群聊设置", + "groupDesc": "管理当前群聊", "session": "会话设置", "sessionDesc": "角色设定与会话偏好", "sessionWithName": "会话设置 · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "更多模型正在 <1>计划接入 中,敬请期待" }, + "message": { + "success": "更新成功" + }, "plugin": { "addMCPPlugin": "添加 MCP 插件", "addTooltip": "自定义插件", @@ -294,6 +304,101 @@ }, "title": "通用设置" }, + "settingGroup": { + "description": { + "placeholder": "请输入群聊描述", + "title": "群聊描述" + }, + "name": { + "placeholder": "请输入群聊名称", + "title": "群聊名称" + }, + "scene": { + "desc": "选择群聊场景", + "options": { + "casual": "休闲", + "productive": "生产力" + }, + "title": "群聊场景" + }, + "submit": "更新群聊", + "systemPrompt": { + "placeholder": "请输入主持人系统提示词", + "title": "主持人系统提示词" + }, + "title": "群聊信息" + }, + "settingGroupChat": { + "allowDM": { + "desc": "关闭后,你仍然可以主动向助手发送私信", + "title": "允许助手发送私信" + }, + "enableSupervisor": { + "desc": "启用群聊主持人功能,主持人将管理群聊对话流程", + "title": "启用主持人" + }, + "maxResponseInRow": { + "desc": "选择成员可以连续回复多少条消息。设置为 0 则禁用此限制。", + "title": "连续回复消息数" + }, + "model": { + "desc": "群成员发言不受影响。部分模型无法作为主持人模型使用。", + "title": "主持人模型" + }, + "orchestratorTitle": "主持人设置", + "responseOrder": { + "desc": "代理将按照在群聊中设置的顺序进行回复", + "options": { + "natural": "自然", + "sequential": "顺序" + }, + "placeholder": "选择回复顺序", + "title": "回复顺序" + }, + "responseSpeed": { + "desc": "控制群聊的整体进行速度", + "options": { + "fast": "快速", + "medium": "中等", + "slow": "慢速" + }, + "placeholder": "选择回复速度", + "title": "回复速度" + }, + "revealDM": { + "desc": "使发送给其他成员的私信内容对你可见。", + "title": "显示私信内容" + }, + "submit": "更新设置", + "systemPrompt": { + "desc": "群聊对话主持人的自定义系统提示词。这可能影响默认的主持人行为。", + "placeholder": "请输入自定义主持人系统提示词...", + "title": "主持人系统提示词" + }, + "title": "聊天设置" + }, + "settingGroupMembers": { + "addToGroup": "加入群组", + "availableAgents": "可用助手", + "defaultAgent": "自定义助手", + "disableHost": "关闭主持助手", + "edit": "编辑成员", + "empty": "该群聊中暂无代理。点击 + 按钮添加成员。", + "enableHost": "启用主持助手", + "groupHost": "群主持", + "groupMembers": "群组成员", + "host": { + "description": "主持人在群组中时,群聊将自动化运行,适合发散性任务。", + "title": "主持人" + }, + "noAvailableAgents": "暂无可用助手", + "noDescription": "暂无描述", + "noMembersInGroup": "群组暂无成员", + "owner": "你(所有者)", + "remove": "移除成员", + "removeFromGroup": "移出群组", + "you": "你" + }, "settingImage": { "defaultCount": { "desc": "设置图像生成面板在创建新任务时的默认图片数量。", @@ -522,6 +627,11 @@ "modelDesc": "指定用于 AI 绘画自动命名话题的模型", "title": "AI 绘画自动命名话题" }, + "groupChatSupervisor": { + "label": "群聊监督模型", + "modelDesc": "指定用于监督和管理群聊对话的模型", + "title": "群聊监督管理" + }, "helpInfo": "当创建新助手时,将以默认助手设置作为预设值。", "historyCompress": { "label": "会话历史模型", diff --git a/locales/zh-CN/welcome.json b/locales/zh-CN/welcome.json index 867cdd45b5d..e5bce144756 100644 --- a/locales/zh-CN/welcome.json +++ b/locales/zh-CN/welcome.json @@ -6,6 +6,345 @@ }, "defaultMessage": "我是您的私人智能助理 {{appName}} ,请问现在能帮您做什么?
如果需要获得更加专业或定制的助手,可以点击 创建自定义助手", "defaultMessageWithoutCreate": "我是您的私人智能助理 {{appName}} ,请问现在能帮您做什么?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "对代码变更和实现进行技术讨论和同行评审", + "emoji": "💻", + "prompt": "让我们一起审查一些代码。你能帮助我们分析这些代码并识别改进的地方吗?", + "title": "代码评审" + }, + "investment": { + "description": "分析市场、讨论投资策略并分享财经洞察", + "emoji": "📈", + "prompt": "让我们一起分析市场。你能帮助我们讨论投资策略并分享财经洞察吗?", + "title": "投资俱乐部" + }, + "research": { + "description": "探索科学概念、进行实验并分享发现", + "emoji": "🔬", + "prompt": "让我们一起探索科学吧!你能帮助我们进行实验并分享我们的发现吗?", + "title": "科学展览" + }, + "study": { + "description": "协作学习会议,讨论概念并共同解决问题", + "emoji": "📚", + "prompt": "让我们组成一个学习小组。你能帮助我们理解这些概念并一起解决问题吗?", + "title": "学习小组" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "创作、评论和欣赏各种形式的视觉和数字艺术", + "emoji": "🖼️", + "prompt": "让我们举办艺术工作坊吧!你能帮助我们创作、评论和欣赏各种形式的艺术吗?", + "title": "艺术工作坊" + }, + "debate": { + "description": "关于各种话题和时事的结构化讨论和论辩", + "emoji": "⚖️", + "prompt": "让我们进行一场结构化辩论。你能帮助我们就这个话题组织一场有理有据的讨论吗?", + "title": "辩论俱乐部" + }, + "designReview": { + "description": "针对设计概念、原型或创意作品的协作反馈会议", + "emoji": "🎨", + "prompt": "我们需要审查一些设计作品。你能帮助我们对设计概念和原型提供建设性反馈吗?", + "title": "设计评审" + }, + "ideation": { + "description": "多视角协作式创意产生和创造性问题解决", + "emoji": "🧠", + "prompt": "让我们开始为项目进行头脑风暴吧。你能帮助我们产生创意想法和解决方案吗?", + "title": "头脑风暴" + } + }, + "game": { + "debateClub": { + "description": "关于各种话题和时事的结构化讨论和论辩", + "emoji": "⚖️", + "prompt": "让我们进行一场结构化辩论。你能帮助我们就这个话题组织一场有理有据的讨论吗?", + "title": "辩论俱乐部" + }, + "gameNight": { + "description": "有趣的互动游戏和活动,建立团队纽带并享受乐趣", + "emoji": "🎲", + "prompt": "游戏之夜开始啦!你能帮助我们组织一些有趣的互动游戏来建立团队纽带吗?", + "title": "游戏之夜" + }, + "modelUN": { + "description": "模拟联合国辩论和全球议题的外交谈判", + "emoji": "🌍", + "prompt": "让我们模拟一场联合国辩论。你能帮助我们设置一个关于全球议题的外交谈判吗?", + "title": "模拟联合国" + }, + "werewolf": { + "description": "玩家通过策略和讨论找出狼人的社交推理游戏", + "emoji": "🐺", + "prompt": "让我们玩狼人游戏吧!你能帮助我们设置规则并主持这个社交推理游戏吗?", + "title": "狼人游戏" + } + }, + "general": { + "brainstorm": { + "description": "多视角协作式创意产生和创造性问题解决", + "emoji": "🧠", + "prompt": "让我们开始为项目进行头脑风暴吧。你能帮助我们产生创意想法和解决方案吗?", + "title": "头脑风暴" + }, + "debate": { + "description": "关于各种话题和时事的结构化讨论和论辩", + "emoji": "⚖️", + "prompt": "让我们进行一场结构化辩论。你能帮助我们就这个话题组织一场有理有据的讨论吗?", + "title": "辩论俱乐部" + }, + "languagePractice": { + "description": "与母语者一起练习口语和学习新语言", + "emoji": "🗣️", + "prompt": "让我们一起练习新语言吧。你能帮助我们学习和练习说这门语言吗?", + "title": "语言练习" + }, + "studyGroup": { + "description": "协作学习会议,讨论概念并共同解决问题", + "emoji": "📚", + "prompt": "让我们组成一个学习小组。你能帮助我们理解这些概念并一起解决问题吗?", + "title": "学习小组" + } + }, + "planning": { + "cookingClass": { + "description": "学习和分享烹饪技巧、食谱和烹饪传统", + "emoji": "👨‍🍳", + "prompt": "让我们上烹饪课吧!你能帮助我们一起学习新食谱和烹饪技巧吗?", + "title": "烹饪课堂" + }, + "fitnessChallenge": { + "description": "设定团体健身目标、分享锻炼方法并相互激励", + "emoji": "💪", + "prompt": "让我们开始健身挑战吧!你能帮助我们设定目标并相互激励保持健康吗?", + "title": "健身挑战" + }, + "planningPoker": { + "description": "使用卡片估算项目任务和工作量的敏捷估算技术", + "emoji": "🃏", + "prompt": "我们正在为项目进行规划扑克。你能帮助我们使用敏捷技术估算这些任务的工作量吗?", + "title": "规划扑克" + }, + "travelPlanning": { + "description": "规划旅行、分享旅行经历并发现新目的地", + "emoji": "✈️", + "prompt": "让我们一起规划旅行吧!你能帮助我们研究目的地并规划旅行行程吗?", + "title": "旅行规划" + } + }, + "product": { + "codeReview": { + "description": "对代码变更和实现进行技术讨论和同行评审", + "emoji": "💻", + "prompt": "让我们一起审查一些代码。你能帮助我们分析这些代码并识别改进的地方吗?", + "title": "代码评审" + }, + "designReview": { + "description": "针对设计概念、原型或创意作品的协作反馈会议", + "emoji": "🎨", + "prompt": "我们需要审查一些设计作品。你能帮助我们对设计概念和原型提供建设性反馈吗?", + "title": "设计评审" + }, + "sprintPlanning": { + "description": "使用卡片估算项目任务和工作量的敏捷估算技术", + "emoji": "🃏", + "prompt": "我们正在为项目进行规划扑克。你能帮助我们使用敏捷技术估算这些任务的工作量吗?", + "title": "规划扑克" + }, + "techExchange": { + "description": "讨论新兴技术、创新和行业趋势", + "emoji": "🚀", + "prompt": "让我们进行技术交流吧!你能帮助我们讨论新兴技术和行业趋势吗?", + "title": "技术交流" + } + }, + "title": "群聊用法推荐", + "writing": { + "bookClub": { + "description": "对书籍、故事和文学作品进行文学讨论和分析", + "emoji": "📖", + "prompt": "让我们开始读书俱乐部讨论。你能帮助我们分析这本书并一起探讨其主题吗?", + "title": "读书俱乐部" + }, + "movieClub": { + "description": "一起观看和讨论电影、纪录片和视觉媒体", + "emoji": "🎬", + "prompt": "让我们开始电影俱乐部讨论。你能帮助我们分析这部电影并一起探讨其主题吗?", + "title": "电影俱乐部" + }, + "musicSession": { + "description": "协作音乐创作、分享和欣赏会议", + "emoji": "🎵", + "prompt": "让我们进行音乐即兴演奏吧!你能帮助我们一起创作和欣赏音乐吗?", + "title": "音乐即兴" + }, + "studyGroup": { + "description": "协作学习会议,讨论概念并共同解决问题", + "emoji": "📚", + "prompt": "让我们组成一个学习小组。你能帮助我们理解这些概念并一起解决问题吗?", + "title": "学习小组" + } + } + }, + "groupMessage": "欢迎使用群聊!与多个 AI 助手在共享的对话空间中协作。", + "groupTemplates": { + "analysis": { + "description": "数据驱动洞察,深度研究分析", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "你擅长处理和解释数据,通过图表和统计分析揭示数据背后的规律和趋势。", + "title": "数据分析师" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "你是研究专家,专门负责信息收集和深度调研,能够从多个维度全面分析问题。", + "title": "研究专家" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "你是统计专家,精通各种统计方法和模型,能够从数据中提取有价值的商业洞察。", + "title": "统计专家" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "你是量化分析师,专门进行量化建模和风险评估,用数学方法解决复杂问题。", + "title": "量化分析师" + } + ], + "title": "分析小队" + }, + "brainstorm": { + "description": "多视角创意思维,激发无限可能", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "你是一位创意总监,擅长从宏观角度把控创意方向,能够将抽象概念转化为具体可执行的创意方案。", + "title": "创意总监" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "你是创新专家,专门负责发现新颖的解决方案和突破性思维,善于跳出固有框架思考问题。", + "title": "创新专家" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "你是设计思维专家,从用户体验和视觉呈现角度思考问题,注重创意的可视化表达。", + "title": "设计思维师" + } + ], + "title": "头脑风暴小组" + }, + "game": { + "description": "畅玩各种多人文字游戏,例如狼人杀和谁是卧底", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "你是一位主持人,擅长组织各种多人文字游戏,能够引导玩家进行游戏。", + "title": "游戏主持人" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "你擅长参与各种多人文字游戏,能够根据游戏规则进行游戏。", + "title": "游戏玩家" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "你擅长参与各种多人文字游戏,能够根据游戏规则进行游戏。", + "title": "游戏玩家" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "你擅长参与各种多人文字游戏,能够根据游戏规则进行游戏。", + "title": "游戏玩家" + } + ], + "title": "游戏厅" + }, + "planning": { + "description": "策略规划与项目管理,统筹全局", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "你负责项目的整体规划、进度管控和资源协调,确保项目按时高质量完成。", + "title": "厨师" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "你负责制定长期战略规划,分析市场机会,制定目标和实现路径。", + "title": "原料采购专家" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "你负责制定详细的执行计划,协调各部门资源,确保计划的可执行性。", + "title": "美食研发专家" + } + ], + "title": "美食研发团队" + }, + "product": { + "description": "产品设计与开发,打造优质产品", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "你是设计师,擅长设计各种类型的产品,能够根据产品需求进行设计。", + "title": "设计师" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "你是产品经理,负责产品的规划、设计、开发和维护,确保产品的质量和用户体验。", + "title": "产品经理" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "你是经验丰富的全栈工程师,擅长开发各种类型的产品,能够根据产品需求进行开发。", + "title": "全栈工程师" + } + ], + "title": "产品研发团队" + }, + "writing": { + "description": "内容创作与编辑,打造优质文案", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "你擅长创作各类文体的内容,能够根据不同场景和受众调整写作风格。", + "title": "内容写手" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "你是编辑,负责文本的校对、润色和优化,确保内容的准确性、流畅性和专业性。", + "title": "编辑" + } + ], + "title": "写作圈" + } + }, "qa": { "q01": "LobeHub 是什么?", "q02": "{{appName}} 是什么?", diff --git a/locales/zh-TW/chat.json b/locales/zh-TW/chat.json index c758292c10f..a114da79887 100644 --- a/locales/zh-TW/chat.json +++ b/locales/zh-TW/chat.json @@ -2,6 +2,7 @@ "ModelSwitch": { "title": "模型" }, + "active": "活躍", "agentDefaultMessage": "你好,我是 **{{name}}**,你可以立即與我開始對話,也可以前往 [助手設定]({{url}}) 完善我的資訊。", "agentDefaultMessageWithSystemRole": "你好,我是 **{{name}}**,有什麼我可以幫忙的嗎?", "agentDefaultMessageWithoutEdit": "你好,我是 **{{name}}**,有什麼我可以幫忙的嗎?", @@ -13,17 +14,28 @@ "thought": "思考過程", "unknownTitle": "未命名作品" }, + "availableAgents": "可用助理", "backToBottom": "返回底部", "chatList": { "longMessageDetail": "查看詳情" }, "clearCurrentMessages": "清空當前對話", "confirmClearCurrentMessages": "即將清空當前對話,清空後將無法找回,請確認你的操作", + "confirmRemoveChatGroupItemAlert": "即將刪除該群聊,群聊成員不受影響,請確認你的操作", + "confirmRemoveGroupItemAlert": "即將刪除此分組。刪除後,該分組中的助理將移至預設列表,請確認是否繼續。", + "confirmRemoveGroupSuccess": "群組刪除成功", "confirmRemoveSessionItemAlert": "即將刪除該助手,刪除後將無法找回,請確認你的操作", "confirmRemoveSessionSuccess": "助手刪除成功", "defaultAgent": "自定義助手", + "defaultGroupChat": "群聊", "defaultList": "預設清單", "defaultSession": "自定義助手", + "dm": { + "placeholder": "你與 {{agentTitle}} 的私訊會顯示在這裡。", + "tooltip": "發私訊", + "visibleTo": "僅 {{target}} 可見", + "you": "你" + }, "duplicateSession": { "loading": "複製中...", "success": "複製成功", @@ -58,11 +70,56 @@ "title": "擷取網頁連結內容" } }, + "group": { + "desc": "與多位 AI 助手在共用的對話空間中協作。", + "memberTooltip": "群組內有 {{count}} 位成員", + "orchestratorThinking": "主持人正在思考中...", + "removeMember": "移除成員", + "title": "群組" + }, + "groupDescription": "群組描述", + "groupSidebar": { + "members": { + "addMember": "添加成員", + "memberSettings": "成員設定", + "orchestrator": "主持人", + "orchestratorThinking": "主持人正在思考中...", + "removeMember": "移除成員", + "stopOrchestrator": "停止思考", + "triggerOrchestrator": "開始群聊" + }, + "tabs": { + "host": "主持人", + "members": "成員", + "role": "設定" + } + }, + "groupWizard": { + "chooseMembers": "選擇現有助理...", + "createGroup": "建立群組聊天", + "existingMembers": "已有助理", + "groupMembers": "這些助理也將被加入您的列表中", + "host": { + "description": "使群聊自動化運作", + "title": "主持人", + "tooltip": "若停用群組主持人,您需要手動@提及成員才能讓他們回覆" + }, + "memberCount": "{{count}} 位成員", + "noMatchingTemplates": "沒有符合的範本", + "noSelectedTemplates": "未選擇範本", + "noTemplateMembers": "模板中沒有成員", + "noTemplates": "沒有可用的範本", + "searchTemplates": "搜尋範本...", + "title": "建立群組聊天", + "useTemplate": "使用模板" + }, + "hideForYou": "私訊內容已經隱藏,請在設定中開啟【顯示私訊內容】以查看", "history": { "title": "助手將只記住最後{{count}}條消息" }, "historyRange": "歷史範圍", "historySummary": "歷史消息總結", + "inactive": "不活躍", "inbox": { "desc": "開啟大腦集群,激發思維火花。你的智能助理,在這裡與你交流一切", "title": "隨便聊聊" @@ -83,6 +140,7 @@ "intentUnderstanding": { "title": "正在理解並分析您的意圖..." }, + "inviteMembers": "邀請成員", "knowledgeBase": { "all": "所有內容", "allFiles": "所有檔案", @@ -101,12 +159,29 @@ "uploadGuide": "上傳過的檔案可以在「知識庫」中查看哦", "viewMore": "查看更多" }, + "memberSelection": { + "addMember": "添加成員", + "allMembers": "所有成員", + "createGroup": "建立群聊", + "noAvailableAgents": "沒有可邀請的助理", + "noSelectedAgents": "尚未選擇助理", + "searchAgents": "搜尋助理...", + "setInitialMembers": "選擇群成員" + }, + "members": "成員", + "mention": { + "title": "提及成員" + }, "messageAction": { "delAndRegenerate": "刪除並重新生成", "deleteDisabledByThreads": "存在子話題,無法刪除", "regenerate": "重新生成" }, "messages": { + "dm": { + "sentTo": "僅對{{name}}可見", + "title": "私訊" + }, "modelCard": { "credit": "積分", "creditPricing": "定價", @@ -156,6 +231,13 @@ "previousMessage": "上一條訊息" }, "newAgent": "新建助手", + "newGroupChat": "建立群組", + "noAgentsYet": "此群組還沒有助手。點擊 + 按鈕邀請助手。", + "noAvailableAgents": "沒有可邀請的助手", + "noMatchingAgents": "找不到符合的助手", + "noMembersYet": "此群組尚未有成員。請點選 + 按鈕邀請助理。", + "noSelectedAgents": "尚未選擇助理", + "owner": "群組擁有者", "pin": "置頂", "pinOff": "取消置頂", "rag": { @@ -196,12 +278,16 @@ "title": "連網搜尋" }, "searchAgentPlaceholder": "搜尋助手...", + "searchAgents": "搜尋助手...", + "selectedAgents": "已選擇的助理", "sendPlaceholder": "輸入聊天內容...", "sessionGroup": { "config": "分組管理", "confirmRemoveGroupAlert": "即將刪除該分組,刪除後該分組的助手將移動到預設清單,請確認你的操作", "createAgentSuccess": "助手建立成功", "createGroup": "新增新分組", + "createGroupFailed": "群聊建立失敗", + "createGroupSuccess": "群聊建立成功", "createSuccess": "創建成功", "creatingAgent": "助手建立中...", "inputPlaceholder": "請輸入分組名稱...", @@ -235,6 +321,12 @@ "loading": "識別中...", "prettifying": "潤色中..." }, + "supervisor": { + "todoList": { + "allComplete": "所有任務已完成", + "title": "任務已完成" + } + }, "thread": { "divider": "子話題", "threadMessageCount": "{{messageCount}} 條消息", @@ -248,6 +340,7 @@ "chats": "聊天訊息", "historySummary": "歷史總結", "rest": "剩餘可用", + "supervisor": "群組主持", "systemRole": "角色設定", "title": "上下文詳細資訊", "tools": "外掛程式設定", @@ -273,6 +366,7 @@ "action": "語音朗讀", "clear": "刪除語音" }, + "untitledAgent": "未命名助理", "updateAgent": "更新助理信息", "upload": { "action": { @@ -300,5 +394,6 @@ "videoSizeExceeded": "影片檔案大小不能超過 20MB,當前檔案大小為 {{actualSize}}" } }, + "you": "你", "zenMode": "專注模式" -} +} diff --git a/locales/zh-TW/error.json b/locales/zh-TW/error.json index 47218650e69..f9ad948044b 100644 --- a/locales/zh-TW/error.json +++ b/locales/zh-TW/error.json @@ -134,6 +134,9 @@ "stt": { "responseError": "服務請求失敗,請檢查配置或重試" }, + "supervisor": { + "decisionFailed": "群組主持人無法工作。請檢查你的主持人設定,確保配置了正確的模型、API Key 和 API 位址。" + }, "testConnectionFailed": "測試連線失敗:{{error}}", "tts": { "responseError": "服務請求失敗,請檢查配置或重試" diff --git a/locales/zh-TW/providers.json b/locales/zh-TW/providers.json index 6a7ad94bff4..d412e8667f2 100644 --- a/locales/zh-TW/providers.json +++ b/locales/zh-TW/providers.json @@ -30,7 +30,10 @@ "description": "Bedrock 是亞馬遜 AWS 提供的一項服務,專注於為企業提供先進的 AI 語言模型和視覺模型。其模型家族包括 Anthropic 的 Claude 系列、Meta 的 Llama 3.1 系列等,涵蓋從輕量級到高性能的多種選擇,支持文本生成、對話、圖像處理等多種任務,適用於不同規模和需求的企業應用。" }, "bfl": { - "description": "領先的前沿人工智慧研究實驗室,打造明日的視覺基礎設施。" + "description": "領先的尖端人工智慧研究實驗室,打造明日的視覺基礎建設。" + }, + "cerebras": { + "description": "Cerebras 是一個基於其專用 CS-3 系統的 AI 推理平台,旨在提供全球最快、即時回應、高吞吐量的 LLM 服務,專為消除延遲並加速複雜的 AI 工作流程(如即時程式碼生成與代理任務)而設計。" }, "cerebras": { "description": "Cerebras 是一個基於其專用 CS-3 系統的 AI 推理平台,旨在提供全球最快、即時回應、高吞吐量的 LLM 服務,專為消除延遲並加速複雜的 AI 工作流程(如即時程式碼生成與代理任務)而設計。" diff --git a/locales/zh-TW/setting.json b/locales/zh-TW/setting.json index 43cbd0e9ac6..f3e90452757 100644 --- a/locales/zh-TW/setting.json +++ b/locales/zh-TW/setting.json @@ -35,9 +35,16 @@ "title": "重置所有設定" } }, + "groupTab": { + "chat": "聊天", + "members": "成員", + "meta": "基本資訊" + }, "header": { "desc": "偏好與模型設定", "global": "全域設定", + "group": "群聊設定", + "groupDesc": "管理當前群聊", "session": "對話設定", "sessionDesc": "角色設定與會話偏好", "sessionWithName": "對話設定 · {{name}}", @@ -139,6 +146,9 @@ }, "waitingForMore": "更多模型正在 <1>計劃接入 中,敬請期待" }, + "message": { + "success": "更新成功" + }, "plugin": { "addMCPPlugin": "新增 MCP 外掛", "addTooltip": "新增自訂外掛程式", @@ -294,6 +304,101 @@ }, "title": "通用設定" }, + "settingGroup": { + "description": { + "placeholder": "請輸入群聊描述", + "title": "群聊描述" + }, + "name": { + "placeholder": "請輸入群聊名稱", + "title": "群聊名稱" + }, + "scene": { + "desc": "選擇群聊場景", + "options": { + "casual": "休閒", + "productive": "生產力" + }, + "title": "群聊場景" + }, + "submit": "更新群聊", + "systemPrompt": { + "placeholder": "請輸入主持人系統提示詞", + "title": "主持人系統提示詞" + }, + "title": "群聊資訊" + }, + "settingGroupChat": { + "allowDM": { + "desc": "關閉後,你仍然可以主動向助手發送私訊", + "title": "允許助手發送私訊" + }, + "enableSupervisor": { + "desc": "啟用群聊主持人功能,主持人將管理群聊對話流程", + "title": "啟用主持人" + }, + "maxResponseInRow": { + "desc": "選擇成員可以連續回覆多少條訊息。設定為 0 則禁用此限制。", + "title": "連續回覆訊息數" + }, + "model": { + "desc": "群成員發言不受影響。部分模型無法作為主持人模型使用。", + "title": "主持人模型" + }, + "orchestratorTitle": "主持人設定", + "responseOrder": { + "desc": "代理將按照在群聊中設定的順序進行回覆", + "options": { + "natural": "自然", + "sequential": "順序" + }, + "placeholder": "選擇回覆順序", + "title": "回覆順序" + }, + "responseSpeed": { + "desc": "控制群聊的整體進行速度", + "options": { + "fast": "快速", + "medium": "中等", + "slow": "慢速" + }, + "placeholder": "選擇回覆速度", + "title": "回覆速度" + }, + "revealDM": { + "desc": "使發送給其他成員的私訊內容對你可見。", + "title": "顯示私訊內容" + }, + "submit": "更新設定", + "systemPrompt": { + "desc": "群聊對話主持人的自訂系統提示詞。這可能影響預設的主持人行為。", + "placeholder": "請輸入自訂主持人系統提示詞...", + "title": "主持人系統提示詞" + }, + "title": "聊天設定" + }, + "settingGroupMembers": { + "addToGroup": "加入群組", + "availableAgents": "可用助理", + "defaultAgent": "自訂助理", + "disableHost": "關閉主持助理", + "edit": "編輯成員", + "empty": "該群聊中暫無代理。點擊 + 按鈕添加成員。", + "enableHost": "啟用主持助理", + "groupHost": "群主持", + "groupMembers": "群組成員", + "host": { + "description": "主持人在群組中時,群聊將自動化運行,適合發散性任務。", + "title": "主持人" + }, + "noAvailableAgents": "暫無可用助理", + "noDescription": "暫無描述", + "noMembersInGroup": "群組暫無成員", + "owner": "你(所有者)", + "remove": "移除成員", + "removeFromGroup": "移出群組", + "you": "你" + }, "settingImage": { "defaultCount": { "desc": "設定圖像生成面板在建立新任務時的預設圖片數量。", @@ -522,6 +627,11 @@ "modelDesc": "指定用於 AI 繪畫自動命名話題的模型", "title": "AI 繪畫自動命名話題" }, + "groupChatSupervisor": { + "label": "群組聊天監督模型", + "modelDesc": "指定用於監督與管理群組聊天對話的模型", + "title": "群組聊天監督管理" + }, "helpInfo": "當創建新助手時,將以預設助手設定作為預設值。", "historyCompress": { "label": "會話歷史模型", diff --git a/locales/zh-TW/welcome.json b/locales/zh-TW/welcome.json index 8ea34fc6c6d..1ae7213f22a 100644 --- a/locales/zh-TW/welcome.json +++ b/locales/zh-TW/welcome.json @@ -6,6 +6,340 @@ }, "defaultMessage": "我是您的私人智能助理 {{appName}} ,請問現在能幫您做什麼?
如果需要獲得更加專業或定制的助手,可以點擊 創建自定義助手", "defaultMessageWithoutCreate": "我是您的私人智能助理 {{appName}} ,請問現在能幫您做什麼?", + "groupActivities": { + "analysis": { + "codeReview": { + "description": "對程式碼變更和實作進行技術討論和同儕審查", + "emoji": "💻", + "prompt": "讓我們一起審查一些程式碼。你能幫助我們分析這些程式碼並識別改進的地方嗎?", + "title": "程式碼審查" + }, + "investment": { + "description": "分析市場、討論投資策略並分享財經洞察", + "emoji": "📈", + "prompt": "讓我們一起分析市場。你能幫助我們討論投資策略並分享財經洞察嗎?", + "title": "投資俱樂部" + }, + "research": { + "description": "探索科學概念、進行實驗並分享發現", + "emoji": "🔬", + "prompt": "讓我們一起探索科學吧!你能幫助我們進行實驗並分享我們的發現嗎?", + "title": "科學展覽" + }, + "study": { + "description": "協作學習會議,討論概念並共同解決問題", + "emoji": "📚", + "prompt": "讓我們組成一個學習小組。你能幫助我們理解這些概念並一起解決問題嗎?", + "title": "學習小組" + } + }, + "brainstorm": { + "artWorkshop": { + "description": "創作、評論和欣賞各種形式的視覺和數位藝術", + "emoji": "🖼️", + "prompt": "讓我們舉辦藝術工作坊吧!你能幫助我們創作、評論和欣賞各種形式的藝術嗎?", + "title": "藝術工作坊" + }, + "debate": { + "description": "關於各種話題和時事的結構化討論和論辯", + "emoji": "⚖️", + "prompt": "讓我們進行一場結構化辯論。你能幫助我們就這個話題組織一場有理有據的討論嗎?", + "title": "辯論俱樂部" + }, + "designReview": { + "description": "針對設計概念、原型或創意作品的協作反饋會議", + "emoji": "🎨", + "prompt": "我們需要審查一些設計作品。你能幫助我們對設計概念和原型提供建設性反饋嗎?", + "title": "設計評審" + }, + "ideation": { + "description": "多視角協作式創意產生和創造性問題解決", + "emoji": "🧠", + "prompt": "讓我們開始為專案進行頭腦風暴吧。你能幫助我們產生創意想法和解決方案嗎?", + "title": "頭腦風暴" + } + }, + "game": { + "debateClub": { + "description": "關於各種話題和時事的結構化討論和論辯", + "emoji": "⚖️", + "prompt": "讓我們進行一場結構化辯論。你能幫助我們就這個話題組織一場有理有據的討論嗎?", + "title": "辯論俱樂部" + }, + "gameNight": { + "description": "有趣的互動遊戲和活動,建立團隊紐帶並享受樂趣", + "emoji": "🎲", + "prompt": "遊戲之夜開始啦!你能幫助我們組織一些有趣的互動遊戲來建立團隊紐帶嗎?", + "title": "遊戲之夜" + }, + "modelUN": { + "description": "模擬聯合國辯論和全球議題的外交談判", + "emoji": "🌍", + "prompt": "讓我們模擬一場聯合國辯論。你能幫助我們設定一個關於全球議題的外交談判嗎?", + "title": "模擬聯合國" + }, + "werewolf": { + "description": "玩家透過策略和討論找出狼人的社交推理遊戲", + "emoji": "🐺", + "prompt": "讓我們玩狼人遊戲吧!你能幫助我們設定規則並主持這個社交推理遊戲嗎?", + "title": "狼人遊戲" + } + }, + "general": { + "brainstorm": { + "description": "多視角協作式創意產生和創造性問題解決", + "emoji": "🧠", + "prompt": "讓我們開始為專案進行頭腦風暴吧。你能幫助我們產生創意想法和解決方案嗎?", + "title": "頭腦風暴" + }, + "debate": { + "description": "關於各種話題和時事的結構化討論和論辯", + "emoji": "⚖️", + "prompt": "讓我們進行一場結構化辯論。你能幫助我們就這個話題組織一場有理有據的討論嗎?", + "title": "辯論俱樂部" + }, + "languagePractice": { + "description": "與母語者一起練習口語和學習新語言", + "emoji": "🗣️", + "prompt": "讓我們一起練習新語言吧。你能幫助我們學習和練習說這門語言嗎?", + "title": "語言練習" + }, + "studyGroup": { + "description": "協作學習會議,討論概念並共同解決問題", + "emoji": "📚", + "prompt": "讓我們組成一個學習小組。你能幫助我們理解這些概念並一起解決問題嗎?", + "title": "學習小組" + } + }, + "planning": { + "cookingClass": { + "description": "學習和分享烹飪技巧、食譜和烹飪傳統", + "emoji": "👨‍🍳", + "prompt": "讓我們上烹飪課吧!你能幫助我們一起學習新食譜和烹飪技巧嗎?", + "title": "烹飪課堂" + }, + "fitnessChallenge": { + "description": "設定團體健身目標、分享鍛鍊方法並相互激勵", + "emoji": "💪", + "prompt": "讓我們開始健身挑戰吧!你能幫助我們設定目標並相互激勵保持健康嗎?", + "title": "健身挑戰" + }, + "planningPoker": { + "description": "使用卡片估算專案任務和工作量的敏捷估算技術", + "emoji": "🃏", + "prompt": "我們正在為專案進行規劃撲克。你能幫助我們使用敏捷技術估算這些任務的工作量嗎?", + "title": "規劃撲克" + }, + "travelPlanning": { + "description": "規劃旅行、分享旅行經歷並發現新目的地", + "emoji": "✈️", + "prompt": "讓我們一起規劃旅行吧!你能幫助我們研究目的地並規劃旅行行程嗎?", + "title": "旅行規劃" + } + }, + "product": { + "codeReview": { + "description": "對程式碼變更和實作進行技術討論和同儕審查", + "emoji": "💻", + "prompt": "讓我們一起審查一些程式碼。你能幫助我們分析這些程式碼並識別改進的地方嗎?", + "title": "程式碼審查" + }, + "designReview": { + "description": "針對設計概念、原型或創意作品的協作反饋會議", + "emoji": "🎨", + "prompt": "我們需要審查一些設計作品。你能幫助我們對設計概念和原型提供建設性反饋嗎?", + "title": "設計評審" + }, + "sprintPlanning": { + "description": "使用卡片估算專案任務和工作量的敏捷估算技術", + "emoji": "🃏", + "prompt": "我們正在為專案進行規劃撲克。你能幫助我們使用敏捷技術估算這些任務的工作量嗎?", + "title": "規劃撲克" + }, + "techExchange": { + "description": "討論新興技術、創新和行業趨勢", + "emoji": "🚀", + "prompt": "讓我們進行技術交流吧!你能幫助我們討論新興技術和行業趨勢嗎?", + "title": "技術交流" + } + }, + "title": "群聊用法推薦", + "writing": { + "bookClub": { + "description": "對書籍、故事和文學作品進行文學討論和分析", + "emoji": "📖", + "prompt": "讓我們開始讀書俱樂部討論。你能幫助我們分析這本書並一起探討其主題嗎?", + "title": "讀書俱樂部" + }, + "movieClub": { + "description": "一起觀看和討論電影、紀錄片和視覺媒體", + "emoji": "🎬", + "prompt": "讓我們開始電影俱樂部討論。你能幫助我們分析這部電影並一起探討其主題嗎?", + "title": "電影俱樂部" + }, + "musicSession": { + "description": "協作音樂創作、分享和欣賞會議", + "emoji": "🎵", + "prompt": "讓我們進行音樂即興演奏吧!你能幫助我們一起創作和欣賞音樂嗎?", + "title": "音樂即興" + }, + "studyGroup": { + "description": "協作學習會議,討論概念並共同解決問題", + "emoji": "📚", + "prompt": "讓我們組成一個學習小組。你能幫助我們理解這些概念並一起解決問題嗎?", + "title": "學習小組" + } + } + }, + "groupMessage": "歡迎使用群聊!在共享的對話空間中與多位 AI 助手協作。", + "groupTemplates": { + "analysis": { + "description": "數據驅動洞察,深度研究分析", + "members": [ + { + "avatar": "📊", + "backgroundColor": "#E8F8F5", + "plugins": ["steam"], + "systemRole": "你擅長處理和解釋資料,透過圖表和統計分析揭示資料背後的規律與趨勢。", + "title": "數據分析師" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#E8F5FF", + "systemRole": "你是研究專家,專門負責資訊收集和深度調研,能夠從多個維度全面分析問題。", + "title": "研究專家" + }, + { + "avatar": "📈", + "backgroundColor": "#FFF7E8", + "systemRole": "你是統計專家,精通各種統計方法和模型,能夠從數據中提取有價值的商業洞察。", + "title": "統計專家" + }, + { + "avatar": "🧮", + "backgroundColor": "#F0F8FF", + "systemRole": "你是量化分析師,專門進行量化建模和風險評估,用數學方法解決複雜問題。", + "title": "量化分析師" + } + ], + "title": "分析小隊" + }, + "brainstorm": { + "description": "多視角創意思維,激發無限可能", + "members": [ + { + "avatar": "🧠", + "backgroundColor": "#E8F5FF", + "systemRole": "你是一位創意總監,擅長從宏觀角度把控創意方向,能夠將抽象概念轉化為具體可執行的創意方案。", + "title": "創意總監" + }, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "你是創新專家,專門負責發現新穎的解決方案和突破性思維,善於跳出固有框架思考問題。", + "title": "創新專家" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "你是設計思維專家,從使用者體驗和視覺呈現角度思考問題,注重創意的可視化表達。", + "title": "設計思維師" + } + ], + "title": "頭腦風暴小組" + }, + "game": { + "description": "暢玩各種多人文字遊戲,例如狼人殺和誰是臥底", + "members": [ + null, + { + "avatar": "🧑‍🔬", + "backgroundColor": "#FFF7E8", + "systemRole": "你擅長參與各種多人文字遊戲,能夠根據遊戲規則進行遊戲。", + "title": "遊戲玩家" + }, + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "你擅長參與各種多人文字遊戲,能夠根據遊戲規則進行遊戲。", + "title": "遊戲玩家" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "你擅長參與各種多人文字遊戲,能夠根據遊戲規則進行遊戲。", + "title": "遊戲玩家" + } + ], + "title": "遊戲廳" + }, + "planning": { + "description": "策略規劃與專案管理,統籌全局", + "members": [ + { + "avatar": "📋", + "backgroundColor": "#E8F5FF", + "systemRole": "你負責專案的整體規劃、進度管控和資源協調,確保專案按時高品質完成。", + "title": "廚師" + }, + { + "avatar": "🎯", + "backgroundColor": "#FFF7E8", + "systemRole": "你負責制定長期策略規劃,分析市場機會,制定目標和實現路徑。", + "title": "原料採購專家" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#F0F8FF", + "systemRole": "你負責制定詳細的執行計畫,協調各部門資源,確保計畫的可執行性。", + "title": "美食研發專家" + } + ], + "title": "美食研發團隊" + }, + "product": { + "description": "產品設計與開發,打造優質產品", + "members": [ + { + "avatar": "🎨", + "backgroundColor": "#F6E8FF", + "systemRole": "你是設計師,擅長設計各種類型的產品,能夠根據產品需求進行設計。", + "title": "設計師" + }, + { + "avatar": "🧑", + "backgroundColor": "#E8F5FF", + "systemRole": "你是產品經理,負責產品的規劃、設計、開發和維護,確保產品的品質和使用者體驗。", + "title": "產品經理" + }, + { + "avatar": "🧑‍💻", + "backgroundColor": "#E8F8F5", + "systemRole": "你是經驗豐富的全端工程師,擅長開發各種類型的產品,能夠根據產品需求進行開發。", + "title": "全端工程師" + } + ], + "title": "產品研發團隊" + }, + "writing": { + "description": "內容創作與編輯,打造優質文案", + "members": [ + { + "avatar": "✍️", + "backgroundColor": "#F6E8FF", + "systemRole": "你擅長創作各類文體的內容,能夠根據不同場景和受眾調整寫作風格。", + "title": "內容寫手" + }, + { + "avatar": "🧑‍🎨", + "backgroundColor": "#E8F8F5", + "systemRole": "你是編輯,負責文本的校對、潤飾和優化,確保內容的準確性、流暢性和專業性。", + "title": "編輯" + } + ], + "title": "寫作圈" + } + }, "qa": { "q01": "LobeHub 是什麼?", "q02": "{{appName}} 是什麼?", diff --git a/packages/const/src/settings/systemAgent.ts b/packages/const/src/settings/systemAgent.ts index f38876c15dc..8c3208f5225 100644 --- a/packages/const/src/settings/systemAgent.ts +++ b/packages/const/src/settings/systemAgent.ts @@ -16,6 +16,7 @@ export const DEFAULT_QUERY_REWRITE_SYSTEM_AGENT_ITEM: QueryRewriteSystemAgent = export const DEFAULT_SYSTEM_AGENT_CONFIG: UserSystemAgentConfig = { agentMeta: DEFAULT_SYSTEM_AGENT_ITEM, generationTopic: DEFAULT_SYSTEM_AGENT_ITEM, + groupChatSupervisor: DEFAULT_SYSTEM_AGENT_ITEM, historyCompress: DEFAULT_SYSTEM_AGENT_ITEM, queryRewrite: DEFAULT_QUERY_REWRITE_SYSTEM_AGENT_ITEM, thread: DEFAULT_SYSTEM_AGENT_ITEM, diff --git a/packages/database/src/models/__tests__/chatGroup.test.ts b/packages/database/src/models/__tests__/chatGroup.test.ts new file mode 100644 index 00000000000..07d03aa0c15 --- /dev/null +++ b/packages/database/src/models/__tests__/chatGroup.test.ts @@ -0,0 +1,819 @@ +// @vitest-environment node +import { eq } from 'drizzle-orm'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; + +import { LobeChatDatabase } from '@/database/type'; + +import { + NewChatGroup, + agents as agentsTable, + chatGroups, + chatGroupsAgents, + users, +} from '../../schemas'; +import { ChatGroupModel } from '../chatGroup'; +import { getTestDB } from './_util'; + +const userId = 'test-user'; +const otherUserId = 'other-user'; + +const serverDB: LobeChatDatabase = await getTestDB(); + +type RelationAgent = { + agentId: string; + chatGroupId?: string; + enabled?: boolean | null; + order?: number | null; + role?: string | null; +}; + +const toRelationAgents = (agents: unknown): RelationAgent[] => agents as RelationAgent[]; + +const chatGroupModel = new ChatGroupModel(serverDB, userId); + +beforeEach(async () => { + await serverDB.delete(users); + // Create test users + await serverDB.insert(users).values([{ id: userId }, { id: otherUserId }]); +}); + +afterEach(async () => { + // Clean up test data + await serverDB.delete(users); +}); + +describe('ChatGroupModel', () => { + describe('findById', () => { + it('should find chat group by ID for current user', async () => { + // Create test data + const testGroup: NewChatGroup = { + id: 'test-group-1', + userId, + title: 'Test Group', + description: 'Test group description', + pinned: false, + }; + + await serverDB.insert(chatGroups).values(testGroup); + + // Test finding the group + const result = await chatGroupModel.findById('test-group-1'); + + expect(result).toBeDefined(); + expect(result?.id).toBe('test-group-1'); + expect(result?.title).toBe('Test Group'); + expect(result?.userId).toBe(userId); + }); + + it('should return undefined for non-existent group', async () => { + const result = await chatGroupModel.findById('non-existent'); + expect(result).toBeUndefined(); + }); + + it('should not find groups belonging to other users', async () => { + // Create group for other user + await serverDB.insert(chatGroups).values({ + id: 'other-group', + userId: otherUserId, + title: 'Other User Group', + }); + + // Should not find it + const result = await chatGroupModel.findById('other-group'); + expect(result).toBeUndefined(); + }); + }); + + describe('query', () => { + it('should return chat groups for current user only', async () => { + // Create test data + await serverDB.insert(chatGroups).values([ + { + id: 'group-1', + userId, + title: 'Group 1', + updatedAt: new Date('2024-01-01T10:00:00Z'), + }, + { + id: 'group-2', + userId, + title: 'Group 2', + updatedAt: new Date('2024-01-02T10:00:00Z'), + }, + { + id: 'group-3', + userId: otherUserId, + title: 'Other Group', + updatedAt: new Date('2024-01-03T10:00:00Z'), + }, + ]); + + const result = await chatGroupModel.query(); + + expect(result).toHaveLength(2); + expect(result[0].id).toBe('group-2'); // Most recent first (desc order) + expect(result[1].id).toBe('group-1'); + expect(result.every((group) => group.userId === userId)).toBe(true); + }); + + it('should return empty array when no groups exist', async () => { + const result = await chatGroupModel.query(); + expect(result).toEqual([]); + }); + }); + + describe('queryWithMemberDetails', () => { + it('should return groups with their agent members', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + // Create groups + await trx.insert(chatGroups).values([ + { id: 'group-1', userId, title: 'Group 1' }, + { id: 'group-2', userId, title: 'Group 2' }, + ]); + + // Create agents + await trx.insert(agentsTable).values([ + { id: 'agent-1', userId, title: 'Agent 1' }, + { id: 'agent-2', userId, title: 'Agent 2' }, + { id: 'agent-3', userId, title: 'Agent 3' }, + ]); + + // Link agents to groups + await trx.insert(chatGroupsAgents).values([ + { chatGroupId: 'group-1', agentId: 'agent-1', userId }, + { chatGroupId: 'group-1', agentId: 'agent-2', userId }, + { chatGroupId: 'group-2', agentId: 'agent-3', userId }, + ]); + }); + + const result = await chatGroupModel.queryWithMemberDetails(); + + expect(result).toHaveLength(2); + + const group1 = result.find((g) => g.id === 'group-1'); + expect(group1?.members).toHaveLength(2); + expect(group1?.members.map((m: any) => m.title)).toEqual( + expect.arrayContaining(['Agent 1', 'Agent 2']), + ); + + const group2 = result.find((g) => g.id === 'group-2'); + expect(group2?.members).toHaveLength(1); + expect(group2?.members[0].title).toBe('Agent 3'); + }); + + it('should return groups with empty members array when no agents assigned', async () => { + await serverDB.insert(chatGroups).values({ + id: 'group-no-agents', + userId, + title: 'Group without agents', + }); + + const result = await chatGroupModel.queryWithMemberDetails(); + + expect(result).toHaveLength(1); + expect(result[0].members).toEqual([]); + }); + + it('should return empty array when no groups exist', async () => { + const result = await chatGroupModel.queryWithMemberDetails(); + expect(result).toEqual([]); + }); + }); + + describe('findGroupWithAgents', () => { + it('should return group with its agents', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'group-with-agents', + userId, + title: 'Group with Agents', + }); + + await trx.insert(agentsTable).values([ + { id: 'agent-1', userId, title: 'Agent 1' }, + { id: 'agent-2', userId, title: 'Agent 2' }, + ]); + + await trx.insert(chatGroupsAgents).values([ + { chatGroupId: 'group-with-agents', agentId: 'agent-1', userId, order: 1 }, + { chatGroupId: 'group-with-agents', agentId: 'agent-2', userId, order: 2 }, + ]); + }); + + const result = await chatGroupModel.findGroupWithAgents('group-with-agents'); + + expect(result).toBeDefined(); + expect(result?.group.id).toBe('group-with-agents'); + const agents = toRelationAgents(result?.agents ?? []); + expect(agents).toHaveLength(2); + // Should be ordered by order field + expect(agents[0]?.agentId).toBe('agent-1'); + expect(agents[1]?.agentId).toBe('agent-2'); + }); + + it('should return null for non-existent group', async () => { + const result = await chatGroupModel.findGroupWithAgents('non-existent'); + expect(result).toBeNull(); + }); + }); + + describe('create', () => { + it('should create a new chat group', async () => { + const groupData: Omit = { + title: 'New Chat Group', + description: 'A test chat group', + pinned: true, + config: { + maxResponseInRow: 5, + responseOrder: 'sequential', + scene: 'casual', + }, + }; + + const result = await chatGroupModel.create(groupData); + + expect(result).toBeDefined(); + expect(result.userId).toBe(userId); + expect(result.title).toBe('New Chat Group'); + expect(result.description).toBe('A test chat group'); + expect(result.pinned).toBe(true); + expect(result.config).toEqual({ + maxResponseInRow: 5, + responseOrder: 'sequential', + scene: 'casual', + }); + expect(result.id.startsWith('cg_')).toBe(true); + }); + + it('should create group with custom ID', async () => { + const groupData: Omit = { + id: 'custom-group-id', + title: 'Custom ID Group', + }; + + const result = await chatGroupModel.create(groupData); + + expect(result.id).toBe('custom-group-id'); + expect(result.title).toBe('Custom ID Group'); + }); + }); + + describe('createWithAgents', () => { + it('should create group and add agents', async () => { + // Create test agents + await serverDB.insert(agentsTable).values([ + { id: 'agent-1', userId, title: 'Agent 1' }, + { id: 'agent-2', userId, title: 'Agent 2' }, + ]); + + const groupData: Omit = { + title: 'Group with Agents', + description: 'Group created with agents', + }; + + const result = await chatGroupModel.createWithAgents(groupData, ['agent-1', 'agent-2']); + + expect(result.group).toBeDefined(); + expect(result.group.title).toBe('Group with Agents'); + expect(result.agents).toHaveLength(2); + expect(result.agents[0].agentId).toBe('agent-1'); + expect(result.agents[1].agentId).toBe('agent-2'); + }); + + it('should create group with empty agents array', async () => { + const groupData: Omit = { + title: 'Empty Group', + }; + + const result = await chatGroupModel.createWithAgents(groupData, []); + + expect(result.group).toBeDefined(); + expect(result.agents).toEqual([]); + }); + }); + + describe('update', () => { + it('should update chat group', async () => { + // Create test group + await serverDB.insert(chatGroups).values({ + id: 'update-test', + userId, + title: 'Original Title', + description: 'Original description', + pinned: false, + }); + + const updatedData = { + title: 'Updated Title', + description: 'Updated description', + pinned: true, + }; + + const result = await chatGroupModel.update('update-test', updatedData); + + expect(result.id).toBe('update-test'); + expect(result.title).toBe('Updated Title'); + expect(result.description).toBe('Updated description'); + expect(result.pinned).toBe(true); + expect(result.updatedAt).toBeInstanceOf(Date); + }); + + it('should not update groups belonging to other users', async () => { + // Create group for other user + await serverDB.insert(chatGroups).values({ + id: 'other-user-group', + userId: otherUserId, + title: 'Other User Group', + }); + + // Try to update - should throw + await expect( + chatGroupModel.update('other-user-group', { title: 'Hacked Title' }), + ).rejects.toThrow('Chat group not found or access denied'); + }); + }); + + describe('addAgentToGroup', () => { + it('should add agent to group', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'test-group', + userId, + title: 'Test Group', + }); + + await trx.insert(agentsTable).values({ + id: 'test-agent', + userId, + title: 'Test Agent', + }); + }); + + const result = await chatGroupModel.addAgentToGroup('test-group', 'test-agent', { + order: 5, + role: 'moderator', + }); + + expect(result.chatGroupId).toBe('test-group'); + expect(result.agentId).toBe('test-agent'); + expect(result.userId).toBe(userId); + expect(result.order).toBe(5); + expect(result.role).toBe('moderator'); + }); + + it('should add agent with default options', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'test-group-2', + userId, + title: 'Test Group 2', + }); + + await trx.insert(agentsTable).values({ + id: 'test-agent-2', + userId, + title: 'Test Agent 2', + }); + }); + + const result = await chatGroupModel.addAgentToGroup('test-group-2', 'test-agent-2'); + + expect(result.order).toBe(0); + expect(result.role).toBe('assistant'); + }); + }); + + describe('addAgentsToGroup', () => { + it('should add multiple agents to group', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'multi-agent-group', + userId, + title: 'Multi Agent Group', + }); + + await trx.insert(agentsTable).values([ + { id: 'agent-1', userId, title: 'Agent 1' }, + { id: 'agent-2', userId, title: 'Agent 2' }, + { id: 'agent-3', userId, title: 'Agent 3' }, + ]); + }); + + const result = await chatGroupModel.addAgentsToGroup('multi-agent-group', [ + 'agent-1', + 'agent-2', + 'agent-3', + ]); + + const connectedAgents = toRelationAgents(result); + expect(connectedAgents).toHaveLength(3); + expect(connectedAgents.map((a) => a.agentId)).toEqual(['agent-1', 'agent-2', 'agent-3']); + }); + + it('should throw when adding duplicate agents', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'existing-agent-group', + userId, + title: 'Existing Agent Group', + }); + + await trx.insert(agentsTable).values([ + { id: 'existing-agent', userId, title: 'Existing Agent' }, + { id: 'new-agent', userId, title: 'New Agent' }, + ]); + + // Add one agent already + await trx.insert(chatGroupsAgents).values({ + chatGroupId: 'existing-agent-group', + agentId: 'existing-agent', + userId, + }); + }); + + await expect( + chatGroupModel.addAgentsToGroup('existing-agent-group', ['existing-agent', 'new-agent']), + ).rejects.toThrow(); + + const groupAgents = toRelationAgents( + await chatGroupModel.getGroupAgents('existing-agent-group'), + ); + + expect(groupAgents).toHaveLength(1); + expect(groupAgents[0]?.agentId).toBe('existing-agent'); + }); + + it('should throw when all agents already exist', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'all-existing-group', + userId, + title: 'All Existing Group', + }); + + await trx.insert(agentsTable).values({ + id: 'existing-only', + userId, + title: 'Existing Only', + }); + + await trx.insert(chatGroupsAgents).values({ + chatGroupId: 'all-existing-group', + agentId: 'existing-only', + userId, + }); + }); + + await expect( + chatGroupModel.addAgentsToGroup('all-existing-group', ['existing-only']), + ).rejects.toThrow(); + }); + + it('should throw error for non-existent group', async () => { + await expect( + chatGroupModel.addAgentsToGroup('non-existent-group', ['agent-1']), + ).rejects.toThrow('Group not found'); + }); + }); + + describe('removeAgentFromGroup', () => { + it('should remove agent from group', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'remove-test-group', + userId, + title: 'Remove Test Group', + }); + + await trx.insert(agentsTable).values({ + id: 'remove-test-agent', + userId, + title: 'Remove Test Agent', + }); + + await trx.insert(chatGroupsAgents).values({ + chatGroupId: 'remove-test-group', + agentId: 'remove-test-agent', + userId, + }); + }); + + await chatGroupModel.removeAgentFromGroup('remove-test-group', 'remove-test-agent'); + + // Verify agent was removed + const groupAgents = await chatGroupModel.getGroupAgents('remove-test-group'); + expect(groupAgents).toHaveLength(0); + }); + + it('should handle removing non-existent agent gracefully', async () => { + await serverDB.insert(chatGroups).values({ + id: 'empty-group', + userId, + title: 'Empty Group', + }); + + // Should not throw error + await expect( + chatGroupModel.removeAgentFromGroup('empty-group', 'non-existent-agent'), + ).resolves.not.toThrow(); + }); + }); + + describe('updateAgentInGroup', () => { + it('should update agent settings in group', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'update-agent-group', + userId, + title: 'Update Agent Group', + }); + + await trx.insert(agentsTable).values({ + id: 'update-agent', + userId, + title: 'Update Agent', + }); + + await trx.insert(chatGroupsAgents).values({ + chatGroupId: 'update-agent-group', + agentId: 'update-agent', + userId, + enabled: true, + order: 0, + role: 'participant', + }); + }); + + const result = await chatGroupModel.updateAgentInGroup('update-agent-group', 'update-agent', { + order: 5, + role: 'moderator', + }); + + expect(result.order).toBe(5); + expect(result.role).toBe('moderator'); + expect(result.updatedAt).toBeInstanceOf(Date); + }); + }); + + describe('delete', () => { + it('should delete chat group', async () => { + // Create test group + await serverDB.insert(chatGroups).values({ + id: 'delete-test', + userId, + title: 'Delete Test', + }); + + const result = await chatGroupModel.delete('delete-test'); + + expect(result.id).toBe('delete-test'); + + // Verify group was deleted + const groups = await serverDB + .select() + .from(chatGroups) + .where(eq(chatGroups.id, 'delete-test')); + expect(groups).toHaveLength(0); + }); + + it('should cascade delete associated agents', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'cascade-delete-group', + userId, + title: 'Cascade Delete Group', + }); + + await trx.insert(agentsTable).values({ + id: 'cascade-agent', + userId, + title: 'Cascade Agent', + }); + + await trx.insert(chatGroupsAgents).values({ + chatGroupId: 'cascade-delete-group', + agentId: 'cascade-agent', + userId, + }); + }); + + await chatGroupModel.delete('cascade-delete-group'); + + // Verify group and associated agents were deleted + const groupAgents = await serverDB + .select() + .from(chatGroupsAgents) + .where(eq(chatGroupsAgents.chatGroupId, 'cascade-delete-group')); + expect(groupAgents).toHaveLength(0); + }); + + it('should not delete groups belonging to other users', async () => { + // Create group for other user + await serverDB.insert(chatGroups).values({ + id: 'other-user-delete', + userId: otherUserId, + title: 'Other User Delete', + }); + + // Try to delete - should throw + await expect(chatGroupModel.delete('other-user-delete')).rejects.toThrow( + 'Chat group not found or access denied', + ); + }); + }); + + describe('deleteAll', () => { + it('should delete all groups for current user only', async () => { + // Create test data + await serverDB.insert(chatGroups).values([ + { id: 'user-group-1', userId, title: 'User Group 1' }, + { id: 'user-group-2', userId, title: 'User Group 2' }, + { id: 'other-group', userId: otherUserId, title: 'Other Group' }, + ]); + + await chatGroupModel.deleteAll(); + + // Verify only current user's groups were deleted + const remainingGroups = await serverDB.select().from(chatGroups); + expect(remainingGroups).toHaveLength(1); + expect(remainingGroups[0].userId).toBe(otherUserId); + }); + }); + + describe('getGroupAgents', () => { + it('should return agents in group ordered by order field', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'ordered-group', + userId, + title: 'Ordered Group', + }); + + await trx.insert(agentsTable).values([ + { id: 'agent-1', userId, title: 'Agent 1' }, + { id: 'agent-2', userId, title: 'Agent 2' }, + { id: 'agent-3', userId, title: 'Agent 3' }, + ]); + + await trx.insert(chatGroupsAgents).values([ + { chatGroupId: 'ordered-group', agentId: 'agent-1', userId, order: 2 }, + { chatGroupId: 'ordered-group', agentId: 'agent-2', userId, order: 1 }, + { chatGroupId: 'ordered-group', agentId: 'agent-3', userId, order: 3 }, + ]); + }); + + const result = toRelationAgents(await chatGroupModel.getGroupAgents('ordered-group')); + + expect(result).toHaveLength(3); + expect(result[0]?.agentId).toBe('agent-2'); // order: 1 + expect(result[1]?.agentId).toBe('agent-1'); // order: 2 + expect(result[2]?.agentId).toBe('agent-3'); // order: 3 + }); + + it('should handle numeric ordering correctly (avoiding lexicographic sorting)', async () => { + // This test ensures that order 10 comes after order 2 (not before like with text sorting) + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'numeric-order-group', + userId, + title: 'Numeric Order Group', + }); + + await trx.insert(agentsTable).values([ + { id: 'agent-order-1', userId, title: 'Agent Order 1' }, + { id: 'agent-order-2', userId, title: 'Agent Order 2' }, + { id: 'agent-order-10', userId, title: 'Agent Order 10' }, + ]); + + await trx.insert(chatGroupsAgents).values([ + { chatGroupId: 'numeric-order-group', agentId: 'agent-order-10', userId, order: 10 }, + { chatGroupId: 'numeric-order-group', agentId: 'agent-order-2', userId, order: 2 }, + { chatGroupId: 'numeric-order-group', agentId: 'agent-order-1', userId, order: 1 }, + ]); + }); + + const result = toRelationAgents(await chatGroupModel.getGroupAgents('numeric-order-group')); + + expect(result).toHaveLength(3); + // With integer ordering: 1, 2, 10 (correct) + // With text ordering it would be: 1, 10, 2 (incorrect lexicographic) + expect(result[0]?.agentId).toBe('agent-order-1'); // order: 1 + expect(result[1]?.agentId).toBe('agent-order-2'); // order: 2 + expect(result[2]?.agentId).toBe('agent-order-10'); // order: 10 + }); + }); + + describe('getEnabledGroupAgents', () => { + it('should return only enabled agents', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values({ + id: 'enabled-test-group', + userId, + title: 'Enabled Test Group', + }); + + await trx.insert(agentsTable).values([ + { id: 'enabled-agent', userId, title: 'Enabled Agent' }, + { id: 'disabled-agent', userId, title: 'Disabled Agent' }, + ]); + + await trx.insert(chatGroupsAgents).values([ + { chatGroupId: 'enabled-test-group', agentId: 'enabled-agent', userId, enabled: true }, + { chatGroupId: 'enabled-test-group', agentId: 'disabled-agent', userId, enabled: false }, + ]); + }); + + const result = toRelationAgents( + await chatGroupModel.getEnabledGroupAgents('enabled-test-group'), + ); + + expect(result).toHaveLength(1); + expect(result[0]?.agentId).toBe('enabled-agent'); + }); + }); + + describe('getGroupsWithAgents', () => { + it('should return groups containing specified agents', async () => { + // Create test data + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values([ + { id: 'group-a', userId, title: 'Group A' }, + { id: 'group-b', userId, title: 'Group B' }, + { id: 'group-c', userId, title: 'Group C' }, + ]); + + await trx.insert(agentsTable).values([ + { id: 'agent-x', userId, title: 'Agent X' }, + { id: 'agent-y', userId, title: 'Agent Y' }, + { id: 'agent-z', userId, title: 'Agent Z' }, + ]); + + await trx.insert(chatGroupsAgents).values([ + { chatGroupId: 'group-a', agentId: 'agent-x', userId }, + { chatGroupId: 'group-a', agentId: 'agent-y', userId }, + { chatGroupId: 'group-b', agentId: 'agent-y', userId }, + { chatGroupId: 'group-c', agentId: 'agent-z', userId }, + ]); + }); + + const result = await chatGroupModel.getGroupsWithAgents(['agent-x', 'agent-y']); + + expect(result).toHaveLength(2); + expect(result.map((g) => g.id)).toEqual(expect.arrayContaining(['group-a', 'group-b'])); + }); + + it('should return all groups when no agentIds provided', async () => { + await serverDB.insert(chatGroups).values([ + { id: 'all-group-1', userId, title: 'All Group 1' }, + { id: 'all-group-2', userId, title: 'All Group 2' }, + ]); + + const result = await chatGroupModel.getGroupsWithAgents(); + + expect(result).toHaveLength(2); + }); + + it('should return empty array when no matching groups found', async () => { + const result = await chatGroupModel.getGroupsWithAgents(['non-existent-agent']); + expect(result).toEqual([]); + }); + + it('should only return groups for current user', async () => { + // Create test data for multiple users + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values([ + { id: 'user-group', userId, title: 'User Group' }, + { id: 'other-user-group', userId: otherUserId, title: 'Other User Group' }, + ]); + + await trx.insert(agentsTable).values([ + { id: 'user-agent', userId, title: 'User Agent' }, + { id: 'other-agent', userId: otherUserId, title: 'Other Agent' }, + ]); + + await trx.insert(chatGroupsAgents).values([ + { chatGroupId: 'user-group', agentId: 'user-agent', userId }, + { chatGroupId: 'other-user-group', agentId: 'other-agent', userId: otherUserId }, + ]); + }); + + const result = await chatGroupModel.getGroupsWithAgents(['user-agent', 'other-agent']); + + expect(result).toHaveLength(1); + expect(result[0].id).toBe('user-group'); + expect(result[0].userId).toBe(userId); + }); + }); +}); diff --git a/packages/database/src/models/__tests__/message.test.ts b/packages/database/src/models/__tests__/message.test.ts index dbdff4f0e1e..8ad6471597b 100644 --- a/packages/database/src/models/__tests__/message.test.ts +++ b/packages/database/src/models/__tests__/message.test.ts @@ -9,6 +9,8 @@ import { getTestDB } from '../../models/__tests__/_util'; import { chunks, embeddings, + agents, + chatGroups, fileChunks, files, messagePlugins, @@ -31,6 +33,7 @@ const serverDB: LobeChatDatabase = await getTestDB(); const userId = 'message-db'; const messageModel = new MessageModel(serverDB, userId); const embeddingsId = uuid(); + beforeEach(async () => { // 在每个测试用例之前,清空表 await serverDB.transaction(async (trx) => { @@ -177,6 +180,51 @@ describe('MessageModel', () => { expect(result[1].id).toBe('2'); }); + it('should filter messages by groupId and expose group metadata', async () => { + await serverDB.transaction(async (trx) => { + await trx.insert(chatGroups).values([ + { id: 'group-1', userId, title: 'Group 1' }, + { id: 'group-2', userId, title: 'Group 2' }, + ]); + + await trx.insert(agents).values([ + { id: 'agent-group', userId, title: 'Agent Group' }, + { id: 'agent-other', userId, title: 'Agent Other' }, + ]); + + await trx.insert(messages).values([ + { + id: 'group-message', + userId, + role: 'assistant', + content: 'group message', + groupId: 'group-1', + agentId: 'agent-group', + targetId: 'user', + createdAt: new Date('2024-01-01'), + }, + { + id: 'other-message', + userId, + role: 'assistant', + content: 'other group message', + groupId: 'group-2', + agentId: 'agent-other', + targetId: 'user', + createdAt: new Date('2024-01-02'), + }, + ]); + }); + + const result = await messageModel.query({ groupId: 'group-1' }); + + expect(result).toHaveLength(1); + expect(result[0].id).toBe('group-message'); + expect(result[0].groupId).toBe('group-1'); + expect(result[0].agentId).toBe('agent-group'); + expect(result[0].targetId).toBe('user'); + }); + it('should query messages with join', async () => { // 创建测试数据 await serverDB.transaction(async (trx) => { diff --git a/packages/database/src/models/__tests__/session.test.ts b/packages/database/src/models/__tests__/session.test.ts index 5b3c59d1ff5..bf6df4bddae 100644 --- a/packages/database/src/models/__tests__/session.test.ts +++ b/packages/database/src/models/__tests__/session.test.ts @@ -115,6 +115,81 @@ describe('SessionModel', () => { expect(result.sessions).toHaveLength(0); expect(result.sessionGroups).toHaveLength(0); }); + + it('should map group sessions with members correctly', async () => { + // Create a group session with multiple agents + await serverDB.transaction(async (trx) => { + // Create a group session + await trx.insert(sessions).values({ + id: 'group-session-1', + userId, + type: 'group', + title: 'Test Group', + description: 'A test group session', + avatar: 'group-avatar', + backgroundColor: 'blue', + }); + + // Create agents + await trx.insert(agents).values([ + { id: 'agent-1', userId, title: 'Agent 1', model: 'gpt-4' }, + { id: 'agent-2', userId, title: 'Agent 2', model: 'gpt-3.5-turbo' }, + { id: 'agent-3', userId, title: 'Agent 3', model: 'claude-2' }, + ]); + + // Link agents to the group session + await trx.insert(agentsToSessions).values([ + { sessionId: 'group-session-1', agentId: 'agent-1', userId }, + { sessionId: 'group-session-1', agentId: 'agent-2', userId }, + { sessionId: 'group-session-1', agentId: 'agent-3', userId }, + ]); + }); + + const result = await sessionModel.queryWithGroups(); + + // Verify group session mapping + expect(result.sessions).toHaveLength(1); + const groupSession = result.sessions[0] as any; + + expect(groupSession.type).toBe('group'); + expect(groupSession.meta).toEqual({ + avatar: 'group-avatar', + backgroundColor: 'blue', + description: 'A test group session', + tags: undefined, + title: 'Test Group', + }); + + // Verify members are mapped correctly + expect(groupSession.members).toHaveLength(3); + expect(groupSession.members[0]).toMatchObject({ + agentId: 'agent-1', + chatGroupId: 'group-session-1', + enabled: true, + order: 0, + role: 'participant', + title: 'Agent 1', + model: 'gpt-4', + }); + expect(groupSession.members[1]).toMatchObject({ + agentId: 'agent-2', + chatGroupId: 'group-session-1', + enabled: true, + order: 1, + role: 'participant', + title: 'Agent 2', + model: 'gpt-3.5-turbo', + }); + expect(groupSession.members[2]).toMatchObject({ + agentId: 'agent-3', + chatGroupId: 'group-session-1', + enabled: true, + order: 2, + role: 'participant', + title: 'Agent 3', + model: 'claude-2', + }); + }); }); describe('findById', () => { @@ -338,6 +413,71 @@ describe('SessionModel', () => { // 断言结果 expect(result.id).toBe(customId); }); + + it('should create a session associated with a group', async () => { + await serverDB.insert(sessionGroups).values({ + id: 'session-group-1', + name: 'Session Group', + userId, + }); + + const result = await sessionModel.create({ + type: 'agent', + config: { model: 'gpt-3.5-turbo' }, + session: { title: 'Grouped Session', groupId: 'session-group-1' }, + }); + + expect(result.groupId).toBe('session-group-1'); + + const fetched = await sessionModel.findByIdOrSlug(result.id); + const fetchedWithGroup = fetched as typeof fetched & { + group?: { id: string | null } | null; + }; + expect(fetchedWithGroup?.group?.id).toBe('session-group-1'); + }); + + it('should create a group-type session', async () => { + const result = await sessionModel.create({ + type: 'group', + session: { + title: 'Group Chat Session', + description: 'Multi-agent group chat', + }, + }); + + expect(result.id).toBeDefined(); + expect(result.userId).toBe(userId); + expect(result.type).toBe('group'); + expect(result.title).toBe('Group Chat Session'); + expect(result.description).toBe('Multi-agent group chat'); + + // Verify group session was created + const fetched = await sessionModel.findByIdOrSlug(result.id); + expect(fetched).toBeDefined(); + expect(fetched?.type).toBe('group'); + }); + + it('should return existing session if slug already exists', async () => { + // Create a session with a slug + const first = await sessionModel.create({ + type: 'agent', + config: { model: 'gpt-4' }, + session: { title: 'First Session' }, + slug: 'test-slug', + }); + + // Try to create another session with the same slug + const second = await sessionModel.create({ + type: 'agent', + config: { model: 'gpt-3.5-turbo' }, + session: { title: 'Second Session' }, + slug: 'test-slug', + }); + + // Should return the existing session + expect(second.id).toBe(first.id); + expect(second.title).toBe('First Session'); + }); }); describe('batchCreate', () => { @@ -1149,17 +1289,24 @@ describe('SessionModel', () => { describe('findSessionsByKeywords', () => { it('should handle errors gracefully and return empty array', async () => { - // 这个测试旨在覆盖 findSessionsByKeywords 中的错误处理逻辑 (lines 484-486) - // 通过模拟一个可能导致错误的场景来触发 catch 块 + // 这个测试旨在覆盖 findSessionsByKeywords 中的错误处理逻辑 const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); - // 创建一个会导致错误的场景 - // 我们可以通过传递一个会导致数据库查询问题的关键词来测试错误处理 + // Mock the database query to throw an error + const originalFindMany = serverDB.query.agents.findMany; + serverDB.query.agents.findMany = vi.fn().mockRejectedValue(new Error('Database error')); + const result = await sessionModel.findSessionsByKeywords({ keyword: 'test' }); // 即使发生错误,方法也应该返回一个空数组 expect(Array.isArray(result)).toBe(true); + expect(result).toEqual([]); + expect(consoleSpy).toHaveBeenCalledWith('findSessionsByKeywords error:', expect.any(Error), { + keyword: 'test', + }); + // Restore original method + serverDB.query.agents.findMany = originalFindMany; consoleSpy.mockRestore(); }); diff --git a/packages/database/src/models/__tests__/topic.test.ts b/packages/database/src/models/__tests__/topic.test.ts index 15e95c122e1..7994a230c6b 100644 --- a/packages/database/src/models/__tests__/topic.test.ts +++ b/packages/database/src/models/__tests__/topic.test.ts @@ -1,15 +1,14 @@ import { eq, inArray } from 'drizzle-orm'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { messages, sessions, topics, users } from '../../schemas'; +import { chatGroups, messages, sessions, topics, users } from '../../schemas'; import { LobeChatDatabase } from '../../type'; import { CreateTopicParams, TopicModel } from '../topic'; import { getTestDB } from './_util'; -const serverDB: LobeChatDatabase = await getTestDB(); - const userId = 'topic-user-test'; const sessionId = 'topic-session'; +const serverDB: LobeChatDatabase = await getTestDB(); const topicModel = new TopicModel(serverDB, userId); describe('TopicModel', () => { @@ -44,7 +43,7 @@ describe('TopicModel', () => { }); // 调用 query 方法 - const result = await topicModel.query({ sessionId }); + const result = await topicModel.query({ containerId: sessionId }); // 断言结果 expect(result).toHaveLength(4); @@ -87,11 +86,50 @@ describe('TopicModel', () => { }); // 应该只返回属于 session1 的 topic - const result = await topicModel.query({ sessionId: 'session1' }); + const result = await topicModel.query({ containerId: 'session1' }); expect(result).toHaveLength(1); expect(result[0].id).toBe('1'); }); + it('should query topics by group ID', async () => { + await serverDB.transaction(async (tx) => { + await tx.insert(chatGroups).values([ + { id: 'chat-group-1', title: 'Chat Group 1', userId }, + { id: 'chat-group-2', title: 'Chat Group 2', userId }, + ]); + + await tx.insert(topics).values([ + { + id: 'group-topic-1', + userId, + groupId: 'chat-group-1', + favorite: true, + updatedAt: new Date('2023-05-01'), + }, + { + id: 'group-topic-2', + userId, + groupId: 'chat-group-1', + favorite: false, + updatedAt: new Date('2023-04-01'), + }, + { + id: 'group-topic-3', + userId, + groupId: 'chat-group-2', + favorite: true, + updatedAt: new Date('2023-06-01'), + }, + ]); + }); + + const result = await topicModel.query({ containerId: 'chat-group-1' }); + + expect(result).toHaveLength(2); + expect(result[0].id).toBe('group-topic-1'); + expect(result[1].id).toBe('group-topic-2'); + }); + it('should return topics based on pagination parameters', async () => { // 创建测试数据 await serverDB.insert(topics).values([ @@ -101,8 +139,8 @@ describe('TopicModel', () => { ]); // 调用 query 方法 - const result1 = await topicModel.query({ current: 0, pageSize: 2, sessionId }); - const result2 = await topicModel.query({ current: 1, pageSize: 2, sessionId }); + const result1 = await topicModel.query({ containerId: sessionId, current: 0, pageSize: 2 }); + const result2 = await topicModel.query({ containerId: sessionId, current: 1, pageSize: 2 }); // 断言返回结果符合分页要求 expect(result1).toHaveLength(2); @@ -311,6 +349,49 @@ describe('TopicModel', () => { }); }); + describe('batchDeleteByGroupId', () => { + it('should delete all topics associated with a group', async () => { + await serverDB.insert(chatGroups).values([ + { id: 'group1', userId, title: 'Group 1' }, + { id: 'group2', userId, title: 'Group 2' }, + ]); + await serverDB.insert(topics).values([ + { id: 'topic1', groupId: 'group1', userId }, + { id: 'topic2', groupId: 'group1', userId }, + { id: 'topic3', groupId: 'group2', userId }, + { id: 'topic4', userId }, + ]); + + // 调用 batchDeleteByGroupId 方法 + await topicModel.batchDeleteByGroupId('group1'); + + // 断言属于 group1 的 topics 都被删除了 + expect( + await serverDB.select().from(topics).where(eq(topics.groupId, 'group1')), + ).toHaveLength(0); + expect(await serverDB.select().from(topics)).toHaveLength(2); + }); + + it('should delete all topics associated without groupId', async () => { + await serverDB.insert(chatGroups).values([{ id: 'group1', userId, title: 'Group 1' }]); + + await serverDB.insert(topics).values([ + { id: 'topic1', groupId: 'group1', userId }, + { id: 'topic2', groupId: 'group1', userId }, + { id: 'topic4', userId }, + ]); + + // 调用 batchDeleteByGroupId 方法 + await topicModel.batchDeleteByGroupId(); + + // 断言属于 group1 的 topics 都被删除了 + expect( + await serverDB.select().from(topics).where(eq(topics.groupId, 'group1')), + ).toHaveLength(2); + expect(await serverDB.select().from(topics)).toHaveLength(2); + }); + }); + describe('batchDelete', () => { it('should delete multiple topics and their associated messages', async () => { await serverDB.transaction(async (tx) => { diff --git a/packages/database/src/models/chatGroup.ts b/packages/database/src/models/chatGroup.ts new file mode 100644 index 00000000000..3e67d2ae310 --- /dev/null +++ b/packages/database/src/models/chatGroup.ts @@ -0,0 +1,252 @@ +import { and, desc, eq, inArray } from 'drizzle-orm'; + +import { + ChatGroupAgentItem, + ChatGroupItem, + NewChatGroup, + NewChatGroupAgent, + chatGroups, + chatGroupsAgents, +} from '@/database/schemas'; +import { LobeChatDatabase } from '@/database/type'; + +export class ChatGroupModel { + private userId: string; + private db: LobeChatDatabase; + + constructor(db: LobeChatDatabase, userId: string) { + this.userId = userId; + this.db = db; + } + // ******* Query Methods ******* // + + async findById(id: string): Promise { + const item = await this.db.query.chatGroups.findFirst({ + where: and(eq(chatGroups.id, id), eq(chatGroups.userId, this.userId)), + }); + + return item; + } + + async query(): Promise { + return this.db.query.chatGroups.findMany({ + orderBy: [desc(chatGroups.updatedAt)], + where: eq(chatGroups.userId, this.userId), + }); + } + + async queryWithMemberDetails(): Promise { + const groups = await this.query(); + if (groups.length === 0) return []; + + const groupIds = groups.map((g) => g.id); + + const groupAgents = await this.db.query.chatGroupsAgents.findMany({ + where: inArray(chatGroupsAgents.chatGroupId, groupIds), + with: { agent: true }, + }); + + const groupAgentMap = new Map(); + + for (const groupAgent of groupAgents) { + if (!groupAgent.agent) continue; + + const groupList = groupAgentMap.get(groupAgent.chatGroupId) || []; + groupList.push(groupAgent.agent); + groupAgentMap.set(groupAgent.chatGroupId, groupList); + } + + return groups.map((group) => ({ + ...group, + members: groupAgentMap.get(group.id) || [], + })); + } + + async findGroupWithAgents(groupId: string): Promise<{ + agents: ChatGroupAgentItem[]; + group: ChatGroupItem; + } | null> { + const group = await this.findById(groupId); + if (!group) return null; + + const agents = await this.db.query.chatGroupsAgents.findMany({ + orderBy: [chatGroupsAgents.order], + where: eq(chatGroupsAgents.chatGroupId, groupId), + }); + + return { agents, group }; + } + + // ******* Create Methods ******* // + + async create(params: Omit): Promise { + const [result] = await this.db + .insert(chatGroups) + .values({ ...params, userId: this.userId }) + .returning(); + + return result; + } + + async createWithAgents( + groupParams: Omit, + agentIds: string[], + ): Promise<{ agents: NewChatGroupAgent[]; group: ChatGroupItem }> { + const group = await this.create(groupParams); + + if (agentIds.length === 0) { + return { agents: [], group }; + } + + const agentParams: NewChatGroupAgent[] = agentIds.map((agentId, index) => ({ + agentId, + chatGroupId: group.id, + order: index, + role: 'assistant', + userId: this.userId, + })); + + const agents = await this.db.insert(chatGroupsAgents).values(agentParams).returning(); + + return { agents, group }; + } + + // ******* Update Methods ******* // + + async update(id: string, value: Partial): Promise { + const [result] = await this.db + .update(chatGroups) + .set({ ...value, updatedAt: new Date() }) + .where(and(eq(chatGroups.id, id), eq(chatGroups.userId, this.userId))) + .returning(); + + if (!result) { + throw new Error('Chat group not found or access denied'); + } + + return result; + } + + async addAgentToGroup( + groupId: string, + agentId: string, + options?: { order?: number; role?: string }, + ): Promise { + const params: NewChatGroupAgent = { + agentId, + chatGroupId: groupId, + order: options?.order || 0, + role: options?.role || 'assistant', + userId: this.userId, + }; + + const [result] = await this.db.insert(chatGroupsAgents).values(params).returning(); + return result; + } + + async addAgentsToGroup(groupId: string, agentIds: string[]): Promise { + const group = await this.findById(groupId); + if (!group) throw new Error('Group not found'); + + const existingAgents = await this.getGroupAgents(groupId); + const existingAgentIds = new Set(existingAgents.map((a) => a.id)); + + const newAgentIds = agentIds.filter((id) => !existingAgentIds.has(id)); + + if (newAgentIds.length === 0) { + return []; + } + + const newAgents: NewChatGroupAgent[] = newAgentIds.map((agentId) => ({ + agentId, + chatGroupId: groupId, + enabled: true, + userId: this.userId, + })); + + return this.db.insert(chatGroupsAgents).values(newAgents).returning(); + } + + async removeAgentFromGroup(groupId: string, agentId: string): Promise { + await this.db + .delete(chatGroupsAgents) + .where(and(eq(chatGroupsAgents.chatGroupId, groupId), eq(chatGroupsAgents.agentId, agentId))); + } + + async updateAgentInGroup( + groupId: string, + agentId: string, + updates: Partial>, + ): Promise { + const [result] = await this.db + .update(chatGroupsAgents) + .set({ ...updates, updatedAt: new Date() }) + .where(and(eq(chatGroupsAgents.chatGroupId, groupId), eq(chatGroupsAgents.agentId, agentId))) + .returning(); + + return result; + } + + // ******* Delete Methods ******* // + + async delete(id: string): Promise { + // Agents are automatically deleted due to CASCADE constraint + const [result] = await this.db + .delete(chatGroups) + .where(and(eq(chatGroups.id, id), eq(chatGroups.userId, this.userId))) + .returning(); + + if (!result) { + throw new Error('Chat group not found or access denied'); + } + + return result; + } + + async deleteAll(): Promise { + await this.db.delete(chatGroups).where(eq(chatGroups.userId, this.userId)); + } + + // ******* Agent Query Methods ******* // + + async getGroupAgents(groupId: string): Promise { + return this.db.query.chatGroupsAgents.findMany({ + orderBy: [chatGroupsAgents.order], + where: eq(chatGroupsAgents.chatGroupId, groupId), + }); + } + + async getEnabledGroupAgents(groupId: string): Promise { + return this.db.query.chatGroupsAgents.findMany({ + orderBy: [chatGroupsAgents.order], + where: and(eq(chatGroupsAgents.chatGroupId, groupId), eq(chatGroupsAgents.enabled, true)), + }); + } + + async getGroupsWithAgents(agentIds?: string[]): Promise { + if (!agentIds || agentIds.length === 0) { + return this.query(); + } + + // Find groups containing any of the specified agents + const groupIds = await this.db + .selectDistinct({ chatGroupId: chatGroupsAgents.chatGroupId }) + .from(chatGroupsAgents) + .where( + and(eq(chatGroupsAgents.userId, this.userId), inArray(chatGroupsAgents.agentId, agentIds)), + ); + + if (groupIds.length === 0) return []; + + return this.db.query.chatGroups.findMany({ + orderBy: [desc(chatGroups.updatedAt)], + where: and( + inArray( + chatGroups.id, + groupIds.map((g) => g.chatGroupId), + ), + eq(chatGroups.userId, this.userId), + ), + }); + } +} diff --git a/packages/database/src/models/message.ts b/packages/database/src/models/message.ts index aa0db589179..1e76d8201fc 100644 --- a/packages/database/src/models/message.ts +++ b/packages/database/src/models/message.ts @@ -41,6 +41,7 @@ import { idGenerator } from '../utils/idGenerator'; export interface QueryMessageParams { current?: number; + groupId?: string | null; pageSize?: number; sessionId?: string | null; topicId?: string | null; @@ -57,7 +58,7 @@ export class MessageModel { // **************** Query *************** // query = async ( - { current = 0, pageSize = 1000, sessionId, topicId }: QueryMessageParams = {}, + { current = 0, pageSize = 1000, sessionId, topicId, groupId }: QueryMessageParams = {}, options: { postProcessUrl?: (path: string | null, file: { fileType: string }) => Promise; } = {}, @@ -86,6 +87,11 @@ export class MessageModel { parentId: messages.parentId, threadId: messages.threadId, + // Group chat fields + groupId: messages.groupId, + agentId: messages.agentId, + targetId: messages.targetId, + tools: messages.tools, tool_call_id: messagePlugins.toolCallId, @@ -116,6 +122,7 @@ export class MessageModel { eq(messages.userId, this.userId), this.matchSession(sessionId), this.matchTopic(topicId), + this.matchGroup(groupId), ), ) .leftJoin(messagePlugins, eq(messagePlugins.id, messages.id)) @@ -468,10 +475,13 @@ export class MessageModel { id: string = this.genId(), ): Promise => { return this.db.transaction(async (trx) => { + // Ensure group message does not populate sessionId + const normalizedMessage = message.groupId ? { ...message, sessionId: null } : message; + const [item] = (await trx .insert(messages) .values({ - ...message, + ...normalizedMessage, // TODO: remove this when the client is updated createdAt: createdAt ? new Date(createdAt) : undefined, id, @@ -689,7 +699,11 @@ export class MessageModel { .delete(messageQueries) .where(and(eq(messageQueries.id, id), eq(messageQueries.userId, this.userId))); - deleteMessagesBySession = async (sessionId?: string | null, topicId?: string | null) => + deleteMessagesBySession = async ( + sessionId?: string | null, + topicId?: string | null, + groupId?: string | null, + ) => this.db .delete(messages) .where( @@ -697,6 +711,7 @@ export class MessageModel { eq(messages.userId, this.userId), this.matchSession(sessionId), this.matchTopic(topicId), + this.matchGroup(groupId), ), ); @@ -713,4 +728,7 @@ export class MessageModel { private matchTopic = (topicId?: string | null) => topicId ? eq(messages.topicId, topicId) : isNull(messages.topicId); + + private matchGroup = (groupId?: string | null) => + groupId ? eq(messages.groupId, groupId) : isNull(messages.groupId); } diff --git a/packages/database/src/models/session.ts b/packages/database/src/models/session.ts index a8a4f6acfa3..1cff2d7bb7a 100644 --- a/packages/database/src/models/session.ts +++ b/packages/database/src/models/session.ts @@ -19,7 +19,12 @@ import { DEFAULT_INBOX_AVATAR } from '@/const/meta'; import { INBOX_SESSION_ID } from '@/const/session'; import { DEFAULT_AGENT_CONFIG } from '@/const/settings'; import { LobeAgentConfig } from '@/types/agent'; -import { ChatSessionList, LobeAgentSession, SessionRankItem } from '@/types/session'; +import { + ChatSessionList, + LobeAgentSession, + LobeGroupSession, + SessionRankItem, +} from '@/types/session'; import { merge } from '@/utils/merge'; import { @@ -209,6 +214,23 @@ export class SessionModel { if (existResult) return existResult; } + if (type === 'group') { + const result = await trx + .insert(sessions) + .values({ + ...session, + createdAt: new Date(), + id, + slug, + type, + updatedAt: new Date(), + userId: this.userId, + }) + .returning(); + + return result[0]; + } + const newAgents = await trx .insert(agents) .values({ @@ -431,12 +453,53 @@ export class SessionModel { description, avatar, groupId, + type, ...res - }: SessionItem & { agentsToSessions?: { agent: AgentItem }[] }): LobeAgentSession => { + }: SessionItem & { agentsToSessions?: { agent: AgentItem }[] }): + | LobeAgentSession + | LobeGroupSession => { + const meta = { + avatar: avatar ?? undefined, + backgroundColor: backgroundColor ?? undefined, + description: description ?? undefined, + tags: undefined, + title: title ?? undefined, + }; + + if (type === 'group') { + // For group sessions, return without agent-specific fields + // Transform agentsToSessions to include both relationship and agent data + const members = + agentsToSessions?.map((item, index) => { + const member = { + // Start with agent properties for compatibility + ...item.agent, + // Override with ChatGroupAgentItem properties + agentId: item.agent.id, + chatGroupId: res.id, + enabled: true, + order: index, + role: 'participant', + // Keep agent timestamps for now (could be overridden if needed) + }; + return member; + }) || []; + + return { + ...res, + group: groupId, + members, + meta, + type: 'group', + } as LobeGroupSession; + } + + // For agent sessions, include agent-specific fields // TODO: 未来这里需要更好的实现方案,目前只取第一个 const agent = agentsToSessions?.[0]?.agent; return { ...res, + config: agent ? (agent as any) : { model: '', plugins: [] }, // Ensure config exists for agent sessions group: groupId, meta: { avatar: agent?.avatar ?? avatar ?? undefined, @@ -445,8 +508,9 @@ export class SessionModel { tags: agent?.tags ?? undefined, title: agent?.title ?? title ?? undefined, }, - model: agent?.model, - } as any; + model: agent?.model || '', + type: 'agent', + } as LobeAgentSession; }; findSessionsByKeywords = async (params: { diff --git a/packages/database/src/models/topic.ts b/packages/database/src/models/topic.ts index 544fba864c1..5f3e595b34f 100644 --- a/packages/database/src/models/topic.ts +++ b/packages/database/src/models/topic.ts @@ -1,4 +1,4 @@ -import { and, count, desc, eq, gt, ilike, inArray, isNull, sql } from 'drizzle-orm'; +import { and, count, desc, eq, gt, ilike, inArray, isNull, or, sql } from 'drizzle-orm'; import { MessageItem } from '@/types/message'; import { TopicRankItem } from '@/types/topic'; @@ -10,12 +10,14 @@ import { idGenerator } from '../utils/idGenerator'; export interface CreateTopicParams { favorite?: boolean; + groupId?: string | null; messages?: string[]; sessionId?: string | null; title?: string; } interface QueryTopicParams { + containerId?: string | null; // sessionId or groupId current?: number; pageSize?: number; sessionId?: string | null; @@ -31,7 +33,7 @@ export class TopicModel { } // **************** Query *************** // - query = async ({ current = 0, pageSize = 9999, sessionId }: QueryTopicParams = {}) => { + query = async ({ current = 0, pageSize = 9999, containerId }: QueryTopicParams = {}) => { const offset = current * pageSize; return ( this.db @@ -45,7 +47,7 @@ export class TopicModel { updatedAt: topics.updatedAt, }) .from(topics) - .where(and(eq(topics.userId, this.userId), this.matchSession(sessionId))) + .where(and(eq(topics.userId, this.userId), this.matchContainer(containerId))) // In boolean sorting, false is considered "smaller" than true. // So here we use desc to ensure that topics with favorite as true are in front. .orderBy(desc(topics.favorite), desc(topics.updatedAt)) @@ -68,7 +70,7 @@ export class TopicModel { .where(eq(topics.userId, this.userId)); }; - queryByKeyword = async (keyword: string, sessionId?: string | null): Promise => { + queryByKeyword = async (keyword: string, containerId?: string | null): Promise => { if (!keyword) return []; const keywordLowerCase = keyword.toLowerCase(); @@ -78,7 +80,7 @@ export class TopicModel { orderBy: [desc(topics.updatedAt)], where: and( eq(topics.userId, this.userId), - this.matchSession(sessionId), + this.matchContainer(containerId), ilike(topics.title, `%${keywordLowerCase}%`), ), }); @@ -93,7 +95,7 @@ export class TopicModel { eq(messages.userId, this.userId), ilike(messages.content, `%${keywordLowerCase}%`), eq(topics.userId, this.userId), - this.matchSession(sessionId), + this.matchContainer(containerId), ), ) .groupBy(messages.topicId); @@ -176,17 +178,18 @@ export class TopicModel { id: string = this.genId(), ): Promise => { return this.db.transaction(async (tx) => { - // 在 topics 表中插入新的 topic - const [topic] = await tx - .insert(topics) - .values({ - ...params, - id: id, - userId: this.userId, - }) - .returning(); + const insertData = { + ...params, + groupId: params.groupId || null, + id, + sessionId: params.sessionId || null, + userId: this.userId, + }; + + // Insert new topic + const [topic] = await tx.insert(topics).values(insertData).returning(); - // 如果有关联的 messages, 更新它们的 topicId + // Update associated messages' topicId if (messageIds && messageIds.length > 0) { await tx .update(messages) @@ -207,8 +210,9 @@ export class TopicModel { .values( topicParams.map((params) => ({ favorite: params.favorite, + groupId: params.sessionId ? null : params.groupId, id: params.id || this.genId(), - sessionId: params.sessionId, + sessionId: params.groupId ? null : params.sessionId, title: params.title, userId: this.userId, })), @@ -302,6 +306,15 @@ export class TopicModel { .where(and(this.matchSession(sessionId), eq(topics.userId, this.userId))); }; + /** + * Deletes multiple topics based on the groupId. + */ + batchDeleteByGroupId = async (groupId?: string | null) => { + return this.db + .delete(topics) + .where(and(this.matchGroup(groupId), eq(topics.userId, this.userId))); + }; + /** * Deletes multiple topics and all messages associated with them in a transaction. */ @@ -331,4 +344,13 @@ export class TopicModel { private matchSession = (sessionId?: string | null) => sessionId ? eq(topics.sessionId, sessionId) : isNull(topics.sessionId); + + private matchGroup = (groupId?: string | null) => + groupId ? eq(topics.groupId, groupId) : isNull(topics.groupId); + + private matchContainer = (containerId?: string | null) => { + if (containerId) return or(eq(topics.sessionId, containerId), eq(topics.groupId, containerId)); + // If neither is provided, match topics with no session or group + return and(isNull(topics.sessionId), isNull(topics.groupId)); + }; } diff --git a/packages/model-bank/src/aiModels/aihubmix.ts b/packages/model-bank/src/aiModels/aihubmix.ts index 1a5107c6d6a..84e8163d657 100644 --- a/packages/model-bank/src/aiModels/aihubmix.ts +++ b/packages/model-bank/src/aiModels/aihubmix.ts @@ -815,6 +815,7 @@ const aihubmixModels: AIChatModelCard[] = [ abilities: { functionCall: true, reasoning: true, + structuredOutput: true, }, contextWindowTokens: 131_072, description: diff --git a/packages/model-runtime/src/providers/anthropic/generateObject.ts b/packages/model-runtime/src/providers/anthropic/generateObject.ts index 7dff5c4bc5b..3e76c52fcc9 100644 --- a/packages/model-runtime/src/providers/anthropic/generateObject.ts +++ b/packages/model-runtime/src/providers/anthropic/generateObject.ts @@ -14,23 +14,23 @@ export const createAnthropicGenerateObject = async ( payload: GenerateObjectPayload, options?: GenerateObjectOptions, ) => { - const { schema, messages, model, tools } = payload; + const { schema, messages, systemRole, model, tools } = payload; log('generateObject called with model: %s', model); log('schema: %O', schema); log('messages count: %d', messages.length); // Convert messages to Anthropic format - const system_message = messages.find((m) => m.role === 'system'); + const system_message = systemRole || messages.find((m) => m.role === 'system')?.content; const user_messages = messages.filter((m) => m.role !== 'system'); const anthropicMessages = await buildAnthropicMessages(user_messages); log('converted %d messages to Anthropic format', anthropicMessages.length); - const systemPrompts = system_message?.content + const systemPrompts = system_message ? [ { - text: system_message.content as string, + text: system_message, type: 'text' as const, }, ] diff --git a/packages/prompts/src/chains/summaryTitle.ts b/packages/prompts/src/chains/summaryTitle.ts index 5c9206bec80..4952beaeb44 100644 --- a/packages/prompts/src/chains/summaryTitle.ts +++ b/packages/prompts/src/chains/summaryTitle.ts @@ -1,7 +1,8 @@ +import { ChatMessage } from '@/types/message/chat'; import { ChatStreamPayload, OpenAIChatMessage } from '@/types/openai/chat'; export const chainSummaryTitle = ( - messages: OpenAIChatMessage[], + messages: (ChatMessage | OpenAIChatMessage)[], locale: string, ): Partial => ({ messages: [ diff --git a/packages/prompts/src/prompts/chatMessages/index.test.ts b/packages/prompts/src/prompts/chatMessages/index.test.ts index c60796acc17..3e102d1d47a 100644 --- a/packages/prompts/src/prompts/chatMessages/index.test.ts +++ b/packages/prompts/src/prompts/chatMessages/index.test.ts @@ -1,7 +1,23 @@ import { ChatMessage } from '@lobechat/types'; import { describe, expect, it } from 'vitest'; -import { chatHistoryPrompts } from './index'; +import { + chatHistoryPrompts, + consolidateGroupChatHistory, + groupMemeberSpeakingPrompts, + groupSupervisorPrompts, +} from './index'; + +let messageCounter = 0; +const createMessage = ( + overrides: Partial & Pick, +): ChatMessage => ({ + id: overrides.id ?? `msg-${++messageCounter}`, + createdAt: overrides.createdAt ?? 0, + updatedAt: overrides.updatedAt ?? 0, + meta: overrides.meta ?? {}, + ...overrides, +}); describe('chatHistoryPrompts', () => { // Test with empty messages array @@ -91,3 +107,70 @@ describe('chatHistoryPrompts', () => { `); }); }); + +describe('groupSupervisorPrompts', () => { + it('should format messages and exclude supervisor role', () => { + const messages: ChatMessage[] = [ + createMessage({ role: 'user', content: 'Hello everyone' }), + createMessage({ role: 'assistant', agentId: 'agent-1', content: 'Reporting in' }), + createMessage({ + role: 'assistant', + agentId: 'agent-2', + targetId: 'agent-1', + content: 'Private update', + }), + createMessage({ role: 'supervisor', content: 'Ignore this' }), + createMessage({ role: 'assistant', content: 'General update' }), + ]; + + const result = groupSupervisorPrompts(messages); + + expect(result).toBe( + `Hello everyone +Reporting in +Private update +General update`, + ); + }); +}); + +describe('groupMemeberSpeakingPrompts', () => { + it('should wrap messages in chat_group tags', () => { + const messages: ChatMessage[] = [ + createMessage({ role: 'user', content: 'Need assistance' }), + createMessage({ role: 'assistant', content: 'On it!' }), + ]; + + const result = groupMemeberSpeakingPrompts(messages); + + expect(result).toBe(` +Need assistance +On it! +`); + }); +}); + +describe('consolidateGroupChatHistory', () => { + it('should return empty string for no messages', () => { + expect(consolidateGroupChatHistory([])).toBe(''); + }); + + it('should format messages with agent titles and default labels', () => { + const messages: ChatMessage[] = [ + createMessage({ role: 'assistant', content: ' ' }), // filtered out + createMessage({ role: 'user', content: 'Hello group' }), + createMessage({ role: 'assistant', agentId: 'agent-1', content: 'Status update' }), + createMessage({ role: 'assistant', agentId: 'agent-2', content: 'Additional info' }), + createMessage({ role: 'assistant', content: 'General response' }), + ]; + + const agents = [{ id: 'agent-1', title: 'Researcher' }]; + + const result = consolidateGroupChatHistory(messages, agents); + + expect(result).toBe(`(User): Hello group +(Researcher): Status update +(Agent agent-2): Additional info +(Assistant): General response`); + }); +}); diff --git a/packages/prompts/src/prompts/chatMessages/index.ts b/packages/prompts/src/prompts/chatMessages/index.ts index 604d3eb4f5f..c8e1f01f6a0 100644 --- a/packages/prompts/src/prompts/chatMessages/index.ts +++ b/packages/prompts/src/prompts/chatMessages/index.ts @@ -9,3 +9,129 @@ export const chatHistoryPrompts = (messages: ChatMessage[]) => { ${messages.map((m) => chatMessage(m)).join('\n')} `; }; + +export const groupSupervisorPrompts = (messages: ChatMessage[]) => { + const formatMessage = (message: ChatMessage) => { + const author = message.role === 'user' ? 'user' : message.agentId || 'assistant'; + const targetAttr = message.targetId ? ` target="${message.targetId}"` : ''; + return `${message.content}`; + }; + + // Filter out supervisor's own messages to avoid self-referencing + const filteredMessages = messages.filter((message) => message.role !== 'supervisor'); + + return filteredMessages.map((m) => formatMessage(m)).join('\n'); +}; + +export const groupMemeberSpeakingPrompts = (messages: ChatMessage[]) => { + return ` +${messages.map((m) => chatMessage(m)).join('\n')} +`; +}; + +/** + * Filters messages that an agent should see based on DM targeting rules + * - Agent sees all group messages (no targetId) + * - Agent sees DMs where they are the target + * - Agent sees DMs they sent + * - Agent sees user messages that are group messages or targeted to them + * - For DM messages not involving the agent, content is replaced with "***" + * + * TODO: Use context engineering to filter messages + */ +export const filterMessagesForAgent = (messages: ChatMessage[], agentId: string): ChatMessage[] => { + return messages + .filter((message) => { + // Exclude supervisor messages (messages with role="supervisor") + if (message.role === 'supervisor') { + return false; + } + return true; + }) + .map((message) => { + // Always include system messages as-is + if (message.role === 'system') { + return message; + } + + // For user messages, check DM targeting rules + if (message.role === 'user') { + // If no target specified, it's a group message - include it as-is + if (!message.targetId) { + return message; + } + + // If the message is targeted to this agent, include it as-is + if (message.targetId === agentId) { + return message; + } + + // Otherwise, it's a DM to another agent - replace content with "***" + return { + ...message, + content: '***', + }; + } + + // For assistant messages, check DM targeting rules + if (message.role === 'assistant') { + // If no target specified, it's a group message - include it as-is + if (!message.targetId) { + return message; + } + + // If the agent is the target of the DM, include it as-is + if (message.targetId === agentId) { + return message; + } + + // If the agent sent the message, include it as-is + if (message.agentId === agentId) { + return message; + } + + // Otherwise, it's a DM not involving this agent - replace content with "***" + return { + ...message, + content: '***', + }; + } + + // Default: include the message as-is + return message; + }); +}; + +/** + * Consolidates group chat message history into a single formatted string + * for use in system messages. Each message is formatted as "(AuthorName): content" + */ +export const consolidateGroupChatHistory = ( + messages: ChatMessage[], + agents: { id: string; title: string }[] = [], +) => { + if (messages.length === 0) return ''; + + // Create a map for quick agent lookup + const agentMap = new Map(agents.map((agent) => [agent.id, agent.title])); + + const formatMessage = (message: ChatMessage) => { + let authorName: string; + + if (message.role === 'user') { + authorName = 'User'; + } else if (message.role === 'assistant' && message.agentId) { + // Try to get agent title from the provided agents map + authorName = agentMap.get(message.agentId) || `Agent ${message.agentId}`; + } else { + authorName = 'Assistant'; + } + + return `(${authorName}): ${message.content}`; + }; + + return messages + .filter((m) => m.content && m.content.trim()) // Filter out empty messages + .map(formatMessage) + .join('\n'); +}; diff --git a/packages/prompts/src/prompts/groupChat/__snapshots__/index.test.ts.snap b/packages/prompts/src/prompts/groupChat/__snapshots__/index.test.ts.snap new file mode 100644 index 00000000000..99d75d970d1 --- /dev/null +++ b/packages/prompts/src/prompts/groupChat/__snapshots__/index.test.ts.snap @@ -0,0 +1,281 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`buildGroupChatSystemPrompt > should generate correct prompt with members and history 1`] = ` +"You are an expert collaborator. + +Guidelines: + +- Stay in character as agent-1 (Agent One) +- Be concise and natural, behave like a real person +- The group supervisor will decide whether to send it privately or publicly, so you just need to say the actuall content, even it's a DM to a specific member. Do not pretend you've sent it. +- Be collaborative and build upon others' responses when appropriate +- Keep your responses concise and relevant to the ongoing discussion + + +[ + { + "id": "user", + "title": "User Name" + }, + { + "id": "agent-1", + "title": "Agent One" + } +] + + +Now it's your turn to respond. You are sending message to the group publicly. Please respond as this agent would, considering the full conversation history provided above. Directly return the message content, no other text. You do not need add author name or anything else." +`; + +exports[`buildGroupChatSystemPrompt > should generate correct prompt without members and history 1`] = ` +"You are an expert collaborator. + +Guidelines: + +- Stay in character as agent-2 (Agent) +- Be concise and natural, behave like a real person +- The group supervisor will decide whether to send it privately or publicly, so you just need to say the actuall content, even it's a DM to a specific member. Do not pretend you've sent it. +- Be collaborative and build upon others' responses when appropriate +- Keep your responses concise and relevant to the ongoing discussion + +Now it's your turn to respond. You are sending message to the group publicly. Please respond as this agent would, considering the full conversation history provided above. Directly return the message content, no other text. You do not need add author name or anything else." +`; + +exports[`filterMessagesForAgent > should handle assistant direct messages 1`] = ` +[ + { + "agentId": "agent-2", + "content": "DM to agent-1", + "createdAt": 1634567890000, + "id": "1", + "meta": {}, + "role": "assistant", + "targetId": "agent-1", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-3", + "content": "***", + "createdAt": 1634567890000, + "id": "2", + "meta": {}, + "role": "assistant", + "targetId": "agent-2", + "updatedAt": 1634567890000, + }, +] +`; + +exports[`filterMessagesForAgent > should handle group messages without targetId 1`] = ` +[ + { + "content": "Hello everyone", + "createdAt": 1634567890000, + "id": "1", + "meta": {}, + "role": "user", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-2", + "content": "Hi there", + "createdAt": 1634567890000, + "id": "2", + "meta": {}, + "role": "assistant", + "updatedAt": 1634567890000, + }, +] +`; + +exports[`filterMessagesForAgent > should handle messages sent by this agent 1`] = ` +[ + { + "agentId": "agent-1", + "content": "My message to agent-2", + "createdAt": 1634567890000, + "id": "1", + "meta": {}, + "role": "assistant", + "targetId": "agent-2", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-1", + "content": "My group message", + "createdAt": 1634567890000, + "id": "2", + "meta": {}, + "role": "assistant", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-2", + "content": "***", + "createdAt": 1634567890000, + "id": "3", + "meta": {}, + "role": "assistant", + "targetId": "agent-3", + "updatedAt": 1634567890000, + }, +] +`; + +exports[`filterMessagesForAgent > should handle mixed message types 1`] = ` +[ + { + "content": "System prompt", + "createdAt": 1634567890000, + "id": "1", + "meta": {}, + "role": "system", + "updatedAt": 1634567890000, + }, + { + "content": "Hello everyone", + "createdAt": 1634567890000, + "id": "2", + "meta": {}, + "role": "user", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-1", + "content": "Hi!", + "createdAt": 1634567890000, + "id": "3", + "meta": {}, + "role": "assistant", + "updatedAt": 1634567890000, + }, + { + "content": "DM to agent-1", + "createdAt": 1634567890000, + "id": "4", + "meta": {}, + "role": "user", + "targetId": "agent-1", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-1", + "content": "DM response", + "createdAt": 1634567890000, + "id": "5", + "meta": {}, + "role": "assistant", + "targetId": "user", + "updatedAt": 1634567890000, + }, + { + "content": "***", + "createdAt": 1634567890000, + "id": "6", + "meta": {}, + "role": "user", + "targetId": "agent-2", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-2", + "content": "***", + "createdAt": 1634567890000, + "id": "7", + "meta": {}, + "role": "assistant", + "targetId": "user", + "updatedAt": 1634567890000, + }, +] +`; + +exports[`filterMessagesForAgent > should handle system messages 1`] = ` +[ + { + "content": "System message", + "createdAt": 1634567890000, + "id": "1", + "meta": {}, + "role": "system", + "updatedAt": 1634567890000, + }, +] +`; + +exports[`filterMessagesForAgent > should handle user direct messages 1`] = ` +[ + { + "content": "Private message to agent-1", + "createdAt": 1634567890000, + "id": "1", + "meta": {}, + "role": "user", + "targetId": "agent-1", + "updatedAt": 1634567890000, + }, + { + "content": "***", + "createdAt": 1634567890000, + "id": "2", + "meta": {}, + "role": "user", + "targetId": "agent-2", + "updatedAt": 1634567890000, + }, +] +`; + +exports[`filterMessagesForAgent > should preserve all message properties when replacing content 1`] = ` +[ + { + "content": "***", + "createdAt": 1634567890000, + "files": [ + "file1", + ], + "id": "1", + "meta": {}, + "observationId": "obs1", + "parentId": "parent1", + "role": "user", + "targetId": "agent-2", + "tools": [], + "updatedAt": 1634567890000, + }, +] +`; + +exports[`filterMessagesForAgent > should replace content for DMs not involving this agent 1`] = ` +[ + { + "content": "***", + "createdAt": 1634567890000, + "id": "1", + "meta": {}, + "role": "user", + "targetId": "agent-2", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-2", + "content": "***", + "createdAt": 1634567890000, + "id": "2", + "meta": {}, + "role": "assistant", + "targetId": "user", + "updatedAt": 1634567890000, + }, + { + "agentId": "agent-2", + "content": "***", + "createdAt": 1634567890000, + "id": "3", + "meta": {}, + "role": "assistant", + "targetId": "agent-3", + "updatedAt": 1634567890000, + }, +] +`; diff --git a/packages/prompts/src/prompts/groupChat/index.test.ts b/packages/prompts/src/prompts/groupChat/index.test.ts new file mode 100644 index 00000000000..3c5414c8886 --- /dev/null +++ b/packages/prompts/src/prompts/groupChat/index.test.ts @@ -0,0 +1,205 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import type { ChatMessage } from '@/types/index'; + +import { filterMessagesForAgent } from '../chatMessages'; +import { buildGroupChatSystemPrompt } from './index'; + +describe('buildGroupChatSystemPrompt', () => { + const baseSystemRole = 'You are an expert collaborator.'; + const mockTimestamp = 1634567890000; + + beforeEach(() => { + vi.spyOn(Date, 'now').mockReturnValue(mockTimestamp); + }); + + const messages: ChatMessage[] = [ + { + id: 'm1', + role: 'user', + content: 'Hello everyone', + createdAt: mockTimestamp, + updatedAt: mockTimestamp, + meta: {}, + }, + { + id: 'm2', + role: 'assistant', + agentId: 'agent-1', + content: 'Hi! I can help with that.', + createdAt: mockTimestamp, + updatedAt: mockTimestamp, + meta: {}, + }, + ]; + + it('should generate correct prompt with members and history', () => { + const result = buildGroupChatSystemPrompt({ + agentId: 'agent-1', + baseSystemRole, + groupMembers: [ + { id: 'user', title: 'User Name' }, + { id: 'agent-1', title: 'Agent One' }, + ], + messages, + }); + + expect(result).toMatchSnapshot(); + }); + + it('should generate correct prompt without members and history', () => { + const result = buildGroupChatSystemPrompt({ + agentId: 'agent-2', + baseSystemRole, + groupMembers: [], + messages: [], + }); + + expect(result).toMatchSnapshot(); + }); + + it('should include response instruction for group message', () => { + const result = buildGroupChatSystemPrompt({ + agentId: 'agent-1', + baseSystemRole, + groupMembers: [{ id: 'agent-1', title: 'Agent One' }], + messages, + }); + + expect(result).toContain("Now it's your turn to respond"); + expect(result).toContain('the group publicly'); + }); + + it('should include response instruction for direct message', () => { + const result = buildGroupChatSystemPrompt({ + agentId: 'agent-1', + baseSystemRole, + groupMembers: [{ id: 'agent-1', title: 'Agent One' }], + messages, + targetId: 'user', + }); + + expect(result).toContain("Now it's your turn to respond"); + expect(result).toContain('user'); + }); + + it('should include supervisor instruction when provided', () => { + const result = buildGroupChatSystemPrompt({ + agentId: 'agent-1', + baseSystemRole, + groupMembers: [{ id: 'agent-1', title: 'Agent One' }], + messages, + instruction: 'Please be concise', + }); + + expect(result).toContain('SUPERVISOR INSTRUCTION: Please be concise'); + }); +}); + +describe('filterMessagesForAgent', () => { + const mockTimestamp = 1634567890000; + const agentId = 'agent-1'; + + beforeEach(() => { + vi.spyOn(Date, 'now').mockReturnValue(mockTimestamp); + }); + + const createMessage = ( + id: string, + role: 'user' | 'assistant' | 'system', + content: string, + options?: { agentId?: string; targetId?: string }, + ): ChatMessage => ({ + id, + role, + content, + createdAt: mockTimestamp, + updatedAt: mockTimestamp, + meta: {}, + ...options, + }); + + it('should handle system messages', () => { + const messages = [createMessage('1', 'system', 'System message')]; + const result = filterMessagesForAgent(messages, agentId); + expect(result).toMatchSnapshot(); + }); + + it('should handle group messages without targetId', () => { + const messages = [ + createMessage('1', 'user', 'Hello everyone'), + createMessage('2', 'assistant', 'Hi there', { agentId: 'agent-2' }), + ]; + const result = filterMessagesForAgent(messages, agentId); + expect(result).toMatchSnapshot(); + }); + + it('should handle user direct messages', () => { + const messages = [ + createMessage('1', 'user', 'Private message to agent-1', { targetId: agentId }), + createMessage('2', 'user', 'Private message to agent-2', { targetId: 'agent-2' }), + ]; + const result = filterMessagesForAgent(messages, agentId); + expect(result).toMatchSnapshot(); + }); + + it('should handle assistant direct messages', () => { + const messages = [ + createMessage('1', 'assistant', 'DM to agent-1', { agentId: 'agent-2', targetId: agentId }), + createMessage('2', 'assistant', 'DM to agent-2', { agentId: 'agent-3', targetId: 'agent-2' }), + ]; + const result = filterMessagesForAgent(messages, agentId); + expect(result).toMatchSnapshot(); + }); + + it('should handle messages sent by this agent', () => { + const messages = [ + createMessage('1', 'assistant', 'My message to agent-2', { agentId, targetId: 'agent-2' }), + createMessage('2', 'assistant', 'My group message', { agentId }), + createMessage('3', 'assistant', 'Other agent message', { + agentId: 'agent-2', + targetId: 'agent-3', + }), + ]; + const result = filterMessagesForAgent(messages, agentId); + expect(result).toMatchSnapshot(); + }); + + it('should replace content for DMs not involving this agent', () => { + const messages = [ + createMessage('1', 'user', 'Secret message', { targetId: 'agent-2' }), + createMessage('2', 'assistant', 'Private response', { agentId: 'agent-2', targetId: 'user' }), + createMessage('3', 'assistant', 'Agent to agent DM', { + agentId: 'agent-2', + targetId: 'agent-3', + }), + ]; + const result = filterMessagesForAgent(messages, agentId); + expect(result).toMatchSnapshot(); + }); + + it('should handle mixed message types', () => { + const messages = [ + createMessage('1', 'system', 'System prompt'), + createMessage('2', 'user', 'Hello everyone'), + createMessage('3', 'assistant', 'Hi!', { agentId }), + createMessage('4', 'user', 'DM to agent-1', { targetId: agentId }), + createMessage('5', 'assistant', 'DM response', { agentId, targetId: 'user' }), + createMessage('6', 'user', 'Secret to agent-2', { targetId: 'agent-2' }), + createMessage('7', 'assistant', 'Secret response', { agentId: 'agent-2', targetId: 'user' }), + ]; + const result = filterMessagesForAgent(messages, agentId); + expect(result).toMatchSnapshot(); + }); + + it('should preserve all message properties when replacing content', () => { + const originalMessage = createMessage('1', 'user', 'Secret message', { targetId: 'agent-2' }); + originalMessage.files = ['file1']; + originalMessage.tools = []; + originalMessage.parentId = 'parent1'; + originalMessage.observationId = 'obs1'; + + const result = filterMessagesForAgent([originalMessage], agentId); + expect(result).toMatchSnapshot(); + }); +}); diff --git a/packages/prompts/src/prompts/groupChat/index.ts b/packages/prompts/src/prompts/groupChat/index.ts new file mode 100644 index 00000000000..293e53daa10 --- /dev/null +++ b/packages/prompts/src/prompts/groupChat/index.ts @@ -0,0 +1,165 @@ +import { ChatMessage } from '@/types/index'; + +export interface GroupMemberInfo { + id: string; + title: string; +} + +export interface SupervisorTodoItem { + assignee?: string; + content: string; + finished: boolean; +} + +const buildGroupMembersTag = (members: GroupMemberInfo[]): string => { + if (!members || members.length === 0) return ''; + return `\n${JSON.stringify(members, null, 2)}\n`; +}; + +export const buildGroupChatSystemPrompt = ({ + baseSystemRole = '', + agentId, + groupMembers, + targetId, + instruction, +}: { + agentId: string; + baseSystemRole?: string; + groupMembers: GroupMemberInfo[]; + instruction?: string; + messages: ChatMessage[]; + targetId?: string; +}): string => { + const membersTag = buildGroupMembersTag(groupMembers); + + const agentTitle = groupMembers.find((m) => m.id === agentId)?.title || 'Agent'; + + const guidelines = [ + `Stay in character as ${agentId} (${agentTitle})`, + 'Be concise and natural, behave like a real person', + "The group supervisor will decide whether to send it privately or publicly, so you just need to say the actuall content, even it's a DM to a specific member. Do not pretend you've sent it.", + "Be collaborative and build upon others' responses when appropriate", + 'Keep your responses concise and relevant to the ongoing discussion', + ]; + + const guidelinesSection = ['Guidelines:', '', ...guidelines.map((line) => `- ${line}`)].join( + '\n', + ); + + const sections = [baseSystemRole, guidelinesSection]; + + if (membersTag) sections.push(membersTag); + + // Add response instruction at the end + const targetText = targetId ? targetId : 'the group publicly'; + const instructionText = instruction ? `SUPERVISOR INSTRUCTION: ${instruction}` : ''; + const responseInstruction = + `Now it's your turn to respond. ${instructionText} You are sending message to ${targetText}. Please respond as this agent would, considering the full conversation history provided above. Directly return the message content, no other text. You do not need add author name or anything else.`.trim(); + + sections.push(responseInstruction); + + return sections.filter(Boolean).join('\n\n').trim(); +}; + +export interface SupervisorPromptParams { + allowDM?: boolean; + availableAgents: Array<{ id: string; title?: string | null }>; + conversationHistory: string; + scene?: 'casual' | 'productive'; + systemPrompt?: string; + todoList?: SupervisorTodoItem[]; + userName?: string; +} + +const buildTodoListTag = (todoList?: SupervisorTodoItem[]): string => { + if (!todoList || todoList.length === 0) return ''; + + const serialized = JSON.stringify(todoList && todoList.length > 0 ? todoList : [], null, 2); + return `\n${serialized}\n`; +}; + +export const buildSupervisorPrompt = ({ + allowDM = true, + scene = 'productive', + availableAgents, + conversationHistory, + todoList, + systemPrompt, + userName, +}: SupervisorPromptParams): string => { + const members = [ + { + id: 'user', + name: userName || 'User', + role: 'user', + }, + // Then include all agents + ...availableAgents.map((agent) => ({ + id: agent.id, + name: agent.title || agent.id, + role: 'assistant', + })), + ]; + + const memberList = members + .map((member) => ` `) + .join('\n'); + + const todoListTag = scene === 'productive' ? buildTodoListTag(todoList) : ''; + + // Build rules and examples for DM usage + const dmRules = allowDM + ? `- To send a private message, use "trigger_agent_dm" and set "target" to the recipient agent id or "user". +- Use public messages by default; choose DM only when the message MUST be private.` + : ''; + + const prompt = ` +You are a conversation supervisor for a group chat with multiple AI agents. Your role is to orchestrate a group of agents to make user feel natural and interactive. + + +${systemPrompt || ''} + + + +${memberList} + + + +${conversationHistory} + + +${todoListTag} + +RULES: + +- Do not forcing user to respond, only ask for information for one time before you get the information you need. +- Make the group conversation feels like a real conversation. + +WHEN ASKING AGENTS TO SPEAK: + +- Only reference agents from the member list. Never invent new IDs. +- Do not excessivly gathering information from user, you should only ask for information when it's necessary. +- If need many information from user, make single agent to ask for all. +${dmRules} + +${ + scene === 'productive' + ? `WHEN GENERATING TODOS: + +- Only use Todo for complex tasks. +- Break down the main objective into logical, sequential tasks. +- Be concise and to the point. Each todo should no longer than 10 words. Do not create more than 5 todos. +- Match user's message language. +- By only assigning todo will not tirgger agent response you still need to use trigger tool if needed. +- Keep todo items synchronized with the context. Finish or create todos as progress changes.` + : '' +} +`; + + return prompt.trim(); +}; + +export const groupChatPrompts = { + buildGroupChatSystemPrompt, + buildSupervisorPrompt, +}; diff --git a/packages/prompts/src/prompts/index.ts b/packages/prompts/src/prompts/index.ts index 6967d8e72f5..2f4d1a17198 100644 --- a/packages/prompts/src/prompts/index.ts +++ b/packages/prompts/src/prompts/index.ts @@ -1,5 +1,6 @@ export * from './chatMessages'; export * from './files'; +export * from './groupChat'; export * from './knowledgeBaseQA'; export * from './plugin'; export * from './search'; diff --git a/packages/types/src/agent/item.ts b/packages/types/src/agent/item.ts index 88985d1be09..5db3e5b57b0 100644 --- a/packages/types/src/agent/item.ts +++ b/packages/types/src/agent/item.ts @@ -53,6 +53,11 @@ export interface LobeAgentConfig { * 语音服务 */ tts: LobeAgentTTSConfig; + + /** + * Flag for assistants generated automatically (e.g., from templates) + */ + virtual?: boolean; } export type LobeAgentConfigKeys = @@ -82,4 +87,5 @@ export interface AgentItem { tts?: LobeAgentTTSConfig | null; updatedAt: Date; userId: string; + virtual?: boolean | null; } diff --git a/packages/types/src/message/base.ts b/packages/types/src/message/base.ts index 3d5115ea650..c3bbf1cb504 100644 --- a/packages/types/src/message/base.ts +++ b/packages/types/src/message/base.ts @@ -95,7 +95,7 @@ export interface ModelSpeed { export interface MessageMetadata extends ModelUsage, ModelSpeed {} -export type MessageRoleType = 'user' | 'system' | 'assistant' | 'tool'; +export type MessageRoleType = 'user' | 'system' | 'assistant' | 'tool' | 'supervisor'; export interface MessageItem { agentId: string | null; diff --git a/packages/types/src/serverConfig.ts b/packages/types/src/serverConfig.ts index 7bafdf3325c..9343d43d6e6 100644 --- a/packages/types/src/serverConfig.ts +++ b/packages/types/src/serverConfig.ts @@ -1,6 +1,6 @@ import type { PartialDeep } from 'type-fest'; -import { IFeatureFlags } from '@/config/featureFlags'; +import { IFeatureFlagsState } from '@/config/featureFlags'; import { ChatModelCard } from './llm'; import { @@ -45,5 +45,5 @@ export interface GlobalServerConfig { export interface GlobalRuntimeConfig { serverConfig: GlobalServerConfig; - serverFeatureFlags: IFeatureFlags; + serverFeatureFlags: IFeatureFlagsState; } diff --git a/packages/types/src/session/agentSession.ts b/packages/types/src/session/agentSession.ts index 90d8acf0dcd..184bfd220ae 100644 --- a/packages/types/src/session/agentSession.ts +++ b/packages/types/src/session/agentSession.ts @@ -51,4 +51,7 @@ export interface LobeAgentSettings { meta: MetaData; } -export type LobeSessions = LobeAgentSession[]; +// Union type for all session types +export type LobeSession = LobeAgentSession | LobeGroupSession; + +export type LobeSessions = LobeSession[]; diff --git a/packages/types/src/user/settings/systemAgent.ts b/packages/types/src/user/settings/systemAgent.ts index 759f09362c8..b9e708d183b 100644 --- a/packages/types/src/user/settings/systemAgent.ts +++ b/packages/types/src/user/settings/systemAgent.ts @@ -12,6 +12,7 @@ export interface QueryRewriteSystemAgent extends Omitv%kVb!<=UdEB{o4r||YCo|JdqPFUhj_=%a&pCVTwb$AE7=QQ(?V{GP16o`77@E4( zhuvp&Utw1Nwk58fJ~E=toK5P!R1QD8;o>3o7E3|bTX?Z0gy(vr_}8X2Y6TxBfW0s2 z&rMFb|BJN-e!6b}$I~wUJC#SvbsLz@0hxkE16TL+Pj4LxN@1R_K?f-EIn^4(*$x}O z8M#}%gO370+J7(3>+PEw@xZi=A1ykF1~^-~T?A$cWO79#o7J$w3h^k=7*rrL&>Cn6 z0_*EAvDU)&Jws~Y#JFzG0}n@l6TAA=M9D_5mf-^jw6*y$?4!r~kEPI2;Mk5hP#-Xe zWzirFCh8Q0NqB7?&;#MA-udlSg$M$5%rHL4()HS|Y=-Iv`Fk(>dyd`(3(G#3jlxRIk?V zSf_r-r9T#%RcCoAkKT8)9!h93aA!=Rj+UC)TYmxu0FRy5o5M5^G;D}AddO=ZjkZvb z7I#fiaikqKpIRt_+0&+Q(;4+hO$M5S7;oc7GhCqQwjzKAZXS}@2aUl-zC>w&#|{N< zm@gU@f*k82V>A37;YaEdDZab5hMU)(agQ?goTIZPn^g>a<}Nk1zEM5j-DRP_&B8K4 zw0{SU=;|tZgrLHf=@EZSm}n09q2jZN3{mk2@td~&PC!8-yQ|4MU6TQ6V>vX>WdxbV znkZFF8aqQqbjt72l;6dJfMtFQGolX>uxLa?x~|p2IQPh;HDdL^rtZM;Ep>S6mH=q% zpYu`N&vdrf9l|&HTyBrx_jwoVC6q$DXMb23>V?^Oz?=jD=W-xv8&jR%M>9{Hctwp>T z2%}HVv(PEV?`vXMBBlmRWQ~_MeD!<6=H?mK#5-3s^X}!E_K4BJ7}t>Qb57$A#|v0swIA$Ic=EGBe7#%YP{M#I zdC^84e7TFjD8N5naB*%@vleLlU{?@5EefCS0RA&$oD&4Zzk$EX0IZ;QjDNk|J`wW( zA<07Ytv}hYZ8PVsS&j3_0uDVH#xMi;F0B!>>+`R>upNJvWyWTfHO@>Hv6g4Lfn)WSpNjeZ z(v-%`iuUGt`GSJTaQ(?qQ-7nyLob)`chN$sN`zqt*Cgj!73U%*(l0^OxTzQ)pXYJW zAD3{67?mGm*+>Pn=ciR6b=l4}&+AnTe0rUlWIkUIk!1YXKCmT#u4Zmzm1lM~Ds163 zCtEaPYw+&}BDCQyh0X>abink^R)w8|W^poi6U4-$1M00R2Bh(b{C}N~@1_{@PUi7A zX+5|%gg>7qJ@eW#{OJ7wG?A&XMMJ%KD=bX$xZTqNJi9xHznpV%?OlzHtS67%V|k!f z2{4hnN#@Ct&8kFnZd&goJ*OlLlGCN2*sckSXhTY{C(f+tj-LwzfTZGH0+tKRqHVlQ z7tD7lShG3*(xScUx_|jggKG4B0HmEy>c8^wxbiQc0bev;CDo=9=KPIZzZS?-vR=XH z&-*Q7PN`P_r89r~%7A*JQWI4zZ{aB#PbhzZbia&yn@utw{Ns(H7vc@fcz3f8@xp4+ z;*l#ZRtsg|0#fTT)inN2D1e_=+IwF$ystyeUYXZ>n9omgaev&cC?5hqQo?K0!>NRW zP~1Xh21dx81AF>JIUwPT)%XBSV*mL@~L%qx`HOBEbE_{Bl>@_X&v_8$}Kp^sD^X8g9p z4~h2UI+-&iSbr|8QthNHe==rbEgF!x`^L|3&LeyJ)Oal$w*^pYmy-H%{wunlyR8%B za_JC;mkP#9$?v>RdWELcIOifk9NgWH=TPGw@Sy;d+T~e2%sl=D$K{QQxr>Yh-12G2 z6X00_eVK{t*v>9>>Vxe0p#W4ht<`Huv=#DbSmo7!q#Yk~>NcL45875?tMZ=L7aJY#1ZC${52N)(oW3Y0}{ z#g2fsls%4s7F3k7bOBYgRST+$BC60IAdm=9)WsrzDo~5qLx6ywaqH3&5)&W`m^hBN zv1fhTy*=+uOzqeK)c)d*u4d-Vd*^)jobP<+48tK--z$B`dVjvKPC4VaH=^&GpIV!R zVXb0j_N0JWPN}Z8PgUfTJs0+D!T+(?p?=ua|LQKEIoW|N>acw4lcy$I+a9(vg$&b^ z2$>Ey5Ga;iSuE9GPH^{MhLBZorb)?bWnXPC4!JM%^z=;Ne+4k`+ABSEW*YwFi|I^j z^Ic}Lg-d2bGJlHzm{81sFF9N}5B$)=+@e3Ygt7%wZ-l#Ng%kWA;%_2{WkXxv@z{kTS3=U4Bqq7Cl;&dPRW{mvn^sYnG7_vFLE!W*~O+nSCvUXy* z@&KJ&QuwU|hn>jajP*{*d+DStSS9<|T$Hv~#5&;ru z&M(w5%?q>4X@#p}#Bx^c_K8)EORf!NBmSJ?wn}T|&^nyF( zQh(khd^d7L_+)^_xu*B@Qc+#S?;076j7PviDod?aMOZ-$Ae1U9zj#af90UQpQf=G3 z0Ib?!|KuVMZe>s!A`o!kxm7ac(ZgX(N<~}B#`eir7zRW-(f|Y$Fp2;<(Rc{1$Wh&e zPbUeY9e7llHH;09_MdmfMZNQKKo>rb!ha}f2SGSgakcmBrK#>_BiT;XPVv(a1v5I8 z=YzDNOaOccMG8QKQ^XN&XsAdVE~{f?cyyx-RNPe1M4PeM6I zh<3iZ;f7F8FP|8z+;zhF7w_D(>FZhsXFrh06s{6hjzwx%4;ac74<-RMbV`vw1%Ib0 z4WT!|S2`vup&A`6tv%inCxrXt6H^ z89SkL9kQzlEi0A*MvjPUp;isxZtaJdEF$#DI2GK$d6DQVavNZGqRhxKQY zlbZ`yuB*%eu=~zCm%F@;eQlhopu4( zqQk+ohG{uIjMByz;10YCOt^I2>}IXvxAfEbvjA`=mqUvLy#n6WhUArN=;DkbArQP{ z8SG2eV0`_32%g{7&P&5-r{koPUG1pwMP6z6=_vpk`3b8$rCYtFD5UZH`4~_A7dhqv?E# zrX}d0Q~;7E=K!FPdE6vbYg+`7FOUK<+S)wk9t5lbpT+j(L_vzryu(>Ze4vjesT3GZ13+o5WQrhp9nrQ?f1Vz zWEgvxFu-cXc(4$fz*oMy5^ucPkIgUj;mwy`#)-#w;@X?nVCBgtfk}@H+Vo&}pf`Y2 zFTfukd;%LD{1g1*E`Kt>C{^llh zELj+TR`lTL$T${uc7O^WtXz!wz-^ivN@G+-6==G^i_g41v!>V5?4Ti0BN<;Na} zaPUKfBUC+fFj(xVPy9}Q_~8Eg(<$M;t%=HFo=HMG=^`kSS%1GYg}%N4RA~}A_4Jcr z*(Ut{R}c*RqtU2*56bhXLXLoS?kc!77n`5kjFIjCMrYo^@n@Y0p30)q`#XdaH5vyJ z-pGP5`{nCyug(Gxt^L1$;Ac83-$7zTNaI{l+;}`_g2pr6c@$K665;M`vEV3bMv-&r zl6FMGwPXcETYm?<*Pn$fSEz|aJ%UH9r*{L2rYx0D{HpVoTW_1o0a_KQ-Ivy#Yk}$# z93UzakqFWDND1G4gPIi8alVs6ug5Hpf%raxu}SzeJF3C0^bB=IDrr`WD&at*q6i{s z4eCklo|!)9G^72GJ-pHggDs3#bSA>aBt%q+(h*LUv48L5rSQ_-NG)rI?lkJ$o02GP z8-*!{kWar&nW;gRXeKCAHTiUMSWwBPI?LG?F24T9&weU^XpKI;;oF)lJ<3qkVh|At zslNxsDU|m!6#XM%kADETWeN@{AH)FMUnG_BW2dPsq2Ox z-FvXFLx27+7<+ufSzMMM;HY;n8co1_IvIs}l7@_7a`Ik@(%};@s+v%Td1MY|yVYnw zwK9T|Kp?3?9A^Rvd-dWQe(>~sehvvBT0@UK(nTk_gN5!DTvjOzL|k$h4@Wzyl=nJh zL_%sj=5ftrjVhu}AgdYz`VSy2`xznZ>)Nls{(PfD`S?@-(`(|1-jy=&Zbaao$NcI7 z0z@Yz6g46jiI3FCaipHq8AEQCLM|SqL3MrG_kP&-S++kHfa#@fznxDU-Fa3~8b)|X+dtA@Pz&wrqei{tMy{oO8g4^&+B zCjoziVN(G|F|k4jTNS(*ZpD?cSvY##w6qD};SBGdiQ?W$g7O5JgqQu>X-G33kI!+@v!DDXm|$mTrGm5$*i1l?0PHIVCc?mi>{*1( zhaeAE#dO&1RDWW;Rg6yp*cyqm)20%tEI@-5a1{f!GK(j)8&`?2B(lP549_ydx6Ee? z07qTqb(AY!(((@~WVVTwiIvNGn*g~5&?#0XYgHU+MfAvctF6bN(t;74DI^YH*Dx{ipMwFXfOvbI?GQ}ItF^T0CRpF;UuHELB*>8Adb-})SD!L3%_)9 z)Db2l1fKx04p&Zs(4;Ce5RWo0KTqc(GtdRJwy5w%foAc1el&xO0337@t{pQW5C?QC zCVP=fGN=4r) zV`^SUPn!yl7kc0f{G$qpn@QXHmJxb3ZYd?8#NQFnbBtM%-zoEIFcLw za3Aiy=UeXg{g+_Gd~AAkA>MueaL&|e^-Rv6pU8;ae@*L3u75#eDGT1x1?!(;%#e{c z@0)HNQI+@>n<~?jGz3}CgCxq(d=!iy?dtA-({j0O;ljNodwP@3o#l&GN2UKnpIFg#mQy^OI}B`GvJ` z)9?rU2!--s1b+-nFDZf~XfT2ye(6YMTog_!UFT^zuta~&0Cvy;u``}az#JQ*-v=TP z2#h-sMCiH(Me#vQyHI2U;Lip?)OO|%5m@b^E~Bz#E)%9 zeZS0SRwOrGxv%c+5W%;G`m4+~H!4$#p;lA^u^u=b{QZo{@K_MS=Qb!MRUn1|yQ33k zYbTgrdQ@6>d`0#XWNNLHizhq$<9O|P+g$pZGJTVjRWb}bN>Jeoj!2@K4pgh0000 { - initServerConfigStore({ featureFlags: { market: true, ai_image: true } }); + initServerConfigStore({ + featureFlags: { + ...mapFeatureFlagsEnvToState(DEFAULT_FEATURE_FLAGS), + showMarket: true, + showAiImage: true, + }, + }); }); beforeEach(() => { @@ -21,7 +28,13 @@ beforeEach(() => { }); afterEach(() => { - createServerConfigStore().setState({ featureFlags: { market: true, ai_image: true } }); + createServerConfigStore().setState({ + featureFlags: { + ...createServerConfigStore().getState().featureFlags, + showMarket: true, + showAiImage: true, + }, + }); cleanup(); }); @@ -66,7 +79,12 @@ describe('TopActions', () => { it('should render only Chat icon when `-market` is set', () => { act(() => { - createServerConfigStore().setState({ featureFlags: { market: false } }); + createServerConfigStore().setState({ + featureFlags: { + ...createServerConfigStore().getState().featureFlags, + showMarket: false, + }, + }); }); renderTopActions(); @@ -77,7 +95,12 @@ describe('TopActions', () => { it('should render File icon when `-knowledge_base` is set', () => { act(() => { - createServerConfigStore().setState({ featureFlags: { knowledge_base: false } }); + createServerConfigStore().setState({ + featureFlags: { + ...createServerConfigStore().getState().featureFlags, + enableKnowledgeBase: false, + }, + }); }); renderTopActions(); @@ -88,7 +111,12 @@ describe('TopActions', () => { it('should not render AI Image icon when ai_image is disabled', () => { act(() => { - createServerConfigStore().setState({ featureFlags: { ai_image: false } }); + createServerConfigStore().setState({ + featureFlags: { + ...createServerConfigStore().getState().featureFlags, + showAiImage: false, + }, + }); }); renderTopActions(); diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/ClassicChat.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/ClassicChat.tsx index ce8115b472e..7f812ebb583 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/ClassicChat.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/ClassicChat.tsx @@ -1,21 +1,18 @@ 'use client'; -import { Alert, Hotkey, Icon } from '@lobehub/ui'; -import { BotMessageSquare, LucideCheck, MessageSquarePlus } from 'lucide-react'; +import { Alert } from '@lobehub/ui'; import { Suspense, memo } from 'react'; -import { Trans, useTranslation } from 'react-i18next'; +import { useTranslation } from 'react-i18next'; import { Flexbox } from 'react-layout-kit'; import { type ActionKeys, ChatInputProvider, DesktopChatInput } from '@/features/ChatInput'; import WideScreenContainer from '@/features/Conversation/components/WideScreenContainer'; import { useChatStore } from '@/store/chat'; import { aiChatSelectors } from '@/store/chat/selectors'; -import { useUserStore } from '@/store/user'; -import { preferenceSelectors, settingsSelectors } from '@/store/user/selectors'; -import { HotkeyEnum, KeyEnum } from '@/types/hotkey'; import { useSend } from '../useSend'; import MessageFromUrl from './MessageFromUrl'; +import { useSendMenuItems } from './useSendMenuItems'; const leftActions: ActionKeys[] = [ 'model', @@ -34,16 +31,13 @@ const rightActions: ActionKeys[] = ['saveTopic']; const ClassicChatInput = memo(() => { const { t } = useTranslation('chat'); const { send, generating, disabled, stop } = useSend(); - const [useCmdEnterToSend, updatePreference] = useUserStore((s) => [ - preferenceSelectors.useCmdEnterToSend(s), - s.updatePreference, - ]); const [mainInputSendErrorMsg, clearSendMessageError] = useChatStore((s) => [ aiChatSelectors.isCurrentSendMessageError(s), s.clearSendMessageError, ]); - const hotkey = useUserStore(settingsSelectors.getHotkeyById(HotkeyEnum.AddUserMessage)); + + const sendMenuItems = useSendMenuItems(); return ( { rightActions={rightActions} sendButtonProps={{ disabled, generating, onStop: stop }} sendMenu={{ - items: [ - { - icon: !useCmdEnterToSend ? :
, - key: 'sendWithEnter', - label: ( - - , - }} - i18nKey={'input.sendWithEnter'} - ns={'chat'} - /> - - ), - onClick: () => { - updatePreference({ useCmdEnterToSend: false }); - }, - }, - { - icon: useCmdEnterToSend ? :
, - key: 'sendWithCmdEnter', - label: ( - - - ), - }} - i18nKey={'input.sendWithCmdEnter'} - ns={'chat'} - /> - - ), - onClick: () => { - updatePreference({ useCmdEnterToSend: true }); - }, - }, - { type: 'divider' }, - { - // disabled, - icon: , - key: 'addAi', - label: t('input.addAi'), - onClick: () => { - send({ onlyAddAIMessage: true }); - }, - }, - { - // disabled, - icon: , - key: 'addUser', - label: ( - - {t('input.addUser')} - - - ), - onClick: () => { - send({ onlyAddUserMessage: true }); - }, - }, - ], + items: sendMenuItems, }} > diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/GroupChat.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/GroupChat.tsx index c2d802e60b5..541bbd413cf 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/GroupChat.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/GroupChat.tsx @@ -1,49 +1,87 @@ 'use client'; -import { Alert, Hotkey, Icon } from '@lobehub/ui'; -import { BotMessageSquare, LucideCheck, MessageSquarePlus } from 'lucide-react'; -import { Suspense, memo } from 'react'; -import { Trans, useTranslation } from 'react-i18next'; +import { SlashOptions } from '@lobehub/editor'; +import { Alert, Avatar, GroupAvatar } from '@lobehub/ui'; +import { isEqual } from 'lodash'; +import { Suspense, memo, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; import { Flexbox } from 'react-layout-kit'; +import { DEFAULT_AVATAR } from '@/const/meta'; import { type ActionKeys, ChatInputProvider, DesktopChatInput } from '@/features/ChatInput'; import WideScreenContainer from '@/features/Conversation/components/WideScreenContainer'; import { useChatStore } from '@/store/chat'; import { aiChatSelectors } from '@/store/chat/selectors'; -import { useUserStore } from '@/store/user'; -import { preferenceSelectors, settingsSelectors } from '@/store/user/selectors'; -import { HotkeyEnum, KeyEnum } from '@/types/hotkey'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; -import { useSend } from '../useSend'; +import { useSendGroupMessage } from '../useSend'; import MessageFromUrl from './MessageFromUrl'; +import { useSendMenuItems } from './useSendMenuItems'; const leftActions: ActionKeys[] = [ - 'model', - 'search', 'typo', 'fileUpload', 'knowledgeBase', - 'tools', '---', - ['params', 'history', 'stt', 'clear'], - 'mainToken', + ['stt', 'clear'], + 'groupChatToken', ]; +const dmLeftActions: ActionKeys[] = ['typo', 'fileUpload', 'knowledgeBase', '---', ['stt']]; + const rightActions: ActionKeys[] = ['saveTopic']; -const Desktop = memo(() => { +/** + * Message Editor for Group Chat along with DM Portal + */ +const Desktop = memo((props: { targetMemberId?: string }) => { const { t } = useTranslation('chat'); - const { send, generating, disabled, stop } = useSend(); - const [useCmdEnterToSend, updatePreference] = useUserStore((s) => [ - preferenceSelectors.useCmdEnterToSend(s), - s.updatePreference, - ]); + const { send, generating, disabled, stop } = useSendGroupMessage(); + + const isDMPortal = !!props.targetMemberId; + const currentGroupMemebers = useSessionStore(sessionSelectors.currentGroupAgents, isEqual); const [mainInputSendErrorMsg, clearSendMessageError] = useChatStore((s) => [ aiChatSelectors.isCurrentSendMessageError(s), s.clearSendMessageError, ]); - const hotkey = useUserStore(settingsSelectors.getHotkeyById(HotkeyEnum.AddUserMessage)); + + const mentionItems: SlashOptions['items'] = useMemo(() => { + if (!currentGroupMemebers) return []; + return [ + { + icon: ( + ({ + avatar: member.avatar || DEFAULT_AVATAR, + background: member.backgroundColor || undefined, + })) || [] + } + size={24} + /> + ), + key: 'ALL_MEMBERS', + label: t('memberSelection.allMembers'), + metadata: { id: 'ALL_MEMBERS' }, + }, + ...currentGroupMemebers.map((member) => ({ + icon: ( + + ), + key: member.id, + label: member.title, + metadata: { id: member.id }, + })), + ]; + }, [currentGroupMemebers]); + + const sendMenuItems = useSendMenuItems(); return ( { if (!instance) return; useChatStore.setState({ mainInputEditor: instance }); }} - leftActions={leftActions} + leftActions={isDMPortal ? dmLeftActions : leftActions} + mentionItems={mentionItems} onMarkdownContentChange={(content) => { useChatStore.setState({ inputMessage: content }); }} onSend={() => { - send(); + send({ targetMemberId: props.targetMemberId }); }} - rightActions={rightActions} + rightActions={isDMPortal ? [] : rightActions} sendButtonProps={{ disabled, generating, onStop: stop }} sendMenu={{ - items: [ - { - icon: !useCmdEnterToSend ? :
, - key: 'sendWithEnter', - label: ( - - , - }} - i18nKey={'input.sendWithEnter'} - ns={'chat'} - /> - - ), - onClick: () => { - updatePreference({ useCmdEnterToSend: false }); - }, - }, - { - icon: useCmdEnterToSend ? :
, - key: 'sendWithCmdEnter', - label: ( - - - ), - }} - i18nKey={'input.sendWithCmdEnter'} - ns={'chat'} - /> - - ), - onClick: () => { - updatePreference({ useCmdEnterToSend: true }); - }, - }, - { type: 'divider' }, - { - // disabled, - icon: , - key: 'addAi', - label: t('input.addAi'), - onClick: () => { - send({ onlyAddAIMessage: true }); - }, - }, - { - // disabled, - icon: , - key: 'addUser', - label: ( - - {t('input.addUser')} - - - ), - onClick: () => { - send({ onlyAddUserMessage: true }); - }, - }, - ], + items: sendMenuItems, }} > diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/index.tsx index fe5e020300a..b9bf5529698 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/index.tsx @@ -2,10 +2,16 @@ import { memo } from 'react'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; + import ClassicChatInput from './ClassicChat'; +import GroupChatInput from './GroupChat'; + +const Desktop = memo((props: { targetMemberId?: string }) => { + const isGroupSession = useSessionStore(sessionSelectors.isCurrentSessionGroupSession); -const Desktop = memo(() => { - return ; + return isGroupSession ? : ; }); export default Desktop; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/useSendMenuItems.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/useSendMenuItems.tsx new file mode 100644 index 00000000000..76181126c73 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Desktop/useSendMenuItems.tsx @@ -0,0 +1,92 @@ +'use client'; + +import { Hotkey, Icon, type MenuProps } from '@lobehub/ui'; +import { BotMessageSquare, LucideCheck, MessageSquarePlus } from 'lucide-react'; +import { useMemo } from 'react'; +import { Trans, useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import { useUserStore } from '@/store/user'; +import { preferenceSelectors, settingsSelectors } from '@/store/user/selectors'; +import { HotkeyEnum, KeyEnum } from '@/types/hotkey'; + +import { useSend } from '../useSend'; + +export const useSendMenuItems = (): MenuProps['items'] => { + const { t } = useTranslation('chat'); + const { send } = useSend(); + const [useCmdEnterToSend, updatePreference] = useUserStore((s) => [ + preferenceSelectors.useCmdEnterToSend(s), + s.updatePreference, + ]); + + const hotkey = useUserStore(settingsSelectors.getHotkeyById(HotkeyEnum.AddUserMessage)); + + return useMemo( + () => [ + { + icon: !useCmdEnterToSend ? :
, + key: 'sendWithEnter', + label: ( + + , + }} + i18nKey={'input.sendWithEnter'} + ns={'chat'} + /> + + ), + onClick: () => { + updatePreference({ useCmdEnterToSend: false }); + }, + }, + { + icon: useCmdEnterToSend ? :
, + key: 'sendWithCmdEnter', + label: ( + + + ), + }} + i18nKey={'input.sendWithCmdEnter'} + ns={'chat'} + /> + + ), + onClick: () => { + updatePreference({ useCmdEnterToSend: true }); + }, + }, + { type: 'divider' }, + { + // disabled, + icon: , + key: 'addAi', + label: t('input.addAi'), + onClick: () => { + send({ onlyAddAIMessage: true }); + }, + }, + { + // disabled, + icon: , + key: 'addUser', + label: ( + + {t('input.addUser')} + + + ), + onClick: () => { + send({ onlyAddUserMessage: true }); + }, + }, + ], + [useCmdEnterToSend, send, updatePreference, hotkey], + ); +}; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/MentionedUsers/MentionedUserItem.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/MentionedUsers/MentionedUserItem.tsx new file mode 100644 index 00000000000..40bf85def3d --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/MentionedUsers/MentionedUserItem.tsx @@ -0,0 +1,54 @@ +import { Avatar, Text } from '@lobehub/ui'; +import { memo } from 'react'; +import { Flexbox } from 'react-layout-kit'; + +import { useMentionStore } from '@/store/mention'; + +interface MentionedUserItemProps { + agent: any; // The actual agent data from the group +} + +const MentionedUserItem = memo(({ agent }) => { + const removeMentionedUser = useMentionStore((s: any) => s.removeMentionedUser); + + const handleRemove = () => { + removeMentionedUser(agent.id); + }; + + return ( + + + + {agent.title || agent.id} + +
+ × +
+
+ ); +}); + +export default MentionedUserItem; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/MentionedUsers/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/MentionedUsers/index.tsx new file mode 100644 index 00000000000..82292ae90da --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/MentionedUsers/index.tsx @@ -0,0 +1,41 @@ +import { memo } from 'react'; +import { Flexbox } from 'react-layout-kit'; + +import { useMentionStore } from '@/store/mention'; +import { mentionSelectors } from '@/store/mention/selectors'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; + +import MentionedUserItem from './MentionedUserItem'; + +const MentionedUsers = memo(() => { + const currentSession = useSessionStore(sessionSelectors.currentSession); + const mentionedUsers = useMentionStore(mentionSelectors.mentionedUsers); + const hasMentionedUsers = useMentionStore(mentionSelectors.hasMentionedUsers); + + const groupMembers = useSessionStore(sessionSelectors.currentGroupAgents); + + const mentionedAgents = (groupMembers || []).filter((member) => + mentionedUsers.includes(member.id || ''), + ); + + if (currentSession?.type !== 'group' || !hasMentionedUsers || mentionedAgents.length === 0) + return null; + + return ( + + + {mentionedAgents.map((member) => ( + + ))} + + + ); +}); + +export default MentionedUsers; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx index 23178690cf5..1f1f14e75fb 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/Mobile/index.tsx @@ -12,9 +12,11 @@ import { ChatInputProvider, } from '@/features/ChatInput'; import { useChatStore } from '@/store/chat'; -import { aiChatSelectors } from '@/store/chat/slices/aiChat/selectors'; +import { aiChatSelectors } from '@/store/chat/selectors'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; -import { useSend } from '../useSend'; +import { useSend, useSendGroupMessage } from '../useSend'; const leftActions: ActionKeys[] = [ 'model', @@ -25,6 +27,7 @@ const leftActions: ActionKeys[] = [ '---', ['params', 'history', 'stt', 'clear'], 'mainToken', + 'mention', ]; const rightActions: ActionKey[] = ['saveTopic']; @@ -32,6 +35,9 @@ const rightActions: ActionKey[] = ['saveTopic']; const MobileChatInput = memo(() => { const { t } = useTranslation('chat'); const { send, disabled, generating, stop } = useSend(); + const { send: sendGroupMessage } = useSendGroupMessage(); + + const isSessionGroup = useSessionStore(sessionSelectors.isCurrentSessionGroupSession); const [mainInputSendErrorMsg, clearSendMessageError] = useChatStore((s) => [ aiChatSelectors.isCurrentSendMessageError(s), @@ -48,7 +54,13 @@ const MobileChatInput = memo(() => { onMarkdownContentChange={(content) => { useChatStore.setState({ inputMessage: content }); }} - onSend={() => send()} + onSend={() => { + if (isSessionGroup) { + sendGroupMessage(); + } else { + send(); + } + }} rightActions={rightActions} sendButtonProps={{ disabled, generating, onStop: stop }} > diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/index.tsx index a4351b5b144..9365a7af1f1 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/index.tsx @@ -1,10 +1,15 @@ import DesktopChatInput from './Desktop'; import MobileChatInput from './V1Mobile'; -const ChatInput = ({ mobile }: { mobile: boolean }) => { +interface ChatInputProps { + mobile: boolean; + targetMemberId?: string; +} + +const ChatInput = ({ mobile, targetMemberId }: ChatInputProps) => { const Input = mobile ? MobileChatInput : DesktopChatInput; - return ; + return ; }; export default ChatInput; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts index c212f4e4fff..762c2cee9f4 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatInput/useSend.ts @@ -1,5 +1,5 @@ import { useAnalytics } from '@lobehub/analytics/react'; -import { useMemo } from 'react'; +import { useCallback, useMemo } from 'react'; import { useGeminiChineseWarning } from '@/hooks/useGeminiChineseWarning'; import { getAgentStoreState } from '@/store/agent'; @@ -7,6 +7,9 @@ import { agentSelectors } from '@/store/agent/selectors'; import { getChatStoreState, useChatStore } from '@/store/chat'; import { aiChatSelectors, chatSelectors, topicSelectors } from '@/store/chat/selectors'; import { fileChatSelectors, useFileStore } from '@/store/file'; +import { mentionSelectors, useMentionStore } from '@/store/mention'; +import { useSessionStore } from '@/store/session'; +import { sessionMetaSelectors } from '@/store/session/selectors'; import { getUserStoreState } from '@/store/user'; export interface UseSendMessageParams { @@ -15,6 +18,10 @@ export interface UseSendMessageParams { onlyAddUserMessage?: boolean; } +export type UseSendGroupMessageParams = UseSendMessageParams & { + targetMemberId?: string; +}; + export const useSend = () => { const [ isContentEmpty, @@ -144,3 +151,166 @@ export const useSend = () => { [canNotSend, generating, isSendingMessage, stop, handleSend], ); }; + +export const useSendGroupMessage = () => { + const [ + isContentEmpty, + sendGroupMessage, + updateInputMessage, + stopGenerateMessage, + isSendButtonDisabledByMessage, + isCreatingMessage, + ] = useChatStore((s) => [ + !s.inputMessage, + s.sendGroupMessage, + s.updateInputMessage, + s.stopGenerateMessage, + chatSelectors.isSendButtonDisabledByMessage(s), + chatSelectors.isCreatingMessage(s), + ]); + + const isSupervisorThinking = useChatStore((s) => + chatSelectors.isSupervisorLoading(s.activeId)(s), + ); + const { analytics } = useAnalytics(); + const checkGeminiChineseWarning = useGeminiChineseWarning(); + + const fileList = fileChatSelectors.chatUploadFileList(useFileStore.getState()); + const [isUploadingFiles, clearChatUploadFileList] = useFileStore((s) => [ + fileChatSelectors.isUploadingFiles(s), + s.clearChatUploadFileList, + ]); + + const isInputEmpty = isContentEmpty && fileList.length === 0; + + const canNotSend = + isInputEmpty || + isUploadingFiles || + isSendButtonDisabledByMessage || + isCreatingMessage || + isSupervisorThinking; + + const handleSend = useCallback( + async (params: UseSendGroupMessageParams = {}) => { + if (canNotSend) return; + + const store = useChatStore.getState(); + if (!store.activeId) return; + + const mainInputEditor = store.mainInputEditor; + if (!mainInputEditor) { + console.warn('not found mainInputEditor instance'); + return; + } + + if ( + chatSelectors.isSupervisorLoading(store.activeId)(store) || + chatSelectors.isCreatingMessage(store) + ) + return; + + const inputMessage = store.inputMessage; + + // if there is no message and no files, then we should not send the message + if (!inputMessage && fileList.length === 0) return; + + // Check for Chinese text warning with Gemini model + const agentStore = getAgentStoreState(); + const currentModel = agentSelectors.currentAgentModel(agentStore); + const shouldContinue = await checkGeminiChineseWarning({ + model: currentModel, + prompt: inputMessage, + scenario: 'chat', + }); + + if (!shouldContinue) return; + + // Append mentioned users as plain text like "@userName" + const mentionState = useMentionStore.getState(); + const mentioned = mentionSelectors.mentionedUsers(mentionState); + const sessionState = useSessionStore.getState(); + const mentionText = + mentioned.length > 0 + ? ` ${mentioned + .map((id) => sessionMetaSelectors.getAgentMetaByAgentId(id)(sessionState).title || id) + .map((name) => `@${name}`) + .join(' ')}` + : ''; + const messageWithMentions = `${inputMessage}${mentionText}`.trim(); + + sendGroupMessage({ + files: fileList, + groupId: store.activeId, + message: messageWithMentions, + targetMemberId: params.targetMemberId, + ...params, + }); + + clearChatUploadFileList(); + mainInputEditor.setExpand(false); + mainInputEditor.clearContent(); + mainInputEditor.focus(); + updateInputMessage(''); + // clear mentioned users after sending + mentionState.clearMentionedUsers(); + + // 获取分析数据 + const userStore = getUserStoreState(); + const hasImages = fileList.some((file) => file.file?.type?.startsWith('image')); + const messageType = fileList.length === 0 ? 'text' : hasImages ? 'image' : 'file'; + + analytics?.track({ + name: 'send_group_message', + properties: { + chat_id: store.activeId || 'unknown', + current_topic: topicSelectors.currentActiveTopic(store)?.title || null, + has_attachments: fileList.length > 0, + history_message_count: chatSelectors.activeBaseChats(store).length, + message: inputMessage, + message_length: inputMessage.length, + message_type: messageType, + selected_model: agentSelectors.currentAgentModel(agentStore), + session_id: store.activeId || 'inbox', // 当前活跃的会话ID + user_id: userStore.user?.id || 'anonymous', + }, + }); + }, + [ + canNotSend, + fileList, + clearChatUploadFileList, + updateInputMessage, + analytics, + checkGeminiChineseWarning, + ], + ); + + const stop = useCallback(() => { + const store = getChatStoreState(); + const isAgentGenerating = chatSelectors.isAIGenerating(store); + const isCreating = chatSelectors.isCreatingMessage(store); + + if (isAgentGenerating) { + stopGenerateMessage(); + return; + } + + if (isCreating) { + // For group messages, we don't have a separate cancel method like in single chat + // The isCreatingMessage state will be reset when the operation completes + // We can potentially add a cancel group message functionality in the future + console.warn('Group message creation in progress, cannot cancel'); + } + }, [stopGenerateMessage]); + + return useMemo( + () => ({ + disabled: canNotSend, + generating: isSupervisorThinking || isCreatingMessage, + send: handleSend, + stop, + updateInputMessage, + }), + [canNotSend, isSupervisorThinking, isCreatingMessage, handleSend, stop, updateInputMessage], + ); +}; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/OrchestratorThinking.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/OrchestratorThinking.tsx new file mode 100644 index 00000000000..4aed277a09c --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/OrchestratorThinking.tsx @@ -0,0 +1,58 @@ +import { ActionIcon, Text } from '@lobehub/ui'; +import { createStyles } from 'antd-style'; +import { StopCircle } from 'lucide-react'; +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Center } from 'react-layout-kit'; + +import { useChatStore } from '@/store/chat'; +import { chatSelectors } from '@/store/chat/selectors'; +import { useSessionStore } from '@/store/session'; +import { shinyTextStylish } from '@/styles/loading'; + +const useStyles = createStyles(({ token, css }) => ({ + container: css` + .show-on-hover { + opacity: 0; + transition: all ease-in-out 0.3ms; + } + + :hover { + .show-on-hover { + opacity: 1; + } + } + `, + + shinyText: shinyTextStylish(token), +})); + +const OrchestratorThinkingTag = memo(() => { + const { t } = useTranslation('chat'); + const activeGroupId = useSessionStore((s) => s.activeId); + const isSupervisorLoading = useChatStore(chatSelectors.isSupervisorLoading(activeGroupId || '')); + const cancelSupervisorDecision = useChatStore((s) => s.internal_cancelSupervisorDecision); + const { styles } = useStyles(); + + if (!isSupervisorLoading) return null; + + return ( +
+ + {t('group.orchestratorThinking')} + + { + e.stopPropagation(); + cancelSupervisorDecision(activeGroupId); + }} + size={'small'} + title={t('groupSidebar.members.stopOrchestrator')} + /> +
+ ); +}); + +export default OrchestratorThinkingTag; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/index.tsx index 84615142c8b..3c7f7fcaa7c 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/index.tsx @@ -1,6 +1,7 @@ import { createStyles } from 'antd-style'; import React, { memo } from 'react'; +import OrchestratorThinkingTag from '@/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/ChatItem/OrchestratorThinking'; import { ChatItem } from '@/features/Conversation'; import { useAgentStore } from '@/store/agent'; import { agentChatConfigSelectors } from '@/store/agent/selectors'; @@ -63,22 +64,27 @@ const MainChatItem = memo(({ id, index }) => { const placement = displayMode === 'chat' && userRole === 'user' ? 'end' : 'start'; + const isLatestItem = historyLength === index + 1; + return ( - - ) - } - id={id} - index={index} - /> + <> + + ) + } + id={id} + index={index} + /> + {isLatestItem && } + ); }); diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/GroupUsageSuggest.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/GroupUsageSuggest.tsx new file mode 100644 index 00000000000..faa6dba389f --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/GroupUsageSuggest.tsx @@ -0,0 +1,164 @@ +'use client'; + +import { ActionIcon, Block, Grid, Text } from '@lobehub/ui'; +import { createStyles } from 'antd-style'; +import { shuffle } from 'lodash-es'; +import { RefreshCw } from 'lucide-react'; +import { memo, useEffect, useMemo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import { useSendGroupMessage } from '../../../ChatInput/useSend'; +import { useTemplateMatching } from './useTemplateMatching'; + +const useStyles = createStyles(({ css, token, responsive }) => ({ + card: css` + cursor: pointer; + + position: relative; + + overflow: hidden; + + height: 100%; + min-height: 110px; + padding: 16px; + border-radius: ${token.borderRadiusLG}px; + + background: ${token.colorBgContainer}; + + transition: all ${token.motionDurationMid}; + + &:hover { + border-color: ${token.colorPrimary}; + box-shadow: 0 2px 8px ${token.colorPrimaryBg}; + } + + ${responsive.mobile} { + min-height: 72px; + } + `, + cardDesc: css` + margin-block: 0 !important; + color: ${token.colorTextDescription}; + `, + cardTitle: css` + margin-block: 0 !important; + font-size: 16px; + font-weight: bold; + `, + emoji: css` + display: flex; + flex: none; + align-items: center; + justify-content: center; + + width: 40px; + height: 40px; + border-radius: ${token.borderRadius}px; + + font-size: 24px; + + background: ${token.colorFillTertiary}; + `, + title: css` + color: ${token.colorTextDescription}; + `, +})); + +// Get fallback activities from general section +const getFallbackActivities = (t: any) => { + const generalActivities = t('guide.groupActivities.general', { returnObjects: true }) as Record< + string, + { description: string; emoji: string; prompt: string; title: string } + >; + return generalActivities || {}; +}; + +const GroupUsageSuggest = memo<{ mobile?: boolean }>(({ mobile }) => { + const { t } = useTranslation('welcome'); + const { styles } = useStyles(); + const { updateInputMessage, send } = useSendGroupMessage(); + const templateMatch = useTemplateMatching(); + + const itemsPerPage = mobile ? 2 : 4; + + // Use template-specific activities if available, otherwise use fallback + const availableActivities = useMemo(() => { + if (templateMatch?.activities && Object.keys(templateMatch.activities).length > 0) { + return templateMatch.activities; + } + return getFallbackActivities(t); + }, [templateMatch?.templateId, t]); // Use templateId instead of activities to prevent object reference issues + + const activityKeys = useMemo(() => Object.keys(availableActivities), [availableActivities]); + const [shuffledActivityKeys, setShuffledActivityKeys] = useState([]); + + // Initialize shuffled activities only once when activityKeys change + useEffect(() => { + if (activityKeys.length > 0) { + setShuffledActivityKeys(shuffle([...activityKeys])); + } + }, [activityKeys]); + + const displayedActivityKeys = shuffledActivityKeys.slice(0, itemsPerPage); + + const handleRefresh = () => { + if (activityKeys.length > 0) { + setShuffledActivityKeys(shuffle([...activityKeys])); + } + }; + + // Don't render if no activities available or not yet initialized + if (!activityKeys.length || !shuffledActivityKeys.length) { + return null; + } + + return ( + + +
{t('guide.groupActivities.title')}
+ +
+ + {displayedActivityKeys.map((activityKey) => { + const activity = availableActivities[activityKey]; + if (!activity) return null; + + const { title, emoji, description, prompt } = activity; + + return ( + { + updateInputMessage(prompt); + send(); + }} + variant={'outlined'} + > +
{emoji}
+ + + {title} + + + {description} + + +
+ ); + })} +
+
+ ); +}); + +export default GroupUsageSuggest; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/index.tsx new file mode 100644 index 00000000000..53180309e64 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/index.tsx @@ -0,0 +1,55 @@ +'use client'; + +import { createStyles } from 'antd-style'; +import { memo } from 'react'; +import { Center, Flexbox } from 'react-layout-kit'; + +import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig'; + +import GroupUsageSuggest from './GroupUsageSuggest'; + +const useStyles = createStyles(({ css, responsive }) => ({ + container: css` + align-items: center; + ${responsive.mobile} { + align-items: flex-start; + } + `, + desc: css` + font-size: 14px; + text-align: center; + ${responsive.mobile} { + text-align: start; + } + `, + title: css` + margin-block: 0.2em 0; + font-size: 32px; + font-weight: bolder; + line-height: 1; + ${responsive.mobile} { + font-size: 24px; + } + `, +})); + +const GroupWelcome = memo(() => { + const { styles } = useStyles(); + const mobile = useServerConfigStore((s) => s.isMobile); + const { showWelcomeSuggest } = useServerConfigStore(featureFlagsSelectors); + + return ( +
+ + {showWelcomeSuggest && } + +
+ ); +}); + +export default GroupWelcome; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/useTemplateMatching.ts b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/useTemplateMatching.ts new file mode 100644 index 00000000000..b4a8370eb86 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/GroupWelcome/useTemplateMatching.ts @@ -0,0 +1,105 @@ +import { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { useGroupTemplates } from '@/components/ChatGroupWizard/templates'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; +import { LobeGroupSession } from '@/types/session'; + +interface TemplateMatch { + activities: Record; + templateId: string; +} + +export const useTemplateMatching = (): TemplateMatch | null => { + const { t } = useTranslation('welcome'); + const groupTemplates = useGroupTemplates(); + const currentSession = useSessionStore( + sessionSelectors.currentSession, + ) as LobeGroupSession | null; + + console.log('groupTemplates', groupTemplates); + console.log('currentSession', currentSession); + + return useMemo(() => { + if (!currentSession || currentSession.type !== 'group') { + console.log('No group session found:', { currentSession }); + return null; + } + + const currentTitle = currentSession.meta?.title || ''; + const currentMemberCount = currentSession.members?.length || 0; + + console.log('Current group session:', { + memberCount: currentMemberCount, + members: currentSession.members, + title: currentTitle, + }); + + // Try to match by title and member count + for (const template of groupTemplates) { + const templateTitle = template.title; + const templateMemberCount = template.members.length; + + console.log('Checking template:', { + memberCountDiff: Math.abs(templateMemberCount - currentMemberCount), + templateId: template.id, + templateMemberCount, + templateTitle, + titleMatch: templateTitle.toLowerCase() === currentTitle.toLowerCase(), + }); + + // Check if titles match (case-insensitive) and member counts are similar (±1) + if ( + templateTitle.toLowerCase() === currentTitle.toLowerCase() && + Math.abs(templateMemberCount - currentMemberCount) <= 1 + ) { + console.log('Found exact match for template:', template.id); + // Get template-specific activities from i18n + const templateActivities = (t as any)(`guide.groupActivities.${template.id}`, { + returnObjects: true, + }) as Record; + + console.log('Template activities:', templateActivities); + + return { + activities: templateActivities || {}, + templateId: template.id, + }; + } + } + + // If no exact match, try partial title matching + console.log('No exact match found, trying partial matching...'); + for (const template of groupTemplates) { + const templateTitle = template.title; + + const currentIncludes = currentTitle.toLowerCase().includes(templateTitle.toLowerCase()); + const templateIncludes = templateTitle.toLowerCase().includes(currentTitle.toLowerCase()); + + console.log('Partial match check:', { + currentIncludes, + templateId: template.id, + templateIncludes, + templateTitle, + }); + + if (currentIncludes || templateIncludes) { + console.log('Found partial match for template:', template.id); + const templateActivities = (t as any)(`guide.groupActivities.${template.id}`, { + returnObjects: true, + }) as Record; + + console.log('Template activities:', templateActivities); + + return { + activities: templateActivities || {}, + templateId: template.id, + }; + } + } + + console.log('No template match found, returning null'); + return null; + }, [currentSession, groupTemplates, t]); +}; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/index.tsx index 2c7e77c9387..d21967dd27d 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@conversation/features/ChatList/WelcomeChatItem/index.tsx @@ -1 +1,17 @@ -export { default } from './WelcomeMessage'; +import React, { memo } from 'react'; + +import { sessionSelectors } from '@/store/session/selectors'; +import { useSessionStore } from '@/store/session/store'; + +import GroupWelcome from './GroupWelcome'; +import WelcomeMessage from './WelcomeMessage'; + +const WelcomeChatItem = memo(() => { + const isGroupSession = useSessionStore(sessionSelectors.isCurrentSessionGroupSession); + + if (isGroupSession) return ; + + return ; +}); + +export default WelcomeChatItem; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/_layout/Desktop.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/_layout/Desktop.tsx index 522f3862158..f7e86b94ffe 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/_layout/Desktop.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/_layout/Desktop.tsx @@ -1,16 +1,11 @@ import { PropsWithChildren } from 'react'; import { Flexbox } from 'react-layout-kit'; -import Header from '../features/Header'; - const Layout = ({ children }: PropsWithChildren) => { return ( - <> -
- - {children} - - + + {children} + ); }; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/_layout/Mobile.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/_layout/Mobile.tsx index 296f5717807..a5527e35030 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/_layout/Mobile.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/_layout/Mobile.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react'; import { Flexbox } from 'react-layout-kit'; -import TopicSearchBar from '../features/TopicSearchBar'; +import TopicSearchBar from '../features/Topic/TopicSearchBar'; const Layout = ({ children }: PropsWithChildren) => { return ( diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/default.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/default.tsx index 224213b88f6..53e137826db 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/default.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/default.tsx @@ -1,5 +1,5 @@ -// import TopicListContent from './features/TopicListContent'; -import React, { Suspense, lazy } from 'react'; +import dynamic from 'next/dynamic'; +import React from 'react'; import { DynamicLayoutProps } from '@/types/next'; import { RouteVariants } from '@/utils/server/routeVariants'; @@ -7,27 +7,25 @@ import { RouteVariants } from '@/utils/server/routeVariants'; import Desktop from './_layout/Desktop'; import Mobile from './_layout/Mobile'; import SkeletonList from './features/SkeletonList'; -import SystemRole from './features/SystemRole'; +import Topic from './features/Topic'; -const TopicContent = lazy(() => import('./features/TopicListContent')); +const ConfigSwitcher = dynamic(() => import('./features/ConfigSwitcher'), { + loading: () => , +}); -const Topic = async (props: DynamicLayoutProps) => { +const Sidebar = async (props: DynamicLayoutProps) => { const isMobile = await RouteVariants.getIsMobile(props); const Layout = isMobile ? Mobile : Desktop; return ( - <> - {!isMobile && } - - }> - - - - + + + + ); }; -Topic.displayName = 'ChatTopic'; +Sidebar.displayName = 'ChatTopic'; -export default Topic; +export default Sidebar; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/AgentConfig/SystemRole.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/AgentConfig/SystemRole.tsx new file mode 100644 index 00000000000..877252aefd1 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/AgentConfig/SystemRole.tsx @@ -0,0 +1,110 @@ +'use client'; + +import { EditableMessage } from '@lobehub/ui/chat'; +import { Skeleton } from 'antd'; +import { createStyles } from 'antd-style'; +import { MouseEvent, memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import AgentInfo from '@/features/AgentInfo'; +import { useOpenChatSettings } from '@/hooks/useInterceptingRoutes'; +import { useAgentStore } from '@/store/agent'; +import { agentSelectors } from '@/store/agent/selectors'; +import { ChatSettingsTabs } from '@/store/global/initialState'; +import { useSessionStore } from '@/store/session'; +import { sessionMetaSelectors } from '@/store/session/selectors'; + +export const useStyles = createStyles(({ css, token }) => ({ + prompt: css` + opacity: 0.75; + transition: opacity 200ms ${token.motionEaseOut}; + + &:hover { + opacity: 1; + } + `, +})); + +interface SystemRoleProps { + editing: boolean; + isLoading: boolean; + open: boolean; + setEditing: (value: boolean) => void; + setOpen: (value: boolean) => void; +} + +const SystemRole = memo(({ editing, setEditing, open, setOpen, isLoading }: SystemRoleProps) => { + const { styles } = useStyles(); + const openChatSettings = useOpenChatSettings(ChatSettingsTabs.Prompt); + const { t } = useTranslation('common'); + + const [meta] = useSessionStore((s) => [sessionMetaSelectors.currentAgentMeta(s)]); + + const [systemRole, updateAgentConfig] = useAgentStore((s) => [ + agentSelectors.currentAgentSystemRole(s), + s.updateAgentConfig, + ]); + + const handleOpenWithEdit = (e: MouseEvent) => { + if (isLoading) return; + e.stopPropagation(); + setEditing(true); + setOpen(true); + }; + + const handleOpen = (e: MouseEvent) => { + if (isLoading) return; + if (e.altKey) handleOpenWithEdit(e); + setOpen(true); + }; + + if (isLoading) + return ( + + + + ); + + return ( + + { + setOpen(false); + setEditing(false); + openChatSettings(); + }} + style={{ marginBottom: 16 }} + /> + ), + }} + onChange={(e) => { + updateAgentConfig({ systemRole: e }); + }} + onEditingChange={setEditing} + onOpenChange={setOpen} + openModal={open} + placeholder={`${t('settingAgent.prompt.placeholder', { ns: 'setting' })}...`} + styles={{ markdown: { opacity: systemRole ? undefined : 0.5, overflow: 'visible' } }} + text={{ + cancel: t('cancel'), + confirm: t('ok'), + edit: t('edit'), + title: t('settingAgent.prompt.title', { ns: 'setting' }), + }} + value={systemRole} + /> + + ); +}); + +SystemRole.displayName = 'SystemRole'; + +export default SystemRole; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/AgentConfig/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/AgentConfig/index.tsx new file mode 100644 index 00000000000..590dd2d9813 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/AgentConfig/index.tsx @@ -0,0 +1,75 @@ +'use client'; + +import { ActionIcon } from '@lobehub/ui'; +import { Edit } from 'lucide-react'; +import { MouseEvent, memo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import useMergeState from 'use-merge-value'; + +import { useAgentStore } from '@/store/agent'; +import { agentSelectors } from '@/store/agent/selectors'; +import { useGlobalStore } from '@/store/global'; +import { systemStatusSelectors } from '@/store/global/selectors'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; + +import ConfigLayout from '../ConfigLayout'; +import SystemRole from './SystemRole'; + +const AgentConfig = memo(() => { + const [editing, setEditing] = useState(false); + + const [init, sessionId] = useSessionStore((s) => [ + sessionSelectors.isSomeSessionActive(s), + s.activeId, + ]); + + const [isAgentConfigLoading] = useAgentStore((s) => [agentSelectors.isAgentConfigLoading(s)]); + + const [showSystemRole, toggleSystemRole] = useGlobalStore((s) => [ + systemStatusSelectors.showSystemRole(s), + s.toggleSystemRole, + ]); + + const [open, setOpen] = useMergeState(false, { + defaultValue: showSystemRole, + onChange: toggleSystemRole, + value: showSystemRole, + }); + + const { t } = useTranslation('common'); + + const isLoading = !init || isAgentConfigLoading; + + const handleOpenWithEdit = (e: MouseEvent) => { + if (isLoading) return; + + e.stopPropagation(); + setEditing(true); + setOpen(true); + }; + + return ( + + } + expandedHeight={200} + headerStyle={{ cursor: 'pointer' }} + sessionId={sessionId} + title={t('settingAgent.prompt.title', { ns: 'setting' })} + > + + + ); +}); + +AgentConfig.displayName = 'AgentConfig'; + +export default AgentConfig; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/ConfigLayout.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/ConfigLayout.tsx new file mode 100644 index 00000000000..b3ba5ac13a8 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/ConfigLayout.tsx @@ -0,0 +1,97 @@ +'use client'; + +import { ScrollShadow } from '@lobehub/ui'; +import { createStyles } from 'antd-style'; +import { CSSProperties, ReactNode, memo } from 'react'; +import { Flexbox } from 'react-layout-kit'; + +import SidebarHeader from '@/components/SidebarHeader'; +import { useGlobalStore } from '@/store/global'; +import { systemStatusSelectors } from '@/store/global/selectors'; + +export const useStyles = createStyles(({ css }) => ({ + container: css` + position: relative; + transition: + height 0.3s ease, + opacity 0.3s ease; + `, +})); + +export interface ConfigLayoutProps { + actions?: ReactNode; + children?: ReactNode; + className?: string; + containerStyle?: CSSProperties; + expandedHeight?: number | string; + headerStyle?: CSSProperties; + onHeaderClick?: () => void; + sessionId: string; + title: ReactNode; +} + +const ConfigLayout = memo( + ({ + title, + actions, + sessionId, + className, + headerStyle, + containerStyle, + expandedHeight, + onHeaderClick, + children, + }) => { + const { styles } = useStyles(); + const [expanded, toggleAgentSystemRoleExpand] = useGlobalStore((s) => [ + systemStatusSelectors.getAgentSystemRoleExpanded(sessionId)(s), + s.toggleAgentSystemRoleExpand, + ]); + + const handleHeaderClick = () => { + toggleAgentSystemRoleExpand(sessionId); + onHeaderClick?.(); + }; + + const computedStyle: CSSProperties = expanded + ? { + minHeight: 232, + opacity: 1, + ...(expandedHeight !== undefined ? { maxHeight: expandedHeight } : {}), + } + : { + minHeight: 0, + opacity: 0, + ...(expandedHeight !== undefined ? { maxHeight: 0 } : {}), + }; + + return ( + + + + {children} + + + ); + }, +); + +ConfigLayout.displayName = 'ConfigLayout'; + +export default ConfigLayout; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/ConfigSwitcher.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/ConfigSwitcher.tsx new file mode 100644 index 00000000000..821e4eaa939 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/ConfigSwitcher.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { memo } from 'react'; + +import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; + +import AgentConfig from './AgentConfig'; +import GroupConfig from './GroupConfig'; + +const ConfigSwitcher = memo(() => { + const { isAgentEditable: showSystemRole } = useServerConfigStore(featureFlagsSelectors); + const isInbox = useSessionStore(sessionSelectors.isInboxSession); + const isGroupSession = useSessionStore(sessionSelectors.isCurrentSessionGroupSession); + + if (isInbox) return; + if (isGroupSession) return ; + if (showSystemRole) return ; + return; +}); + +ConfigSwitcher.displayName = 'ConfigSwitcher'; + +export default ConfigSwitcher; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupMember.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupMember.tsx new file mode 100644 index 00000000000..c881a8d5e8d --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupMember.tsx @@ -0,0 +1,232 @@ +'use client'; + +import { ActionIcon, SortableList } from '@lobehub/ui'; +import { Settings, UserMinus } from 'lucide-react'; +import { memo, useEffect, useMemo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import { MemberSelectionModal } from '@/components/MemberSelectionModal'; +import { DEFAULT_AVATAR, DEFAULT_SUPERVISOR_AVATAR } from '@/const/meta'; +import { useChatStore } from '@/store/chat'; +import { chatSelectors } from '@/store/chat/selectors'; +import { useChatGroupStore } from '@/store/chatGroup'; +import { chatGroupSelectors } from '@/store/chatGroup/selectors'; +import { useUserStore } from '@/store/user'; +import { userProfileSelectors } from '@/store/user/selectors'; +import { LobeGroupSession } from '@/types/session'; + +import AgentSettings from '../../../features/AgentSettings'; +import GroupMemberItem from './GroupMemberItem'; + +interface GroupMemberProps { + addModalOpen: boolean; + currentSession?: LobeGroupSession; + onAddModalOpenChange: (open: boolean) => void; + sessionId?: string; +} + +/** + * Group member info in Sidebar + */ +const GroupMember = memo( + ({ currentSession, addModalOpen, onAddModalOpenChange, sessionId }) => { + const { t } = useTranslation('chat'); + + const addAgentsToGroup = useChatGroupStore((s) => s.addAgentsToGroup); + const removeAgentFromGroup = useChatGroupStore((s) => s.removeAgentFromGroup); + const persistReorder = useChatGroupStore((s) => s.reorderGroupMembers); + const toggleThread = useChatGroupStore((s) => s.toggleThread); + const updateGroupConfig = useChatGroupStore((s) => s.updateGroupConfig); + const togglePortal = useChatStore((s) => s.togglePortal); + const cancelSupervisorDecision = useChatStore((s) => s.internal_cancelSupervisorDecision); + const triggerSupervisorDecision = useChatStore((s) => s.internal_triggerSupervisorDecision); + + const isSupervisorLoading = useChatStore(chatSelectors.isSupervisorLoading(sessionId || '')); + const groupConfig = useChatGroupStore(chatGroupSelectors.getGroupConfig(sessionId || '')); + + const currentUser = useUserStore((s) => ({ + avatar: userProfileSelectors.userAvatar(s), + name: userProfileSelectors.nickName(s), + })); + + const [agentSettingsOpen, setAgentSettingsOpen] = useState(false); + const [selectedAgentId, setSelectedAgentId] = useState(); + + const handleAddMembers = async (selectedAgents: string[]) => { + if (!sessionId) { + console.error('No active group to add members to'); + return; + } + await addAgentsToGroup(sessionId, selectedAgents); + onAddModalOpenChange(false); + }; + + // TODO: fix type + // @ts-ignore + const initialMembers = useMemo(() => currentSession?.members ?? [], [currentSession?.members]); + const [members, setMembers] = useState(initialMembers); + + const [removingMemberIds, setRemovingMemberIds] = useState([]); + + const withRemovingFlag = async (id: string, task: () => Promise) => { + setRemovingMemberIds((prev) => (prev.includes(id) ? prev : [...prev, id])); + try { + await task(); + } finally { + setRemovingMemberIds((prev) => prev.filter((memberId) => memberId !== id)); + } + }; + + useEffect(() => { + setMembers(initialMembers); + }, [initialMembers]); + + const handleRemoveMember = async (memberId: string) => { + if (!sessionId) return; + + await withRemovingFlag(memberId, () => removeAgentFromGroup(sessionId, memberId)); + }; + + const handleMemberClick = (agentId: string) => { + toggleThread(agentId); + togglePortal(true); + }; + + const handleOpenMemberSettings = (agentId: string) => { + setSelectedAgentId(agentId); + setAgentSettingsOpen(true); + }; + + const handleAgentSettingsClose = () => { + setAgentSettingsOpen(false); + setSelectedAgentId(undefined); + }; + + const handleStopSupervisor = () => { + if (!sessionId) return; + cancelSupervisorDecision(sessionId); + }; + + const handleTriggerSupervisor = () => { + if (!sessionId) return; + // Manual trigger: topicId stays current (undefined), flag manual=true + triggerSupervisorDecision(sessionId, undefined, true); + }; + + return ( + <> + + {/* Supervisor - only show if supervisor is enabled */} + {groupConfig?.enableSupervisor && ( + { + e.stopPropagation(); + void withRemovingFlag('orchestrator', () => + updateGroupConfig({ enableSupervisor: false }), + ); + }} + size={'small'} + title={t('groupSidebar.members.removeMember')} + /> + } + avatar={DEFAULT_SUPERVISOR_AVATAR} + generating={isSupervisorLoading} + generatingTooltip={t('groupSidebar.members.orchestratorThinking')} + id={'orchestrator'} + onStopGenerating={handleStopSupervisor} + onStopGeneratingTooltip={t('groupSidebar.members.stopOrchestrator')} + onTriggerSupervisor={handleTriggerSupervisor} + onTriggerSupervisorTooltip={t('groupSidebar.members.triggerOrchestrator')} + pin + showActionsOnHover={true} + title={t('groupSidebar.members.orchestrator')} + /> + )} + + {/* Current User */} + + + {Boolean(members && members.length > 0) && ( + { + setMembers(items); + if (!sessionId) return; + const orderedIds = items.map((m) => m.id); + persistReorder(sessionId, orderedIds).catch(() => { + console.error('Failed to persist reorder'); + }); + }} + renderItem={(item: any) => ( + + { + e.stopPropagation(); + handleOpenMemberSettings(item.id); + }} + size={'small'} + title={t('groupSidebar.members.memberSettings')} + /> + { + e.stopPropagation(); + handleRemoveMember(item.id); + }} + size={'small'} + title={t('groupSidebar.members.removeMember')} + /> + + } + avatar={item.avatar || DEFAULT_AVATAR} + background={item.backgroundColor} + id={item.id} + onClick={() => handleMemberClick(item.id)} + title={item.title || t('defaultSession', { ns: 'common' })} + /> + )} + style={{ margin: 0 }} + /> + )} + + + member.id) || []} + groupId={sessionId} + mode="add" + onCancel={() => onAddModalOpenChange(false)} + onConfirm={handleAddMembers} + open={addModalOpen} + /> + + + + ); + }, +); + +export default GroupMember; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupMemberItem.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupMemberItem.tsx new file mode 100644 index 00000000000..cecbfc3df08 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupMemberItem.tsx @@ -0,0 +1,121 @@ +'use client'; + +import { ActionIcon, Avatar, SortableList, Text } from '@lobehub/ui'; +import { LoaderCircle, PinIcon, Play, StopCircle } from 'lucide-react'; +import { ReactNode, memo } from 'react'; +import { Flexbox } from 'react-layout-kit'; + +import { DEFAULT_AVATAR } from '@/const/meta'; + +import { useStyles } from './style'; + +interface GroupMemberItemProps { + actions?: ReactNode; + avatar?: string; + background?: string; + generating?: boolean; + generatingTooltip?: string; + id: string; + onClick?: () => void; + onStopGenerating?: () => void; + onStopGeneratingTooltip?: string; + onTriggerSupervisor?: () => void; + onTriggerSupervisorTooltip?: string; + pin?: boolean; + showActionsOnHover?: boolean; + title: string; +} + +const GroupMemberItem = memo( + ({ + id, + title, + avatar, + background, + onClick, + actions, + showActionsOnHover = true, + pin, + generating, + generatingTooltip, + onStopGenerating, + onStopGeneratingTooltip, + onTriggerSupervisor, + onTriggerSupervisorTooltip, + }) => { + const { styles } = useStyles(); + + return ( + + { + e.stopPropagation(); + onClick?.(); + }} + style={{ overflow: 'hidden' }} + > + {pin ? ( + + ) : ( + + )} + + + {title} + + + {actions !== undefined && ( + + {actions} + + )} + {generating ? ( + + + {onStopGenerating && ( + { + e.stopPropagation(); + onStopGenerating(); + }} + size={'small'} + title={onStopGeneratingTooltip || 'Stop generating'} + /> + )} + + ) : ( + onTriggerSupervisor && ( + { + e.stopPropagation(); + onTriggerSupervisor(); + }} + size={'small'} + title={onTriggerSupervisorTooltip || 'Trigger supervisor decision'} + /> + ) + )} + + ); + }, +); + +export default GroupMemberItem; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupRole.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupRole.tsx new file mode 100644 index 00000000000..109637781c6 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/GroupRole.tsx @@ -0,0 +1,86 @@ +'use client'; + +import { EditableMessage } from '@lobehub/ui/chat'; +import { MouseEvent, memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import GroupInfo from '@/features/GroupInfo'; +import { useChatGroupStore } from '@/store/chatGroup'; +import { chatGroupSelectors } from '@/store/chatGroup/selectors'; +import { useSessionStore } from '@/store/session'; +import { LobeSession } from '@/types/session'; + +import { useStyles } from './style'; + +interface GroupRoleProps { + currentSession?: LobeSession; + editing: boolean; + editorModalOpen: boolean; + setEditing: (editing: boolean) => void; + setEditorModalOpen: (open: boolean) => void; +} + +const GroupRole = memo( + ({ currentSession, editorModalOpen, setEditorModalOpen, setEditing, editing }) => { + const { styles } = useStyles(); + const { t } = useTranslation('chat'); + + const activeGroupId = useSessionStore((s) => s.activeId); + const updateGroupConfig = useChatGroupStore((s) => s.updateGroupConfig); + const groupConfig = useChatGroupStore(chatGroupSelectors.currentGroupConfig); + + const handleSystemPromptChange = async (value: string) => { + if (!activeGroupId) return; + await updateGroupConfig({ systemPrompt: value }); + }; + + const handleOpenWithEdit = (e: MouseEvent) => { + e.stopPropagation(); + setEditing(true); + setEditorModalOpen(true); + }; + + const handleOpen = (e: MouseEvent) => { + e.stopPropagation(); + if (editorModalOpen) return; + if (e.altKey) handleOpenWithEdit(e); + setEditorModalOpen(true); + }; + + return ( + + , + }} + onChange={handleSystemPromptChange} + onEditingChange={setEditing} + onOpenChange={setEditorModalOpen} + openModal={editorModalOpen} + placeholder={`${t('settingGroup.systemPrompt.placeholder', { ns: 'setting' })}...`} + styles={{ + markdown: { + opacity: groupConfig?.systemPrompt ? undefined : 0.5, + overflow: 'visible', + }, + }} + text={{ + cancel: t('cancel', { ns: 'common' }), + confirm: t('ok', { ns: 'common' }), + edit: t('edit', { ns: 'common' }), + title: t('settingGroup.systemPrompt.title', { ns: 'setting' }), + }} + value={groupConfig?.systemPrompt || ''} + /> + + ); + }, +); + +GroupRole.displayName = 'GroupRole'; + +export default GroupRole; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/index.tsx new file mode 100644 index 00000000000..6b9ab30b22c --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/index.tsx @@ -0,0 +1,124 @@ +'use client'; + +import { ActionIcon, Tabs } from '@lobehub/ui'; +import isEqual from 'fast-deep-equal'; +import { Edit, UserPlus } from 'lucide-react'; +import { MouseEvent, memo, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { useChatGroupStore } from '@/store/chatGroup'; +import { chatGroupSelectors } from '@/store/chatGroup/selectors'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/slices/session/selectors'; +import type { LobeGroupSession } from '@/types/session'; + +import ConfigLayout from '../ConfigLayout'; +import GroupMember from './GroupMember'; +import GroupRole from './GroupRole'; + +const GroupChatSidebar = memo(() => { + const [addModalOpen, setAddModalOpen] = useState(false); + const [editorModalOpen, setEditorModalOpen] = useState(false); + const [editing, setEditing] = useState(false); + const [activeTab, setActiveTab] = useState('members'); + const { t } = useTranslation(['chat', 'common']); + + const [sessionId] = useSessionStore((s) => [s.activeId]); + const currentSession = useSessionStore((state) => { + const session = sessionSelectors.currentSession(state); + return session?.type === 'group' ? (session as LobeGroupSession) : undefined; + }, isEqual); + + const groupConfig = useChatGroupStore(chatGroupSelectors.getGroupConfig(sessionId || '')); + + // Switch to members tab if host tab becomes unavailable + useEffect(() => { + if (activeTab === 'host' && !groupConfig?.enableSupervisor) { + setActiveTab('members'); + } + }, [activeTab, groupConfig?.enableSupervisor]); + + const handleAddMember = (e: MouseEvent) => { + e.stopPropagation(); + setAddModalOpen(true); + }; + + const handleOpenWithEdit = (e: MouseEvent) => { + e.stopPropagation(); + setEditing(true); + setEditorModalOpen(true); + }; + + const actions = + activeTab === 'members' ? ( + + ) : activeTab === 'host' ? ( + + ) : undefined; + + return ( + setActiveTab(key)} + onClick={(e) => { + e.stopPropagation(); + }} + size="small" + variant="rounded" + /> + } + > + {activeTab === 'members' && ( + + )} + {activeTab === 'host' && ( + + )} + + ); +}); + +export default GroupChatSidebar; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/style.ts b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/style.ts new file mode 100644 index 00000000000..d6498362aea --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/GroupConfig/style.ts @@ -0,0 +1,39 @@ +import { createStyles } from 'antd-style'; + +export const useStyles = createStyles(({ css, token }) => ({ + memberItem: css` + cursor: pointer; + + display: flex; + flex-direction: row; + gap: 4px; + align-items: center; + + width: 100%; + padding-block: 8px; + padding-inline: 8px 12px; + border-radius: ${token.borderRadius}px; + + transition: all 0.2s ease; + + .show-on-hover { + opacity: 0; + } + + &:hover { + background: ${token.colorFillSecondary}; + + .show-on-hover { + opacity: 1; + } + } + `, + prompt: css` + opacity: 0.75; + transition: opacity 200ms ${token.motionEaseOut}; + + &:hover { + opacity: 1; + } + `, +})); diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx deleted file mode 100644 index 9679b97a976..00000000000 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/SystemRoleContent.tsx +++ /dev/null @@ -1,146 +0,0 @@ -'use client'; - -import { ActionIcon, ScrollShadow } from '@lobehub/ui'; -import { EditableMessage } from '@lobehub/ui/chat'; -import { Skeleton } from 'antd'; -import { Edit } from 'lucide-react'; -import { MouseEvent, memo, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import { Flexbox } from 'react-layout-kit'; -import useMergeState from 'use-merge-value'; - -import SidebarHeader from '@/components/SidebarHeader'; -import AgentInfo from '@/features/AgentInfo'; -import { useOpenChatSettings } from '@/hooks/useInterceptingRoutes'; -import { useAgentStore } from '@/store/agent'; -import { agentSelectors } from '@/store/agent/selectors'; -import { useGlobalStore } from '@/store/global'; -import { ChatSettingsTabs } from '@/store/global/initialState'; -import { systemStatusSelectors } from '@/store/global/selectors'; -import { useSessionStore } from '@/store/session'; -import { sessionMetaSelectors, sessionSelectors } from '@/store/session/selectors'; - -import { useStyles } from './style'; - -const SystemRole = memo(() => { - const [editing, setEditing] = useState(false); - const { styles, cx } = useStyles(); - const openChatSettings = useOpenChatSettings(ChatSettingsTabs.Prompt); - const [init, meta, sessionId] = useSessionStore((s) => [ - sessionSelectors.isSomeSessionActive(s), - sessionMetaSelectors.currentAgentMeta(s), - s.activeId, - ]); - - const [isAgentConfigLoading, systemRole, updateAgentConfig] = useAgentStore((s) => [ - agentSelectors.isAgentConfigLoading(s), - agentSelectors.currentAgentSystemRole(s), - s.updateAgentConfig, - ]); - - const [showSystemRole, toggleSystemRole] = useGlobalStore((s) => [ - systemStatusSelectors.showSystemRole(s), - s.toggleSystemRole, - ]); - - const [open, setOpen] = useMergeState(false, { - defaultValue: showSystemRole, - onChange: toggleSystemRole, - value: showSystemRole, - }); - - const { t } = useTranslation('common'); - - const isLoading = !init || isAgentConfigLoading; - - const handleOpenWithEdit = (e: MouseEvent) => { - if (isLoading) return; - - e.stopPropagation(); - setEditing(true); - setOpen(true); - }; - - const handleOpen = () => { - if (isLoading) return; - - setOpen(true); - }; - - const [expanded, toggleAgentSystemRoleExpand] = useGlobalStore((s) => [ - systemStatusSelectors.getAgentSystemRoleExpanded(sessionId)(s), - s.toggleAgentSystemRoleExpand, - ]); - - const toggleExpanded = () => { - toggleAgentSystemRoleExpand(sessionId); - }; - - return ( - - - } - onClick={toggleExpanded} - style={{ cursor: 'pointer' }} - title={t('settingAgent.prompt.title', { ns: 'setting' })} - /> - { - if (e.altKey) handleOpenWithEdit(e); - }} - paddingInline={16} - size={25} - style={{ - opacity: expanded ? 1 : 0, - overflow: 'hidden', - transition: 'height 0.3s ease', - }} - > - {isLoading ? ( - - ) : ( - { - setOpen(false); - setEditing(false); - openChatSettings(); - }} - style={{ marginBottom: 16 }} - /> - ), - }} - onChange={(e) => { - updateAgentConfig({ systemRole: e }); - }} - onEditingChange={setEditing} - onOpenChange={setOpen} - openModal={open} - placeholder={`${t('settingAgent.prompt.placeholder', { ns: 'setting' })}...`} - styles={{ markdown: { opacity: systemRole ? undefined : 0.5, overflow: 'visible' } }} - text={{ - cancel: t('cancel'), - confirm: t('ok'), - edit: t('edit'), - title: t('settingAgent.prompt.title', { ns: 'setting' }), - }} - value={systemRole} - /> - )} - - - ); -}); - -export default SystemRole; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/index.tsx deleted file mode 100644 index e80a29316fa..00000000000 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/index.tsx +++ /dev/null @@ -1,18 +0,0 @@ -'use client'; - -import { memo } from 'react'; - -import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig'; -import { useSessionStore } from '@/store/session'; -import { sessionSelectors } from '@/store/session/selectors'; - -import SystemRoleContent from './SystemRoleContent'; - -const SystemRole = memo(() => { - const { isAgentEditable: showSystemRole } = useServerConfigStore(featureFlagsSelectors); - const isInbox = useSessionStore(sessionSelectors.isInboxSession); - - return showSystemRole && !isInbox && ; -}); - -export default SystemRole; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/style.ts b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/style.ts deleted file mode 100644 index 7605884f266..00000000000 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/SystemRole/style.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createStyles } from 'antd-style'; - -export const useStyles = createStyles(({ css, token }) => ({ - animatedContainer: css` - transition: - height 0.3s ease, - opacity 0.3s ease; - `, - prompt: css` - opacity: 0.75; - transition: opacity 200ms ${token.motionEaseOut}; - - &:hover { - opacity: 1; - } - `, - promptBox: css` - position: relative; - border-block-end: 1px solid ${token.colorBorderSecondary}; - `, -})); diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Header.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/Header.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/Header.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/Header.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ByTimeMode/GroupItem.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ByTimeMode/GroupItem.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ByTimeMode/GroupItem.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ByTimeMode/GroupItem.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ByTimeMode/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ByTimeMode/index.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ByTimeMode/index.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ByTimeMode/index.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/FlatMode/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/FlatMode/index.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/FlatMode/index.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/FlatMode/index.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/SearchResult/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/SearchResult/index.tsx similarity index 96% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/SearchResult/index.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/SearchResult/index.tsx index 5ad06f58140..fb08fbacf3d 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/SearchResult/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/SearchResult/index.tsx @@ -11,7 +11,7 @@ import { useChatStore } from '@/store/chat'; import { topicSelectors } from '@/store/chat/selectors'; import { ChatTopic } from '@/types/topic'; -import { SkeletonList } from '../../SkeletonList'; +import { SkeletonList } from '../../../SkeletonList'; import TopicItem from '../TopicItem'; const SearchResult = memo(() => { diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ThreadItem/Content.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ThreadItem/Content.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ThreadItem/Content.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ThreadItem/Content.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ThreadItem/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ThreadItem/index.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ThreadItem/index.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ThreadItem/index.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ThreadList/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ThreadList/index.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/ThreadList/index.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/ThreadList/index.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem/DefaultContent.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/TopicItem/DefaultContent.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem/DefaultContent.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/TopicItem/DefaultContent.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem/TopicContent.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/TopicItem/TopicContent.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem/TopicContent.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/TopicItem/TopicContent.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/TopicItem/index.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/TopicItem/index.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/TopicItem/index.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/index.tsx similarity index 97% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/index.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/index.tsx index bf73d5695d1..ef5736ea167 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicListContent/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicListContent/index.tsx @@ -14,7 +14,7 @@ import { useUserStore } from '@/store/user'; import { preferenceSelectors } from '@/store/user/selectors'; import { TopicDisplayMode } from '@/types/topic'; -import { SkeletonList } from '../SkeletonList'; +import { SkeletonList } from '../../SkeletonList'; import ByTimeMode from './ByTimeMode'; import FlatMode from './FlatMode'; import SearchResult from './SearchResult'; diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicSearchBar/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicSearchBar/index.tsx similarity index 100% rename from src/app/[variants]/(main)/chat/(workspace)/@topic/features/TopicSearchBar/index.tsx rename to src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/TopicSearchBar/index.tsx diff --git a/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/index.tsx new file mode 100644 index 00000000000..1b47a546c8b --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/@topic/features/Topic/index.tsx @@ -0,0 +1,27 @@ +'use client'; + +import { Divider } from 'antd'; +import React, { memo } from 'react'; + +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; + +import Header from './Header'; +import TopicListContent from './TopicListContent'; + +const Topic = memo(() => { + const isInbox = useSessionStore(sessionSelectors.isInboxSession); + + return ( + <> + {!isInbox && } + +
+ + + ); +}); + +Topic.displayName = 'Topic'; + +export default Topic; diff --git a/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Main.tsx b/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Main.tsx index 4e4cb049974..cf07dd5982b 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Main.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Main.tsx @@ -1,12 +1,13 @@ 'use client'; -import { Avatar } from '@lobehub/ui'; +import { Avatar, GroupAvatar } from '@lobehub/ui'; import { Skeleton } from 'antd'; import { createStyles } from 'antd-style'; import { Suspense, memo } from 'react'; import { useTranslation } from 'react-i18next'; import { Flexbox } from 'react-layout-kit'; +import { DEFAULT_AVATAR } from '@/const/meta'; import { useInitAgentConfig } from '@/hooks/useInitAgentConfig'; import { useOpenChatSettings } from '@/hooks/useInterceptingRoutes'; import { usePinnedAgentState } from '@/hooks/usePinnedAgentState'; @@ -14,6 +15,9 @@ import { useGlobalStore } from '@/store/global'; import { systemStatusSelectors } from '@/store/global/selectors'; import { useSessionStore } from '@/store/session'; import { sessionMetaSelectors, sessionSelectors } from '@/store/session/selectors'; +import { useUserStore } from '@/store/user'; +import { userProfileSelectors } from '@/store/user/selectors'; +import { GroupMemberWithAgent } from '@/types/session'; import TogglePanelButton from '../../../../features/TogglePanelButton'; import Tags from './Tags'; @@ -34,7 +38,7 @@ const useStyles = createStyles(({ css }) => ({ font-size: 14px; font-weight: bold; - line-height: 1; + line-height: 1.2; text-overflow: ellipsis; white-space: nowrap; `, @@ -46,13 +50,28 @@ const Main = memo<{ className?: string }>(({ className }) => { useInitAgentConfig(); const [isPinned] = usePinnedAgentState(); - const [init, isInbox, title, avatar, backgroundColor] = useSessionStore((s) => [ - sessionSelectors.isSomeSessionActive(s), - sessionSelectors.isInboxSession(s), - sessionMetaSelectors.currentAgentTitle(s), - sessionMetaSelectors.currentAgentAvatar(s), - sessionMetaSelectors.currentAgentBackgroundColor(s), - ]); + const [init, isInbox, title, avatar, backgroundColor, members, sessionType] = useSessionStore( + (s) => { + const session = sessionSelectors.currentSession(s); + + return [ + sessionSelectors.isSomeSessionActive(s), + sessionSelectors.isInboxSession(s), + sessionMetaSelectors.currentAgentTitle(s), + sessionMetaSelectors.currentAgentAvatar(s), + sessionMetaSelectors.currentAgentBackgroundColor(s), + session?.type === 'group' ? session.members : undefined, + session?.type, + ]; + }, + ); + + const currentUser = useUserStore((s) => ({ + avatar: userProfileSelectors.userAvatar(s), + name: userProfileSelectors.displayUserName(s) || userProfileSelectors.nickName(s) || 'You', + })); + + const isGroup = sessionType === 'group'; const openChatSettings = useOpenChatSettings(); @@ -72,6 +91,32 @@ const Main = memo<{ className?: string }>(({ className }) => { ); + if (isGroup) { + return ( + + {!isPinned && !showSessionPanel && } + ({ + avatar: member.avatar || DEFAULT_AVATAR, + background: member.backgroundColor || undefined, + })) || []), + ]} + onClick={() => openChatSettings()} + size={32} + title={title} + /> + +
{displayTitle}
+ +
+
+ ); + } + return ( {!isPinned && !showSessionPanel && } diff --git a/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags/MemberCountTag.tsx b/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags/MemberCountTag.tsx new file mode 100644 index 00000000000..0f80d2c763f --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags/MemberCountTag.tsx @@ -0,0 +1,31 @@ +import { Icon, Tag, Tooltip } from '@lobehub/ui'; +import { Users } from 'lucide-react'; +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; +import { LobeGroupSession } from '@/types/session'; + +const MemberCountTag = memo(() => { + const { t } = useTranslation('chat'); + const currentSession = useSessionStore(sessionSelectors.currentSession); + + const memberCount = (currentSession as LobeGroupSession).members?.length ?? 0 + 1; + + if (memberCount < 0) return null; + + return ( + + + + + {memberCount} + + + + ); +}); + +export default MemberCountTag; diff --git a/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags/index.tsx index 5b4030e9501..c2d8f535d2b 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/_layout/Desktop/ChatHeader/Tags/index.tsx @@ -10,11 +10,14 @@ import { useAgentEnableSearch } from '@/hooks/useAgentEnableSearch'; import { useModelSupportToolUse } from '@/hooks/useModelSupportToolUse'; import { useAgentStore } from '@/store/agent'; import { agentChatConfigSelectors, agentSelectors } from '@/store/agent/selectors'; +import { useSessionStore } from '@/store/session'; +import { sessionSelectors } from '@/store/session/selectors'; import { useUserStore } from '@/store/user'; import { authSelectors } from '@/store/user/selectors'; import HistoryLimitTags from './HistoryLimitTags'; import KnowledgeTag from './KnowledgeTag'; +import MemberCountTag from './MemberCountTag'; import SearchTags from './SearchTags'; const TitleTags = memo(() => { @@ -31,9 +34,18 @@ const TitleTags = memo(() => { const showPlugin = useModelSupportToolUse(model, provider); const isLogin = useUserStore(authSelectors.isLogin); + const isGroupSession = useSessionStore(sessionSelectors.isCurrentSessionGroupSession); const isAgentEnableSearch = useAgentEnableSearch(); + if (isGroupSession) { + return ( + + + + ); + } + return isLoading && isLogin ? ( ) : ( diff --git a/src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx index fc722a35bb1..0758dbbfaad 100644 --- a/src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx +++ b/src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx @@ -21,21 +21,107 @@ import { agentSelectors } from '@/store/agent/slices/chat'; import { ChatSettingsTabs } from '@/store/global/initialState'; import { useSessionStore } from '@/store/session'; import { sessionMetaSelectors } from '@/store/session/selectors'; +import { LobeSessionType } from '@/types/session'; -const AgentSettings = memo(() => { +export interface AgentSettingsProps { + agentId?: string; + onClose?: () => void; + open?: boolean; +} + +/** + * Support both agent ID and session ID + * Consider choose agent id first, since + * session ID will soon be deprecated + */ +const AgentSettings = memo(({ agentId, onClose, open }) => { const { t } = useTranslation('setting'); - const id = useSessionStore((s) => s.activeId); - const config = useAgentStore(agentSelectors.currentAgentConfig, isEqual); - const meta = useSessionStore(sessionMetaSelectors.currentAgentMeta, isEqual); - const { isLoading } = useInitAgentConfig(); - const [showAgentSetting, updateAgentConfig] = useAgentStore((s) => [ + + // Use provided agentId or fall back to current active session + const activeId = useSessionStore((s) => s.activeId); + const id = agentId || activeId; + + // Get agent config and meta based on the provided or active agent ID + const config = useAgentStore((s) => { + if (agentId) { + // Use the new selector that works with agent IDs + return agentSelectors.getAgentConfigByAgentId(agentId)(s); + } else if (id) { + // Use the existing selector for session IDs + return agentSelectors.getAgentConfigById(id)(s); + } else { + // Use current agent config + return agentSelectors.currentAgentConfig(s); + } + }, isEqual); + const meta = useSessionStore((s) => { + if (agentId) { + // Use the selector that works with agent IDs + return sessionMetaSelectors.getAgentMetaByAgentId(agentId)(s); + } else { + // Use current agent meta for session-based access + return sessionMetaSelectors.currentAgentMeta(s); + } + }, isEqual); + + const { isLoading } = useInitAgentConfig(agentId); + + // Handle global store state or use props + const [showAgentSetting, globalUpdateAgentConfig] = useAgentStore((s) => [ s.showAgentSetting, s.updateAgentConfig, ]); - const [updateAgentMeta] = useSessionStore((s) => [ + const [globalUpdateAgentMeta] = useSessionStore((s) => [ s.updateSessionMeta, sessionMetaSelectors.currentAgentTitle(s), ]); + + // Create custom update functions that can target specific sessions + const updateAgentConfig = async (config: any) => { + if (agentId) { + // Find the agent session ID from the agent ID + const sessions = useSessionStore.getState().sessions || []; + const agentSession = sessions.find( + (session) => session.type === LobeSessionType.Agent && session.config?.id === agentId, + ); + + if (agentSession) { + // Use the internal agent store function with the specific session ID + await useAgentStore.getState().internal_updateAgentConfig(agentSession.id, config); + } + } else { + // Use the global update function for current session + await globalUpdateAgentConfig(config); + } + }; + + const updateAgentMeta = async (meta: any) => { + if (agentId) { + // Find the agent session ID from the agent ID + const sessions = useSessionStore.getState().sessions || []; + const agentSession = sessions.find( + (session) => session.type === LobeSessionType.Agent && session.config?.id === agentId, + ); + + if (agentSession) { + // Use the session service directly with the specific session ID + const { sessionService } = await import('@/services/session'); + await sessionService.updateSessionMeta(agentSession.id, meta); + // Refresh sessions to update the UI + await useSessionStore.getState().refreshSessions(); + } + } else { + // Use the global update function for current session + await globalUpdateAgentMeta(meta); + } + }; + + // Determine visibility - use prop if provided, otherwise use global state + const isOpen = open !== undefined ? open : showAgentSetting; + + // Handle close - use prop if provided, otherwise use global state setter + const handleClose = onClose || (() => useAgentStore.setState({ showAgentSetting: false })); + const isInbox = id === INBOX_SESSION_ID; const [tab, setTab] = useState(isInbox ? ChatSettingsTabs.Prompt : ChatSettingsTabs.Meta); @@ -53,18 +139,20 @@ const AgentSettings = memo(() => { containerMaxWidth={1280} height={isDesktop ? `calc(100vh - ${TITLE_BAR_HEIGHT}px)` : '100vh'} noHeader - onClose={() => useAgentStore.setState({ showAgentSetting: false })} - open={showAgentSetting} + onClose={handleClose} + open={isOpen} placement={'bottom'} sidebar={ - + + + diff --git a/src/app/[variants]/(main)/chat/(workspace)/features/GroupChatSettings/index.tsx b/src/app/[variants]/(main)/chat/(workspace)/features/GroupChatSettings/index.tsx new file mode 100644 index 00000000000..be9701e8c12 --- /dev/null +++ b/src/app/[variants]/(main)/chat/(workspace)/features/GroupChatSettings/index.tsx @@ -0,0 +1,97 @@ +'use client'; + +import { Drawer } from '@lobehub/ui'; +import isEqual from 'fast-deep-equal'; +import { memo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import BrandWatermark from '@/components/BrandWatermark'; +import PanelTitle from '@/components/PanelTitle'; +import { isDesktop } from '@/const/version'; +import { TITLE_BAR_HEIGHT } from '@/features/ElectronTitlebar'; +import { + GroupCategory, + GroupChatSettingsProvider, + GroupSettings, +} from '@/features/GroupChatSettings'; +import Footer from '@/features/Setting/Footer'; +import { useInitGroupConfig } from '@/hooks/useInitGroupConfig'; +import { useChatGroupStore } from '@/store/chatGroup'; +import { chatGroupSelectors } from '@/store/chatGroup/selectors'; +import { GroupSettingsTabs } from '@/store/global/initialState'; +import { useSessionStore } from '@/store/session'; + +// Counterpart: src/app/[variants]/(main)/chat/(workspace)/features/AgentSettings/index.tsx +const GroupChatSettings = memo(() => { + const { t } = useTranslation('setting'); + const id = useSessionStore((s) => s.activeId); + const config = useChatGroupStore(chatGroupSelectors.currentGroupConfig, isEqual); + const meta = useChatGroupStore(chatGroupSelectors.currentGroupMeta, isEqual); + const { isLoading } = useInitGroupConfig(); + + const [showGroupSetting, updateGroupConfig, updateGroupMeta] = useChatGroupStore((s) => [ + s.showGroupSetting, + s.updateGroupConfig, + s.updateGroupMeta, + ]); + + const [tab, setTab] = useState(GroupSettingsTabs.Settings); + + return ( + + useChatGroupStore.setState({ showGroupSetting: false })} + open={showGroupSetting} + placement={'bottom'} + sidebar={ + + + + + + + + } + sidebarWidth={280} + styles={{ + sidebarContent: { + gap: 48, + justifyContent: 'space-between', + minHeight: isDesktop ? `calc(100% - ${TITLE_BAR_HEIGHT}px)` : '100%', + paddingBlock: 24, + paddingInline: 48, + }, + }} + > + +