From abc30af3692e634e2d283c1327c8f8a063b01ab9 Mon Sep 17 00:00:00 2001 From: zhengkunwang223 <1paneldev@sina.com> Date: Fri, 8 May 2026 17:39:46 +0800 Subject: [PATCH] fix: Fixed issue with install openclaw plugin failed --- agent/app/service/agents_channels.go | 2 +- frontend/src/lang/modules/en.ts | 24 ++++-------------------- frontend/src/lang/modules/es-es.ts | 6 ++---- frontend/src/lang/modules/ja.ts | 6 ++---- frontend/src/lang/modules/ko.ts | 6 ++---- frontend/src/lang/modules/ms.ts | 6 ++---- frontend/src/lang/modules/pt-br.ts | 6 ++---- frontend/src/lang/modules/ru.ts | 6 ++---- frontend/src/lang/modules/tr.ts | 6 ++---- frontend/src/lang/modules/zh-Hant.ts | 6 ++---- frontend/src/lang/modules/zh.ts | 24 ++++-------------------- 11 files changed, 25 insertions(+), 73 deletions(-) diff --git a/agent/app/service/agents_channels.go b/agent/app/service/agents_channels.go index 3833a9a86e01..7ee0b82d51d3 100644 --- a/agent/app/service/agents_channels.go +++ b/agent/app/service/agents_channels.go @@ -1312,7 +1312,7 @@ func installOpenclawPlugin(mgr *cmd.CommandHelper, containerName, spec, pluginID if err := mgr.Run("docker", "exec", "-w", workdir, containerName, "npm", "pack", "--silent", spec); err != nil { return err } - pkgPath, err := mgr.RunWithStdout("docker", "exec", containerName, "find", workdir, "-maxdepth", "1", "-type", "f", "-name", "*.tgz", "-print", "-quit") + pkgPath, err := cmd.RunDockerExecWithStdout(10*time.Minute, containerName, "find", workdir, "-maxdepth", "1", "-type", "f", "-name", "*.tgz", "-print", "-quit") if err != nil { return err } diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 2c391bc204c8..8ed0a96f73f2 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -880,20 +880,14 @@ const message = { importModelAccount: 'Import Model Account', editModelAccount: 'Edit Model Account', selectModelAccount: 'Select an existing model account', - weight: 'Weight', priority: 'Priority', healthStatus: 'Health', failureCount: 'Failures', lastError: 'Last Error', modelMap: 'Model Mapping', - apiKeys: 'API Keys', - apiKey: 'API Key', apiKeyReset: 'Reset API Key (leave empty to keep unchanged)', qpsLimit: 'QPS Limit', unlimited: 'Unlimited', - userGroup: 'User Group', - userGroups: 'User Groups', - defaultGroup: 'Default', apiKeyCount: 'API Keys', lastUsedAt: 'Last Used', settingTitle: 'AI Proxy Settings', @@ -934,13 +928,14 @@ const message = { providerDistribution: 'Provider Distribution', modelDistribution: 'Model Distribution', serviceProvider: 'Provider', - requestCount: 'Requests', tokenUsage: 'Token Usage', percent: 'Percent', ranking: 'Ranking', rank: 'Rank', promptToken: 'Prompt Tokens', completionToken: 'Completion Tokens', + inputTokens: 'Input Tokens', + outputTokens: 'Output Tokens', totalToken: 'Total Tokens', activeUsers: 'Active Users', activeModels: 'Active Models', @@ -950,7 +945,6 @@ const message = { attemptChain: 'Attempt Chain', attemptIndex: 'Call Order', noAttemptDetails: 'This request hit once; no fallback details', - requestId: 'Request ID', input: 'Input', output: 'Output', total: 'Total', @@ -988,8 +982,6 @@ const message = { firstTokenLatency: 'First Token Latency', firstTokenLatencyHelper: 'Time from sending the request to receiving the first token. Lower means faster response.', - inputTokens: 'Input Tokens', - outputTokens: 'Output Tokens', tokenValueHelper: 'Enter a positive integer or k value, e.g. 512, 1k, 32k', numPrompts: 'Prompts', concurrency: 'Concurrency', @@ -998,17 +990,9 @@ const message = { requestRateCustom: 'Custom QPS', requestRateCustomPlaceholder: 'Requests per second, e.g. 2.5', successfulRequests: 'Successful Requests', - failedRequests: 'Failed Requests', requestThroughput: 'Request Throughput', - ttftMean: 'Mean TTFT', - ttftMedian: 'Median TTFT', - ttftP99: 'P99 TTFT', - tpotMean: 'Mean TPOT', - tpotMedian: 'Median TPOT', - tpotP99: 'P99 TPOT', - itlMean: 'Mean ITL', - itlMedian: 'Median ITL', - itlP99: 'P99 ITL', + mean: 'Mean', + median: 'Median', timeout: 'Timeout (seconds)', image: 'vLLM Image', ignoreEos: 'Ignore EOS', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index a660a3bf64e0..f5bcd3854c61 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -894,13 +894,11 @@ const message = { importModelAccount: 'Importar cuenta de modelo', editModelAccount: 'Editar cuenta de modelo', selectModelAccount: 'Seleccionar una cuenta de modelo existente', - weight: 'Peso', priority: 'Prioridad', healthStatus: 'Estado de salud', failureCount: 'Fallos', lastError: 'Último error', modelMap: 'Mapeo de modelos', - apiKey: 'API Key', apiKeyKeepEmpty: 'API Key (dejar vacío para no cambiar)', apiKeyOnceHint: 'La API Key solo se muestra una vez al crearla. Cópiela y guárdela ahora.', apiKeyOnceSave: 'La API Key solo se muestra una vez. Guárdela ahora:', @@ -944,13 +942,14 @@ const message = { providerDistribution: 'Distribución por proveedor', modelDistribution: 'Distribución por modelo', serviceProvider: 'Proveedor', - requestCount: 'Solicitudes', tokenUsage: 'Uso de tokens', percent: 'Porcentaje', ranking: 'Ranking', rank: 'Rango', promptToken: 'Tokens de entrada', completionToken: 'Tokens de salida', + inputTokens: 'Tokens de entrada', + outputTokens: 'Tokens de salida', totalToken: 'Tokens totales', activeUsers: 'Usuarios activos', activeModels: 'Modelos activos', @@ -960,7 +959,6 @@ const message = { attemptChain: 'Cadena de intentos', attemptIndex: 'Orden de llamada', noAttemptDetails: 'Esta solicitud acertó en el primer intento; no hay detalles de fallback', - requestId: 'Request ID', input: 'Entrada', output: 'Salida', total: 'Total', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index b3aa95dccb5e..b81a6fa39fce 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -884,13 +884,11 @@ const message = { importModelAccount: 'モデルアカウントをインポート', editModelAccount: 'モデルアカウントを編集', selectModelAccount: '既存のモデルアカウントを選択', - weight: '重み', priority: '優先度', healthStatus: 'ヘルス状態', failureCount: '失敗回数', lastError: '直近のエラー', modelMap: 'モデルマッピング', - apiKey: 'API Key', apiKeyKeepEmpty: 'API Key(空欄の場合は変更しません)', apiKeyOnceHint: 'API Key は作成時に一度だけ表示されます。今すぐコピーして保存してください。', apiKeyOnceSave: 'API Key は一度だけ表示されます。今すぐ保存してください:', @@ -934,13 +932,14 @@ const message = { providerDistribution: 'プロバイダー別分布', modelDistribution: 'モデル別分布', serviceProvider: 'プロバイダー', - requestCount: 'リクエスト数', tokenUsage: 'Token 使用量', percent: '割合', ranking: 'ランキング', rank: '順位', promptToken: '入力 Token', completionToken: '出力 Token', + inputTokens: '入力 Token', + outputTokens: '出力 Token', totalToken: '合計 Token', activeUsers: 'アクティブユーザー', activeModels: 'アクティブモデル', @@ -950,7 +949,6 @@ const message = { attemptChain: '試行チェーン', attemptIndex: '呼び出し順', noAttemptDetails: 'このリクエストは 1 回で命中しました。fallback 明細はありません', - requestId: 'Request ID', input: '入力', output: '出力', total: '合計', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index cad522da1009..eb2fae6886e0 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -868,13 +868,11 @@ const message = { importModelAccount: '모델 계정 가져오기', editModelAccount: '모델 계정 편집', selectModelAccount: '기존 모델 계정 선택', - weight: '가중치', priority: '우선순위', healthStatus: '상태', failureCount: '실패 횟수', lastError: '최근 오류', modelMap: '모델 매핑', - apiKey: 'API Key', apiKeyKeepEmpty: 'API Key (비워 두면 변경하지 않음)', apiKeyOnceHint: 'API Key는 생성 시 한 번만 표시됩니다. 지금 복사하여 저장하세요.', apiKeyOnceSave: 'API Key는 한 번만 표시됩니다. 지금 저장하세요:', @@ -918,13 +916,14 @@ const message = { providerDistribution: '제공자별 분포', modelDistribution: '모델별 분포', serviceProvider: '제공자', - requestCount: '요청 수', tokenUsage: 'Token 사용량', percent: '비율', ranking: '순위', rank: '순위', promptToken: '입력 Token', completionToken: '출력 Token', + inputTokens: '입력 Token', + outputTokens: '출력 Token', totalToken: '총 Token', activeUsers: '활성 사용자', activeModels: '활성 모델', @@ -934,7 +933,6 @@ const message = { attemptChain: '시도 체인', attemptIndex: '호출 순서', noAttemptDetails: '이 요청은 한 번에 적중했으며 fallback 상세가 없습니다', - requestId: 'Request ID', input: '입력', output: '출력', total: '합계', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index a1e9dd257cbe..351e27a227c9 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -893,13 +893,11 @@ const message = { importModelAccount: 'Import akaun model', editModelAccount: 'Edit akaun model', selectModelAccount: 'Pilih akaun model sedia ada', - weight: 'Berat', priority: 'Keutamaan', healthStatus: 'Status kesihatan', failureCount: 'Bilangan gagal', lastError: 'Ralat terkini', modelMap: 'Pemetaan model', - apiKey: 'API Key', apiKeyKeepEmpty: 'API Key (biarkan kosong untuk kekal)', apiKeyOnceHint: 'API Key hanya dipaparkan sekali semasa penciptaan. Salin dan simpan sekarang.', apiKeyOnceSave: 'API Key hanya dipaparkan sekali. Simpan sekarang:', @@ -943,13 +941,14 @@ const message = { providerDistribution: 'Taburan mengikut penyedia', modelDistribution: 'Taburan mengikut model', serviceProvider: 'Penyedia', - requestCount: 'Permintaan', tokenUsage: 'Penggunaan Token', percent: 'Peratus', ranking: 'Kedudukan', rank: 'Kedudukan', promptToken: 'Token input', completionToken: 'Token output', + inputTokens: 'Token input', + outputTokens: 'Token output', totalToken: 'Jumlah Token', activeUsers: 'Pengguna aktif', activeModels: 'Model aktif', @@ -959,7 +958,6 @@ const message = { attemptChain: 'Rantaian percubaan', attemptIndex: 'Urutan panggilan', noAttemptDetails: 'Permintaan ini berjaya sekali percubaan; tiada butiran fallback', - requestId: 'Request ID', input: 'Input', output: 'Output', total: 'Jumlah', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 1869b4f18940..cf4b9c0def59 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -889,13 +889,11 @@ const message = { importModelAccount: 'Importar conta de modelo', editModelAccount: 'Editar conta de modelo', selectModelAccount: 'Selecionar uma conta de modelo existente', - weight: 'Peso', priority: 'Prioridade', healthStatus: 'Saúde', failureCount: 'Falhas', lastError: 'Último erro', modelMap: 'Mapeamento de modelos', - apiKey: 'API Key', apiKeyKeepEmpty: 'API Key (deixe vazio para manter)', apiKeyOnceHint: 'A API Key é exibida apenas uma vez após a criação. Copie e salve agora.', apiKeyOnceSave: 'A API Key é exibida apenas uma vez. Salve agora:', @@ -939,13 +937,14 @@ const message = { providerDistribution: 'Distribuição por provedor', modelDistribution: 'Distribuição por modelo', serviceProvider: 'Provedor', - requestCount: 'Requisições', tokenUsage: 'Uso de Token', percent: 'Percentual', ranking: 'Ranking', rank: 'Posição', promptToken: 'Token de entrada', completionToken: 'Token de saída', + inputTokens: 'Token de entrada', + outputTokens: 'Token de saída', totalToken: 'Total de Token', activeUsers: 'Usuários ativos', activeModels: 'Modelos ativos', @@ -955,7 +954,6 @@ const message = { attemptChain: 'Cadeia de tentativas', attemptIndex: 'Ordem de chamada', noAttemptDetails: 'Esta requisição acertou na primeira tentativa; sem detalhes de fallback', - requestId: 'Request ID', input: 'Entrada', output: 'Saída', total: 'Total', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index d39170bacc86..0d60f90b601b 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -883,13 +883,11 @@ const message = { importModelAccount: 'Импортировать аккаунт модели', editModelAccount: 'Редактировать аккаунт модели', selectModelAccount: 'Выберите существующий аккаунт модели', - weight: 'Вес', priority: 'Приоритет', healthStatus: 'Состояние', failureCount: 'Ошибки', lastError: 'Последняя ошибка', modelMap: 'Сопоставление моделей', - apiKey: 'API Key', apiKeyKeepEmpty: 'API Key (оставьте пустым, чтобы не менять)', apiKeyOnceHint: 'API Key отображается только один раз после создания. Скопируйте и сохраните его сейчас.', apiKeyOnceSave: 'API Key отображается только один раз. Сохраните его сейчас:', @@ -933,13 +931,14 @@ const message = { providerDistribution: 'Распределение по провайдерам', modelDistribution: 'Распределение по моделям', serviceProvider: 'Провайдер', - requestCount: 'Запросы', tokenUsage: 'Использование Token', percent: 'Доля', ranking: 'Рейтинг', rank: 'Место', promptToken: 'Входные Token', completionToken: 'Выходные Token', + inputTokens: 'Входные Token', + outputTokens: 'Выходные Token', totalToken: 'Всего Token', activeUsers: 'Активные пользователи', activeModels: 'Активные модели', @@ -949,7 +948,6 @@ const message = { attemptChain: 'Цепочка попыток', attemptIndex: 'Порядок вызова', noAttemptDetails: 'Запрос выполнен с первой попытки, деталей fallback нет', - requestId: 'Request ID', input: 'Вход', output: 'Выход', total: 'Итого', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 4cb2d994fa35..a7b3a47ca060 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -891,13 +891,11 @@ const message = { importModelAccount: 'Model hesabını içe aktar', editModelAccount: 'Model hesabını düzenle', selectModelAccount: 'Mevcut bir model hesabı seçin', - weight: 'Ağırlık', priority: 'Öncelik', healthStatus: 'Sağlık durumu', failureCount: 'Hata sayısı', lastError: 'Son hata', modelMap: 'Model eşlemesi', - apiKey: 'API Key', apiKeyKeepEmpty: 'API Key (değiştirmemek için boş bırakın)', apiKeyOnceHint: 'API Key oluşturulduktan sonra yalnızca bir kez gösterilir. Şimdi kopyalayıp kaydedin.', apiKeyOnceSave: 'API Key yalnızca bir kez gösterilir. Şimdi kaydedin:', @@ -941,13 +939,14 @@ const message = { providerDistribution: 'Sağlayıcı dağılımı', modelDistribution: 'Model dağılımı', serviceProvider: 'Sağlayıcı', - requestCount: 'İstekler', tokenUsage: 'Token kullanımı', percent: 'Yüzde', ranking: 'Sıralama', rank: 'Sıra', promptToken: 'Girdi Token', completionToken: 'Çıktı Token', + inputTokens: 'Girdi Token', + outputTokens: 'Çıktı Token', totalToken: 'Toplam Token', activeUsers: 'Aktif kullanıcılar', activeModels: 'Aktif modeller', @@ -957,7 +956,6 @@ const message = { attemptChain: 'Deneme zinciri', attemptIndex: 'Çağrı sırası', noAttemptDetails: 'Bu istek tek denemede isabet etti; fallback ayrıntısı yok', - requestId: 'Request ID', input: 'Girdi', output: 'Çıktı', total: 'Toplam', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index eed541e1c612..95a74e1afe15 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -831,13 +831,11 @@ const message = { importModelAccount: '匯入模型帳號', editModelAccount: '編輯模型帳號', selectModelAccount: '選擇已有模型帳號', - weight: '權重', priority: '優先級', healthStatus: '健康狀態', failureCount: '失敗次數', lastError: '最近錯誤', modelMap: '模型映射', - apiKey: 'API Key', apiKeyKeepEmpty: 'API Key(留空不改)', apiKeyOnceHint: 'API Key 僅建立時顯示一次,請及時複製保存。', apiKeyOnceSave: 'API Key 只顯示一次,請立即保存:', @@ -879,13 +877,14 @@ const message = { providerDistribution: '按服務商分佈', modelDistribution: '按模型分佈', serviceProvider: '服務商', - requestCount: '請求數', tokenUsage: 'Token 用量', percent: '佔比', ranking: '排行榜', rank: '排名', promptToken: '輸入 Token', completionToken: '輸出 Token', + inputTokens: '輸入 Token', + outputTokens: '輸出 Token', totalToken: '總 Token', activeUsers: '活躍使用者', activeModels: '活躍模型', @@ -895,7 +894,6 @@ const message = { attemptChain: '呼叫鏈路', attemptIndex: '調用順序', noAttemptDetails: '本次請求一次命中,無 fallback 明細', - requestId: 'Request ID', input: '輸入', output: '輸出', total: '總計', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index d866fd875911..cdfd16a30aa0 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -825,20 +825,14 @@ const message = { importModelAccount: '导入模型账号', editModelAccount: '编辑模型账号', selectModelAccount: '选择已有模型账号', - weight: '权重', priority: '优先级', healthStatus: '健康状态', failureCount: '失败次数', lastError: '最近错误', modelMap: '模型映射', - apiKeys: 'API Key', - apiKey: 'API Key', apiKeyReset: '重置 API Key(留空不改)', qpsLimit: 'QPS 限制', unlimited: '不限', - userGroup: '用户组', - userGroups: '用户组', - defaultGroup: '默认', apiKeyCount: 'API Key 数', lastUsedAt: '最近使用时间', settingTitle: 'AI 代理设置', @@ -877,13 +871,14 @@ const message = { providerDistribution: '按服务商分布', modelDistribution: '按模型分布', serviceProvider: '服务商', - requestCount: '请求数', tokenUsage: 'Token 用量', percent: '占比', ranking: '排行榜', rank: '排名', promptToken: '输入 Token', completionToken: '输出 Token', + inputTokens: '输入 Token', + outputTokens: '输出 Token', totalToken: '总 Token', activeUsers: '活跃用户', activeModels: '活跃模型', @@ -893,7 +888,6 @@ const message = { attemptChain: '调用链路', attemptIndex: '调用顺序', noAttemptDetails: '本次请求一次命中,无 fallback 明细', - requestId: 'Request ID', input: '输入', output: '输出', total: '总计', @@ -929,8 +923,6 @@ const message = { totalThroughputHelper: '每秒处理的输入与输出 Token 总数,用于衡量整体处理能力。', firstTokenLatency: '首 Token 延迟', firstTokenLatencyHelper: '从请求发出到收到第一个 Token 的时间,越低表示响应越快。', - inputTokens: '输入 Token', - outputTokens: '输出 Token', tokenValueHelper: '请输入正整数或 k 单位,例如 512、1k、32k', numPrompts: '请求数量', concurrency: '并发数', @@ -939,17 +931,9 @@ const message = { requestRateCustom: '自定义 QPS', requestRateCustomPlaceholder: '请输入每秒请求数,如 2.5', successfulRequests: '成功请求', - failedRequests: '失败请求', requestThroughput: '请求吞吐', - ttftMean: 'TTFT 平均', - ttftMedian: 'TTFT 中位数', - ttftP99: 'TTFT P99', - tpotMean: 'TPOT 平均', - tpotMedian: 'TPOT 中位数', - tpotP99: 'TPOT P99', - itlMean: 'ITL 平均', - itlMedian: 'ITL 中位数', - itlP99: 'ITL P99', + mean: '平均', + median: '中位数', timeout: '超时时间(秒)', image: 'vLLM 镜像', ignoreEos: '忽略 EOS',