Compare commits

..
Author SHA1 Message Date
Yuki Guoandssongliu d658395188 feat(sync): sync php extended template (#14299)
* feat(sync): sync php extended template

* fix(i18n): complete resource sync translations

---------

Co-authored-by: ssongliu <sloooop1x@gmail.com>
2026-11-05 15:06:12 +08:00
ssongliu 51bae946e1 feat(ai): refine model service terminology and provider setup (#14305) 2026-11-05 14:58:17 +08:00
Yuki Guo 56c7981b3a fix(docker): check image update (#14302) 2026-11-05 14:03:55 +08:00
ssongliu 730dbbab5b fix(vllm): distinguish empty metrics from collection failures (#14303) 2026-11-04 20:42:58 +08:00
ssongliu 2e9c1794f2 feat: separate model services into a standalone menu (#14300) 2026-11-04 17:23:21 +08:00
54 changed files with 630 additions and 522 deletions
+11 -11
View File
@@ -380,7 +380,7 @@ func (b *BaseApi) DeleteHermesChatSession(c *gin.Context) {
}
// @Tags AI
// @Summary Get model account providers
// @Summary Get model service providers
// @Success 200 {array} dto.ProviderInfo
// @Security ApiKeyAuth
// @Security Timestamp
@@ -395,7 +395,7 @@ func (b *BaseApi) GetAgentProviders(c *gin.Context) {
}
// @Tags AI
// @Summary Create model account
// @Summary Create model service
// @Accept json
// @Param request body dto.AgentAccountCreateReq true "request"
// @Success 200
@@ -415,7 +415,7 @@ func (b *BaseApi) CreateAgentAccount(c *gin.Context) {
}
// @Tags AI
// @Summary Update model account
// @Summary Update model service
// @Accept json
// @Param request body dto.AgentAccountUpdateReq true "request"
// @Success 200
@@ -435,7 +435,7 @@ func (b *BaseApi) UpdateAgentAccount(c *gin.Context) {
}
// @Tags AI
// @Summary Page model accounts
// @Summary Page model services
// @Accept json
// @Param request body dto.AgentAccountSearch true "request"
// @Success 200 {object} dto.PageResult
@@ -459,7 +459,7 @@ func (b *BaseApi) PageAgentAccounts(c *gin.Context) {
}
// @Tags AI
// @Summary Count model accounts by provider
// @Summary Count model services by provider
// @Accept json
// @Param request body dto.AgentAccountProviderCountReq true "request"
// @Success 200 {object} map[string]int64
@@ -480,7 +480,7 @@ func (b *BaseApi) CountAgentAccountsByProviders(c *gin.Context) {
}
// @Tags AI
// @Summary List model account models
// @Summary List model service models
// @Accept json
// @Param request body dto.AgentAccountModelReq true "request"
// @Success 200 {array} dto.AgentAccountModel
@@ -522,7 +522,7 @@ func (b *BaseApi) DiscoverAgentAccountModels(c *gin.Context) {
}
// @Tags AI
// @Summary Create model account model
// @Summary Create model service model
// @Accept json
// @Param request body dto.AgentAccountModelCreateReq true "request"
// @Success 200
@@ -542,7 +542,7 @@ func (b *BaseApi) CreateAgentAccountModel(c *gin.Context) {
}
// @Tags AI
// @Summary Update model account model
// @Summary Update model service model
// @Accept json
// @Param request body dto.AgentAccountModelUpdateReq true "request"
// @Success 200
@@ -562,7 +562,7 @@ func (b *BaseApi) UpdateAgentAccountModel(c *gin.Context) {
}
// @Tags AI
// @Summary Delete model account model
// @Summary Delete model service model
// @Accept json
// @Param request body dto.AgentAccountModelDeleteReq true "request"
// @Success 200
@@ -582,7 +582,7 @@ func (b *BaseApi) DeleteAgentAccountModel(c *gin.Context) {
}
// @Tags AI
// @Summary Verify model account
// @Summary Verify model service
// @Accept json
// @Param request body dto.AgentAccountVerifyReq true "request"
// @Success 200
@@ -602,7 +602,7 @@ func (b *BaseApi) VerifyAgentAccount(c *gin.Context) {
}
// @Tags AI
// @Summary Delete model account
// @Summary Delete model service
// @Accept json
// @Param request body dto.AgentAccountDeleteReq true "request"
// @Success 200
+4
View File
@@ -59,6 +59,10 @@ var catalog = map[string]Meta{
Key: "vllm", DisplayName: "vLLM", Sort: 20, DefaultAPIType: "openai-completions", EnvKey: "VLLM_API_KEY",
APIConfigs: editableAPIConfigs(false, "openai-completions", "openai-responses", "anthropic-messages", "openai-images", "openai-embeddings"),
},
"1panel-ai-gateway": {
Key: "1panel-ai-gateway", DisplayName: "1Panel AI Gateway", DisplayNameKey: "AIProvider1PanelGateway", Sort: 21, DefaultAPIType: "openai-completions", EnvKey: "ONEPANEL_AI_GATEWAY_API_KEY",
APIConfigs: editableAPIConfigs(true, "openai-completions", "openai-responses", "anthropic-messages", "openai-images", "openai-embeddings"),
},
"deepseek": {
Key: "deepseek", DisplayName: "DeepSeek", Sort: 25, DefaultAPIType: "openai-completions", EnvKey: "DEEPSEEK_API_KEY",
APIConfigs: []APIConfig{
+4 -4
View File
@@ -36,7 +36,7 @@ func SyncLocalModelAccount(install model.AppInstall, accountID uint, baseURL str
return nil, err
}
if err == nil && account.AppInstallID != 0 && account.AppInstallID != install.ID {
return nil, fmt.Errorf("model account belongs to another installation")
return nil, fmt.Errorf("model service belongs to another installation")
}
}
if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -228,12 +228,12 @@ func CleanupLocalModelAccount(installID uint) {
}
accounts, err := agentAccountRepo.List(repo.WithByAppInstallID(installID))
if err != nil {
global.LOG.Errorf("load local model accounts: %v", err)
global.LOG.Errorf("load local model services: %v", err)
return
}
for _, account := range accounts {
if err := (AgentService{}).DeleteAccount(dto.AgentAccountDeleteReq{ID: account.ID}); err != nil {
global.LOG.Warnf("keep local model account %d after uninstall: %v", account.ID, err)
global.LOG.Warnf("keep local model service %d after uninstall: %v", account.ID, err)
}
}
}
@@ -243,7 +243,7 @@ func ResolveLocalModelAccountBaseURL(addressType, customURL, containerName, cont
case "custom":
baseURL := strings.TrimRight(strings.TrimSpace(customURL), "/")
if !strings.HasPrefix(baseURL, "http://") && !strings.HasPrefix(baseURL, "https://") {
return "", fmt.Errorf("model account base URL must start with http:// or https://")
return "", fmt.Errorf("model service base URL must start with http:// or https://")
}
return baseURL, nil
case "localhost":
@@ -299,8 +299,19 @@ func checkContainerImageUpdate(ctx context.Context, cli imageCheckUpdateDockerCl
record.LatestVersion = remote.target.Tag
record.TargetImage = "docker.io/" + repository + ":" + remote.target.Tag
record.TargetImageID = remote.target.ConfigDigest
sameImage := inspected.ID == remote.target.ConfigDigest
if inspected.Descriptor != nil {
// The containerd store uses the pulled index/manifest as its image ID,
// not the config digest. Persist the ID that pulling this tag will produce
// so post-upgrade reconciliation uses the same identity as Docker.
if remote.target.ReferenceDigest == "" {
return record, fmt.Errorf("Docker Hub manifest response is missing its digest")
}
record.TargetImageID = remote.target.ReferenceDigest
sameImage = inspected.ID == remote.target.ReferenceDigest || inspected.ID == remote.target.Digest
}
// Both versioned and floating tags can be republished with new image content.
record.HasUpdate = remote.target.Tag != tag || remote.target.ConfigDigest != inspected.ID
record.HasUpdate = remote.target.Tag != tag || !sameImage
return record, nil
}
return record, fmt.Errorf("no compatible image for %s/%s", platform.OS, platform.Architecture)
+5
View File
@@ -286,6 +286,11 @@ func collectVLLMMetrics(ctx context.Context, install model.AppInstall, previous
return point, err
}
point.CreatedAt = time.Now()
if len(metrics) == 0 {
point.Status = "no_data"
point.RawMetrics = "{}"
return point, nil
}
raw, err := json.Marshal(metrics)
if err != nil {
return point, err
+4 -3
View File
@@ -70,8 +70,8 @@ Decrypt: "Decrypt"
# agent
ErrAgentAccountBound: 'Account is bound to an agent and cannot be deleted'
ErrTerminalAIAccountInUse: 'This model account is currently used by Terminal AI. Switch the account in Terminal AI settings or disable Terminal AI and try again.'
ErrFileAIAccountInUse: 'This model account is currently used by File Management AI. Switch the account in File Management AI settings or disable File Management AI and try again.'
ErrTerminalAIAccountInUse: 'This model service is currently used by Terminal AI. Switch the account in Terminal AI settings or disable Terminal AI and try again.'
ErrFileAIAccountInUse: 'This model service is currently used by File Management AI. Switch the account in File Management AI settings or disable File Management AI and try again.'
ErrAgentAccountUnavailable: 'Account connection unavailable: {{ .err }}'
ErrAgentProviderNotSupported: 'Unsupported agent provider'
ErrAgentAccountRequired: 'Select an agent account first'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI request failed: {{ .err }}'
# AI gateway
ErrAIProxyServiceNotInstalled: '{{ .name }} service is not installed'
ErrAIProxyModelAccountNotFound: 'Model account {{ .id }} not found'
ErrAIProxyModelAccountNotFound: 'Model service {{ .id }} not found'
ErrAIProxyModelMapRequired: 'This field is required.'
ErrAIProxyModelMapInvalid: 'Model mapping must be a valid JSON object: {{ .err }}'
ErrAIProxyModelMapEmpty: 'Model mapping cannot be empty'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: '1Panel AI Gateway'
# Firewall
ErrDockerIptablesChainUnavailable: 'The Docker DOCKER-USER chain was not found. Restart Docker and try again'
+5 -4
View File
@@ -70,8 +70,8 @@ Decrypt: 'Descifrar'
# agente
ErrAgentAccountBound: 'Cuenta vinculada a agente'
ErrTerminalAIAccountInUse: 'Esta cuenta de modelo esta siendo usada por Terminal AI. Cambia la cuenta en la configuracion de Terminal AI o desactiva Terminal AI y vuelve a intentarlo.'
ErrFileAIAccountInUse: 'Esta cuenta de modelo está siendo utilizada por la IA del gestor de archivos. Cambia la cuenta en su configuración o desactívala y vuelve a intentarlo.'
ErrTerminalAIAccountInUse: 'Este servicio de modelo esta siendo usado por Terminal AI. Cambia la cuenta en la configuracion de Terminal AI o desactiva Terminal AI y vuelve a intentarlo.'
ErrFileAIAccountInUse: 'Este servicio de modelo está siendo utilizado por la IA del gestor de archivos. Cambia la cuenta en su configuración o desactívala y vuelve a intentarlo.'
ErrAgentAccountUnavailable: 'Conexión de cuenta no disponible: {{ .err }}'
ErrAgentProviderNotSupported: 'Proveedor de agente no soportado'
ErrAgentAccountRequired: 'Elige una cuenta de agente primero'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'La solicitud de AI ha fallado: {{ .err }}'
# puerta de enlace de IA
ErrAIProxyServiceNotInstalled: 'El servicio {{ .name }} no está instalado'
ErrAIProxyModelAccountNotFound: 'Cuenta de modelo {{ .id }} no encontrada'
ErrAIProxyModelAccountNotFound: 'Servicio de modelo {{ .id }} no encontrado'
ErrAIProxyModelMapRequired: 'Este campo es obligatorio.'
ErrAIProxyModelMapInvalid: 'El mapeo de modelos debe ser un objeto JSON válido: {{ .err }}'
ErrAIProxyModelMapEmpty: 'El mapeo de modelos no puede estar vacío'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'Puerta de enlace de IA de 1Panel'
# Firewall
ErrDockerIptablesChainUnavailable: 'No se encontró la cadena DOCKER-USER de Docker. Reinicie Docker y vuelva a intentarlo'
@@ -816,4 +817,4 @@ ContainerImageCheckFailures: "Falló la comprobación de {{ .count }} contenedor
ErrImageCheckProxyRequired: "Para comprobar actualizaciones de imágenes en el entorno actual, configura primero un servidor proxy."
ErrPHPExtensionsConflict: "Ya existe una plantilla de extensiones PHP con el mismo nombre y distinto contenido; no se ha sobrescrito"
ErrPHPExtensionsConflict: "Ya existe una plantilla de extensiones PHP con este nombre y contenido diferente; no se ha sobrescrito"
+5 -4
View File
@@ -70,8 +70,8 @@ Decrypt: "رمزگشایی"
# عامل
ErrAgentAccountBound: 'حساب به یک عامل متصل است و قابل حذف نیست'
ErrTerminalAIAccountInUse: 'این حساب مدل در حال حاضر توسط ترمینال هوش مصنوعی استفاده می‌شود. حساب را در تنظیمات ترمینال هوش مصنوعی تغییر دهید یا ترمینال هوش مصنوعی را غیرفعال کرده و دوباره تلاش کنید.'
ErrFileAIAccountInUse: 'این حساب مدل توسط هوش مصنوعی مدیریت فایل استفاده می‌شود. حساب را در تنظیمات آن تغییر دهید یا هوش مصنوعی مدیریت فایل را غیرفعال کرده و دوباره تلاش کنید.'
ErrTerminalAIAccountInUse: 'این سرویس مدل در حال حاضر توسط ترمینال هوش مصنوعی استفاده می‌شود. حساب را در تنظیمات ترمینال هوش مصنوعی تغییر دهید یا ترمینال هوش مصنوعی را غیرفعال کرده و دوباره تلاش کنید.'
ErrFileAIAccountInUse: 'این سرویس مدل توسط هوش مصنوعی مدیریت فایل استفاده می‌شود. حساب را در تنظیمات آن تغییر دهید یا هوش مصنوعی مدیریت فایل را غیرفعال کرده و دوباره تلاش کنید.'
ErrAgentAccountUnavailable: 'اتصال حساب در دسترس نیست: {{ .err }}'
ErrAgentProviderNotSupported: 'ارائه‌دهنده عامل پشتیبانی نمی‌شود'
ErrAgentAccountRequired: 'ابتدا یک حساب عامل انتخاب کنید'
@@ -677,7 +677,7 @@ TerminalAIRequestFailed: 'درخواست هوش مصنوعی ناموفق بود
# دروازه هوش مصنوعی
ErrAIProxyServiceNotInstalled: 'سرویس {{ .name }} نصب نشده است'
ErrAIProxyModelAccountNotFound: 'حساب مدل {{ .id }} یافت نشد'
ErrAIProxyModelAccountNotFound: 'سرویس مدل {{ .id }} یافت نشد'
ErrAIProxyModelMapRequired: 'این فیلد الزامی است.'
ErrAIProxyModelMapInvalid: 'نگاشت مدل باید یک شی JSON معتبر باشد: {{ .err }}'
ErrAIProxyModelMapEmpty: 'نگاشت مدل نمی‌تواند خالی باشد'
@@ -688,6 +688,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'درگاه هوش مصنوعی 1Panel'
# Firewall
ErrDockerIptablesChainUnavailable: 'زنجیره DOCKER-USER داکر یافت نشد. داکر را راه‌اندازی مجدد کنید و دوباره تلاش کنید'
@@ -817,4 +818,4 @@ ContainerImageCheckFailures: "بررسی {{ .count }} کانتینر ناموف
ErrImageCheckProxyRequired: "برای بررسی به‌روزرسانی تصاویر در محیط فعلی، ابتدا یک سرور پروکسی پیکربندی کنید."
ErrPHPExtensionsConflict: "الگوی افزونه‌های PHP با این نام و محتوای متفاوت از قبل وجود دارد؛ بازنویسی نشد"
ErrPHPExtensionsConflict: "قالب افزونه PHP با این نام و محتوای متفاوت از قبل وجود دارد؛ بازنویسی نشد"
+5 -4
View File
@@ -70,8 +70,8 @@ Decrypt: '復号化'
# エージェント
ErrAgentAccountBound: 'アカウントはエージェントに紐づいています'
ErrTerminalAIAccountInUse: 'このモデルアカウントは Terminal AI で使用中です。Terminal AI の設定で別のアカウントへ切り替えるか、Terminal AI を無効にしてから再試行してください。'
ErrFileAIAccountInUse: 'このモデルアカウントはファイル管理 AI で使用中です。ファイル管理 AI の設定で別のアカウントへ切り替えるか、ファイル管理 AI を無効にしてから再試行してください。'
ErrTerminalAIAccountInUse: 'このモデルサービスは Terminal AI で使用中です。Terminal AI の設定で別のアカウントへ切り替えるか、Terminal AI を無効にしてから再試行してください。'
ErrFileAIAccountInUse: 'このモデルサービスはファイル管理 AI で使用中です。ファイル管理 AI の設定で別のアカウントへ切り替えるか、ファイル管理 AI を無効にしてから再試行してください。'
ErrAgentAccountUnavailable: 'アカウント接続不可: {{ .err }}'
ErrAgentProviderNotSupported: 'エージェントプロバイダ非対応'
ErrAgentAccountRequired: 'まずエージェントアカウントを選択'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI リクエストに失敗しました: {{ .err }}'
# AIゲートウェイ
ErrAIProxyServiceNotInstalled: '{{ .name }} サービスはインストールされていません'
ErrAIProxyModelAccountNotFound: 'モデルアカウント {{ .id }} が見つかりません'
ErrAIProxyModelAccountNotFound: 'モデルサービス {{ .id }} が見つかりません'
ErrAIProxyModelMapRequired: 'この項目は必須です。'
ErrAIProxyModelMapInvalid: 'モデルマッピングは有効な JSON オブジェクトである必要があります: {{ .err }}'
ErrAIProxyModelMapEmpty: 'モデルマッピングは空にできません'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: '1Panel AI ゲートウェイ'
# Firewall
ErrDockerIptablesChainUnavailable: 'Docker の DOCKER-USER チェーンが見つかりません。Docker を再起動してから再試行してください'
@@ -816,4 +817,4 @@ ContainerImageCheckFailures: "{{ .count }} コンテナの確認に失敗しま
ErrImageCheckProxyRequired: "現在の実行環境でイメージの更新を確認するには、先にプロキシサーバーを設定してください。"
ErrPHPExtensionsConflict: "同名の PHP 拡張テンプレートが異なる内容で存在するため、上書きしませんでした"
ErrPHPExtensionsConflict: "同じ名前で内容が異なる PHP 拡張機能テンプレートが既に存在するため、上書きしませんでした"
+5 -4
View File
@@ -70,8 +70,8 @@ Decrypt: '복호화'
# 에이전트
ErrAgentAccountBound: '계정이 에이전트에 묶여 있습니다'
ErrTerminalAIAccountInUse: '이 모델 계정은 현재 터미널 AI에서 사용 중입니다. 터미널 AI 설정에서 다른 계정으로 변경하거나 터미널 AI를 비활성화한 뒤 다시 시도하세요.'
ErrFileAIAccountInUse: '이 모델 계정은 현재 파일 관리 AI에서 사용 중입니다. 파일 관리 AI 설정에서 다른 계정으로 변경하거나 파일 관리 AI를 비활성화한 뒤 다시 시도하세요.'
ErrTerminalAIAccountInUse: '이 모델 서비스는 현재 터미널 AI에서 사용 중입니다. 터미널 AI 설정에서 다른 계정으로 변경하거나 터미널 AI를 비활성화한 뒤 다시 시도하세요.'
ErrFileAIAccountInUse: '이 모델 서비스는 현재 파일 관리 AI에서 사용 중입니다. 파일 관리 AI 설정에서 다른 계정으로 변경하거나 파일 관리 AI를 비활성화한 뒤 다시 시도하세요.'
ErrAgentAccountUnavailable: '계정 연결 불가: {{ .err }}'
ErrAgentProviderNotSupported: '지원되지 않는 에이전트 공급자'
ErrAgentAccountRequired: '먼저 에이전트 계정을 선택하세요'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI 요청 실패: {{ .err }}'
# AI 게이트웨이
ErrAIProxyServiceNotInstalled: '{{ .name }} 서비스가 설치되어 있지 않습니다'
ErrAIProxyModelAccountNotFound: '모델 계정 {{ .id }}을(를) 찾을 수 없습니다'
ErrAIProxyModelAccountNotFound: '모델 서비스 {{ .id }}을(를) 찾을 수 없습니다'
ErrAIProxyModelMapRequired: '이 필드는 필수입니다.'
ErrAIProxyModelMapInvalid: '모델 매핑은 유효한 JSON 객체여야 합니다: {{ .err }}'
ErrAIProxyModelMapEmpty: '모델 매핑은 비워 둘 수 없습니다'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: '1Panel AI 게이트웨이'
# Firewall
ErrDockerIptablesChainUnavailable: 'Docker DOCKER-USER 체인을 찾을 수 없습니다. Docker를 다시 시작한 후 재시도하세요'
@@ -816,4 +817,4 @@ ContainerImageCheckFailures: "컨테이너 {{ .count }}개 확인에 실패했
ErrImageCheckProxyRequired: "현재 실행 환경에서 이미지 업데이트를 확인하려면 먼저 프록시 서버를 설정하세요."
ErrPHPExtensionsConflict: "이름은 같지만 내용이 다른 PHP 확장 템플릿이 이미 있어 덮어쓰지 않았습니다"
ErrPHPExtensionsConflict: "같은 이름에 내용이 다른 PHP 확장 템플릿이 이미 있어 덮어쓰지 않았습니다"
+5 -4
View File
@@ -55,8 +55,8 @@ Decrypt: "ຖອດລະຫັດ"
#agent
ErrAgentAccountBound: 'ບັນຊີຖືກຜູກມັດກັບຕົວແທນ (Agent) ແລະບໍ່ສາມາດລຶບໄດ້'
ErrTerminalAIAccountInUse: 'ບັນຊີໂມເດລນີ້ກຳລັງຖືກໃຊ້ໂດຍ Terminal AI. ກະລຸນາປ່ຽນບັນຊີໃນການຕັ້ງຄ່າ Terminal AI ຫຼື ປິດໃຊ້ງານ Terminal AI ແລ້ວລອງໃໝ່.'
ErrFileAIAccountInUse: 'ບັນຊີໂມເດລນີ້ກຳລັງຖືກໃຊ້ໂດຍ AI ຈັດການໄຟລ໌. ກະລຸນາປ່ຽນບັນຊີໃນການຕັ້ງຄ່າ AI ຈັດການໄຟລ໌ ຫຼື ປິດໃຊ້ງານແລ້ວລອງໃໝ່.'
ErrTerminalAIAccountInUse: 'ບໍລິການໂມເດລນີ້ກຳລັງຖືກໃຊ້ໂດຍ Terminal AI. ກະລຸນາປ່ຽນບັນຊີໃນການຕັ້ງຄ່າ Terminal AI ຫຼື ປິດໃຊ້ງານ Terminal AI ແລ້ວລອງໃໝ່.'
ErrFileAIAccountInUse: 'ບໍລິການໂມເດລນີ້ກຳລັງຖືກໃຊ້ໂດຍ AI ຈັດການໄຟລ໌. ກະລຸນາປ່ຽນບັນຊີໃນການຕັ້ງຄ່າ AI ຈັດການໄຟລ໌ ຫຼື ປິດໃຊ້ງານແລ້ວລອງໃໝ່.'
ErrAgentAccountUnavailable: 'ການເຊື່ອມຕໍ່ບັນຊີບໍ່ສາມາດໃຊ້ງານໄດ້: {{ .err }}'
ErrAgentProviderNotSupported: 'ບໍ່ຮອງຮັບຜູ້ໃຫ້ບໍລິການຕົວແທນນີ້'
ErrAgentAccountRequired: 'ກະລຸນາເລືອກບັນຊີຕົວແທນກ່ອນ'
@@ -667,7 +667,7 @@ FileAISearchEmptyDir: 'ບໍ່ພົບໄຟລ໌ ຫຼື ໂຟນເດ
# ai proxy
ErrAIProxyServiceNotInstalled: 'ຍັງບໍ່ໄດ້ຕິດຕັ້ງບໍລິການ {{ .name }}'
ErrAIProxyModelAccountNotFound: 'ບໍ່ພົບບັນຊີໂມເດລ {{ .id }}'
ErrAIProxyModelAccountNotFound: 'ບໍ່ພົບບໍລິການໂມເດລ {{ .id }}'
ErrAIProxyModelMapRequired: 'ຟິວ (Field) ນີ້ຈຳເປັນຕ້ອງມີ.'
ErrAIProxyModelMapInvalid: 'ການຈັບຄູ່ໂມເດລຕ້ອງເປັນວັດຖຸ JSON ທີ່ຖືກຕ້ອງ: {{ .err }}'
ErrAIProxyModelMapEmpty: 'ການຈັບຄູ່ໂມເດລບໍ່ສາມາດຫວ່າງເປົ່າໄດ້'
@@ -678,6 +678,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'ເກດເວ AI ຂອງ 1Panel'
# Firewall
ErrDockerIptablesChainUnavailable: 'ບໍ່ພົບ chain DOCKER-USER ຂອງ Docker. ກະລຸນາເລີ່ມ Docker ໃໝ່ແລ້ວລອງອີກຄັ້ງ'
@@ -807,4 +808,4 @@ ContainerImageCheckFailures: "ກວດສອບ {{ .count }} ຄອນເທນ
ErrImageCheckProxyRequired: "ເພື່ອກວດສອບການອັບເດດອິມເມຈໃນສະພາບແວດລ້ອມປັດຈຸບັນ ກະລຸນາຕັ້ງຄ່າພຣັອກຊີເຊີບເວີກ່ອນ."
ErrPHPExtensionsConflict: "ມີແມ່ແບບສ່ວນຂະຫຍາຍ PHP ຊື່ດຽວກັນແຕ່ເນື້ອຫາຕ່າງກັນຢູ່ແລ້ວ; ບໍ່ໄດ້ຂຽນທັບ"
ErrPHPExtensionsConflict: "ມີແມ່ແບບສ່ວນຂະຫຍາຍ PHP ຊື່ນີ້ຢູ່ແລ້ວແຕ່ເນື້ອຫາຕ່າງກັນ; ບໍ່ໄດ້ຂຽນທັບ"
+5 -4
View File
@@ -70,8 +70,8 @@ Decrypt: 'Dekripsi'
# ejen
ErrAgentAccountBound: 'Akaun terikat kepada ejen'
ErrTerminalAIAccountInUse: 'Akaun model ini sedang digunakan oleh Terminal AI. Tukar akaun dalam tetapan Terminal AI atau nyahaktifkan Terminal AI, kemudian cuba lagi.'
ErrFileAIAccountInUse: 'Akaun model ini sedang digunakan oleh AI pengurusan fail. Tukar akaun dalam tetapannya atau nyahaktifkan AI tersebut, kemudian cuba lagi.'
ErrTerminalAIAccountInUse: 'Perkhidmatan model ini sedang digunakan oleh Terminal AI. Tukar akaun dalam tetapan Terminal AI atau nyahaktifkan Terminal AI, kemudian cuba lagi.'
ErrFileAIAccountInUse: 'Perkhidmatan model ini sedang digunakan oleh AI pengurusan fail. Tukar akaun dalam tetapannya atau nyahaktifkan AI tersebut, kemudian cuba lagi.'
ErrAgentAccountUnavailable: 'Sambungan akaun tidak tersedia: {{ .err }}'
ErrAgentProviderNotSupported: 'Penyedia ejen tidak disokong'
ErrAgentAccountRequired: 'Pilih akaun ejen terlebih dahulu'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'Permintaan AI gagal: {{ .err }}'
# gerbang AI
ErrAIProxyServiceNotInstalled: 'Perkhidmatan {{ .name }} belum dipasang'
ErrAIProxyModelAccountNotFound: 'Akaun model {{ .id }} tidak ditemui'
ErrAIProxyModelAccountNotFound: 'Perkhidmatan model {{ .id }} tidak ditemui'
ErrAIProxyModelMapRequired: 'Medan ini wajib diisi.'
ErrAIProxyModelMapInvalid: 'Pemetaan model mestilah objek JSON yang sah: {{ .err }}'
ErrAIProxyModelMapEmpty: 'Pemetaan model tidak boleh kosong'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'Gerbang AI 1Panel'
# Firewall
ErrDockerIptablesChainUnavailable: 'Rantaian DOCKER-USER Docker tidak ditemui. Mulakan semula Docker dan cuba lagi'
@@ -816,4 +817,4 @@ ContainerImageCheckFailures: "Semakan {{ .count }} kontena gagal; lihat log tuga
ErrImageCheckProxyRequired: "Untuk menyemak kemas kini imej dalam persekitaran semasa, sila konfigurasikan pelayan proksi terlebih dahulu."
ErrPHPExtensionsConflict: "Templat sambungan PHP dengan nama yang sama tetapi kandungan berbeza sudah wujud; tidak ditulis ganti"
ErrPHPExtensionsConflict: "Templat sambungan PHP dengan nama ini sudah wujud tetapi kandungannya berbeza; tidak ditulis ganti"
+5 -4
View File
@@ -70,8 +70,8 @@ Decrypt: 'Descriptografar'
# agente
ErrAgentAccountBound: 'Conta vinculada a agente'
ErrTerminalAIAccountInUse: 'Esta conta de modelo esta sendo usada pelo Terminal AI. Troque a conta nas configuracoes do Terminal AI ou desative o Terminal AI e tente novamente.'
ErrFileAIAccountInUse: 'Esta conta de modelo está sendo usada pela IA do gerenciador de arquivos. Troque a conta nas configurações ou desative a IA e tente novamente.'
ErrTerminalAIAccountInUse: 'Este serviço de modelo esta sendo usado pelo Terminal AI. Troque a conta nas configuracoes do Terminal AI ou desative o Terminal AI e tente novamente.'
ErrFileAIAccountInUse: 'Este serviço de modelo está sendo usado pela IA do gerenciador de arquivos. Troque a conta nas configurações ou desative a IA e tente novamente.'
ErrAgentAccountUnavailable: 'Conexão da conta indisponível: {{ .err }}'
ErrAgentProviderNotSupported: 'Provedor de agente não suportado'
ErrAgentAccountRequired: 'Selecione uma conta de agente primeiro'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'Falha na solicitação de AI: {{ .err }}'
# gateway de IA
ErrAIProxyServiceNotInstalled: 'O serviço {{ .name }} não está instalado'
ErrAIProxyModelAccountNotFound: 'Conta de modelo {{ .id }} não encontrada'
ErrAIProxyModelAccountNotFound: 'Serviço de modelo {{ .id }} não encontrado'
ErrAIProxyModelMapRequired: 'Este campo é obrigatório.'
ErrAIProxyModelMapInvalid: 'O mapeamento de modelos deve ser um objeto JSON válido: {{ .err }}'
ErrAIProxyModelMapEmpty: 'O mapeamento de modelos não pode estar vazio'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'Gateway de IA do 1Panel'
# Firewall
ErrDockerIptablesChainUnavailable: 'A cadeia DOCKER-USER do Docker não foi encontrada. Reinicie o Docker e tente novamente'
@@ -816,4 +817,4 @@ ContainerImageCheckFailures: "Falha na verificação de {{ .count }} contêinere
ErrImageCheckProxyRequired: "Para verificar atualizações de imagens no ambiente atual, configure primeiro um servidor proxy."
ErrPHPExtensionsConflict: "Já existe um modelo de extensões PHP com o mesmo nome e conteúdo diferente; ele não foi sobrescrito"
ErrPHPExtensionsConflict: "Já existe um modelo de extensões PHP com este nome e conteúdo diferente; ele não foi sobrescrito"
+4 -3
View File
@@ -70,8 +70,8 @@ Decrypt: 'Расшифровать'
# агент
ErrAgentAccountBound: 'Акаунт привязан к агенту'
ErrTerminalAIAccountInUse: 'Эта учетная запись модели сейчас используется Terminal AI. Смените учетную запись в настройках Terminal AI или отключите Terminal AI и повторите попытку.'
ErrFileAIAccountInUse: 'Эта учетная запись модели используется ИИ файлового менеджера. Смените учетную запись в его настройках или отключите ИИ и повторите попытку.'
ErrTerminalAIAccountInUse: 'Этот сервис модели сейчас используется Terminal AI. Смените учетную запись в настройках Terminal AI или отключите Terminal AI и повторите попытку.'
ErrFileAIAccountInUse: 'Этот сервис модели используется ИИ файлового менеджера. Смените учетную запись в его настройках или отключите ИИ и повторите попытку.'
ErrAgentAccountUnavailable: 'Связь с аккаунтом недоступна: {{ .err }}'
ErrAgentProviderNotSupported: 'Провайдер агента не поддерживается'
ErrAgentAccountRequired: 'Выберите аккаунт агента'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'Ошибка запроса AI: {{ .err }}'
# AI-шлюз
ErrAIProxyServiceNotInstalled: 'Сервис {{ .name }} не установлен'
ErrAIProxyModelAccountNotFound: 'Аккаунт модели {{ .id }} не найден'
ErrAIProxyModelAccountNotFound: 'Сервис модели {{ .id }} не найден'
ErrAIProxyModelMapRequired: 'Это поле обязательно.'
ErrAIProxyModelMapInvalid: 'Сопоставление моделей должно быть допустимым JSON-объектом: {{ .err }}'
ErrAIProxyModelMapEmpty: 'Сопоставление моделей не может быть пустым'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'ИИ-шлюз 1Panel'
# Firewall
ErrDockerIptablesChainUnavailable: 'Цепочка Docker DOCKER-USER не найдена. Перезапустите Docker и повторите попытку'
+5 -4
View File
@@ -70,8 +70,8 @@ Decrypt: 'Şifre Çöz'
# ajan
ErrAgentAccountBound: 'Hesap bir ajana bağlı'
ErrTerminalAIAccountInUse: 'Bu model hesabi su anda Terminal AI tarafindan kullaniliyor. Terminal AI ayarlarinda baska bir hesaba gecin veya Terminal AI yi devre disi birakip tekrar deneyin.'
ErrFileAIAccountInUse: 'Bu model hesabı dosya yönetimi yapay zekası tarafından kullanılıyor. Ayarlardan hesabı değiştirin veya yapay zekayı devre dışı bırakıp yeniden deneyin.'
ErrTerminalAIAccountInUse: 'Bu model hizmeti su anda Terminal AI tarafindan kullaniliyor. Terminal AI ayarlarinda baska bir hesaba gecin veya Terminal AI yi devre disi birakip tekrar deneyin.'
ErrFileAIAccountInUse: 'Bu model hizmeti dosya yönetimi yapay zekası tarafından kullanılıyor. Ayarlardan hesabı değiştirin veya yapay zekayı devre dışı bırakıp yeniden deneyin.'
ErrAgentAccountUnavailable: 'Hesap bağlantısı yok: {{ .err }}'
ErrAgentProviderNotSupported: 'Ajans sağlayıcısı desteklenmiyor'
ErrAgentAccountRequired: 'Önce bir ajans hesabı seçin'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI istegi basarisiz oldu: {{ .err }}'
# AI ağ geçidi
ErrAIProxyServiceNotInstalled: '{{ .name }} servisi kurulu değil'
ErrAIProxyModelAccountNotFound: 'Model hesabı {{ .id }} bulunamadı'
ErrAIProxyModelAccountNotFound: 'Model hizmeti {{ .id }} bulunamadı'
ErrAIProxyModelMapRequired: 'Bu alan zorunludur.'
ErrAIProxyModelMapInvalid: 'Model eşlemesi geçerli bir JSON nesnesi olmalıdır: {{ .err }}'
ErrAIProxyModelMapEmpty: 'Model eşlemesi boş olamaz'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: '1Panel AI Ağ Geçidi'
# Firewall
ErrDockerIptablesChainUnavailable: 'Docker DOCKER-USER zinciri bulunamadı. Docker’ı yeniden başlatıp tekrar deneyin'
@@ -816,4 +817,4 @@ ContainerImageCheckFailures: "{{ .count }} konteyner denetlenemedi; görev günl
ErrImageCheckProxyRequired: "Geçerli çalışma ortamında imaj güncellemelerini kontrol etmek için önce bir proxy sunucusu yapılandırın."
ErrPHPExtensionsConflict: "Aynı ada sahip farklı içerikli bir PHP eklenti şablonu zaten var; üzerine yazılmadı"
ErrPHPExtensionsConflict: "Bu ada sahip ancak içeriği farklı bir PHP uzantı şablonu zaten mevcut; üzerine yazılmadı"
+4 -3
View File
@@ -70,8 +70,8 @@ Decrypt: '解密'
# 智慧體
ErrAgentAccountBound: '該帳號已綁定到智能體,無法刪除,請重試。'
ErrTerminalAIAccountInUse: '該模型帳號正被終端 AI 使用,請在終端 AI 設定中更換帳號或關閉終端 AI 後再試。'
ErrFileAIAccountInUse: '該模型帳號正被檔案管理 AI 使用,請在檔案管理 AI 設定中更換帳號或關閉檔案管理 AI 後再試。'
ErrTerminalAIAccountInUse: '該模型服務正被終端 AI 使用,請在終端 AI 設定中更換帳號或關閉終端 AI 後再試。'
ErrFileAIAccountInUse: '該模型服務正被檔案管理 AI 使用,請在檔案管理 AI 設定中更換帳號或關閉檔案管理 AI 後再試。'
ErrAgentAccountUnavailable: '帳號連線資訊不可用,錯誤:{{ .err }},請重試'
ErrAgentProviderNotSupported: '暫不支援該智能體提供商,請重試'
ErrAgentAccountRequired: '請選擇智能體帳號後重試'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI 請求失敗:{{ .err }}'
# AI 閘道
ErrAIProxyServiceNotInstalled: '{{ .name }} 服務未安裝'
ErrAIProxyModelAccountNotFound: '模型帳號 {{ .id }} 不存在'
ErrAIProxyModelAccountNotFound: '模型服務 {{ .id }} 不存在'
ErrAIProxyModelMapRequired: '請填寫必填項'
ErrAIProxyModelMapInvalid: '模型映射必須是合法的 JSON 物件:{{ .err }}'
ErrAIProxyModelMapEmpty: '模型映射不能為空'
@@ -687,6 +687,7 @@ AIProviderBailian: '阿里雲百煉'
AIProviderBailianCodingPlan: '阿里雲百煉 Coding Plan'
AIProviderArk: '火山方舟'
AIProviderArkCodingPlan: '火山方舟 Coding Plan'
AIProvider1PanelGateway: '1Panel AI 閘道'
# 防火牆
ErrDockerIptablesChainUnavailable: '未偵測到 Docker 的 DOCKER-USER 鏈,請重新啟動 Docker 後再試'
+4 -3
View File
@@ -70,8 +70,8 @@ Decrypt: "解密"
# 智能体
ErrAgentAccountBound: "该账号已绑定智能体,无法删除"
ErrTerminalAIAccountInUse: "该模型账号正被终端 AI 使用,请在终端 AI 设置中更换账号或关闭终端 AI 后重试"
ErrFileAIAccountInUse: "该模型账号正被文件管理 AI 使用,请在文件管理 AI 设置中更换账号或关闭文件管理 AI 后重试"
ErrTerminalAIAccountInUse: "该模型服务正被终端 AI 使用,请在终端 AI 设置中更换账号或关闭终端 AI 后重试"
ErrFileAIAccountInUse: "该模型服务正被文件管理 AI 使用,请在文件管理 AI 设置中更换账号或关闭文件管理 AI 后重试"
ErrAgentAccountUnavailable: "账号连接信息不可用: {{ .err }}"
ErrAgentProviderNotSupported: "不支持该智能体提供商"
ErrAgentAccountRequired: "请选择智能体账号后重试"
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: "AI 请求失败:{{ .err }}"
# AI 网关
ErrAIProxyServiceNotInstalled: "{{ .name }} 服务未安装"
ErrAIProxyModelAccountNotFound: "模型账号 {{ .id }} 不存在"
ErrAIProxyModelAccountNotFound: "模型服务 {{ .id }} 不存在"
ErrAIProxyModelMapRequired: "请填写必填项"
ErrAIProxyModelMapInvalid: "模型映射必须是合法的 JSON 对象:{{ .err }}"
ErrAIProxyModelMapEmpty: "模型映射不能为空"
@@ -687,6 +687,7 @@ AIProviderBailian: "阿里云百炼"
AIProviderBailianCodingPlan: "阿里云百炼 Coding Plan"
AIProviderArk: "火山方舟"
AIProviderArkCodingPlan: "火山方舟 Coding Plan"
AIProvider1PanelGateway: '1Panel AI 网关'
# 防火墙
ErrDockerIptablesChainUnavailable: "未检测到 Docker 的 DOCKER-USER 链,请重启 Docker 后重试"
+8 -8
View File
@@ -29,13 +29,20 @@ func Parse(reader io.Reader) (Metrics, error) {
scanner.Buffer(make([]byte, 4096), 1024*1024)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if !strings.HasPrefix(line, "vllm:") {
if line == "" || strings.HasPrefix(line, "#") {
continue
}
match := re.GetRegex(re.VLLMMetricSamplePattern).FindStringSubmatch(line)
if match == nil {
return nil, fmt.Errorf("invalid vLLM metric sample")
}
value, err := strconv.ParseFloat(match[3], 64)
if err != nil {
return nil, fmt.Errorf("invalid vLLM metric value: %w", err)
}
if !strings.HasPrefix(match[1], "vllm:") {
continue
}
name := strings.TrimPrefix(match[1], "vllm:")
switch name {
case "request_prefill_time_seconds_bucket", "request_decode_time_seconds_bucket", "request_queue_time_seconds_bucket":
@@ -52,10 +59,6 @@ func Parse(reader io.Reader) (Metrics, error) {
continue
}
}
value, err := strconv.ParseFloat(match[3], 64)
if err != nil {
return nil, fmt.Errorf("invalid vLLM metric value: %w", err)
}
if math.IsNaN(value) || math.IsInf(value, 0) || value < 0 {
continue
}
@@ -73,9 +76,6 @@ func Parse(reader io.Reader) (Metrics, error) {
if err := scanner.Err(); err != nil {
return nil, err
}
if len(metrics) == 0 {
return nil, fmt.Errorf("no supported vLLM metrics")
}
return metrics, nil
}
+10 -4
View File
@@ -42,7 +42,12 @@ type Client struct {
}
type Platform struct{ OS, Architecture, Variant string }
type Target struct{ Tag, Digest, ConfigDigest string }
type Target struct {
Tag string
Digest string // Platform-specific manifest digest.
ReferenceDigest string // Tag target: an image index or a single-platform manifest.
ConfigDigest string // Image configuration digest used by the classic Docker image store.
}
func New(ctx context.Context, repository, username, password string, httpClient *http.Client) (*Client, error) {
if httpClient == nil {
@@ -151,7 +156,8 @@ func (c *Client) Resolve(ctx context.Context, tag string, platform Platform) (Ta
if err != nil {
return Target{}, false, err
}
digest := headers.Get("Docker-Content-Digest")
referenceDigest := headers.Get("Docker-Content-Digest")
digest := referenceDigest
if len(m.Manifests) > 0 {
digest = ""
for _, item := range m.Manifests {
@@ -171,7 +177,7 @@ func (c *Client) Resolve(ctx context.Context, tag string, platform Platform) (Ta
if m.Config.Digest == "" {
return Target{}, false, fmt.Errorf("unsupported Docker Hub manifest")
}
// Validate single-platform manifests too; the config digest is the Docker Image ID.
// Validate single-platform manifests too; classic Docker image IDs use the config digest.
var config struct {
OS string `json:"os"`
Architecture string `json:"architecture"`
@@ -183,7 +189,7 @@ func (c *Client) Resolve(ctx context.Context, tag string, platform Platform) (Ta
if config.OS != platform.OS || config.Architecture != platform.Architecture || (platform.Variant != "" && config.Variant != "" && config.Variant != platform.Variant) {
return Target{}, false, nil
}
return Target{Tag: tag, Digest: digest, ConfigDigest: m.Config.Digest}, true, nil
return Target{Tag: tag, Digest: digest, ReferenceDigest: referenceDigest, ConfigDigest: m.Config.Digest}, true, nil
}
var versionPattern = regexp.MustCompile(`^v?(\d+)\.(\d+)(?:\.(\d+))?(-[a-zA-Z][a-zA-Z0-9_.-]*)?$`)
+11 -11
View File
@@ -51,7 +51,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Create model account",
"summary": "Create model service",
"tags": [
"AI"
]
@@ -92,7 +92,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Count model accounts by provider",
"summary": "Count model services by provider",
"tags": [
"AI"
]
@@ -127,7 +127,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Delete model account",
"summary": "Delete model service",
"tags": [
"AI"
]
@@ -168,7 +168,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "List model account models",
"summary": "List model service models",
"tags": [
"AI"
]
@@ -203,7 +203,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Create model account model",
"summary": "Create model service model",
"tags": [
"AI"
]
@@ -238,7 +238,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Delete model account model",
"summary": "Delete model service model",
"tags": [
"AI"
]
@@ -314,7 +314,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Update model account model",
"summary": "Update model service model",
"tags": [
"AI"
]
@@ -341,7 +341,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Get model account providers",
"summary": "Get model service providers",
"tags": [
"AI"
]
@@ -379,7 +379,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Page model accounts",
"summary": "Page model services",
"tags": [
"AI"
]
@@ -414,7 +414,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Update model account",
"summary": "Update model service",
"tags": [
"AI"
]
@@ -449,7 +449,7 @@ const docTemplate = `{
"Timestamp": []
}
],
"summary": "Verify model account",
"summary": "Verify model service",
"tags": [
"AI"
]
+11 -11
View File
@@ -43,7 +43,7 @@
"Timestamp": []
}
],
"summary": "Create model account",
"summary": "Create model service",
"tags": [
"AI"
]
@@ -85,7 +85,7 @@
"Timestamp": []
}
],
"summary": "Count model accounts by provider",
"summary": "Count model services by provider",
"tags": [
"AI"
]
@@ -120,7 +120,7 @@
"Timestamp": []
}
],
"summary": "Delete model account",
"summary": "Delete model service",
"tags": [
"AI"
]
@@ -161,7 +161,7 @@
"Timestamp": []
}
],
"summary": "List model account models",
"summary": "List model service models",
"tags": [
"AI"
]
@@ -196,7 +196,7 @@
"Timestamp": []
}
],
"summary": "Create model account model",
"summary": "Create model service model",
"tags": [
"AI"
]
@@ -231,7 +231,7 @@
"Timestamp": []
}
],
"summary": "Delete model account model",
"summary": "Delete model service model",
"tags": [
"AI"
]
@@ -307,7 +307,7 @@
"Timestamp": []
}
],
"summary": "Update model account model",
"summary": "Update model service model",
"tags": [
"AI"
]
@@ -334,7 +334,7 @@
"Timestamp": []
}
],
"summary": "Get model account providers",
"summary": "Get model service providers",
"tags": [
"AI"
]
@@ -372,7 +372,7 @@
"Timestamp": []
}
],
"summary": "Page model accounts",
"summary": "Page model services",
"tags": [
"AI"
]
@@ -407,7 +407,7 @@
"Timestamp": []
}
],
"summary": "Update model account",
"summary": "Update model service",
"tags": [
"AI"
]
@@ -442,7 +442,7 @@
"Timestamp": []
}
],
"summary": "Verify model account",
"summary": "Verify model service",
"tags": [
"AI"
]
+1 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Alert information sync error, check and retry!"
ErrAIProxyUserGroupIsDefault: "Default user group cannot be deleted."
ErrAIProxyUserGroupInUse: "The user group is in use and cannot be deleted."
ErrAIProxyUserGroupExists: "The user group name already exists."
ErrAIProxyBackendAccountExists: "This model account has already been imported into the AI Gateway account pool."
ErrAIProxyBackendAccountExists: "This model service has already been imported into the AI Gateway account pool."
ErrAIProxyModelGroupInUse: "The model group is in use and cannot be deleted."
ErrAIProxyModelGroupExists: "The model group name already exists."
ErrAIProxySensitiveGroupInUse: "The sensitive word group is in use and cannot be deleted."
+1 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Error al sincronizar la información de alertas, verifique e inte
ErrAIProxyUserGroupIsDefault: "No se puede eliminar el grupo de usuarios predeterminado."
ErrAIProxyUserGroupInUse: "El grupo de usuarios está en uso y no se puede eliminar."
ErrAIProxyUserGroupExists: "El nombre del grupo de usuarios ya existe."
ErrAIProxyBackendAccountExists: "Esta cuenta de modelo ya se importó al grupo de cuentas de AI Gateway."
ErrAIProxyBackendAccountExists: "Este servicio de modelo ya se importó al grupo de cuentas de AI Gateway."
ErrAIProxyModelGroupInUse: "El grupo de modelos está en uso y no se puede eliminar."
ErrAIProxyModelGroupExists: "El nombre del grupo de modelos ya existe."
ErrAIProxySensitiveGroupInUse: "El grupo de palabras sensibles está en uso y no se puede eliminar."
+4 -4
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "خطا در همگام‌سازی اطلاعات هشدار، ب
ErrAIProxyUserGroupIsDefault: "گروه کاربری پیش‌فرض قابل حذف نیست."
ErrAIProxyUserGroupInUse: "گروه کاربری در حال استفاده است و قابل حذف نیست."
ErrAIProxyUserGroupExists: "نام گروه کاربری از قبل وجود دارد."
ErrAIProxyBackendAccountExists: "این حساب مدل قبلاً به مجموعه حساب‌های دروازه AI وارد شده است."
ErrAIProxyBackendAccountExists: "این سرویس مدل قبلاً به مجموعه حساب‌های دروازه AI وارد شده است."
ErrAIProxyModelGroupInUse: "گروه مدل در حال استفاده است و قابل حذف نیست."
ErrAIProxyModelGroupExists: "نام گروه مدل از قبل وجود دارد."
ErrAIProxySensitiveGroupInUse: "گروه کلمات حساس در حال استفاده است و قابل حذف نیست."
@@ -588,9 +588,9 @@ MCPInstallLocalImage: "تصویر به‌صورت محلی موجود است؛
MCPInstallVerifyImage: "اعتبارسنجی نسخه تصویر و قرارداد سرویس مدیریت‌شده"
MCPInstallVerifiedImage: "اعتبارسنجی تصویر موفق بود"
PHPExtensionsNoTargets: "پس از حذف گره مبدأ از فهرست، هیچ گره مقصدی باقی نمانده است"
PHPExtensionsSyncTask: "همگام‌سازی الگوی افزونه‌های PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "گره [{{ .node }}] از قبل الگوی یکسانی دارد؛ رد شد"
PHPExtensionsNoTargets: "پس از کنار گذاشتن گره مبدأ، هیچ گره مقصدی باقی نمانده است"
PHPExtensionsSyncTask: "همگام‌سازی قالب افزونه PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "گره [{{ .node }}] از قبل قالب یکسانی دارد؛ نادیده گرفته شد"
MCPInstallCleanup: "پاک‌سازی کانتینر قبلی"
MCPInstallOldContainerRemoved: "کانتینر قبلی حذف شد"
MCPInstallOldImageRemoved: "ایمیج قبلی حذف شد"
+4 -4
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "アラート情報の同期エラーです。後で再試行し
ErrAIProxyUserGroupIsDefault: "デフォルトユーザーグループは削除できません"
ErrAIProxyUserGroupInUse: "ユーザーグループは使用中のため、削除できません。"
ErrAIProxyUserGroupExists: "ユーザーグループ名は既に存在します。"
ErrAIProxyBackendAccountExists: "このモデルアカウントは既に AI ゲートウェイのアカウントプールにインポートされています。"
ErrAIProxyBackendAccountExists: "このモデルサービスは既に AI ゲートウェイのアカウントプールにインポートされています。"
ErrAIProxyModelGroupInUse: "モデルグループは使用中のため、削除できません。"
ErrAIProxyModelGroupExists: "モデルグループ名は既に存在します。"
ErrAIProxySensitiveGroupInUse: "センシティブワードグループは使用中のため削除できません。"
@@ -588,9 +588,9 @@ MCPInstallLocalImage: "ローカルにイメージが存在するため、ダウ
MCPInstallVerifyImage: "イメージのバージョンと管理対象サービスの契約を検証"
MCPInstallVerifiedImage: "イメージの検証に成功しました"
PHPExtensionsNoTargets: "ソースノードを除外した結果、同期先ノードがありません"
PHPExtensionsSyncTask: "PHP 拡張テンプレート [{{ .name }}] を同期"
PHPExtensionsSyncSkipped: "ノード [{{ .node }}] に同一のテンプレートが存在するため、スキップしました"
PHPExtensionsNoTargets: "ソースノードを除外すると、ターゲットノードが残りません"
PHPExtensionsSyncTask: "PHP 拡張機能テンプレート [{{ .name }}] を同期"
PHPExtensionsSyncSkipped: "ノード [{{ .node }}] には同一のテンプレートが既に存在するため、スキップしました"
MCPInstallCleanup: "以前のコンテナーをクリーンアップ"
MCPInstallOldContainerRemoved: "以前のコンテナーを削除しました"
MCPInstallOldImageRemoved: "以前のイメージを削除しました"
+2 -2
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "경고 정보 동기화 오류, 다시 확인하고 시도해 주
ErrAIProxyUserGroupIsDefault: "기본 사용자 그룹은 삭제할 수 없습니다"
ErrAIProxyUserGroupInUse: "사용자 그룹이 사용 중이므로 삭제할 수 없습니다."
ErrAIProxyUserGroupExists: "사용자 그룹 이름이 이미 존재합니다."
ErrAIProxyBackendAccountExists: "이 모델 계정은 이미 AI 게이트웨이 계정 풀에 가져왔습니다."
ErrAIProxyBackendAccountExists: "이 모델 서비스는 이미 AI 게이트웨이 계정 풀에 가져왔습니다."
ErrAIProxyModelGroupInUse: "모델 그룹이 사용 중이므로 삭제할 수 없습니다."
ErrAIProxyModelGroupExists: "모델 그룹 이름이 이미 존재합니다."
ErrAIProxySensitiveGroupInUse: "민감 단어 그룹이 사용 중이므로 삭제할 수 없습니다."
@@ -588,7 +588,7 @@ MCPInstallLocalImage: "로컬 이미지가 있어 다운로드를 건너뜁니
MCPInstallVerifyImage: "이미지 버전 및 관리형 서비스 계약 검증"
MCPInstallVerifiedImage: "이미지 검증 통과"
PHPExtensionsNoTargets: "소스 노드를 제외하면 동기화할 대상 노드가 없습니다"
PHPExtensionsNoTargets: "원본 노드를 제외하면 대상 노드가 남지 않습니다"
PHPExtensionsSyncTask: "PHP 확장 템플릿 [{{ .name }}] 동기화"
PHPExtensionsSyncSkipped: "노드 [{{ .node }}]에 동일한 템플릿이 이미 있어 건너뛰었습니다"
MCPInstallCleanup: "이전 컨테이너 정리"
+4 -4
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "ການຊິງຂໍ້ມູນແຈ້ງເຕືອນ
ErrAIProxyUserGroupIsDefault: "ບໍ່ສາມາດລຶບກຸ່ມຜູ້ໃຊ້ເລີ່ມຕົ້ນໄດ້."
ErrAIProxyUserGroupInUse: "ກຸ່ມຜູ້ໃຊ້ກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້."
ErrAIProxyUserGroupExists: "ມີຊື່ກຸ່ມຜູ້ໃຊ້ນີ້ຢູ່ແລ້ວ."
ErrAIProxyBackendAccountExists: "ບັນຊີໂມເດວນີ້ຖືກນຳເຂົ້າໃນພູນບັນຊີ AI Gateway ແລ້ວ."
ErrAIProxyBackendAccountExists: "ບໍລິການໂມເດວນີ້ຖືກນຳເຂົ້າໃນພູນບັນຊີ AI Gateway ແລ້ວ."
ErrAIProxyModelGroupInUse: "ກຸ່ມໂມເດວກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້."
ErrAIProxyModelGroupExists: "ມີຊື່ກຸ່ມໂມເດວນີ້ຢູ່ແລ້ວ."
ErrAIProxySensitiveGroupInUse: "ກຸ່ມຄຳທີ່ລະອຽດອ່ອນກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້."
@@ -588,9 +588,9 @@ MCPInstallLocalImage: "ມີອິມເມດຢູ່ໃນເຄື່ອງ
MCPInstallVerifyImage: "ກວດສອບເວີຊັນອິມເມດ ແລະ ສັນຍາບໍລິການທີ່ຈັດການ"
MCPInstallVerifiedImage: "ກວດສອບອິມເມດຜ່ານແລ້ວ"
PHPExtensionsNoTargets: "ບໍ່ມີໂນດປາຍທາງຫຼັງຈາກຍົກເວັ້ນໂນດຕົ້ນທາງ"
PHPExtensionsSyncTask: "ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "ໂນດ [{{ .node }}] ມີແມ່ແບບດຽວກັນຢູ່ແລ້ວ; ຂ້າມແລ້ວ"
PHPExtensionsNoTargets: "ບໍ່ມີໂນດປາຍທາງເຫຼືອຫຼັງຈາກຍົກເວັ້ນໂນດຕົ້ນທາງ"
PHPExtensionsSyncTask: "ຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "ໂນດ [{{ .node }}] ມີແມ່ແບບທີ່ຄືກັນແລ້ວ; ຂ້າມ"
MCPInstallCleanup: "ກຳລັງລ້າງຄອນເທນເນີເກົ່າ"
MCPInstallOldContainerRemoved: "ລຶບຄອນເທນເນີເກົ່າແລ້ວ"
MCPInstallOldImageRemoved: "ລຶບອິມເມຈເກົ່າແລ້ວ"
+2 -2
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Ralat penyinkronan maklumat amaran, sila semak dan cuba lagi"
ErrAIProxyUserGroupIsDefault: "Kumpulan pengguna lalai tidak boleh dipadam."
ErrAIProxyUserGroupInUse: "Kumpulan pengguna sedang digunakan dan tidak boleh dipadam."
ErrAIProxyUserGroupExists: "Nama kumpulan pengguna sudah wujud."
ErrAIProxyBackendAccountExists: "Akaun model ini telah diimport ke dalam kolam akaun AI Gateway."
ErrAIProxyBackendAccountExists: "Perkhidmatan model ini telah diimport ke dalam kolam akaun AI Gateway."
ErrAIProxyModelGroupInUse: "Kumpulan model sedang digunakan dan tidak boleh dipadam."
ErrAIProxyModelGroupExists: "Nama kumpulan model sudah wujud."
ErrAIProxySensitiveGroupInUse: "Kumpulan kata sensitif sedang digunakan dan tidak boleh dipadam."
@@ -588,7 +588,7 @@ MCPInstallLocalImage: "Imej sudah tersedia secara setempat; langkau muat turun"
MCPInstallVerifyImage: "Sahkan versi imej dan kontrak perkhidmatan terurus"
MCPInstallVerifiedImage: "Pengesahan imej berjaya"
PHPExtensionsNoTargets: "Tiada nod sasaran selepas nod sumber dikecualikan"
PHPExtensionsNoTargets: "Tiada nod sasaran yang tinggal selepas mengecualikan nod sumber"
PHPExtensionsSyncTask: "Segerakkan templat sambungan PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "Nod [{{ .node }}] sudah mempunyai templat yang sama; dilangkau"
MCPInstallCleanup: "Bersihkan bekas terdahulu"
+2 -2
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Erro na sincronização das informações de alerta, verifique e
ErrAIProxyUserGroupIsDefault: "O grupo de usuários padrão não pode ser excluído."
ErrAIProxyUserGroupInUse: "O grupo de usuários está em uso e não pode ser excluído."
ErrAIProxyUserGroupExists: "O nome do grupo de usuários já existe."
ErrAIProxyBackendAccountExists: "Esta conta de modelo já foi importada para o pool de contas do AI Gateway."
ErrAIProxyBackendAccountExists: "Este serviço de modelo já foi importado para o pool de contas do AI Gateway."
ErrAIProxyModelGroupInUse: "O grupo de modelos está em uso e não pode ser excluído."
ErrAIProxyModelGroupExists: "O nome do grupo de modelos já existe."
ErrAIProxySensitiveGroupInUse: "O grupo de palavras sensíveis está em uso e não pode ser excluído."
@@ -588,7 +588,7 @@ MCPInstallLocalImage: "A imagem já existe localmente; ignorar o download"
MCPInstallVerifyImage: "Validar a versão da imagem e o contrato do serviço gerenciado"
MCPInstallVerifiedImage: "A imagem passou na validação"
PHPExtensionsNoTargets: "Não há nós de destino após excluir o nó de origem"
PHPExtensionsNoTargets: "Não restam nós de destino após excluir o nó de origem"
PHPExtensionsSyncTask: "Sincronizar modelo de extensões PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "O nó [{{ .node }}] já possui um modelo idêntico; ignorado"
MCPInstallCleanup: "Limpar o contêiner anterior"
+1 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Ошибка синхронизации информации об
ErrAIProxyUserGroupIsDefault: "Группу пользователей по умолчанию нельзя удалить."
ErrAIProxyUserGroupInUse: "Группа пользователей используется и не может быть удалена."
ErrAIProxyUserGroupExists: "Имя группы пользователей уже существует."
ErrAIProxyBackendAccountExists: "Эта учетная запись модели уже импортирована в пул аккаунтов AI Gateway."
ErrAIProxyBackendAccountExists: "Этот сервис модели уже импортирован в пул аккаунтов AI Gateway."
ErrAIProxyModelGroupInUse: "Группа моделей используется и не может быть удалена."
ErrAIProxyModelGroupExists: "Имя группы моделей уже существует."
ErrAIProxySensitiveGroupInUse: "Группа чувствительных слов используется и не может быть удалена."
+3 -3
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Uyarı bilgisi senkronizasyon hatası, lütfen kontrol edip tekra
ErrAIProxyUserGroupIsDefault: "Varsayılan kullanıcı grubu silinemez."
ErrAIProxyUserGroupInUse: "Kullanıcı grubu kullanımda ve silinemez."
ErrAIProxyUserGroupExists: "Kullanıcı grubu adı zaten mevcut."
ErrAIProxyBackendAccountExists: "Bu model hesabı AI Gateway hesap havuzuna zaten aktarılmış."
ErrAIProxyBackendAccountExists: "Bu model hizmeti AI Gateway hesap havuzuna zaten aktarılmış."
ErrAIProxyModelGroupInUse: "Model grubu kullanımda ve silinemez."
ErrAIProxyModelGroupExists: "Model grubu adı zaten mevcut."
ErrAIProxySensitiveGroupInUse: "Hassas kelime grubu kullanımda ve silinemez."
@@ -589,8 +589,8 @@ MCPInstallVerifyImage: "İmaj sürümünü ve yönetilen hizmet sözleşmesini d
MCPInstallVerifiedImage: "İmaj doğrulaması başarılı"
PHPExtensionsNoTargets: "Kaynak düğüm hariç tutulduktan sonra hedef düğüm kalmadı"
PHPExtensionsSyncTask: "PHP eklenti şablonunu eşitle [{{ .name }}]"
PHPExtensionsSyncSkipped: "[{{ .node }}] düğümünde aynı şablon zaten var; atlandı"
PHPExtensionsSyncTask: "PHP uzantı şablonunu eşitle [{{ .name }}]"
PHPExtensionsSyncSkipped: "[{{ .node }}] düğümünde aynı şablon zaten mevcut; atlandı"
MCPInstallCleanup: "Önceki konteyneri temizle"
MCPInstallOldContainerRemoved: "Önceki konteyner silindi"
MCPInstallOldImageRemoved: "Önceki imaj silindi"
+1 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "告警資訊同步錯誤,請檢查後重試。"
ErrAIProxyUserGroupIsDefault: "預設使用者群組無法刪除"
ErrAIProxyUserGroupInUse: "使用者群組正被使用,無法刪除。"
ErrAIProxyUserGroupExists: "使用者群組名稱已存在"
ErrAIProxyBackendAccountExists: "該模型帳號已匯入 AI 閘道帳號池,請勿重複匯入"
ErrAIProxyBackendAccountExists: "該模型服務已匯入 AI 閘道帳號池,請勿重複匯入"
ErrAIProxyModelGroupInUse: "模型組正在使用,無法刪除"
ErrAIProxyModelGroupExists: "模型組名稱已存在"
ErrAIProxySensitiveGroupInUse: "敏感詞分組正在使用,無法刪除。"
+1 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "告警信息同步错误,请检查后重试!"
ErrAIProxyUserGroupIsDefault: "默认用户组无法删除"
ErrAIProxyUserGroupInUse: "用户组正被使用,无法删除"
ErrAIProxyUserGroupExists: "用户组名称已存在"
ErrAIProxyBackendAccountExists: "该模型账号已导入 AI 网关账号池,请勿重复导入"
ErrAIProxyBackendAccountExists: "该模型服务已导入 AI 网关账号池,请勿重复导入"
ErrAIProxyModelGroupInUse: "模型组正在使用,无法删除"
ErrAIProxyModelGroupExists: "模型组名称已存在"
ErrAIProxySensitiveGroupInUse: "敏感词分组正在使用,无法删除"
+2
View File
@@ -100,6 +100,7 @@ func LoadMenus() string {
Children: []dto.ShowMenu{
{ID: "48", Disabled: false, Title: "aiTools.model.ollamaManagement", IsShow: true, Label: "OllamaModels", Path: "/ai/model/local/ollama", Sort: 25},
{ID: "41", Disabled: false, Title: "aiTools.model.vllmManagement", IsShow: true, Label: "AIModel", Path: "/ai/model/files", Sort: 50},
{ID: "49", Disabled: false, Title: "aiTools.model.services", IsShow: true, Label: "ModelServices", Path: "/ai/model/account", Sort: 75},
{ID: "44", Disabled: false, Title: "aiTools.agents.agent", IsShow: true, Label: "Agents", Path: "/ai/agents/agent", Sort: 100},
{ID: "42", Disabled: false, Title: "menu.mcp", IsShow: true, Label: "MCPServer", Path: "/ai/mcp", Sort: 200},
{ID: "43", Disabled: false, Title: "aiTools.gpu.gpu", IsShow: true, Label: "GPU", Path: "/ai/gpu", Sort: 300},
@@ -207,6 +208,7 @@ func MenuSort() []dto.MenuLabelSort {
{Label: "AI-Menu", Sort: 300},
{Label: "OllamaModels", Sort: 25},
{Label: "AIModel", Sort: 50},
{Label: "ModelServices", Sort: 75},
{Label: "Agents", Sort: 100},
{Label: "AIProxyManagement", Sort: 150},
{Label: "SkillsHub", Sort: 175},
+1
View File
@@ -75,5 +75,6 @@ func coreMigrations() []*gormigrate.Migration {
migrations.AddAPIKeyDeletedAt,
migrations.MoveVirtualMachineMenuToTopLevel,
migrations.UpdateAiModelManagementMenus,
migrations.AddModelServicesMenu,
}
}
+28
View File
@@ -1446,6 +1446,34 @@ var UpdateAiModelManagementMenus = &gormigrate.Migration{
},
}
var AddModelServicesMenu = &gormigrate.Migration{
ID: "20261104-add-model-services-menu",
Migrate: func(tx *gorm.DB) error {
return helper.UpdateHideMenu(tx, func(menus []dto.ShowMenu) []dto.ShowMenu {
for i := range menus {
if menus[i].Label != "AI-Menu" {
continue
}
isShow := true
for _, child := range menus[i].Children {
if child.Label == "ModelServices" {
return menus
}
if child.Label == "AIModel" {
isShow = child.IsShow
}
}
menus[i].Children = helper.UpsertMenuByLabel(menus[i].Children, dto.ShowMenu{
ID: "49", Title: "aiTools.model.services", IsShow: isShow,
Label: "ModelServices", Path: "/ai/model/account", Sort: 75,
}, "AIModel")
break
}
return menus
})
},
}
var UpdateFirewallMenuPath = &gormigrate.Migration{
ID: "20260819-update-firewall-menu-path",
Migrate: func(tx *gorm.DB) error {
+15 -13
View File
@@ -804,7 +804,7 @@ const message = {
nativeAgentAccessUnavailable:
'The existing installation has no compatible HTTPS access address or port. Check its application settings.',
agent: 'Agent',
account: 'Model Account',
account: 'Model Service',
batchOperation: 'Batch Operation',
operationType: 'Operation Type',
batchAction: 'Batch {0}',
@@ -818,10 +818,10 @@ const message = {
skillSource: 'Skill Source',
skillKeyword: 'Skill Keyword',
clawHubSkillPlaceholder: 'Search and select a Skill first',
noAccountHint: 'Choose an existing model account or add a new one.',
accountCount: '{0} model accounts',
noAccountHint: 'Choose an existing model service or add a new one.',
accountCount: '{0} model services',
syncAgents: 'Sync related agents',
syncAgentsHelper: 'Update openclaw.json for agents using this model account',
syncAgentsHelper: 'Update openclaw.json for agents using this model service',
appVersion: 'App Version',
webuiPort: 'WebUI Port',
tokenOrAuth: 'Token/Auth',
@@ -862,7 +862,7 @@ const message = {
useModelDefault: 'Use model default',
reasoning: 'Reasoning Model',
verified: 'Verified',
verifySkipped: 'No verification',
verifySkipped: 'No verification required',
skillsTab: 'Skills',
pluginsTab: 'Plugins',
pluginsInstalled: 'Installed',
@@ -1214,9 +1214,9 @@ const message = {
notInstalled: 'Not installed',
usage: 'Usage',
accountPool: 'Account Pool',
importModelAccount: 'Import Model Account',
editModelAccount: 'Edit Model Account',
selectModelAccount: 'Select an existing model account',
importModelAccount: 'Import Model Service',
editModelAccount: 'Edit Model Service',
selectModelAccount: 'Select an existing model service',
upstreamApiAddress: 'Upstream API Address',
priority: 'Priority',
healthStatus: 'Health',
@@ -1273,8 +1273,8 @@ const message = {
waitingQueue: 'Current Waiting Queue',
currentActiveUsers: 'Current Active Users',
activeStreamingRequests: 'Active Streaming Requests',
modelAccountConcurrency: 'Model Account Concurrency',
accountAvailability: 'Model Account Availability',
modelAccountConcurrency: 'Model Service Concurrency',
accountAvailability: 'Model Service Availability',
capacityFull: 'At Capacity',
groupConcurrency: 'User Group Concurrency',
apiKeyConcurrency: 'API Key Concurrency',
@@ -1329,7 +1329,7 @@ const message = {
esLogCircuitUntil: 'ES Circuit Until',
serviceOperateConfirm: 'Confirm to {0} the AI Gateway service?',
deleteTargetConfirm: 'Delete {0} {1}?',
deleteBackendTitle: 'Delete Model Account',
deleteBackendTitle: 'Delete Model Service',
userFallback: 'Deleted user (ID: {0})',
requestModel: 'Request Model',
upstreamModel: 'Upstream Model',
@@ -1342,7 +1342,7 @@ const message = {
usageTrend: 'Usage Trend',
distributionBy: '{0} Distribution',
unmatched: 'Unmatched',
modelAccount: 'Model Account',
modelAccount: 'Model Service',
serviceProvider: 'Provider',
tokenUsage: 'Token Usage',
percent: 'Percent',
@@ -1689,6 +1689,8 @@ const message = {
timeToFirstToken: 'Mean time to first token',
timePerOutputToken: 'Mean inter-token latency',
requestLatency: 'Mean request latency',
noMetrics:
'The metrics endpoint is reachable, but no supported vLLM metrics are available yet. Some metrics may appear only after the first inference request.',
unavailable: 'Metrics are unavailable. Check that the instance is running and /metrics is accessible.',
loadFailed: 'Failed to load monitoring data. Please retry.',
helper: 'Manage collection, interval and retention in monitoring settings.',
@@ -2825,7 +2827,7 @@ const message = {
scrollSensitivity: 'Scroll Sensitivity',
aiAssistant: 'AI Assistant',
aiAccountHelper:
'Use the selected model account to generate and fill commands. For local models like Ollama and vLLM, use a custom model account.',
'Use the selected model service to generate and fill commands. For local models like Ollama and vLLM, use a custom model service.',
aiPrefix: 'Trigger Prefix',
aiPrefixHelper:
'Enter "prefix + space" and press Enter to trigger AI command generation, for example: {0} help me check disk usage.',
+39 -37
View File
@@ -807,7 +807,7 @@ const message = {
nativeAgentAccessUnavailable:
'La instalación existente no tiene una dirección o puerto HTTPS compatible. Revise la configuración de la aplicación.',
agent: 'Agente',
account: 'Cuenta de modelo',
account: 'Servicio de modelo',
batchOperation: 'Operación por lotes',
operationType: 'Tipo de operación',
batchAction: '{0} por lotes',
@@ -821,10 +821,10 @@ const message = {
skillSource: 'Origen de Skill',
skillKeyword: 'Palabra clave de Skill',
clawHubSkillPlaceholder: 'Busque y seleccione una Skill primero',
noAccountHint: 'Selecciona una cuenta de modelo existente o agrega una nueva.',
accountCount: '{0} cuentas de modelo',
noAccountHint: 'Selecciona un servicio de modelo existente o agrega uno nuevo.',
accountCount: '{0} servicios de modelo',
syncAgents: 'Sincronizar agentes vinculados',
syncAgentsHelper: 'Actualiza openclaw.json para los agentes que usan esta cuenta de modelo',
syncAgentsHelper: 'Actualiza openclaw.json para los agentes que usan este servicio de modelo',
appVersion: 'Versión de la app',
webuiPort: 'Puerto WebUI',
tokenOrAuth: 'Token/Autenticación',
@@ -867,7 +867,7 @@ const message = {
useModelDefault: 'Usar valor predeterminado del modelo',
reasoning: 'Modelo de razonamiento',
verified: 'Verificado',
verifySkipped: 'Sin verificación',
verifySkipped: 'No requiere verificación',
skillsTab: 'Habilidades',
pluginsTab: 'Complementos',
pluginsInstalled: 'Instalados',
@@ -1218,9 +1218,9 @@ const message = {
notInstalled: 'No instalado',
usage: 'Uso',
accountPool: 'Grupo de cuentas',
importModelAccount: 'Importar cuenta de modelo',
editModelAccount: 'Editar cuenta de modelo',
selectModelAccount: 'Seleccionar una cuenta de modelo existente',
importModelAccount: 'Importar servicio de modelo',
editModelAccount: 'Editar servicio de modelo',
selectModelAccount: 'Seleccionar un servicio de modelo existente',
upstreamApiAddress: 'Dirección de API ascendente',
priority: 'Prioridad',
healthStatus: 'Estado de salud',
@@ -1277,8 +1277,8 @@ const message = {
waitingQueue: 'Cola de espera actual',
currentActiveUsers: 'Usuarios activos actuales',
activeStreamingRequests: 'Solicitudes de streaming activas',
modelAccountConcurrency: 'Concurrencia de cuentas de modelo',
accountAvailability: 'Disponibilidad de cuentas de modelo',
modelAccountConcurrency: 'Concurrencia de servicios de modelo',
accountAvailability: 'Disponibilidad de servicios de modelo',
capacityFull: 'Capacidad completa',
groupConcurrency: 'Concurrencia de grupos de usuarios',
apiKeyConcurrency: 'Concurrencia de API Keys',
@@ -1334,7 +1334,7 @@ const message = {
esLogCircuitUntil: 'Circuito ES hasta',
serviceOperateConfirm: '¿Confirmar {0} el servicio de gateway de IA?',
deleteTargetConfirm: '¿Eliminar {0} {1}?',
deleteBackendTitle: 'Eliminar cuenta de modelo',
deleteBackendTitle: 'Eliminar servicio de modelo',
userFallback: 'Usuario eliminado (ID: {0})',
requestModel: 'Modelo solicitado',
upstreamModel: 'Modelo upstream',
@@ -1347,7 +1347,7 @@ const message = {
usageTrend: 'Tendencia de uso',
distributionBy: 'Distribución por {0}',
unmatched: 'Sin coincidencia',
modelAccount: 'Cuenta de modelo',
modelAccount: 'Servicio de modelo',
serviceProvider: 'Proveedor',
tokenUsage: 'Uso de tokens',
percent: 'Porcentaje',
@@ -1699,6 +1699,8 @@ const message = {
timeToFirstToken: 'Latencia media del primer token',
timePerOutputToken: 'Latencia media entre tokens',
requestLatency: 'Latencia media de solicitud',
noMetrics:
'El endpoint de métricas es accesible, pero aún no hay métricas de vLLM compatibles. Algunas pueden aparecer solo después de la primera solicitud de inferencia.',
unavailable:
'Métricas no disponibles. Compruebe que la instancia esté en ejecución y que /metrics sea accesible.',
loadFailed: 'No se pudieron cargar los datos. Inténtelo de nuevo.',
@@ -2878,7 +2880,7 @@ const message = {
scrollSensitivity: 'Sensibilidad de scroll',
aiAssistant: 'Asistente de IA',
aiAccountHelper:
'Use la cuenta de modelo seleccionada para generar y rellenar comandos. Para modelos locales como Ollama y vLLM, use una cuenta de modelo personalizada.',
'Use el servicio de modelo seleccionado para generar y rellenar comandos. Para modelos locales como Ollama y vLLM, use un servicio de modelo personalizado.',
aiPrefix: 'Prefijo de activación',
aiPrefixHelper:
'Introduzca "prefijo + espacio" y pulse Enter para activar la generación de comandos por IA; por ejemplo: {0} ayúdame a consultar la información del disco.',
@@ -3123,7 +3125,7 @@ const message = {
aiSearchHint:
'Busca el contenido del archivo línea por línea. Usa los botones a la derecha de la fila de búsqueda y las "Condiciones avanzadas" debajo. Cuando la cuenta de IA esté activada y guardada, también se podrá generar un resumen en Markdown.',
aiSearchAccountTitle: 'Cuenta de IA',
aiSearchAccountIntro: 'Elige una cuenta de modelo grande para generar resúmenes y guarda los cambios.',
aiSearchAccountIntro: 'Elige un servicio de modelo grande para generar resúmenes y guarda los cambios.',
aiSearchAccountEnable: 'Activar búsqueda de IA en archivos',
aiSearchSaveAccount: 'Guardar configuración de la cuenta',
aiSearchSectionQuery: 'Búsqueda',
@@ -4087,13 +4089,13 @@ const message = {
nodeDashboard:
'Actualizar a la edición comercial permite la gestión centralizada de aplicaciones, sitios web, bases de datos y tareas programadas multinodo.',
imageExchange:
'Actualice a la edición comercial para transferir imágenes de contenedores entre nodos por lotes.',
'Actualiza a la Edición Comercial para transferir imágenes de contenedores por lotes entre nodos.',
appExchange:
'Actualice a la edición comercial para migrar aplicaciones instaladas a nodos de destino y confirmar sus recursos dependientes.',
'Actualiza a la Edición Comercial para migrar aplicaciones instaladas a nodos de destino y confirmar sus dependencias de recursos.',
sslSync:
'Actualice a la edición comercial para sincronizar certificados del nodo de origen con uno o varios nodos de destino.',
'Actualiza a la Edición Comercial para sincronizar certificados de un nodo de origen con uno o varios nodos de destino.',
phpExtensionsSync:
'Actualice a la edición comercial para sincronizar plantillas de extensiones PHP con uno o varios nodos de destino.',
'Actualiza a la Edición Comercial para sincronizar plantillas de extensiones PHP con uno o varios nodos de destino.',
fileExchange: 'La edición comercial permite transferir archivos entre varios servidores.',
app: 'La edición comercial permite ver información de servicio, monitoreo, etc. vía app móvil.',
cluster:
@@ -7159,39 +7161,39 @@ const message = {
nodeContent4: 'Conecta directamente a la terminal remota de un nodo con un clic',
imageExchangeTitle1: 'Seleccionar imágenes de origen',
imageExchangeContent1:
'Consulte las imágenes de contenedores del nodo de origen y seleccione las que desea transferir.',
imageExchangeTitle2: 'Distribuir imágenes por lotes',
imageExchangeContent2: 'Transfiera las imágenes seleccionadas a uno o varios nodos de destino.',
imageExchangeTitle3: 'Consultar registros de transferencia',
'Consulta las imágenes de contenedores del nodo de origen y selecciona las que quieras transferir.',
imageExchangeTitle2: 'Distribuir imágenes',
imageExchangeContent2: 'Transfiere las imágenes seleccionadas a uno o varios nodos de destino.',
imageExchangeTitle3: 'Ver registros de transferencia',
imageExchangeContent3:
'Consulte el progreso y los resultados de la transferencia de imágenes en los registros de tareas.',
'Consulta el progreso y los resultados de la transferencia de imágenes en los registros de tareas.',
appExchangeTitle1: 'Seleccionar una aplicación',
appExchangeContent1:
'Consulte las aplicaciones instaladas en el nodo de origen y seleccione la que desea migrar.',
'Consulta las aplicaciones instaladas en el nodo de origen y selecciona una para migrarla.',
appExchangeTitle2: 'Confirmar dependencias',
appExchangeContent2:
'Confirme los nodos de destino y los recursos necesarios, como bases de datos, antes de la migración.',
'Antes de migrar, confirma los nodos de destino y los recursos necesarios, como las bases de datos.',
appExchangeTitle3: 'Migrar aplicaciones',
appExchangeContent3:
'Transfiera copias de seguridad de aplicaciones a los nodos de destino para restaurarlas y consulte los resultados en los registros de tareas.',
'Transfiere las copias de seguridad de las aplicaciones a los nodos de destino para restaurarlas y consulta los resultados en los registros de tareas.',
sslSyncTitle1: 'Seleccionar certificados',
sslSyncContent1:
'Consulte los detalles de los certificados del nodo de origen y seleccione los que desea sincronizar.',
sslSyncTitle2: 'Sincronizar certificados entre nodos',
'Consulta los detalles de los certificados del nodo de origen y selecciona los que quieras sincronizar.',
sslSyncTitle2: 'Sincronizar entre nodos',
sslSyncContent2:
'Sincronice los certificados seleccionados con los nodos de destino, excluyendo automáticamente el nodo de origen.',
'Sincroniza los certificados seleccionados con los nodos de destino, excluyendo automáticamente el nodo de origen.',
sslSyncTitle3: 'Confirmar tareas de sincronización',
sslSyncContent3:
'Revise los nodos de destino y los certificados antes de ejecutar la tarea y consulte los resultados en sus registros.',
'Revisa los nodos de destino y los certificados antes de ejecutar la tarea y consulta los resultados en los registros de tareas.',
phpExtensionsSyncTitle1: 'Seleccionar una plantilla',
phpExtensionsSyncContent1:
'Consulte los nombres de las plantillas y sus extensiones en el nodo de origen y seleccione la plantilla que desea sincronizar.',
phpExtensionsSyncTitle2: 'Sincronizar plantillas entre nodos',
'Consulta los nombres de las plantillas y sus listas de extensiones en el nodo de origen y selecciona una plantilla para sincronizarla.',
phpExtensionsSyncTitle2: 'Sincronizar plantillas',
phpExtensionsSyncContent2:
'Sincronice la plantilla seleccionada con los nodos de destino, excluyendo automáticamente el nodo de origen.',
'Sincroniza la plantilla seleccionada con los nodos de destino, excluyendo automáticamente el nodo de origen.',
phpExtensionsSyncTitle3: 'Comprobar plantillas existentes',
phpExtensionsSyncContent3:
'Se omiten las plantillas con el mismo nombre y contenido. Si el contenido difiere, se informa del conflicto sin sobrescribirlas.',
'Se omiten las plantillas con el mismo nombre y contenido. Si el contenido es diferente, se informa del conflicto sin sobrescribirlo.',
fileExchangeTitle1: 'Transmisión con Autenticación por Claves',
fileExchangeContent1: 'Autenticación vía claves SSH para garantizar seguridad en la transmisión.',
fileExchangeTitle2: 'Sincronización de Archivos Eficiente',
@@ -7713,11 +7715,11 @@ const message = {
phpExtensions: 'Sincronización de plantillas de extensiones PHP',
phpExtensionsTitle: 'Sincronización de plantillas de extensiones',
phpExtensionsDesc:
'Seleccione un nodo de origen para sincronizar su plantilla de extensiones PHP con los nodos de destino.',
phpExtensionsList: 'Lista de extensiones',
'Selecciona un nodo de origen para sincronizar su plantilla de extensiones PHP con los nodos de destino.',
phpExtensionsList: 'Extensiones PHP',
phpExtensionsConfirm: 'Se sincronizarán {0} plantillas de extensiones PHP con {1} nodos.',
phpExtensionsConflictHint:
'Se omiten las plantillas con el mismo nombre y contenido. Si el nombre coincide pero el contenido difiere, se informa del conflicto sin sobrescribirlas.',
'Se omiten las plantillas idénticas. Las plantillas con el mismo nombre y contenido diferente se notifican como conflictos y no se sobrescriben.',
sslBatchDesc:
'Después de seleccionar el nodo de origen, los certificados especificados pueden sincronizarse con el entorno actual del panel.',
sslBatchConfirmPrefix: 'Se sincronizarán {0} certificados a {1} nodos, creando {2} tareas.',
+45 -41
View File
@@ -798,7 +798,7 @@ const message = {
initialCredentials: 'اطلاعات ورود اولیه؛ اگر در برنامه تغییر کرده، از گذرواژه فعلی استفاده کنید.',
nativeAgentAccessUnavailable: 'نصب موجود نشانی یا درگاه HTTPS سازگار ندارد. تنظیمات برنامه را بررسی کنید.',
agent: 'عامل',
account: 'حساب مدل',
account: 'سرویس مدل',
batchOperation: 'عملیات دسته‌ای',
operationType: 'نوع عملیات',
batchAction: 'دسته‌ای {0}',
@@ -812,10 +812,10 @@ const message = {
skillSource: 'منبع مهارت',
skillKeyword: 'کلیدواژه مهارت',
clawHubSkillPlaceholder: 'ابتدا یک مهارت را جستجو و انتخاب کنید',
noAccountHint: 'یک حساب مدل موجود انتخاب کنید یا یک حساب جدید اضافه کنید.',
accountCount: '{0} حساب مدل',
noAccountHint: 'یک سرویس مدل موجود انتخاب کنید یا یک حساب جدید اضافه کنید.',
accountCount: '{0} سرویس مدل',
syncAgents: 'همگام‌سازی عامل‌های مرتبط',
syncAgentsHelper: 'به‌روزرسانی openclaw.json برای عامل‌هایی که از این حساب مدل استفاده می‌کنند',
syncAgentsHelper: 'به‌روزرسانی openclaw.json برای عامل‌هایی که از این سرویس مدل استفاده می‌کنند',
appVersion: 'نسخه برنامه',
webuiPort: 'پورت WebUI',
tokenOrAuth: 'Token/احراز هویت',
@@ -856,7 +856,7 @@ const message = {
useModelDefault: 'استفاده از پیش‌فرض مدل',
reasoning: 'مدل استدلالی',
verified: 'تأیید شده',
verifySkipped: 'بدون تأیید',
verifySkipped: 'نیازی به تأیید نیست',
skillsTab: 'مهارت‌ها',
pluginsTab: 'افزونه‌ها',
pluginsInstalled: 'نصب‌شده',
@@ -1196,9 +1196,9 @@ const message = {
notInstalled: 'نصب نشده',
usage: 'استفاده',
accountPool: 'مجموعه حساب‌ها',
importModelAccount: 'واردات حساب مدل',
editModelAccount: 'ویرایش حساب مدل',
selectModelAccount: 'یک حساب مدل موجود انتخاب کنید',
importModelAccount: 'واردات سرویس مدل',
editModelAccount: 'ویرایش سرویس مدل',
selectModelAccount: 'یک سرویس مدل موجود انتخاب کنید',
upstreamApiAddress: 'آدرس API بالادست',
priority: 'اولویت',
healthStatus: 'سلامت',
@@ -1255,8 +1255,8 @@ const message = {
waitingQueue: 'صف انتظار فعلی',
currentActiveUsers: 'کاربران فعال فعلی',
activeStreamingRequests: 'درخواست‌های جریانی فعال',
modelAccountConcurrency: 'هم‌روندی حساب مدل',
accountAvailability: 'دسترس‌پذیری حساب مدل',
modelAccountConcurrency: 'هم‌روندی سرویس مدل',
accountAvailability: 'دسترس‌پذیری سرویس مدل',
capacityFull: 'ظرفیت تکمیل',
groupConcurrency: 'هم‌روندی گروه کاربر',
apiKeyConcurrency: 'هم‌روندی API Key',
@@ -1310,7 +1310,7 @@ const message = {
esLogCircuitUntil: 'مدار ES تا',
serviceOperateConfirm: 'تأیید {0} سرویس دروازه AI؟',
deleteTargetConfirm: 'حذف {0} {1}؟',
deleteBackendTitle: 'حذف حساب مدل',
deleteBackendTitle: 'حذف سرویس مدل',
userFallback: 'کاربر حذف شده (شناسه: {0})',
requestModel: 'مدل درخواست',
upstreamModel: 'مدل بالادست',
@@ -1323,7 +1323,7 @@ const message = {
usageTrend: 'روند استفاده',
distributionBy: 'توزیع {0}',
unmatched: 'بدون تطابق',
modelAccount: 'حساب مدل',
modelAccount: 'سرویس مدل',
serviceProvider: 'ارائه‌دهنده',
tokenUsage: 'استفاده از توکن',
percent: 'درصد',
@@ -1669,6 +1669,8 @@ const message = {
timeToFirstToken: 'میانگین تأخیر توکن اول',
timePerOutputToken: 'میانگین تأخیر بین توکن‌ها',
requestLatency: 'میانگین تأخیر درخواست',
noMetrics:
'نقطه پایانی معیارها در دسترس است، اما هنوز معیار پشتیبانی‌شده‌ای از vLLM موجود نیست. برخی معیارها ممکن است تنها پس از نخستین درخواست استنتاج ظاهر شوند.',
unavailable: 'معیارها در دسترس نیستند. از اجرای نمونه و دسترسی به /metrics مطمئن شوید.',
loadFailed: 'بارگیری داده‌های پایش ناموفق بود. دوباره تلاش کنید.',
helper: 'فعال‌سازی جمع‌آوری، فاصله زمانی و مدت نگهداری را در تنظیمات پایش تغییر دهید.',
@@ -2798,7 +2800,7 @@ const message = {
scrollSensitivity: 'حساسیت اسکرول',
aiAssistant: 'دستیار هوش مصنوعی',
aiAccountHelper:
'از حساب مدل انتخاب شده برای تولید و پر کردن دستورات استفاده کنید. برای مدل‌های محلی مانند Ollama و vLLM، از یک حساب مدل سفارشی استفاده کنید.',
'از سرویس مدل انتخاب شده برای تولید و پر کردن دستورات استفاده کنید. برای مدل‌های محلی مانند Ollama و vLLM، از یک سرویس مدل سفارشی استفاده کنید.',
aiPrefix: 'پیشوند محرک',
aiPrefixHelper:
'«پیشوند + فاصله» را وارد کرده و Enter را بزنید تا تولید دستور AI فعال شود؛ برای نمونه: {0} کمک کن میزان استفاده از دیسک را بررسی کنم.',
@@ -3973,10 +3975,11 @@ const message = {
nodeApp: 'برای ارتقاء نسخه برنامه‌های چند گره بدون نیاز به جابجایی دستی بین گره‌ها به نسخه تجاری ارتقاء دهید.',
nodeDashboard:
'برای مدیریت متمرکز برنامه‌ها، وب‌سایت‌ها، پایگاه‌های داده و وظایف زمان‌بندی شده چند گره به نسخه تجاری ارتقاء دهید.',
imageExchange: 'برای انتقال گروهی تصاویر کانتینر بین گره‌ها، به نسخه تجاری ارتقا دهید.',
appExchange: 'برای انتقال برنامه‌های نصب‌شده به گره‌های مقصد و تأیید منابع وابسته، به نسخه تجاری ارتقا دهید.',
sslSync: 'برای همگام‌سازی گواهی‌های گره مبدأ با یک یا چند گره مقصد، به نسخه تجاری ارتقا دهید.',
phpExtensionsSync: 'برای همگام‌سازی الگوهای افزونه‌های PHP با یک یا چند گره مقصد، به نسخه تجاری ارتقا دهید.',
imageExchange: 'برای انتقال گروهی ایمیج‌های کانتینر بین گره‌ها به نسخه تجاری ارتقاء دهید.',
appExchange:
'برای انتقال برنامه‌های نصب‌شده به گره‌های مقصد و تأیید منابع موردنیاز آن‌ها به نسخه تجاری ارتقاء دهید.',
sslSync: 'برای همگام‌سازی گواهی‌های گره مبدأ با یک یا چند گره مقصد به نسخه تجاری ارتقاء دهید.',
phpExtensionsSync: 'برای همگام‌سازی قالب‌های افزونه PHP با یک یا چند گره مقصد به نسخه تجاری ارتقاء دهید.',
fileExchange: 'برای انتقال سریع فایل‌ها بین سرورها به نسخه تجاری ارتقاء دهید.',
app: 'برای مشاهده جزئیات سرویس، نظارت بر ناهنجاری‌ها و موارد دیگر در برنامه موبایل به نسخه تجاری ارتقاء دهید.',
cluster: 'برای مدیریت خوشه‌های اصلی-برده MySQL/Postgres/Redis به نسخه تجاری ارتقاء دهید.',
@@ -6995,37 +6998,38 @@ const message = {
nodeContent3: 'نظارت بر وضعیت عملیاتی هر گره به صورت بلادرنگ',
nodeTitle4: 'اتصال سریع از راه دور',
nodeContent4: 'اتصال مستقیم یک‌کلیکی به ترمینال‌های از راه دور گره',
imageExchangeTitle1: 'انتخاب تصاویر مبدأ',
imageExchangeContent1: 'تصاویر کانتینر در گره مبدأ را مشاهده و تصاویر موردنظر برای انتقال را انتخاب کنید.',
imageExchangeTitle2: 'توزیع گروهی تصاویر',
imageExchangeContent2: 'تصاویر انتخاب‌شده را به یک یا چند گره مقصد انتقال دهید.',
imageExchangeTitle1: 'انتخاب ایمیج‌های مبدأ',
imageExchangeContent1:
'ایمیج‌های کانتینر گره مبدأ را بررسی و ایمیج‌های موردنظر برای انتقال را انتخاب کنید.',
imageExchangeTitle2: 'توزیع ایمیج‌ها',
imageExchangeContent2: 'ایمیج‌های انتخاب‌شده را به یک یا چند گره مقصد انتقال دهید.',
imageExchangeTitle3: 'مشاهده گزارش‌های انتقال',
imageExchangeContent3: 'پیشرفت و نتایج انتقال تصاویر را در گزارش‌های وظایف مشاهده کنید.',
appExchangeTitle1: 'انتخاب برنامه مبدأ',
imageExchangeContent3: 'پیشرفت و نتایج انتقال ایمیج‌ها را در گزارش‌های وظیفه مشاهده کنید.',
appExchangeTitle1: 'انتخاب برنامه',
appExchangeContent1:
'برنامه‌های نصب‌شده در گره مبدأ را مشاهده و برنامه موردنظر برای انتقال را انتخاب کنید.',
'برنامه‌های نصب‌شده روی گره مبدأ را بررسی و برنامه موردنظر برای انتقال را انتخاب کنید.',
appExchangeTitle2: 'تأیید وابستگی‌ها',
appExchangeContent2: 'پیش از انتقال، گره‌های مقصد و منابع موردنیاز مانند پایگاه‌های داده را تأیید کنید.',
appExchangeTitle3: 'انتقال برنامه‌ها',
appExchangeContent3:
'نسخه‌های پشتیبان برنامه‌ها را برای بازیابی به گره‌های مقصد انتقال دهید و نتایج را در گزارش‌های وظایف مشاهده کنید.',
'نسخه‌های پشتیبان برنامه‌ها را برای بازیابی به گره‌های مقصد انتقال دهید و نتایج را در گزارش‌های وظیفه مشاهده کنید.',
sslSyncTitle1: 'انتخاب گواهی‌ها',
sslSyncContent1: 'اطلاعات گواهی‌های گره مبدأ را مشاهده و گواهی‌های موردنظر برای همگام‌سازی را انتخاب کنید.',
sslSyncTitle2: 'همگام‌سازی گواهی‌ها بین گره‌ها',
sslSyncContent1: 'اطلاعات گواهی‌های گره مبدأ را بررسی و گواهی‌های موردنظر برای همگام‌سازی را انتخاب کنید.',
sslSyncTitle2: 'همگام‌سازی بین گره‌ها',
sslSyncContent2:
'گواهی‌های انتخاب‌شده را با گره‌های مقصد همگام‌سازی کنید؛ گره مبدأ به‌طور خودکار از فهرست مقصدها حذف می‌شود.',
'گواهی‌های انتخاب‌شده را با گره‌های مقصد همگام کنید؛ گره مبدأ به‌طور خودکار کنار گذاشته می‌شود.',
sslSyncTitle3: 'تأیید وظایف همگام‌سازی',
sslSyncContent3:
'پیش از اجرا، گره‌های مقصد و گواهی‌ها را بررسی کنید و سپس نتایج را در گزارش‌های وظایف مشاهده کنید.',
phpExtensionsSyncTitle1: 'انتخاب الگوی افزونه‌ها',
'پیش از اجرا، گره‌های مقصد و گواهی‌ها را بررسی کنید و سپس نتایج را در گزارش‌های وظیفه مشاهده کنید.',
phpExtensionsSyncTitle1: 'انتخاب قالب',
phpExtensionsSyncContent1:
'نام الگوها و فهرست افزونه‌های گره مبدأ را مشاهده و الگوی موردنظر برای همگام‌سازی را انتخاب کنید.',
phpExtensionsSyncTitle2: 'همگام‌سازی الگوها بین گره‌ها',
'نام قالب‌ها و فهرست افزونه‌های گره مبدأ را بررسی و قالب موردنظر برای همگام‌سازی را انتخاب کنید.',
phpExtensionsSyncTitle2: 'همگام‌سازی قالب‌ها',
phpExtensionsSyncContent2:
'الگوی انتخاب‌شده را با گره‌های مقصد همگام‌سازی کنید؛ گره مبدأ به‌طور خودکار از فهرست مقصدها حذف می‌شود.',
phpExtensionsSyncTitle3: 'بررسی الگوهای هم‌نام',
'قالب انتخاب‌شده را با گره‌های مقصد همگام کنید؛ گره مبدأ به‌طور خودکار کنار گذاشته می‌شود.',
phpExtensionsSyncTitle3: 'بررسی قالب‌های موجود',
phpExtensionsSyncContent3:
'الگوهای دارای نام و محتوای یکسان رد می‌شوند. در صورت تفاوت محتوا، تعارض گزارش می‌شود و الگو بازنویسی نخواهد شد.',
'قالب‌هایی با نام و محتوای یکسان نادیده گرفته می‌شوند. اگر محتوا متفاوت باشد، تعارض بدون بازنویسی گزارش می‌شود.',
fileExchangeTitle1: 'انتقال احراز هویت کلید',
fileExchangeContent1: 'از طریق کلیدهای SSH احراز هویت کنید تا امنیت انتقال تضمین شود.',
fileExchangeTitle2: 'همگام‌سازی کارآمد فایل',
@@ -7543,13 +7547,13 @@ const message = {
imageBatchConfirmPrefix: 'در حال انتقال {0} تصویر به {1} گره، مجموعاً {2} وظیفه.',
ssl: 'همگام‌سازی گواهی',
phpExtensions: 'همگام‌سازی الگوی افزونه‌های PHP',
phpExtensionsTitle: 'همگام‌سازی الگوی افزونه‌ها',
phpExtensionsDesc: 'گره مبدأ را برای همگام‌سازی الگوی افزونه‌های PHP آن با گره‌های مقصد انتخاب کنید.',
phpExtensionsList: 'فهرست افزونه‌ها',
phpExtensionsConfirm: '{0} الگوی افزونه‌های PHP با {1} گره همگام‌سازی می‌شود.',
phpExtensions: 'همگام‌سازی قالب‌های افزونه PHP',
phpExtensionsTitle: 'همگام‌سازی قالب‌های افزونه',
phpExtensionsDesc: 'یک گره مبدأ انتخاب کنید تا قالب افزونه PHP آن با گره‌های مقصد همگام شود.',
phpExtensionsList: 'افزونه‌های PHP',
phpExtensionsConfirm: '{0} قالب افزونه PHP با {1} گره همگام می‌شود.',
phpExtensionsConflictHint:
'الگوهای دارای نام و محتوای یکسان رد می‌شوند. اگر نام یکسان اما محتوا متفاوت باشد، تعارض گزارش می‌شود و الگو بازنویسی نخواهد شد.',
'قالب‌های یکسان نادیده گرفته می‌شوند. قالب‌های هم‌نام با محتوای متفاوت به‌عنوان تعارض گزارش می‌شوند و بازنویسی نخواهند شد.',
sslBatchDesc: 'پس از انتخاب یک گره منبع، گواهی مشخص شده را به محیط پنل فعلی همگام‌سازی کنید.',
sslBatchConfirmPrefix: 'در حال همگام‌سازی {0} گواهی به {1} گره، مجموعاً {2} وظیفه.',
+44 -42
View File
@@ -803,7 +803,7 @@ const message = {
nativeAgentAccessUnavailable:
'既存のインストールに対応する HTTPS アクセス先またはポートがありません。アプリの設定を確認してください。',
agent: 'エージェント',
account: 'モデルアカウント',
account: 'モデルサービス',
batchOperation: '一括操作',
operationType: '操作タイプ',
batchAction: '一括{0}',
@@ -817,10 +817,10 @@ const message = {
skillSource: 'Skill ソース',
skillKeyword: 'Skill キーワード',
clawHubSkillPlaceholder: '先に Skill を検索して選択してください',
noAccountHint: '既存のモデルアカウントを選択するか、新規に追加してください。',
accountCount: 'モデルアカウント {0} 件',
noAccountHint: '既存のモデルサービスを選択するか、新規に追加してください。',
accountCount: 'モデルサービス {0} 件',
syncAgents: '関連エージェントを同期',
syncAgentsHelper: 'このモデルアカウントを使用するエージェントの openclaw.json を更新',
syncAgentsHelper: 'このモデルサービスを使用するエージェントの openclaw.json を更新',
appVersion: 'アプリバージョン',
webuiPort: 'WebUI ポート',
tokenOrAuth: 'Token/認証',
@@ -860,7 +860,7 @@ const message = {
useModelDefault: 'モデルの既定値を使用',
reasoning: '推論モデル',
verified: '検証済み',
verifySkipped: '検証なし',
verifySkipped: '検証不要',
skillsTab: '技能',
pluginsTab: 'プラグイン',
pluginsInstalled: 'インストール済み',
@@ -1203,9 +1203,9 @@ const message = {
notInstalled: '未インストール',
usage: '使用量',
accountPool: 'アカウントプール',
importModelAccount: 'モデルアカウントをインポート',
editModelAccount: 'モデルアカウントを編集',
selectModelAccount: '既存のモデルアカウントを選択',
importModelAccount: 'モデルサービスをインポート',
editModelAccount: 'モデルサービスを編集',
selectModelAccount: '既存のモデルサービスを選択',
upstreamApiAddress: '上流 API アドレス',
priority: '優先度',
healthStatus: 'ヘルス状態',
@@ -1261,8 +1261,8 @@ const message = {
waitingQueue: '現在の待機キュー',
currentActiveUsers: '現在のアクティブユーザー',
activeStreamingRequests: '実行中のストリーミングリクエスト',
modelAccountConcurrency: 'モデルアカウント同時実行数',
accountAvailability: 'モデルアカウント可用性',
modelAccountConcurrency: 'モデルサービス同時実行数',
accountAvailability: 'モデルサービス可用性',
capacityFull: '上限到達',
groupConcurrency: 'ユーザーグループ同時実行数',
apiKeyConcurrency: 'API Key 同時実行数',
@@ -1316,7 +1316,7 @@ const message = {
esLogCircuitUntil: 'ES サーキット終了時刻',
serviceOperateConfirm: 'AI ゲートウェイサービスを {0} しますか?',
deleteTargetConfirm: '{0} {1} を削除しますか?',
deleteBackendTitle: 'モデルアカウントを削除',
deleteBackendTitle: 'モデルサービスを削除',
userFallback: '削除済みユーザー (ID: {0})',
requestModel: 'リクエストモデル',
upstreamModel: '上流モデル',
@@ -1329,7 +1329,7 @@ const message = {
usageTrend: '使用傾向',
distributionBy: '{0}別分布',
unmatched: '未一致',
modelAccount: 'モデルアカウント',
modelAccount: 'モデルサービス',
serviceProvider: 'プロバイダー',
tokenUsage: 'Token 使用量',
percent: '割合',
@@ -1676,6 +1676,8 @@ const message = {
timeToFirstToken: '平均初回トークン遅延',
timePerOutputToken: '平均トークン間遅延',
requestLatency: '平均リクエスト遅延',
noMetrics:
'メトリクスエンドポイントにはアクセスできますが、対応する vLLM メトリクスはまだありません。一部のメトリクスは初回の推論リクエスト後に生成される場合があります。',
unavailable: '指標を取得できません。インスタンスが稼働し、/metrics にアクセスできるか確認してください。',
loadFailed: '監視データの読み込みに失敗しました。再試行してください。',
helper: '収集の有効化、間隔、保存期間は監視設定で変更できます。',
@@ -2811,7 +2813,7 @@ const message = {
scrollSensitivity: 'スクロール感度',
aiAssistant: 'AI アシスタント',
aiAccountHelper:
'選択したモデルアカウントでコマンドを生成して補完します。Ollama や vLLM などのローカルモデルはカスタムモデルアカウントを使用してください。',
'選択したモデルサービスでコマンドを生成して補完します。Ollama や vLLM などのローカルモデルはカスタムモデルサービスを使用してください。',
aiPrefix: 'トリガープレフィックス',
aiPrefixHelper:
'「プレフィックス + スペース」を入力して Enter を押すと、AI コマンド生成がトリガーされます。例: {0} ディスク情報を確認して。',
@@ -3058,7 +3060,7 @@ const message = {
aiSearchHint:
'ファイル内容を行ごとに検索します。検索行右側のボタンと下の「詳細条件」で検索方法を切り替えられます。AIアカウントを有効化して保存すると、Markdown要約も生成できます。',
aiSearchAccountTitle: 'AIアカウント',
aiSearchAccountIntro: '要約生成に使うモデルのアカウントを選択し、変更後は保存してください。',
aiSearchAccountIntro: '要約生成に使うモデルサービスを選択し、変更後は保存してください。',
aiSearchAccountEnable: 'ファイルAI検索を有効化',
aiSearchSaveAccount: 'アカウント設定を保存',
aiSearchSectionQuery: '検索',
@@ -3990,12 +3992,12 @@ const message = {
'商用版にアップグレードすると、ノードを手動で切り替えずにマルチノードアプリのバージョンを一括アップグレードできます。',
nodeDashboard:
'商用版にアップグレードすると、マルチノードのアプリ、Web サイト、データベース、スケジュールタスクを一元管理できます。',
imageExchange: '商用版にアップグレードすると、ノード間でコンテナーイメージを一括転送できます。',
imageExchange: '商用版にアップグレードすると、ノード間でコンテナイメージを一括転送できます。',
appExchange:
'商用版にアップグレードすると、インストール済みアプリをターゲットノードに移行し、必要な依存リソースを確認できます。',
'商用版にアップグレードすると、インストール済みアプリケーションを移行先ノードに移行し、必要なリソースの依存関係を確認できます。',
sslSync: '商用版にアップグレードすると、ソースノードの証明書を1つ以上のターゲットノードに同期できます。',
phpExtensionsSync:
'商用版にアップグレードすると、PHP 拡張テンプレートを1つ以上のターゲットノードに同期できます。',
'商用版にアップグレードすると、PHP 拡張機能テンプレートを1つ以上のターゲットノードに同期できます。',
fileExchange: '商用版にアップグレードすると、複数サーバー間でファイルをすばやく転送できます。',
cluster: '商用版にアップグレードすると、MySQL/Postgres/Redis のプライマリ/レプリカ構成を管理できます。',
vllm: '商用版にアップグレードすると、1Panel で vLLM サービスのデプロイ、設定、ライフサイクル操作、タスク追跡を一元管理できます。',
@@ -7030,34 +7032,34 @@ const message = {
nodeContent3: '各ノードの運用状況をリアルタイムで把握',
nodeTitle4: '迅速なリモート接続',
nodeContent4: 'ワンクリックでノードリモート端末に直接接続',
imageExchangeTitle1: 'ソースイメージの選択',
imageExchangeContent1: 'ソースノードのコンテナーイメージを確認し、転送するイメージを選択します。',
imageExchangeTitle2: 'イメージの一括配布',
imageExchangeTitle1: '転送元のイメージを選択',
imageExchangeContent1: 'ソースノードのコンテナイメージを確認し、転送するイメージを選択します。',
imageExchangeTitle2: 'イメージを配布',
imageExchangeContent2: '選択したイメージを1つ以上のターゲットノードに転送します。',
imageExchangeTitle3: '転送ログの確認',
imageExchangeContent3: 'タスクログでイメージ転送の進捗と実行結果を確認できます。',
appExchangeTitle1: 'ソースアプリの選択',
appExchangeContent1: 'ソースノードのインストール済みアプリを確認し、移行するアプリを選択します。',
appExchangeTitle2: '依存リソースの確認',
appExchangeContent2: '移行前にターゲットノードと、データベースなどの必要なリソースを確認します。',
appExchangeTitle3: 'アプリの移行',
imageExchangeTitle3: '転送ログを表示',
imageExchangeContent3: 'タスクログでイメージの転送状況と実行結果を確認します。',
appExchangeTitle1: 'アプリケーションを選択',
appExchangeContent1: 'ソースノードにインストールされたアプリケーションを確認し、移行するものを選択します。',
appExchangeTitle2: '依存関係を確認',
appExchangeContent2: '移行前に、移行先ノードとデータベースなどの必要なリソースを確認します。',
appExchangeTitle3: 'アプリケーションを移行',
appExchangeContent3:
'アプリのバックアップをターゲットノードに転送して復元し、タスクログで結果を確認できます。',
sslSyncTitle1: 'ソース証明書の選択',
'アプリケーションのバックアップを移行先ノードに転送して復元し、タスクログで結果を確認します。',
sslSyncTitle1: '証明書を選択',
sslSyncContent1: 'ソースノードの証明書情報を確認し、同期する証明書を選択します。',
sslSyncTitle2: '複数ノードへの証明書同期',
sslSyncTitle2: 'ノード間で同期',
sslSyncContent2: 'ソースノードを自動的に除外し、選択した証明書をターゲットノードに同期します。',
sslSyncTitle3: '同期タスクの確認',
sslSyncContent3: '実行前にターゲットノードと証明書を確認し、タスクログで同期結果を確認できます。',
phpExtensionsSyncTitle1: '拡張テンプレートの選択',
sslSyncTitle3: '同期タスクを確認',
sslSyncContent3: '実行前にターゲットノードと証明書を確認し、実行後にタスクログで結果を確認します。',
phpExtensionsSyncTitle1: 'テンプレートを選択',
phpExtensionsSyncContent1:
'ソースノードのテンプレート名と拡張機能一覧を確認し、同期するテンプレートを選択します。',
phpExtensionsSyncTitle2: '複数ノードへのテンプレート同期',
phpExtensionsSyncTitle2: 'テンプレートを同期',
phpExtensionsSyncContent2:
'ソースノードを自動的に除外し、選択したテンプレートをターゲットノードに同期します。',
phpExtensionsSyncTitle3: '同名テンプレートの確認',
phpExtensionsSyncTitle3: '既存のテンプレートを確認',
phpExtensionsSyncContent3:
'同名で内容も同じテンプレートはスキップします。内容が異なる場合は競合を報告し、上書きしません。',
'名前と内容が一致するテンプレートはスキップします。内容が異なる場合は上書きせず、競合を報告します。',
fileExchangeTitle1: 'キー認証伝送',
fileExchangeContent1: 'SSHキーを介して認証し、伝送のセキュリティを確保します。',
fileExchangeTitle2: '効率的なファイル同期',
@@ -7572,13 +7574,13 @@ const message = {
'{0} 個のイメージを {1} 個のノードへ転送します。合計 {2} 件のタスクが作成されます。',
ssl: '証明書同期',
phpExtensions: 'PHP 拡張テンプレート同期',
phpExtensionsTitle: '拡張テンプレート同期',
phpExtensionsDesc: 'ソースノードを選択すると、PHP 拡張テンプレートをターゲットノードに同期できます。',
phpExtensionsList: '拡張機能一覧',
phpExtensionsConfirm: '{0} 件の PHP 拡張テンプレートを {1} 個のノードに同期します。',
phpExtensions: 'PHP 拡張機能テンプレートの同期',
phpExtensionsTitle: '拡張機能テンプレートの同期',
phpExtensionsDesc: 'ソースノードを選択し、その PHP 拡張機能テンプレートをターゲットノードに同期します。',
phpExtensionsList: 'PHP 拡張機能',
phpExtensionsConfirm: '{0} 件の PHP 拡張機能テンプレートを {1} 個のノードに同期します。',
phpExtensionsConflictHint:
'同名で内容も同じテンプレートはスキップします。同名で内容が異なる場合は競合を報告し、上書きしません。',
'同一のテンプレートはスキップします。同じ名前で内容が異なるテンプレートは競合として報告し、上書きしません。',
sslBatchDesc: 'ソースノードを選択すると、指定した証明書を現在のパネル環境へ同期できます。',
sslBatchConfirmPrefix: '{0} 件の証明書を {1} 個のノードへ同期します。合計 {2} 件のタスクが作成されます。',
+42 -40
View File
@@ -794,7 +794,7 @@ const message = {
nativeAgentAccessUnavailable:
'기존 설치에 호환되는 HTTPS 접속 주소 또는 포트가 없습니다. 앱 설정을 확인하세요.',
agent: '에이전트',
account: '모델 계정',
account: '모델 서비스',
batchOperation: '일괄 작업',
operationType: '작업 유형',
batchAction: '일괄 {0}',
@@ -808,10 +808,10 @@ const message = {
skillSource: 'Skill 소스',
skillKeyword: 'Skill 키워드',
clawHubSkillPlaceholder: '먼저 Skill을 검색하고 선택하세요',
noAccountHint: '기존 모델 계정을 선택하거나 새로 추가하세요.',
accountCount: '모델 계정 {0}개',
noAccountHint: '기존 모델 서비스를 선택하거나 새로 추가하세요.',
accountCount: '모델 서비스 {0}개',
syncAgents: '관련 에이전트 동기화',
syncAgentsHelper: '이 모델 계정을 사용하는 에이전트의 openclaw.json 업데이트',
syncAgentsHelper: '이 모델 서비스를 사용하는 에이전트의 openclaw.json 업데이트',
appVersion: '앱 버전',
webuiPort: 'WebUI 포트',
tokenOrAuth: 'Token/인증',
@@ -850,7 +850,7 @@ const message = {
useModelDefault: '모델 기본값 사용',
reasoning: '추론 모델',
verified: '검증됨',
verifySkipped: '검증 안 함',
verifySkipped: '검증 불필요',
skillsTab: '기술',
pluginsTab: '플러그인',
pluginsInstalled: '설치됨',
@@ -1190,9 +1190,9 @@ const message = {
notInstalled: '설치되지 않음',
usage: '사용량',
accountPool: '계정 풀',
importModelAccount: '모델 계정 가져오기',
editModelAccount: '모델 계정 편집',
selectModelAccount: '기존 모델 계정 선택',
importModelAccount: '모델 서비스 가져오기',
editModelAccount: '모델 서비스 편집',
selectModelAccount: '기존 모델 서비스 선택',
upstreamApiAddress: '업스트림 API 주소',
priority: '우선순위',
healthStatus: '상태',
@@ -1248,8 +1248,8 @@ const message = {
waitingQueue: '현재 대기열',
currentActiveUsers: '현재 활성 사용자',
activeStreamingRequests: '활성 스트리밍 요청',
modelAccountConcurrency: '모델 계정 동시성',
accountAvailability: '모델 계정 가용성',
modelAccountConcurrency: '모델 서비스 동시성',
accountAvailability: '모델 서비스 가용성',
capacityFull: '용량 가득 참',
groupConcurrency: '사용자 그룹 동시성',
apiKeyConcurrency: 'API Key 동시성',
@@ -1303,7 +1303,7 @@ const message = {
esLogCircuitUntil: 'ES 서킷 종료 시간',
serviceOperateConfirm: 'AI 게이트웨이 서비스를 {0}하시겠습니까?',
deleteTargetConfirm: '{0} {1}을(를) 삭제하시겠습니까?',
deleteBackendTitle: '모델 계정 삭제',
deleteBackendTitle: '모델 서비스 삭제',
userFallback: '삭제된 사용자 (ID: {0})',
requestModel: '요청 모델',
upstreamModel: '업스트림 모델',
@@ -1316,7 +1316,7 @@ const message = {
usageTrend: '사용 추세',
distributionBy: '{0}별 분포',
unmatched: '미일치',
modelAccount: '모델 계정',
modelAccount: '모델 서비스',
serviceProvider: '제공자',
tokenUsage: 'Token 사용량',
percent: '비율',
@@ -1660,6 +1660,8 @@ const message = {
timeToFirstToken: '평균 첫 토큰 지연',
timePerOutputToken: '평균 토큰 간 지연',
requestLatency: '평균 요청 지연',
noMetrics:
'메트릭 엔드포인트에 접근할 수 있지만 아직 지원되는 vLLM 메트릭이 없습니다. 일부 메트릭은 첫 추론 요청 후에만 생성될 수 있습니다.',
unavailable: '지표를 수집할 수 없습니다. 인스턴스 실행 상태와 /metrics 접근 가능 여부를 확인하세요.',
loadFailed: '모니터링 데이터를 불러오지 못했습니다. 다시 시도하세요.',
helper: '수집 활성화, 간격 및 보존 기간은 모니터링 설정에서 조정합니다.',
@@ -2770,7 +2772,7 @@ const message = {
scrollSensitivity: '스크롤 감도',
aiAssistant: 'AI 도우미',
aiAccountHelper:
'선택한 모델 계정으로 명령을 생성하고 채웁니다. Ollama, vLLM 같은 로컬 모델은 사용자 지정 모델 계정을 사용하세요.',
'선택한 모델 서비스로 명령을 생성하고 채웁니다. Ollama, vLLM 같은 로컬 모델은 사용자 지정 모델 서비스를 사용하세요.',
aiPrefix: '트리거 접두사',
aiPrefixHelper:
'"접두사 + 공백"을 입력하고 Enter를 누르면 AI 명령 생성이 시작됩니다. 예: {0} 디스크 정보를 조회해줘.',
@@ -3012,7 +3014,7 @@ const message = {
aiSearchHint:
'파일 내용을 줄 단위로 검색합니다. 검색창 오른쪽 버튼과 아래의 "고급 조건"에서 검색 방식을 바꿀 수 있습니다. AI 계정을 활성화하고 저장하면 Markdown 요약도 생성할 수 있습니다.',
aiSearchAccountTitle: 'AI 계정',
aiSearchAccountIntro: '요약 생성을 위한 대형 모델 계정을 선택하세요. 변경 후 저장을 눌러주세요.',
aiSearchAccountIntro: '요약 생성을 위한 대형 모델 서비스를 선택하세요. 변경 후 저장을 눌러주세요.',
aiSearchAccountEnable: '파일 AI 검색 활성화',
aiSearchSaveAccount: '계정 설정 저장',
aiSearchSectionQuery: '검색',
@@ -3922,8 +3924,8 @@ const message = {
'상용 버전으로 업그레이드하면 다중 노드 애플리케이션, 웹사이트, 데이터베이스, 예약 작업을 중앙에서 관리할 수 있습니다.',
imageExchange: '상용 버전으로 업그레이드하면 노드 간에 컨테이너 이미지를 일괄 전송할 수 있습니다.',
appExchange:
'상용 버전으로 업그레이드하면 설치된 앱을 대상 노드로 이전하고 필요한 종속 리소스를 확인할 수 있습니다.',
sslSync: '상용 버전으로 업그레이드하면 소스 노드의 인증서를 하나 이상의 대상 노드에 동기화할 수 있습니다.',
'상용 버전으로 업그레이드하면 설치된 애플리케이션을 대상 노드로 마이그레이션하고 필요한 리소스 의존성을 확인할 수 있습니다.',
sslSync: '상용 버전으로 업그레이드하면 원본 노드의 인증서를 하나 이상의 대상 노드에 동기화할 수 있습니다.',
phpExtensionsSync:
'상용 버전으로 업그레이드하면 PHP 확장 템플릿을 하나 이상의 대상 노드에 동기화할 수 있습니다.',
fileExchange: '상용 버전으로 업그레이드하면 여러 서버 간에 파일을 빠르게 전송할 수 있습니다.',
@@ -6889,31 +6891,31 @@ const message = {
nodeContent3: '각 노드의 운영 상태를 실시간으로 파악',
nodeTitle4: '빠른 원격 연결',
nodeContent4: '원클릭으로 노드 원격 터미널에 직접 연결',
imageExchangeTitle1: '소스 이미지 선택',
imageExchangeContent1: '소스 노드의 컨테이너 이미지를 확인하고 전송할 이미지를 선택합니다.',
imageExchangeTitle2: '이미지 일괄 배포',
imageExchangeTitle1: '원본 이미지 선택',
imageExchangeContent1: '원본 노드의 컨테이너 이미지를 확인하고 전송할 이미지를 선택합니다.',
imageExchangeTitle2: '이미지 배포',
imageExchangeContent2: '선택한 이미지를 하나 이상의 대상 노드로 전송합니다.',
imageExchangeTitle3: '전송 로그 확인',
imageExchangeContent3: '작업 로그에서 이미지 전송 진행 상황과 실행 결과를 확인합니다.',
appExchangeTitle1: '소스 앱 선택',
appExchangeContent1: '소스 노드에 설치된 앱을 확인하고 이전할 앱을 선택합니다.',
appExchangeTitle2: '종속 리소스 확인',
appExchangeContent2: '이전 전에 대상 노드와 데이터베이스 등 필요한 리소스를 확인합니다.',
appExchangeTitle3: '앱 이전 실행',
appExchangeContent3: '앱 백업을 대상 노드로 전송하여 복원하고 작업 로그에서 결과를 확인합니다.',
sslSyncTitle1: '소스 인증서 선택',
sslSyncContent1: '소스 노드의 인증서 정보를 확인하고 동기화할 인증서를 선택합니다.',
sslSyncTitle2: '여러 노드에 인증서 동기화',
sslSyncContent2: '소스 노드를 자동으로 제외하고 선택한 인증서를 대상 노드에 동기화합니다.',
imageExchangeContent3: '작업 로그에서 이미지 전송 진행 상황과 결과를 확인합니다.',
appExchangeTitle1: '애플리케이션 선택',
appExchangeContent1: '원본 노드에 설치된 애플리케이션을 확인하고 마이그레이션할 항목을 선택합니다.',
appExchangeTitle2: '의존성 확인',
appExchangeContent2: '마이그레이션 전에 대상 노드와 데이터베이스 등 필요한 리소스를 확인합니다.',
appExchangeTitle3: '애플리케이션 마이그레이션',
appExchangeContent3: '애플리케이션 백업을 대상 노드로 전송하여 복원하고 작업 로그에서 결과를 확인합니다.',
sslSyncTitle1: '인증서 선택',
sslSyncContent1: '원본 노드의 인증서 정보를 확인하고 동기화할 인증서를 선택합니다.',
sslSyncTitle2: '노드 간 동기화',
sslSyncContent2: '원본 노드를 자동으로 제외하고 선택한 인증서를 대상 노드에 동기화합니다.',
sslSyncTitle3: '동기화 작업 확인',
sslSyncContent3: '실행 전에 대상 노드와 인증서를 확인하고 작업 로그에서 동기화 결과를 확인합니다.',
phpExtensionsSyncTitle1: '확장 템플릿 선택',
phpExtensionsSyncContent1: '소스 노드의 템플릿 이름과 확장 목록을 확인하고 동기화할 템플릿을 선택합니다.',
phpExtensionsSyncTitle2: '여러 노드에 템플릿 동기화',
phpExtensionsSyncContent2: '소스 노드를 자동으로 제외하고 선택한 템플릿을 대상 노드에 동기화합니다.',
phpExtensionsSyncTitle3: '동일 이름 템플릿 확인',
sslSyncContent3: '실행 전에 대상 노드와 인증서를 확인하고 실행 후 작업 로그에서 결과를 확인합니다.',
phpExtensionsSyncTitle1: '템플릿 선택',
phpExtensionsSyncContent1: '원본 노드의 템플릿 이름과 확장 목록을 확인하고 동기화할 템플릿을 선택합니다.',
phpExtensionsSyncTitle2: '템플릿 동기화',
phpExtensionsSyncContent2: '원본 노드를 자동으로 제외하고 선택한 템플릿을 대상 노드에 동기화합니다.',
phpExtensionsSyncTitle3: '기존 템플릿 확인',
phpExtensionsSyncContent3:
'이름과 내용이 같으면 건너뜁니다. 내용이 다르면 충돌을 알리고 덮어쓰지 않습니다.',
'이름과 내용이 같은 템플릿은 건너뜁니다. 내용이 다르면 덮어쓰지 않고 충돌을 보고합니다.',
fileExchangeTitle1: '키 인증 전송',
fileExchangeContent1: 'SSH 키를 통해 인증하여 전송 보안을 보장합니다.',
fileExchangeTitle2: '효율적인 파일 동기화',
@@ -7423,11 +7425,11 @@ const message = {
ssl: '인증서 동기화',
phpExtensions: 'PHP 확장 템플릿 동기화',
phpExtensionsTitle: '확장 템플릿 동기화',
phpExtensionsDesc: '소스 노드를 선택하면 PHP 확장 템플릿을 대상 노드에 동기화할 수 있습니다.',
phpExtensionsList: '확장 목록',
phpExtensionsDesc: '원본 노드를 선택하여 PHP 확장 템플릿을 대상 노드에 동기화합니다.',
phpExtensionsList: 'PHP 확장',
phpExtensionsConfirm: 'PHP 확장 템플릿 {0}개를 노드 {1}개에 동기화합니다.',
phpExtensionsConflictHint:
'이름과 내용이 같은 템플릿은 건너뜁니다. 이름은 같지만 내용이 다르면 충돌을 알리고 덮어쓰지 않습니다.',
'동일한 템플릿은 건너뜁니다. 이름은 같지만 내용이 다른 템플릿은 충돌로 보고되며 덮어쓰지 않습니다.',
sslBatchDesc: '원본 노드를 선택한 후 지정된 인증서를 현재 패널 환경으로 동기화할 수 있습니다.',
sslBatchConfirmPrefix: '{0}개의 인증서를 {1}개 노드로 동기화합니다. 총 {2}개의 작업이 생성됩니다.',
+47 -45
View File
@@ -792,7 +792,7 @@ const message = {
nativeAgentAccessUnavailable:
'ການຕິດຕັ້ງທີ່ມີຢູ່ບໍ່ມີທີ່ຢູ່ ຫຼືພອດ HTTPS ທີ່ເຂົ້າກັນໄດ້. ກະລຸນາກວດສອບການຕັ້ງຄ່າແອັບ.',
agent: 'ຕົວແທນ (Agent)',
account: 'ບັນຊີໂມເດວ',
account: 'ບໍລິການໂມເດວ',
batchOperation: 'ດຳເນີນການແບບກຸ່ມ',
operationType: 'ປະເພດການດຳເນີນການ',
batchAction: '{0} ແບບກຸ່ມ',
@@ -806,10 +806,10 @@ const message = {
skillSource: 'ແຫຼ່ງທີ່ມາທັກສະ',
skillKeyword: 'ຄຳຄົ້ນຫາທັກສະ',
clawHubSkillPlaceholder: 'ຄົ້ນຫາ ແລະ ເລືອກທັກສະກ່ອນ',
noAccountHint: 'ເລືອກບັນຊີໂມເດວທີ່ມີຢູ່ ຫຼື ເພີ່ມບັນຊີໃໝ່.',
accountCount: '{0} ບັນຊີໂມເດວ',
noAccountHint: 'ເລືອກບໍລິການໂມເດວທີ່ມີຢູ່ ຫຼື ເພີ່ມບັນຊີໃໝ່.',
accountCount: '{0} ບໍລິການໂມເດວ',
syncAgents: 'ຊິ້ງຄ໌ຕົວແທນທີ່ກ່ຽວຂ້ອງ',
syncAgentsHelper: 'ອັບເດດ openclaw.json ສຳລັບຕົວແທນທີ່ໃຊ້ບັນຊີໂມເດວນີ້',
syncAgentsHelper: 'ອັບເດດ openclaw.json ສຳລັບຕົວແທນທີ່ໃຊ້ບໍລິການໂມເດວນີ້',
appVersion: 'ເວີຊັນແອັບ',
webuiPort: 'ພອດ WebUI',
tokenOrAuth: 'Token/ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານ',
@@ -848,7 +848,7 @@ const message = {
useModelDefault: 'ໃຊ້ຄ່າເລີ່ມຕົ້ນຂອງໂມເດວ',
reasoning: 'ໂມເດວການໃຊ້ເຫດຜົນ',
verified: 'ກວດສອບແລ້ວ',
verifySkipped: 'ບໍ່ມີການກວດສອບ',
verifySkipped: 'ບໍ່ຈຳເປັນຕ້ອງກວດສອບ',
skillsTab: 'ທັກສະ',
pluginsTab: 'ປລັກອິນ',
pluginsInstalled: 'ຕິດຕັ້ງແລ້ວ',
@@ -1185,9 +1185,9 @@ const message = {
notInstalled: 'ຍັງບໍ່ໄດ້ຕິດຕັ້ງ',
usage: 'ການໃຊ້ງານ',
accountPool: 'ກຸ່ມບັນຊີ',
importModelAccount: 'ນຳເຂົ້າບັນຊີໂມເດວ',
editModelAccount: 'ແກ້ໄຂບັນຊີໂມເດວ',
selectModelAccount: 'ເລືອກບັນຊີໂມເດວທີ່ມີຢູ່',
importModelAccount: 'ນຳເຂົ້າບໍລິການໂມເດວ',
editModelAccount: 'ແກ້ໄຂບໍລິການໂມເດວ',
selectModelAccount: 'ເລືອກບໍລິການໂມເດວທີ່ມີຢູ່',
upstreamApiAddress: 'ທີ່ຢູ່ API ຕົ້ນທາງ (Upstream)',
priority: 'ລຳດັບຄວາມສຳຄັນ',
healthStatus: 'ສຸຂະພາບ',
@@ -1242,8 +1242,8 @@ const message = {
gatewayConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງເກດເວປັດຈຸບັນ',
waitingQueue: 'ຄິວລໍຖ້າປັດຈຸບັນ',
currentActiveUsers: 'ຜູ້ໃຊ້ທີ່ກຳລັງໃຊ້ງານ',
modelAccountConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງບັນຊີໂມເດວ',
accountAvailability: 'ຄວາມພ້ອມໃຊ້ງານຂອງບັນຊີໂມເດວ',
modelAccountConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງບໍລິການໂມເດວ',
accountAvailability: 'ຄວາມພ້ອມໃຊ້ງານຂອງບໍລິການໂມເດວ',
capacityFull: 'ຄວາມຈຸເຕັມ',
groupConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງກຸ່ມຜູ້ໃຊ້',
apiKeyConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງ API Key',
@@ -1297,7 +1297,7 @@ const message = {
esLogCircuitUntil: 'ES Circuit ຈົນເຖິງ',
serviceOperateConfirm: 'ຢືນຢັນທີ່ຈະ {0} ບໍລິການ AI Gateway?',
deleteTargetConfirm: 'ລຶບ {0} {1}?',
deleteBackendTitle: 'ລຶບບັນຊີໂມເດວ',
deleteBackendTitle: 'ລຶບບໍລິການໂມເດວ',
userFallback: 'ຜູ້ໃຊ້ທີ່ຖືກລຶບ (ID: {0})',
requestModel: 'ໂມເດວທີ່ຮ້ອງຂໍ',
upstreamModel: 'ໂມເດວຕົ້ນທາງ (Upstream)',
@@ -1310,7 +1310,7 @@ const message = {
usageTrend: 'ແນວໂນ້ມການນຳໃຊ້',
distributionBy: 'ການແຈກຢາຍໂດຍ {0}',
unmatched: 'ບໍ່ກົງກັນ',
modelAccount: 'ບັນຊີໂມເດວ',
modelAccount: 'ບໍລິການໂມເດວ',
serviceProvider: 'ຜູ້ໃຫ້ບໍລິການ',
tokenUsage: 'ການນຳໃຊ້ Token',
percent: 'ເປີເຊັນ',
@@ -1649,6 +1649,8 @@ const message = {
timeToFirstToken: 'ເວລາລໍຖ້າສະເລ່ຍຂອງ Token ທຳອິດ',
timePerOutputToken: 'ເວລາລໍຖ້າສະເລ່ຍລະຫວ່າງ Token',
requestLatency: 'ເວລາລໍຖ້າສະເລ່ຍຂອງຄຳຮ້ອງຂໍ',
noMetrics:
'ສາມາດເຂົ້າເຖິງຈຸດປາຍທາງເມຕຣິກໄດ້ ແຕ່ຍັງບໍ່ມີເມຕຣິກ vLLM ທີ່ຮອງຮັບ. ບາງເມຕຣິກອາດປາກົດຫຼັງຈາກຄຳຮ້ອງຂໍອະນຸມານຄັ້ງທຳອິດເທົ່ານັ້ນ.',
unavailable: 'ບໍ່ສາມາດເກັບຕົວຊີ້ວັດໄດ້. ກວດສອບວ່າອິນສະແຕນເຮັດວຽກ ແລະ ເຂົ້າເຖິງ /metrics ໄດ້.',
loadFailed: 'ໂຫຼດຂໍ້ມູນຕິດຕາມບໍ່ສຳເລັດ. ກະລຸນາລອງອີກຄັ້ງ.',
helper: 'ປັບການເປີດໃຊ້ການເກັບຂໍ້ມູນ, ໄລຍະຫ່າງ ແລະ ຈຳນວນມື້ເກັບຮັກສາໃນການຕັ້ງຄ່າການຕິດຕາມ.',
@@ -2748,7 +2750,7 @@ const message = {
scrollSensitivity: 'ຄວາມໄວການເລື່ອນ (Scroll)',
aiAssistant: 'AI Assistant',
aiAccountHelper:
'ໃຊ້ບັນຊີໂມເດວທີ່ເລືອກເພື່ອສ້າງ ແລະ ຕື່ມຄຳສັ່ງ. ສຳລັບໂມເດວພາຍໃນເຄື່ອງເຊັ່ນ Ollama ແລະ vLLM ໃຫ້ໃຊ້ບັນຊີໂມເດວທີ່ກຳນົດເອງ.',
'ໃຊ້ບໍລິການໂມເດວທີ່ເລືອກເພື່ອສ້າງ ແລະ ຕື່ມຄຳສັ່ງ. ສຳລັບໂມເດວພາຍໃນເຄື່ອງເຊັ່ນ Ollama ແລະ vLLM ໃຫ້ໃຊ້ບໍລິການໂມເດວທີ່ກຳນົດເອງ.',
aiPrefix: 'Prefix ເລີ່ມຕົ້ນ AI',
aiPrefixHelper:
'ປ້ອນ "prefix + ຍະຫວ່າງ" ແລະ ກົດ Enter ເພື່ອໃຫ້ AI ສ້າງຄຳສັ່ງ, ຕົວຢ່າງ: {0} help me check disk usage.',
@@ -3898,10 +3900,11 @@ const message = {
nodeApp: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອອັບເກຣດເວີຊັນແອັບໃນຫຼາຍໂນດໂດຍບໍ່ຕ້ອງສະຫຼັບໂນດດ້ວຍຕົນເອງ.',
nodeDashboard:
'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການແອັບ, ເວັບໄຊ, ຖານຂໍ້ມູນ ແລະ ງານຕາມກຳນົດເວລາຂອງຫຼາຍໂນດຢູ່ບ່ອນດຽວ.',
imageExchange: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອໂອນຍ້າຍອິມເມຈຄອນເທນເນີລະຫວ່າງໂນດເປັນຊຸດ.',
appExchange: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຍ້າຍແອັບທີ່ຕິດຕັ້ງແລ້ວໄປຍັງໂນດປາຍທາງ ແລະຢືນຢັນຊັບພະຍາກອນທີ່ຕ້ອງໃຊ້.',
sslSync: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຊິງໂຄຣໄນໃບຢັ້ງຢືນຈາກໂນດຕົ້ນທາງໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
phpExtensionsSync: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
imageExchange: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອໂອນອິມເມດຄອນເທນເນີເປັນຊຸດລະຫວ່າງໂນດ.',
appExchange:
'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຍ້າຍແອັບທີ່ຕິດຕັ້ງແລ້ວໄປຍັງໂນດປາຍທາງ ແລະ ຢືນຢັນຊັບພະຍາກອນທີ່ຈຳເປັນ.',
sslSync: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຊິງໃບຢັ້ງຢືນຈາກໂນດຕົ້ນທາງໄປຍັງໂນດປາຍທາງໜຶ່ງ ຫຼື ຫຼາຍໂນດ.',
phpExtensionsSync: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງໜຶ່ງ ຫຼື ຫຼາຍໂນດ.',
fileExchange: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອໂອນຍ້າຍໄຟລ໌ລະຫວ່າງເຊີບເວີຢ່າງວ່ອງໄວ.',
app: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອເບິ່ງລາຍລະອຽດບໍລິການ, ການຕິດຕາມສິ່ງຜິດປົກກະຕິ ແລະ ອື່ນໆໃນແອັບມືຖື.',
cluster: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການ MySQL/Postgres/Redis primary-replica clusters.',
@@ -6829,32 +6832,31 @@ const message = {
nodeContent3: 'ຕິດຕາມສະຖານະການທຳງານຂອງແຕ່ລະໂນດແບບທັນທີ',
nodeTitle4: 'ເຊື່ອມຕໍ່ໄລຍະໄກວ່ອງໄວ',
nodeContent4: 'ເຊື່ອມຕໍ່ຫາເທີມິນອລຂອງໂນດໄດ້ໂດຍກົງຄລິກດຽວ',
imageExchangeTitle1: 'ເລືອກອິມເມຈຕົ້ນທາງ',
imageExchangeContent1: 'ເບິ່ງອິມເມຈຄອນເທນເນີໃນໂນດຕົ້ນທາງ ແລະເລືອກອິມເມຈທີ່ຕ້ອງການໂອນຍ້າຍ.',
imageExchangeTitle2: 'ແຈກຢາຍອິມເມຈເປັນຊຸດ',
imageExchangeContent2: 'ໂອນຍ້າຍອິມເມຈທີ່ເລືອກໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
imageExchangeTitle3: 'ເບິ່ງບັນທຶກການໂອນຍ້າຍ',
imageExchangeContent3: 'ຕິດຕາມຄວາມຄືບໜ້າແລະຜົນການໂອນຍ້າຍອິມເມຈໃນບັນທຶກວຽກ.',
appExchangeTitle1: 'ເລືອກແອັບຕົ້ນທາງ',
imageExchangeTitle1: 'ເລືອກອິມເມດຕົ້ນທາງ',
imageExchangeContent1: 'ເບິ່ງອິມເມດຄອນເທນເນີໃນໂນດຕົ້ນທາງ ແລະ ເລືອກອິມເມດທີ່ຕ້ອງການໂອນ.',
imageExchangeTitle2: 'ແຈກຢາຍອິມເມດ',
imageExchangeContent2: 'ໂອນອິມເມດທີ່ເລືອກໄປຍັງໂນດປາຍທາງໜຶ່ງ ຫຼື ຫຼາຍໂນດ.',
imageExchangeTitle3: 'ເບິ່ງບັນທຶກການໂອນ',
imageExchangeContent3: 'ຕິດຕາມຄວາມຄືບໜ້າ ແລະ ຜົນການໂອນອິມເມດໃນບັນທຶກວຽກ.',
appExchangeTitle1: 'ເລືອກແອັບ',
appExchangeContent1: 'ເບິ່ງແອັບທີ່ຕິດຕັ້ງໃນໂນດຕົ້ນທາງ ແລະ ເລືອກແອັບທີ່ຕ້ອງການຍ້າຍ.',
appExchangeTitle2: 'ຢືນຢັນຊັບພະຍາກອນທີ່ຂຶ້ນຕໍ່ກັນ',
appExchangeContent2: 'ຢືນຢັນໂນດປາຍທາງແລະຊັບພະຍາກອນທີ່ຕ້ອງໃຊ້ ເຊັ່ນ ຖານຂໍ້ມູນ ກ່ອນການຍ້າຍ.',
appExchangeTitle2: 'ຢືນຢັນຊັບພະຍາກອນທີ່ຈຳເປັນ',
appExchangeContent2: 'ກ່ອນຍ້າຍ ໃຫ້ຢືນຢັນໂນດປາຍທາງ ແລະ ຊັບພະຍາກອນທີ່ຈຳເປັນ ເຊັ່ນ ຖານຂໍ້ມູນ.',
appExchangeTitle3: 'ຍ້າຍແອັບ',
appExchangeContent3: 'ໂອນຍ້າຍຂໍ້ມູນສຳຮອງຂອງແອັບໄປຍັງໂນດປາຍທາງເພື່ອກູ້ຄືນ ແລະເບິ່ງຜົນໃນບັນທຶກວຽກ.',
sslSyncTitle1: 'ເລືອກໃບຢັ້ງຢືນຕົ້ນທາງ',
sslSyncContent1: 'ເບິ່ງຂໍ້ມູນໃບຢັ້ງຢືນໃນໂນດຕົ້ນທາງ ແລະເລືອກໃບຢັ້ງຢືນທີ່ຕ້ອງການຊິງໂຄຣໄນ.',
sslSyncTitle2: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນລະຫວ່າງໂນດ',
sslSyncContent2: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ເລືອກໄປຍັງໂນດປາຍທາງ ໂດຍຍົກເວັ້ນໂນດຕົ້ນທາງອັດຕະໂນມັດ.',
sslSyncTitle3: 'ຢືນຢັນວຽກຊິງໂຄຣໄນ',
appExchangeContent3: 'ໂອນຂໍ້ມູນສຳຮອງຂອງແອັບໄປຍັງໂນດປາຍທາງເພື່ອກູ້ຄືນ ແລະ ເບິ່ງຜົນໃນບັນທຶກວຽກ.',
sslSyncTitle1: 'ເລືອກໃບຢັ້ງຢືນ',
sslSyncContent1: 'ເບິ່ງລາຍລະອຽດໃບຢັ້ງຢືນໃນໂນດຕົ້ນທາງ ແລະ ເລືອກໃບຢັ້ງຢືນທີ່ຕ້ອງການຊິງ.',
sslSyncTitle2: 'ຊິງລະຫວ່າງໂນດ',
sslSyncContent2: 'ຊິງໃບຢັ້ງຢືນທີ່ເລືອກໄປຍັງໂນດປາຍທາງ ໂດຍຍົກເວັ້ນໂນດຕົ້ນທາງອັດຕະໂນມັດ.',
sslSyncTitle3: 'ຢືນຢັນວຽກຊິງ',
sslSyncContent3: 'ກວດສອບໂນດປາຍທາງ ແລະ ໃບຢັ້ງຢືນກ່ອນດຳເນີນການ ແລ້ວເບິ່ງຜົນໃນບັນທຶກວຽກ.',
phpExtensionsSyncTitle1: 'ເລືອກແມ່ແບບສ່ວນຂະຫຍາຍ',
phpExtensionsSyncContent1:
'ເບິ່ງຊື່ແມ່ແບບແລະລາຍການສ່ວນຂະຫຍາຍໃນໂນດຕົ້ນທາງ ແລະເລືອກແມ່ແບບທີ່ຕ້ອງການຊິງໂຄຣໄນ.',
phpExtensionsSyncTitle2: 'ຊິງໂຄຣໄນແມ່ແບບລະຫວ່າງໂນດ',
phpExtensionsSyncContent2: 'ຊິງໂຄຣໄນແມ່ແບບທີ່ເລືອກໄປຍັງໂນດປາຍທາງ ໂດຍຍົກເວັ້ນໂນດຕົ້ນທາງອັດຕະໂນມັດ.',
phpExtensionsSyncTitle3: 'ກວດສອບແມ່ແບບຊື່ດຽວກັນ',
phpExtensionsSyncTitle1: 'ເລືອກແມ່ແບບ',
phpExtensionsSyncContent1: 'ເບິ່ງຊື່ແມ່ແບບ ແລະ ລາຍການສ່ວນຂະຫຍາຍໃນໂນດຕົ້ນທາງ ແລະ ເລືອກແມ່ແບບທີ່ຕ້ອງການຊິງ.',
phpExtensionsSyncTitle2: 'ຊິງແມ່ແບບ',
phpExtensionsSyncContent2: 'ຊິງແມ່ແບບທີ່ເລືອກໄປຍັງໂນດປາຍທາງ ໂດຍຍົກເວັ້ນໂນດຕົ້ນທາງອັດຕະໂນມັດ.',
phpExtensionsSyncTitle3: 'ກວດສອບແມ່ແບບທີ່ມີຢູ່',
phpExtensionsSyncContent3:
'ຈະຂ້າມແມ່ແບບທີ່ມີຊື່ແລະເນື້ອຫາຄືກັນ. ຖ້າເນື້ອຫາຕ່າງກັນ ຈະແຈ້ງຂໍ້ຂັດແຍ່ງແລະບໍ່ຂຽນທັບ.',
'ຂ້າມແມ່ແບບທີ່ມີຊື່ ແລະ ເນື້ອຫາຄືກັນ. ຖ້າເນື້ອຫາຕ່າງກັນ ຈະແຈ້ງຂໍ້ຂັດແຍ່ງໂດຍບໍ່ຂຽນທັບ.',
fileExchangeTitle1: 'ສົ່ງຂໍ້ມູນຜ່ານ Key Authentication',
fileExchangeContent1: 'ຢືນຢັນຕົວຕົນຜ່ານ SSH keys ເພື່ອຄວາມປອດໄພໃນການສົ່ງຂໍ້ມູນ.',
fileExchangeTitle2: 'ຊິງໂຄຣໄນໄຟລ໌ທີ່ມີປະສິດທິພາບ',
@@ -7332,13 +7334,13 @@ const message = {
imageBatchConfirmPrefix: 'ກຳລັງຈະໂອນ {0} images ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.',
ssl: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນ',
phpExtensions: 'ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP',
phpExtensionsTitle: 'ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ',
phpExtensionsDesc: 'ເລືອກໂນດຕົ້ນທາງເພື່ອຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງ.',
phpExtensionsList: 'ລາຍການສ່ວນຂະຫຍາຍ',
phpExtensionsConfirm: 'ຈະຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP {0} ແມ່ແບບ ໄປຍັງ {1} ໂນດ.',
phpExtensions: 'ຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP',
phpExtensionsTitle: 'ຊິງແມ່ແບບສ່ວນຂະຫຍາຍ',
phpExtensionsDesc: 'ເລືອກໂນດຕົ້ນທາງເພື່ອຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງ.',
phpExtensionsList: 'ສ່ວນຂະຫຍາຍ PHP',
phpExtensionsConfirm: 'ຈະຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP {0} ແມ່ແບບ ໄປຍັງ {1} ໂນດ.',
phpExtensionsConflictHint:
'ຈະຂ້າມແມ່ແບບທີ່ມີຊື່ແລະເນື້ອຫາຄືກັນ. ຖ້າຊື່ຄືກັນແຕ່ເນື້ອຫາຕ່າງກັນ ຈະແຈ້ງຂໍ້ຂັດແຍ່ງແລະບໍ່ຂຽນທັບ.',
'ແມ່ແບບທີ່ຄືກັນຈະຖືກຂ້າມ. ແມ່ແບບທີ່ມີຊື່ຄືກັນແຕ່ເນື້ອຫາຕ່າງກັນຈະຖືກແຈ້ງເປັນຂໍ້ຂັດແຍ່ງ ແລະ ບໍ່ຖືກຂຽນທັບ.',
sslBatchDesc: 'ເລືອກໂນດຕົ້ນທາງ ແລະ ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ກຳນົດເຂົ້າມາໃນພາແນລປັດຈຸບັນ.',
sslBatchConfirmPrefix: 'ກຳລັງຈະຊິງໂຄຣໄນ {0} ໃບຢັ້ງຢືນ ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.',
+35 -33
View File
@@ -812,7 +812,7 @@ const message = {
nativeAgentAccessUnavailable:
'Pemasangan sedia ada tiada alamat atau port HTTPS yang serasi. Semak tetapan aplikasi.',
agent: 'Agen',
account: 'Akaun model',
account: 'Perkhidmatan model',
batchOperation: 'Operasi pukal',
operationType: 'Jenis operasi',
batchAction: '{0} pukal',
@@ -826,10 +826,10 @@ const message = {
skillSource: 'Sumber Skill',
skillKeyword: 'Kata kunci Skill',
clawHubSkillPlaceholder: 'Cari dan pilih Skill dahulu',
noAccountHint: 'Pilih akaun model sedia ada atau tambah yang baharu.',
accountCount: 'Akaun model {0}',
noAccountHint: 'Pilih perkhidmatan model sedia ada atau tambah yang baharu.',
accountCount: 'Perkhidmatan model {0}',
syncAgents: 'Segerakkan agen berkaitan',
syncAgentsHelper: 'Kemas kini openclaw.json untuk agen yang menggunakan akaun model ini',
syncAgentsHelper: 'Kemas kini openclaw.json untuk agen yang menggunakan perkhidmatan model ini',
appVersion: 'Versi aplikasi',
webuiPort: 'Port WebUI',
tokenOrAuth: 'Token/Pengesahan',
@@ -871,7 +871,7 @@ const message = {
useModelDefault: 'Gunakan lalai model',
reasoning: 'Model penaakulan',
verified: 'Disahkan',
verifySkipped: 'Tanpa pengesahan',
verifySkipped: 'Pengesahan tidak diperlukan',
skillsTab: 'Kemahiran',
pluginsTab: 'Pemalam',
pluginsInstalled: 'Dipasang',
@@ -1226,9 +1226,9 @@ const message = {
notInstalled: 'Belum dipasang',
usage: 'Penggunaan',
accountPool: 'Kolam Akaun',
importModelAccount: 'Import akaun model',
editModelAccount: 'Edit akaun model',
selectModelAccount: 'Pilih akaun model sedia ada',
importModelAccount: 'Import perkhidmatan model',
editModelAccount: 'Edit perkhidmatan model',
selectModelAccount: 'Pilih perkhidmatan model sedia ada',
upstreamApiAddress: 'Alamat API Hulu',
priority: 'Keutamaan',
healthStatus: 'Status kesihatan',
@@ -1285,8 +1285,8 @@ const message = {
waitingQueue: 'Baris gilir menunggu semasa',
currentActiveUsers: 'Pengguna aktif semasa',
activeStreamingRequests: 'Permintaan penstriman aktif',
modelAccountConcurrency: 'Keserentakan akaun model',
accountAvailability: 'Ketersediaan akaun model',
modelAccountConcurrency: 'Keserentakan perkhidmatan model',
accountAvailability: 'Ketersediaan perkhidmatan model',
capacityFull: 'Kapasiti penuh',
groupConcurrency: 'Keserentakan kumpulan pengguna',
apiKeyConcurrency: 'Keserentakan API Key',
@@ -1340,7 +1340,7 @@ const message = {
esLogCircuitUntil: 'Litar ES hingga',
serviceOperateConfirm: 'Sahkan untuk {0} perkhidmatan gateway AI?',
deleteTargetConfirm: 'Padam {0} {1}?',
deleteBackendTitle: 'Padam akaun model',
deleteBackendTitle: 'Padam perkhidmatan model',
userFallback: 'Pengguna dipadam (ID: {0})',
requestModel: 'Model permintaan',
upstreamModel: 'Model upstream',
@@ -1353,7 +1353,7 @@ const message = {
usageTrend: 'Trend penggunaan',
distributionBy: 'Taburan mengikut {0}',
unmatched: 'Tidak sepadan',
modelAccount: 'Akaun model',
modelAccount: 'Perkhidmatan model',
serviceProvider: 'Penyedia',
tokenUsage: 'Penggunaan Token',
percent: 'Peratus',
@@ -1703,6 +1703,8 @@ const message = {
timeToFirstToken: 'Purata kependaman token pertama',
timePerOutputToken: 'Purata kependaman antara token',
requestLatency: 'Purata kependaman permintaan',
noMetrics:
'Titik akhir metrik boleh dicapai, tetapi belum ada metrik vLLM yang disokong. Sesetengah metrik mungkin hanya muncul selepas permintaan inferens pertama.',
unavailable: 'Metrik tidak tersedia. Pastikan tika sedang berjalan dan /metrics boleh dicapai.',
loadFailed: 'Gagal memuatkan data pemantauan. Sila cuba lagi.',
helper: 'Urus pengumpulan, sela dan tempoh penyimpanan dalam tetapan pemantauan.',
@@ -2862,7 +2864,7 @@ const message = {
scrollSensitivity: 'Kepekaan skrol',
aiAssistant: 'Pembantu AI',
aiAccountHelper:
'Gunakan akaun model yang dipilih untuk menjana dan mengisi arahan. Untuk model tempatan seperti Ollama dan vLLM, gunakan akaun model tersuai.',
'Gunakan perkhidmatan model yang dipilih untuk menjana dan mengisi arahan. Untuk model tempatan seperti Ollama dan vLLM, gunakan perkhidmatan model tersuai.',
aiPrefix: 'Awalan pencetus',
aiPrefixHelper:
'Masukkan "awalan + ruang" dan tekan Enter untuk mencetuskan penjanaan arahan AI, contohnya: {0} bantu saya semak maklumat cakera.',
@@ -3120,7 +3122,7 @@ const message = {
aiSearchHint:
'Cari kandungan fail baris demi baris. Gunakan butang di sebelah kanan baris carian dan "Syarat lanjutan" di bawah. Apabila akaun AI diaktifkan dan disimpan, ringkasan Markdown juga boleh dijana.',
aiSearchAccountTitle: 'Akaun AI',
aiSearchAccountIntro: 'Pilih akaun model besar untuk menjana ringkasan, kemudian simpan selepas perubahan.',
aiSearchAccountIntro: 'Pilih perkhidmatan model besar untuk menjana ringkasan, kemudian simpan selepas perubahan.',
aiSearchAccountEnable: 'Dayakan carian AI fail',
aiSearchSaveAccount: 'Simpan konfigurasi akaun',
aiSearchSectionQuery: 'Carian',
@@ -4076,13 +4078,13 @@ const message = {
'Naik taraf ke Edisi Komersial untuk menaik taraf versi aplikasi berbilang nod tanpa menukar nod secara manual.',
nodeDashboard:
'Naik taraf ke Edisi Komersial untuk mengurus aplikasi, laman web, pangkalan data dan tugas berjadual berbilang nod secara berpusat.',
imageExchange: 'Naik taraf ke edisi komersial untuk memindahkan imej kontena antara nod secara kelompok.',
imageExchange: 'Naik taraf ke Edisi Komersial untuk memindahkan imej kontena secara kelompok antara nod.',
appExchange:
'Naik taraf ke edisi komersial untuk memindahkan aplikasi yang dipasang ke nod sasaran dan mengesahkan sumber kebergantungannya.',
'Naik taraf ke Edisi Komersial untuk memindahkan aplikasi yang dipasang ke nod sasaran dan mengesahkan kebergantungan sumbernya.',
sslSync:
'Naik taraf ke edisi komersial untuk menyegerakkan sijil daripada nod sumber ke satu atau lebih nod sasaran.',
'Naik taraf ke Edisi Komersial untuk menyegerakkan sijil daripada nod sumber ke satu atau lebih nod sasaran.',
phpExtensionsSync:
'Naik taraf ke edisi komersial untuk menyegerakkan templat sambungan PHP ke satu atau lebih nod sasaran.',
'Naik taraf ke Edisi Komersial untuk menyegerakkan templat sambungan PHP ke satu atau lebih nod sasaran.',
fileExchange: 'Naik taraf ke Edisi Komersial untuk memindahkan fail dengan pantas antara pelayan.',
app: 'Naik taraf ke Edisi Komersial untuk melihat maklumat perkhidmatan dan pemantauan anomali dalam aplikasi mudah alih.',
cluster: 'Naik taraf ke Edisi Komersial untuk mengurus kelompok utama-replika MySQL/Postgres/Redis.',
@@ -7145,37 +7147,37 @@ const message = {
nodeTitle4: 'Sambungan Jauh Pantas',
nodeContent4: 'Sambung terus ke terminal jauh nod dengan satu klik',
imageExchangeTitle1: 'Pilih imej sumber',
imageExchangeContent1: 'Lihat imej kontena pada nod sumber dan pilih imej yang ingin dipindahkan.',
imageExchangeTitle2: 'Edarkan imej secara kelompok',
imageExchangeContent1: 'Lihat imej kontena pada nod sumber dan pilih imej yang hendak dipindahkan.',
imageExchangeTitle2: 'Edarkan imej',
imageExchangeContent2: 'Pindahkan imej yang dipilih ke satu atau lebih nod sasaran.',
imageExchangeTitle3: 'Lihat log pemindahan',
imageExchangeContent3: 'Pantau kemajuan dan hasil pemindahan imej dalam log tugas.',
appExchangeTitle1: 'Pilih aplikasi sumber',
appExchangeTitle1: 'Pilih aplikasi',
appExchangeContent1:
'Lihat aplikasi yang dipasang pada nod sumber dan pilih aplikasi yang ingin dipindahkan.',
'Lihat aplikasi yang dipasang pada nod sumber dan pilih aplikasi yang hendak dipindahkan.',
appExchangeTitle2: 'Sahkan kebergantungan',
appExchangeContent2:
'Sahkan nod sasaran dan sumber yang diperlukan, seperti pangkalan data, sebelum pemindahan.',
'Sebelum pemindahan, sahkan nod sasaran dan sumber yang diperlukan, seperti pangkalan data.',
appExchangeTitle3: 'Pindahkan aplikasi',
appExchangeContent3:
'Pindahkan sandaran aplikasi ke nod sasaran untuk pemulihan dan lihat hasilnya dalam log tugas.',
sslSyncTitle1: 'Pilih sijil sumber',
sslSyncContent1: 'Lihat maklumat sijil pada nod sumber dan pilih sijil yang ingin disegerakkan.',
sslSyncTitle2: 'Segerakkan sijil antara nod',
sslSyncTitle1: 'Pilih sijil',
sslSyncContent1: 'Lihat butiran sijil pada nod sumber dan pilih sijil yang hendak disegerakkan.',
sslSyncTitle2: 'Segerakkan antara nod',
sslSyncContent2:
'Segerakkan sijil yang dipilih ke nod sasaran dengan mengecualikan nod sumber secara automatik.',
sslSyncTitle3: 'Sahkan tugas penyegerakan',
sslSyncContent3:
'Semak nod sasaran dan sijil sebelum pelaksanaan, kemudian lihat hasilnya dalam log tugas.',
phpExtensionsSyncTitle1: 'Pilih templat sambungan',
phpExtensionsSyncTitle1: 'Pilih templat',
phpExtensionsSyncContent1:
'Lihat nama templat dan senarai sambungan pada nod sumber, kemudian pilih templat yang ingin disegerakkan.',
phpExtensionsSyncTitle2: 'Segerakkan templat antara nod',
'Lihat nama templat dan senarai sambungan pada nod sumber, kemudian pilih templat yang hendak disegerakkan.',
phpExtensionsSyncTitle2: 'Segerakkan templat',
phpExtensionsSyncContent2:
'Segerakkan templat yang dipilih ke nod sasaran dengan mengecualikan nod sumber secara automatik.',
phpExtensionsSyncTitle3: 'Semak templat bernama sama',
phpExtensionsSyncTitle3: 'Semak templat sedia ada',
phpExtensionsSyncContent3:
'Templat dengan nama dan kandungan yang sama akan dilangkau. Kandungan yang berbeza dilaporkan sebagai konflik tanpa menulis ganti templat.',
'Templat dengan nama dan kandungan yang sama akan dilangkau. Kandungan yang berbeza dilaporkan sebagai konflik tanpa ditulis ganti.',
fileExchangeTitle1: 'Pengangkutan Pengesahan Kunci',
fileExchangeContent1: 'Mengesahkan melalui kunci SSH untuk memastikan keselamatan pengangkutan.',
fileExchangeTitle2: 'Segerakan Fail Cekap',
@@ -7702,10 +7704,10 @@ const message = {
phpExtensions: 'Penyegerakan Templat Sambungan PHP',
phpExtensionsTitle: 'Penyegerakan Templat Sambungan',
phpExtensionsDesc: 'Pilih nod sumber untuk menyegerakkan templat sambungan PHP ke nod sasaran.',
phpExtensionsList: 'Senarai sambungan',
phpExtensionsList: 'Sambungan PHP',
phpExtensionsConfirm: 'Segerakkan {0} templat sambungan PHP ke {1} nod.',
phpExtensionsConflictHint:
'Templat dengan nama dan kandungan yang sama akan dilangkau. Jika nama sama tetapi kandungan berbeza, konflik akan dilaporkan tanpa menulis ganti templat.',
'Templat yang sama akan dilangkau. Templat dengan nama yang sama tetapi kandungan berbeza dilaporkan sebagai konflik dan tidak akan ditulis ganti.',
sslBatchDesc:
'Selepas memilih nod sumber, sijil yang ditentukan boleh disegerakkan ke persekitaran panel semasa.',
sslBatchConfirmPrefix: 'Akan menyegerakkan {0} sijil ke {1} nod, dengan jumlah {2} tugasan.',
+36 -33
View File
@@ -805,7 +805,7 @@ const message = {
nativeAgentAccessUnavailable:
'A instalação existente não tem endereço ou porta HTTPS compatível. Verifique as configurações do aplicativo.',
agent: 'Agente',
account: 'Conta de modelo',
account: 'Serviço de modelo',
batchOperation: 'Operação em lote',
operationType: 'Tipo de operação',
batchAction: '{0} em lote',
@@ -819,10 +819,10 @@ const message = {
skillSource: 'Origem da Skill',
skillKeyword: 'Palavra-chave da Skill',
clawHubSkillPlaceholder: 'Pesquise e selecione uma Skill primeiro',
noAccountHint: 'Selecione uma conta de modelo existente ou adicione uma nova.',
accountCount: '{0} contas de modelo',
noAccountHint: 'Selecione um serviço de modelo existente ou adicione um novo.',
accountCount: '{0} serviços de modelo',
syncAgents: 'Sincronizar agentes vinculados',
syncAgentsHelper: 'Atualize o openclaw.json para agentes que usam esta conta de modelo',
syncAgentsHelper: 'Atualize o openclaw.json para agentes que usam este serviço de modelo',
appVersion: 'Versão do app',
webuiPort: 'Porta WebUI',
tokenOrAuth: 'Token/Autenticação',
@@ -864,7 +864,7 @@ const message = {
useModelDefault: 'Usar padrão do modelo',
reasoning: 'Modelo de raciocínio',
verified: 'Verificado',
verifySkipped: 'Sem verificação',
verifySkipped: 'Não requer verificação',
skillsTab: 'Habilidades',
pluginsTab: 'Plugins',
pluginsInstalled: 'Instalados',
@@ -1220,9 +1220,9 @@ const message = {
notInstalled: 'Não instalado',
usage: 'Uso',
accountPool: 'Pool de contas',
importModelAccount: 'Importar conta de modelo',
editModelAccount: 'Editar conta de modelo',
selectModelAccount: 'Selecionar uma conta de modelo existente',
importModelAccount: 'Importar serviço de modelo',
editModelAccount: 'Editar serviço de modelo',
selectModelAccount: 'Selecionar um serviço de modelo existente',
upstreamApiAddress: 'Endereço da API upstream',
priority: 'Prioridade',
healthStatus: 'Saúde',
@@ -1279,8 +1279,8 @@ const message = {
waitingQueue: 'Fila de espera atual',
currentActiveUsers: 'Usuários ativos agora',
activeStreamingRequests: 'Solicitações de streaming ativas',
modelAccountConcurrency: 'Concorrência das contas de modelo',
accountAvailability: 'Disponibilidade das contas de modelo',
modelAccountConcurrency: 'Concorrência dos serviços de modelo',
accountAvailability: 'Disponibilidade dos serviços de modelo',
capacityFull: 'Capacidade esgotada',
groupConcurrency: 'Concorrência dos grupos de usuários',
apiKeyConcurrency: 'Concorrência das API Keys',
@@ -1335,7 +1335,7 @@ const message = {
esLogCircuitUntil: 'Circuito ES até',
serviceOperateConfirm: 'Confirmar {0} o serviço de gateway de IA?',
deleteTargetConfirm: 'Excluir {0} {1}?',
deleteBackendTitle: 'Excluir conta de modelo',
deleteBackendTitle: 'Excluir serviço de modelo',
userFallback: 'Usuário excluído (ID: {0})',
requestModel: 'Modelo solicitado',
upstreamModel: 'Modelo upstream',
@@ -1348,7 +1348,7 @@ const message = {
usageTrend: 'Tendência de uso',
distributionBy: 'Distribuição por {0}',
unmatched: 'Sem correspondência',
modelAccount: 'Conta de modelo',
modelAccount: 'Serviço de modelo',
serviceProvider: 'Provedor',
tokenUsage: 'Uso de Token',
percent: 'Percentual',
@@ -1699,6 +1699,8 @@ const message = {
timeToFirstToken: 'Latência média do primeiro token',
timePerOutputToken: 'Latência média entre tokens',
requestLatency: 'Latência média da solicitação',
noMetrics:
'O endpoint de métricas está acessível, mas ainda não há métricas compatíveis do vLLM. Algumas podem aparecer apenas após a primeira solicitação de inferência.',
unavailable:
'Métricas indisponíveis. Verifique se a instância está em execução e se /metrics está acessível.',
loadFailed: 'Falha ao carregar os dados. Tente novamente.',
@@ -2867,7 +2869,7 @@ const message = {
scrollSensitivity: 'Sensibilidade de rolagem',
aiAssistant: 'Assistente de IA',
aiAccountHelper:
'Use a conta de modelo selecionada para gerar e preencher comandos. Para modelos locais como Ollama e vLLM, use uma conta de modelo personalizada.',
'Use o serviço de modelo selecionado para gerar e preencher comandos. Para modelos locais como Ollama e vLLM, use um serviço de modelo personalizado.',
aiPrefix: 'Prefixo de disparo',
aiPrefixHelper:
'Digite "prefixo + espaço" e pressione Enter para acionar a geração de comandos por IA, por exemplo: {0} me ajude a consultar as informações do disco.',
@@ -3119,7 +3121,7 @@ const message = {
aiSearchHint:
'Pesquise o conteúdo do arquivo linha por linha. Use os botões à direita da barra de busca e as "Condições avançadas" abaixo. Quando a conta de IA estiver ativada e salva, também será possível gerar um resumo em Markdown.',
aiSearchAccountTitle: 'Conta de IA',
aiSearchAccountIntro: 'Escolha uma conta de modelo para gerar resumos e clique em salvar após as alterações.',
aiSearchAccountIntro: 'Escolha um serviço de modelo para gerar resumos e clique em salvar após as alterações.',
aiSearchAccountEnable: 'Ativar pesquisa de IA em arquivos',
aiSearchSaveAccount: 'Salvar configuração da conta',
aiSearchSectionQuery: 'Pesquisa',
@@ -4082,11 +4084,11 @@ const message = {
'Atualize para a edição comercial para atualizar versões de aplicativos multi-nó sem alternar manualmente entre os nós.',
nodeDashboard:
'Atualize para a edição comercial para gerenciar aplicativos, sites, bancos de dados e tarefas agendadas multi-nó de forma centralizada.',
imageExchange: 'Atualize para a edição comercial para transferir imagens de contêineres entre nós em lote.',
imageExchange: 'Atualize para a edição comercial para transferir imagens de contêineres em lote entre nós.',
appExchange:
'Atualize para a edição comercial para migrar aplicativos instalados para nós de destino e confirmar os recursos necessários.',
'Atualize para a edição comercial para migrar aplicativos instalados para nós de destino e confirmar suas dependências de recursos.',
sslSync:
'Atualize para a edição comercial para sincronizar certificados do nó de origem com um ou mais nós de destino.',
'Atualize para a edição comercial para sincronizar certificados de um nó de origem com um ou mais nós de destino.',
phpExtensionsSync:
'Atualize para a edição comercial para sincronizar modelos de extensões PHP com um ou mais nós de destino.',
fileExchange: 'Atualize para a edição comercial para transferir arquivos rapidamente entre vários servidores.',
@@ -7181,37 +7183,38 @@ const message = {
nodeContent4: 'Conecte-se diretamente a terminais remotos de nós com um clique',
imageExchangeTitle1: 'Selecionar imagens de origem',
imageExchangeContent1:
'Veja as imagens de contêineres no nó de origem e selecione as que deseja transferir.',
imageExchangeTitle2: 'Distribuir imagens em lote',
'Consulte as imagens de contêineres do nó de origem e selecione as que deseja transferir.',
imageExchangeTitle2: 'Distribuir imagens',
imageExchangeContent2: 'Transfira as imagens selecionadas para um ou mais nós de destino.',
imageExchangeTitle3: 'Ver logs de transferência',
imageExchangeContent3:
'Acompanhe o progresso e os resultados da transferência de imagens nos logs de tarefas.',
appExchangeTitle1: 'Selecionar aplicativo de origem',
appExchangeContent1: 'Veja os aplicativos instalados no nó de origem e selecione o que deseja migrar.',
appExchangeTitle1: 'Selecionar um aplicativo',
appExchangeContent1: 'Consulte os aplicativos instalados no nó de origem e selecione um para migrar.',
appExchangeTitle2: 'Confirmar dependências',
appExchangeContent2:
'Confirme os nós de destino e os recursos necessários, como bancos de dados, antes da migração.',
'Antes da migração, confirme os nós de destino e os recursos necessários, como bancos de dados.',
appExchangeTitle3: 'Migrar aplicativos',
appExchangeContent3:
'Transfira backups dos aplicativos para restauração nos nós de destino e veja os resultados nos logs de tarefas.',
'Transfira os backups dos aplicativos para os nós de destino para restauração e consulte os resultados nos logs de tarefas.',
sslSyncTitle1: 'Selecionar certificados',
sslSyncContent1: 'Veja os detalhes dos certificados no nó de origem e selecione os que deseja sincronizar.',
sslSyncTitle2: 'Sincronizar certificados entre nós',
sslSyncContent1:
'Consulte os detalhes dos certificados do nó de origem e selecione os que deseja sincronizar.',
sslSyncTitle2: 'Sincronizar entre nós',
sslSyncContent2:
'Sincronize os certificados selecionados com os nós de destino, excluindo automaticamente o nó de origem.',
sslSyncTitle3: 'Confirmar tarefas de sincronização',
sslSyncContent3:
'Confira os nós de destino e os certificados antes da execução e veja os resultados nos logs de tarefas.',
phpExtensionsSyncTitle1: 'Selecionar modelo de extensões',
'Revise os nós de destino e os certificados antes da execução e consulte os resultados nos logs de tarefas.',
phpExtensionsSyncTitle1: 'Selecionar um modelo',
phpExtensionsSyncContent1:
'Veja os nomes dos modelos e suas listas de extensões no nó de origem e selecione o modelo que deseja sincronizar.',
phpExtensionsSyncTitle2: 'Sincronizar modelos entre nós',
'Consulte os nomes dos modelos e as listas de extensões do nó de origem e selecione um modelo para sincronizar.',
phpExtensionsSyncTitle2: 'Sincronizar modelos',
phpExtensionsSyncContent2:
'Sincronize o modelo selecionado com os nós de destino, excluindo automaticamente o nó de origem.',
phpExtensionsSyncTitle3: 'Verificar modelos existentes',
phpExtensionsSyncContent3:
'Modelos com nome e conteúdo idênticos são ignorados. Conteúdos diferentes geram um aviso de conflito, sem sobrescrever o modelo.',
'Modelos com nome e conteúdo idênticos são ignorados. Conteúdos diferentes são sinalizados como conflitos e não são sobrescritos.',
fileExchangeTitle1: 'Transmissão de Autenticação por Chave',
fileExchangeContent1: 'Autentique via chaves SSH para garantir a segurança da transmissão.',
fileExchangeTitle2: 'Sincronização de Arquivos Eficiente',
@@ -7741,10 +7744,10 @@ const message = {
phpExtensionsTitle: 'Sincronização de modelos de extensões',
phpExtensionsDesc:
'Selecione um nó de origem para sincronizar seu modelo de extensões PHP com os nós de destino.',
phpExtensionsList: 'Lista de extensões',
phpExtensionsConfirm: 'Sincronizar {0} modelos de extensões PHP com {1} nós.',
phpExtensionsList: 'Extensões PHP',
phpExtensionsConfirm: 'Serão sincronizados {0} modelos de extensões PHP com {1} nós.',
phpExtensionsConflictHint:
'Modelos com o mesmo nome e conteúdo são ignorados. Se o nome for igual e o conteúdo diferente, o conflito será informado sem sobrescrever o modelo.',
'Modelos idênticos são ignorados. Modelos com o mesmo nome e conteúdo diferente são sinalizados como conflitos e não são sobrescritos.',
sslBatchDesc:
'Após selecionar o nó de origem, os certificados especificados podem ser sincronizados com o ambiente atual do painel.',
sslBatchConfirmPrefix: 'Serão sincronizados {0} certificados para {1} nós, totalizando {2} tarefas.',
+37 -36
View File
@@ -802,7 +802,7 @@ const message = {
nativeAgentAccessUnavailable:
'У существующей установки нет совместимого HTTPS-адреса или порта. Проверьте настройки приложения.',
agent: 'Агент',
account: 'Аккаунт модели',
account: 'Сервис модели',
batchOperation: 'Пакетная операция',
operationType: 'Тип операции',
batchAction: 'Пакетно {0}',
@@ -816,10 +816,10 @@ const message = {
skillSource: 'Источник Skill',
skillKeyword: 'Ключевое слово Skill',
clawHubSkillPlaceholder: 'Сначала найдите и выберите Skill',
noAccountHint: 'Выберите существующий аккаунт модели или добавьте новый.',
accountCount: '{0} аккаунтов модели',
noAccountHint: 'Выберите существующий сервис модели или добавьте новый.',
accountCount: '{0} сервисов модели',
syncAgents: 'Синхронизировать связанные агенты',
syncAgentsHelper: 'Обновите openclaw.json для агентов, использующих этот аккаунт модели',
syncAgentsHelper: 'Обновите openclaw.json для агентов, использующих этот сервис модели',
appVersion: 'Версия приложения',
webuiPort: 'Порт WebUI',
tokenOrAuth: 'Token/Аутентификация',
@@ -859,7 +859,7 @@ const message = {
useModelDefault: 'Использовать значение модели',
reasoning: 'Модель рассуждений',
verified: 'Проверено',
verifySkipped: 'Без проверки',
verifySkipped: 'Проверка не требуется',
skillsTab: 'Навыки',
pluginsTab: 'Плагины',
pluginsInstalled: 'Установленные',
@@ -1216,9 +1216,9 @@ const message = {
notInstalled: 'Не установлен',
usage: 'Использование',
accountPool: 'Пул аккаунтов',
importModelAccount: 'Импортировать аккаунт модели',
editModelAccount: 'Редактировать аккаунт модели',
selectModelAccount: 'Выберите существующий аккаунт модели',
importModelAccount: 'Импортировать сервис модели',
editModelAccount: 'Редактировать сервис модели',
selectModelAccount: 'Выберите существующий сервис модели',
upstreamApiAddress: 'Адрес API upstream',
priority: 'Приоритет',
healthStatus: 'Состояние',
@@ -1274,8 +1274,8 @@ const message = {
waitingQueue: 'Текущая очередь ожидания',
currentActiveUsers: 'Активные пользователи сейчас',
activeStreamingRequests: 'Активные потоковые запросы',
modelAccountConcurrency: 'Параллельность модельных аккаунтов',
accountAvailability: 'Доступность модельных аккаунтов',
modelAccountConcurrency: 'Параллельность модельных сервисов',
accountAvailability: 'Доступность модельных сервисов',
capacityFull: 'Лимит исчерпан',
groupConcurrency: 'Параллельность групп пользователей',
apiKeyConcurrency: 'Параллельность API Key',
@@ -1330,7 +1330,7 @@ const message = {
esLogCircuitUntil: 'ES разомкнута до',
serviceOperateConfirm: 'Подтвердить {0} сервис AI-шлюза?',
deleteTargetConfirm: 'Удалить {0} {1}?',
deleteBackendTitle: 'Удалить аккаунт модели',
deleteBackendTitle: 'Удалить сервис модели',
userFallback: 'Удаленный пользователь (ID: {0})',
requestModel: 'Запрошенная модель',
upstreamModel: 'Upstream-модель',
@@ -1343,7 +1343,7 @@ const message = {
usageTrend: 'Тренд использования',
distributionBy: 'Распределение по {0}',
unmatched: 'Не сопоставлено',
modelAccount: 'Аккаунт модели',
modelAccount: 'Сервис модели',
serviceProvider: 'Провайдер',
tokenUsage: 'Использование Token',
percent: 'Доля',
@@ -1694,6 +1694,8 @@ const message = {
timeToFirstToken: 'Среднее время до первого токена',
timePerOutputToken: 'Средняя задержка между токенами',
requestLatency: 'Средняя задержка запроса',
noMetrics:
'Конечная точка метрик доступна, но поддерживаемых метрик vLLM пока нет. Некоторые метрики могут появиться только после первого запроса к модели.',
unavailable: 'Метрики недоступны. Проверьте, что экземпляр запущен и /metrics доступен.',
loadFailed: 'Не удалось загрузить данные мониторинга. Повторите попытку.',
helper: 'Сбор, интервал и срок хранения настраиваются в параметрах мониторинга.',
@@ -2853,7 +2855,7 @@ const message = {
scrollSensitivity: 'Чувствительность прокрутки',
aiAssistant: 'AI-помощник',
aiAccountHelper:
'Используйте выбранный модельный аккаунт для генерации и подстановки команд. Для локальных моделей, таких как Ollama и vLLM, используйте пользовательский модельный аккаунт.',
'Используйте выбранный модельный сервис для генерации и подстановки команд. Для локальных моделей, таких как Ollama и vLLM, используйте пользовательский модельный сервис.',
aiPrefix: 'Префикс запуска',
aiPrefixHelper:
'Введите "префикс + пробел" и нажмите Enter, чтобы запустить генерацию команд ИИ, например: {0} помоги мне показать информацию о диске.',
@@ -3106,7 +3108,7 @@ const message = {
aiSearchHint:
'Ищет содержимое файлов построчно. Используйте кнопки справа от строки поиска и "Дополнительные условия" ниже. После включения и сохранения аккаунта ИИ можно также генерировать Markdown-сводку.',
aiSearchAccountTitle: 'Аккаунт ИИ',
aiSearchAccountIntro: 'Выберите аккаунт большой модели для генерации сводок и сохраните изменения.',
aiSearchAccountIntro: 'Выберите сервис большой модели для генерации сводок и сохраните изменения.',
aiSearchAccountEnable: 'Включить ИИ-поиск по файлам',
aiSearchSaveAccount: 'Сохранить настройки аккаунта',
aiSearchSectionQuery: 'Поиск',
@@ -4058,13 +4060,13 @@ const message = {
'Обновление до коммерческой редакции позволяет унифицированно обновлять версии приложений на нескольких узлах без необходимости ручного переключения узлов.',
nodeDashboard:
'Обновление до коммерческой редакции позволяет централизованно управлять приложениями, веб-сайтами, базами данных и запланированными задачами на нескольких узлах.',
imageExchange: 'Перейдите на коммерческую версию для пакетной передачи образов контейнеров между узлами.',
imageExchange: 'Обновите до Коммерческой версии, чтобы передавать образы контейнеров между узлами пакетами.',
appExchange:
'Перейдите на коммерческую версию для переноса установленных приложений на целевые узлы и подтверждения зависимых ресурсов.',
'Обновите до Коммерческой версии, чтобы переносить установленные приложения на целевые узлы и проверять необходимые ресурсы.',
sslSync:
'Перейдите на коммерческую версию для синхронизации сертификатов исходного узла с одним или несколькими целевыми узлами.',
'Обновите до Коммерческой версии, чтобы синхронизировать сертификаты исходного узла с одним или несколькими целевыми узлами.',
phpExtensionsSync:
'Перейдите на коммерческую версию для синхронизации шаблонов расширений PHP с одним или несколькими целевыми узлами.',
'Обновите до Коммерческой версии, чтобы синхронизировать шаблоны расширений PHP с одним или несколькими целевыми узлами.',
fileExchange: 'Обновите до Коммерческой версии, чтобы быстро передавать файлы между несколькими серверами.',
app: 'Обновите до коммерческой версии, чтобы просматривать информацию о сервисах, мониторинг аномалий и т.д. через мобильное приложение.',
cluster: 'Обновление до коммерческой версии позволяет управлять кластерами мастер-слейв MySQL/Postgres/Redis.',
@@ -7155,35 +7157,34 @@ const message = {
nodeContent4: 'Одним кликом подключитесь к удаленным терминалам узлов',
imageExchangeTitle1: 'Выбор исходных образов',
imageExchangeContent1: 'Просмотрите образы контейнеров на исходном узле и выберите образы для передачи.',
imageExchangeTitle2: 'Пакетная передача образов',
imageExchangeContent2: 'Передавайте выбранные образы на один или несколько целевых узлов.',
imageExchangeTitle2: 'Распространение образов',
imageExchangeContent2: 'Передайте выбранные образы на один или несколько целевых узлов.',
imageExchangeTitle3: 'Просмотр журналов передачи',
imageExchangeContent3: 'Отслеживайте ход и результаты передачи образов в журналах задач.',
appExchangeTitle1: 'Выбор исходного приложения',
appExchangeTitle1: 'Выбор приложения',
appExchangeContent1:
'Просмотрите установленные приложения на исходном узле и выберите приложение для переноса.',
appExchangeTitle2: 'Подтверждение зависимостей',
appExchangeContent2:
'Перед переносом подтвердите целевые узлы и необходимые ресурсы, например базы данных.',
appExchangeTitle2: 'Проверка зависимостей',
appExchangeContent2: 'Перед переносом проверьте целевые узлы и необходимые ресурсы, например базы данных.',
appExchangeTitle3: 'Перенос приложений',
appExchangeContent3:
'Передавайте резервные копии приложений на целевые узлы для восстановления и просматривайте результаты в журналах задач.',
'Передайте резервные копии приложений на целевые узлы для восстановления и просмотрите результаты в журналах задач.',
sslSyncTitle1: 'Выбор сертификатов',
sslSyncContent1:
'Просмотрите сведения о сертификатах на исходном узле и выберите сертификаты для синхронизации.',
sslSyncTitle2: 'Синхронизация сертификатов между узлами',
'Просмотрите сведения о сертификатах исходного узла и выберите сертификаты для синхронизации.',
sslSyncTitle2: 'Синхронизация между узлами',
sslSyncContent2:
'Синхронизируйте выбранные сертификаты с целевыми узлами, автоматически исключая исходный узел.',
'Синхронизируйте выбранные сертификаты с целевыми узлами, автоматически исключив исходный узел.',
sslSyncTitle3: 'Подтверждение задач синхронизации',
sslSyncContent3:
'Проверьте целевые узлы и сертификаты перед выполнением, затем просмотрите результаты в журналах задач.',
phpExtensionsSyncTitle1: 'Выбор шаблона расширений',
'Перед выполнением проверьте целевые узлы и сертификаты, а затем просмотрите результаты в журналах задач.',
phpExtensionsSyncTitle1: 'Выбор шаблона',
phpExtensionsSyncContent1:
'Просмотрите имена шаблонов и списки расширений на исходном узле и выберите шаблон для синхронизации.',
phpExtensionsSyncTitle2: 'Синхронизация шаблонов между узлами',
phpExtensionsSyncTitle2: 'Синхронизация шаблонов',
phpExtensionsSyncContent2:
'Синхронизируйте выбранный шаблон с целевыми узлами, автоматически исключая исходный узел.',
phpExtensionsSyncTitle3: 'Проверка одноимённых шаблонов',
'Синхронизируйте выбранный шаблон с целевыми узлами, автоматически исключив исходный узел.',
phpExtensionsSyncTitle3: 'Проверка существующих шаблонов',
phpExtensionsSyncContent3:
'Шаблоны с одинаковыми именами и содержимым пропускаются. При различии содержимого сообщается о конфликте без перезаписи.',
fileExchangeTitle1: 'Передача с аутентификацией по ключу',
@@ -7720,10 +7721,10 @@ const message = {
phpExtensionsTitle: 'Синхронизация шаблонов расширений',
phpExtensionsDesc:
'Выберите исходный узел, чтобы синхронизировать его шаблон расширений PHP с целевыми узлами.',
phpExtensionsList: 'Список расширений',
phpExtensionsConfirm: 'Синхронизировать шаблоны расширений PHP ({0}) с узлами ({1}).',
phpExtensionsList: 'Расширения PHP',
phpExtensionsConfirm: 'Будет синхронизировано шаблонов расширений PHP: {0}; целевых узлов: {1}.',
phpExtensionsConflictHint:
'Шаблоны с одинаковыми именами и содержимым пропускаются. При совпадении имени и различии содержимого сообщается о конфликте без перезаписи.',
'Идентичные шаблоны пропускаются. Шаблоны с одинаковыми именами и разным содержимым отмечаются как конфликтующие и не перезаписываются.',
sslBatchDesc:
'После выбора исходного узла указанные сертификаты можно синхронизировать с текущей средой панели.',
sslBatchConfirmPrefix: 'Будет синхронизировано {0} сертификатов на {1} узлов, всего {2} задач.',
+45 -41
View File
@@ -808,7 +808,7 @@ const message = {
nativeAgentAccessUnavailable:
'Mevcut kurulumda uyumlu HTTPS erişim adresi veya bağlantı noktası yok. Uygulama ayarlarını kontrol edin.',
agent: 'Ajan',
account: 'Model hesabı',
account: 'Model hizmeti',
batchOperation: 'Toplu işlem',
operationType: 'İşlem türü',
batchAction: 'Toplu {0}',
@@ -822,10 +822,10 @@ const message = {
skillSource: 'Skill Kaynağı',
skillKeyword: 'Skill Anahtar Kelimesi',
clawHubSkillPlaceholder: 'Önce bir Skill arayın ve seçin',
noAccountHint: 'Mevcut bir model hesabını seçin veya yeni bir tane ekleyin.',
accountCount: '{0} model hesabı',
noAccountHint: 'Mevcut bir model hizmetinı seçin veya yeni bir tane ekleyin.',
accountCount: '{0} model hizmeti',
syncAgents: 'İlişkili ajanları senkronize et',
syncAgentsHelper: 'Bu model hesabını kullanan ajanlar için openclaw.json dosyasını güncelleyin',
syncAgentsHelper: 'Bu model hizmetinı kullanan ajanlar için openclaw.json dosyasını güncelleyin',
appVersion: 'Uygulama sürümü',
webuiPort: 'WebUI portu',
tokenOrAuth: 'Token/Kimlik Doğrulama',
@@ -866,7 +866,7 @@ const message = {
useModelDefault: 'Model varsayılanını kullan',
reasoning: 'Akıl yürütme modeli',
verified: 'Doğrulandı',
verifySkipped: 'Doğrulama yok',
verifySkipped: 'Doğrulama gerekmiyor',
skillsTab: 'Yetenekler',
pluginsTab: 'Eklentiler',
pluginsInstalled: 'Yüklü',
@@ -1224,9 +1224,9 @@ const message = {
notInstalled: 'Kurulu değil',
usage: 'Kullanım',
accountPool: 'Hesap Havuzu',
importModelAccount: 'Model hesabını içe aktar',
editModelAccount: 'Model hesabını düzenle',
selectModelAccount: 'Mevcut bir model hesabı seçin',
importModelAccount: 'Model hizmetinı içe aktar',
editModelAccount: 'Model hizmetinı düzenle',
selectModelAccount: 'Mevcut bir model hizmeti seçin',
upstreamApiAddress: 'Yukarı Akış API Adresi',
priority: 'Öncelik',
healthStatus: 'Sağlık durumu',
@@ -1282,8 +1282,8 @@ const message = {
waitingQueue: 'Mevcut bekleme kuyruğu',
currentActiveUsers: 'Şu anda aktif kullanıcılar',
activeStreamingRequests: 'Aktif akış istekleri',
modelAccountConcurrency: 'Model hesabı eşzamanlılığı',
accountAvailability: 'Model hesabı kullanılabilirliği',
modelAccountConcurrency: 'Model hizmeti eşzamanlılığı',
accountAvailability: 'Model hizmeti kullanılabilirliği',
capacityFull: 'Kapasite dolu',
groupConcurrency: 'Kullanıcı grubu eşzamanlılığı',
apiKeyConcurrency: 'API Key eşzamanlılığı',
@@ -1337,7 +1337,7 @@ const message = {
esLogCircuitUntil: 'ES devresi şu zamana kadar',
serviceOperateConfirm: 'AI Ağ Geçidi servisini {0} onaylıyor musunuz?',
deleteTargetConfirm: '{0} {1} silinsin mi?',
deleteBackendTitle: 'Model hesabını sil',
deleteBackendTitle: 'Model hizmetinı sil',
userFallback: 'Silinen kullanıcı (ID: {0})',
requestModel: 'İstek modeli',
upstreamModel: 'Upstream model',
@@ -1350,7 +1350,7 @@ const message = {
usageTrend: 'Kullanım eğilimi',
distributionBy: '{0} dağılımı',
unmatched: 'Eşleşmedi',
modelAccount: 'Model hesabı',
modelAccount: 'Model hizmeti',
serviceProvider: 'Sağlayıcı',
tokenUsage: 'Token kullanımı',
percent: 'Yüzde',
@@ -1698,6 +1698,8 @@ const message = {
timeToFirstToken: 'Ortalama ilk token gecikmesi',
timePerOutputToken: 'Ortalama token arası gecikme',
requestLatency: 'Ortalama istek gecikmesi',
noMetrics:
'Metrik uç noktasına erişilebiliyor, ancak henüz desteklenen vLLM metrikleri yok. Bazı metrikler yalnızca ilk çıkarım isteğinden sonra görünebilir.',
unavailable:
'Metrikler kullanılamıyor. Örneğin çalıştığını ve /metrics yolunun erişilebilir olduğunu kontrol edin.',
loadFailed: 'İzleme verileri yüklenemedi. Tekrar deneyin.',
@@ -2855,7 +2857,7 @@ const message = {
scrollSensitivity: 'Kaydırma Hassasiyeti',
aiAssistant: 'AI Asistani',
aiAccountHelper:
'Komut üretmek ve doldurmak için seçili model hesabını kullanın. Ollama ve vLLM gibi yerel modeller için özel model hesabı kullanın.',
'Komut üretmek ve doldurmak için seçili model hizmetinı kullanın. Ollama ve vLLM gibi yerel modeller için özel model hizmeti kullanın.',
aiPrefix: 'Tetikleme öneki',
aiPrefixHelper:
'"Önek + boşluk" girip Enter tuşuna bastığınızda AI komut üretimi tetiklenir; örneğin: {0} disk bilgisini sorgulamama yardım et.',
@@ -3111,7 +3113,7 @@ const message = {
aiSearchHint:
'Dosya içeriğini satır satır arar. Arama satırının sağındaki düğmeleri ve alttaki "Gelişmiş koşullar"ı kullanın. AI hesabı etkinleştirilip kaydedildiğinde Markdown özeti de oluşturulabilir.',
aiSearchAccountTitle: 'AI hesabı',
aiSearchAccountIntro: 'Özet için kullanılacak model hesabını seçin, ardından kaydedin.',
aiSearchAccountIntro: 'Özet için kullanılacak model hizmetinı seçin, ardından kaydedin.',
aiSearchAccountEnable: 'Dosya AI aramasını etkinleştir',
aiSearchSaveAccount: 'Hesap yapılandırmasını kaydet',
aiSearchSectionQuery: 'Arama',
@@ -4071,13 +4073,14 @@ const message = {
'Ticari sürüme yükselterek düğümleri manuel değiştirmeden çok düğümlü uygulama sürümlerini toplu olarak yükseltebilirsiniz.',
nodeDashboard:
'Ticari sürüme yükselterek çok düğümlü uygulamaları, web sitelerini, veritabanlarını ve zamanlanmış görevleri merkezi olarak yönetebilirsiniz.',
imageExchange: 'Konteyner imajlarını düğümler arasında toplu olarak aktarmak için ticari sürüme yükseltin.',
imageExchange:
'Ticari sürüme yükselterek konteyner imajlarını düğümler arasında toplu olarak aktarabilirsiniz.',
appExchange:
'Kurulu uygulamaları hedef düğümlere taşımak ve gerekli kaynak bağımlılıklarını onaylamak için ticari sürüme yükseltin.',
'Ticari sürüme yükselterek yüklü uygulamaları hedef düğümlere taşıyabilir ve gerekli kaynak bağımlılıklarını doğrulayabilirsiniz.',
sslSync:
'Kaynak düğümdeki sertifikaları bir veya daha fazla hedef düğümle eşitlemek için ticari sürüme yükseltin.',
'Ticari sürüme yükselterek kaynak düğümdeki sertifikaları bir veya daha fazla hedef düğümle eşitleyebilirsiniz.',
phpExtensionsSync:
'PHP eklenti şablonlarını bir veya daha fazla hedef düğümle eşitlemek için ticari sürüme yükseltin.',
'Ticari sürüme yükselterek PHP uzantı şablonlarını bir veya daha fazla hedef düğümle eşitleyebilirsiniz.',
fileExchange: 'Ticari sürüme yükselterek birden fazla sunucu arasında dosyaları hızlıca aktarabilirsiniz.',
app: 'Ticari sürüme yükselterek mobil uygulamada hizmet bilgilerini ve anormallik izlemeyi görüntüleyebilirsiniz.',
cluster: 'Ticari sürüme yükselterek MySQL/Postgres/Redis birincil-kopya kümelerini yönetebilirsiniz.',
@@ -7157,35 +7160,36 @@ const message = {
nodeTitle4: 'Hızlı Uzak Bağlantı',
nodeContent4: 'Düğümlere tek tıkla doğrudan uzak terminal bağlantısı',
imageExchangeTitle1: 'Kaynak imajları seçin',
imageExchangeContent1: 'Kaynak düğümdeki konteyner imajlarını görüntüleyin ve aktarılacak imajları seçin.',
imageExchangeTitle2: 'İmajları toplu dağıtın',
imageExchangeContent1: 'Kaynak düğümdeki konteyner imajlarını inceleyin ve aktarılacak imajları seçin.',
imageExchangeTitle2: 'İmajları dağıtın',
imageExchangeContent2: 'Seçilen imajları bir veya daha fazla hedef düğüme aktarın.',
imageExchangeTitle3: 'Aktarım günlüklerini görüntüleyin',
imageExchangeContent3: 'İmaj aktarımının ilerlemesini ve sonuçlarını görev günlüklerinden takip edin.',
appExchangeTitle1: 'Kaynak uygulamayı seçin',
appExchangeContent1: 'Kaynak düğümde kurulu uygulamaları görüntüleyin ve taşınacak uygulamayı seçin.',
appExchangeTitle2: 'Bağımlılıkları onaylayın',
appExchangeContent2: 'Taşıma öncesinde hedef düğümleri ve veritabanları gibi gerekli kaynakları onaylayın.',
appExchangeTitle1: 'Bir uygulama seçin',
appExchangeContent1: 'Kaynak düğümde yüklü uygulamaları inceleyin ve taşınacak uygulamayı seçin.',
appExchangeTitle2: 'Bağımlılıkları doğrulayın',
appExchangeContent2:
'Taşıma işleminden önce hedef düğümleri ve veritabanları gibi gerekli kaynakları doğrulayın.',
appExchangeTitle3: 'Uygulamaları taşıyın',
appExchangeContent3:
'Uygulama yedeklerini geri yüklemek üzere hedef düğümlere aktarın ve sonuçları görev günlüklerinden görüntüleyin.',
'Uygulama yedeklerini geri yüklemek için hedef düğümlere aktarın ve sonuçları görev günlüklerinde görüntüleyin.',
sslSyncTitle1: 'Sertifikaları seçin',
sslSyncContent1: 'Kaynak düğümdeki sertifika bilgilerini görüntüleyin ve eşitlenecek sertifikaları seçin.',
sslSyncTitle2: 'Düğümler arasında sertifika eşitleme',
sslSyncContent1: 'Kaynak düğümdeki sertifika bilgilerini inceleyin ve eşitlenecek sertifikaları seçin.',
sslSyncTitle2: 'Düğümler arasında eşitleyin',
sslSyncContent2:
'Kaynak düğümü otomatik olarak hariç tutarak seçilen sertifikaları hedef düğümlerle eşitleyin.',
'Kaynak düğüm otomatik olarak hariç tutularak seçilen sertifikaları hedef düğümlerle eşitleyin.',
sslSyncTitle3: 'Eşitleme görevlerini onaylayın',
sslSyncContent3:
'Çalıştırmadan önce hedef düğümleri ve sertifikaları kontrol edin, ardından sonuçları görev günlüklerinden görüntüleyin.',
phpExtensionsSyncTitle1: 'Eklenti şablonunu seçin',
'İşlemden önce hedef düğümleri ve sertifikaları gözden geçirin, ardından sonuçları görev günlüklerinde görüntüleyin.',
phpExtensionsSyncTitle1: 'Bir şablon seçin',
phpExtensionsSyncContent1:
'Kaynak düğümdeki şablon adlarını ve eklenti listelerini görüntüleyin, eşitlenecek şablonu seçin.',
phpExtensionsSyncTitle2: 'Düğümler arasında şablon eşitleme',
'Kaynak düğümdeki şablon adlarını ve uzantı listelerini inceleyin ve eşitlenecek şablonu seçin.',
phpExtensionsSyncTitle2: 'Şablonları eşitleyin',
phpExtensionsSyncContent2:
'Kaynak düğümü otomatik olarak hariç tutarak seçilen şablonu hedef düğümlerle eşitleyin.',
phpExtensionsSyncTitle3: 'Aynı adlı şablonları kontrol edin',
'Kaynak düğüm otomatik olarak hariç tutularak seçilen şablonu hedef düğümlerle eşitleyin.',
phpExtensionsSyncTitle3: 'Mevcut şablonları kontrol edin',
phpExtensionsSyncContent3:
'Adı ve içeriği aynı olan şablonlar atlanır. İçerik farklıysa çakışma bildirilir ve üzerine yazılmaz.',
'Adı ve içeriği aynı olan şablonlar atlanır. İçerik farklıysa üzerine yazılmadan çakışma bildirilir.',
fileExchangeTitle1: 'Anahtar Kimlik Doğrulama İletimi',
fileExchangeContent1: 'İletim güvenliğini sağlamak için SSH anahtarları ile kimlik doğrulaması yapar.',
fileExchangeTitle2: 'Verimli Dosya Senkronizasyonu',
@@ -7710,13 +7714,13 @@ const message = {
imageBatchConfirmPrefix: '{0} imaj {1} düğüme aktarılacak, toplam {2} görev oluşturulacak.',
ssl: 'Sertifika Senkronizasyonu',
phpExtensions: 'PHP Eklenti Şablonu Eşitleme',
phpExtensionsTitle: 'Eklenti Şablonu Eşitleme',
phpExtensionsDesc: 'PHP eklenti şablonunu hedef düğümlerle eşitlemek için bir kaynak düğüm seçin.',
phpExtensionsList: 'Eklenti listesi',
phpExtensionsConfirm: '{0} PHP eklenti şablonu {1} düğümle eşitlenecek.',
phpExtensions: 'PHP Uzantı Şablonu Eşitleme',
phpExtensionsTitle: 'Uzantı Şablonu Eşitleme',
phpExtensionsDesc: 'PHP uzantı şablonunu hedef düğümlerle eşitlemek için bir kaynak düğüm seçin.',
phpExtensionsList: 'PHP uzantıları',
phpExtensionsConfirm: '{0} PHP uzantı şablonu {1} düğümle eşitlenecek.',
phpExtensionsConflictHint:
'Adı ve içeriği aynı olan şablonlar atlanır. Adı aynı ancak içeriği farklı olan şablonlar için çakışma bildirilir ve üzerine yazılmaz.',
'Aynı şablonlar atlanır. Adı aynı ancak içeriği farklı olan şablonlar çakışma olarak bildirilir ve üzerlerine yazılmaz.',
sslBatchDesc:
'Kaynak düğüm seçildikten sonra belirtilen sertifikalar mevcut panel ortamına senkronize edilebilir.',
sslBatchConfirmPrefix: '{0} sertifika {1} düğüme senkronize edilecek, toplam {2} görev oluşturulacak.',
+15 -14
View File
@@ -766,7 +766,7 @@ const message = {
initialCredentials: '初始登入資訊;若已在應用程式內修改,以目前密碼為準。',
nativeAgentAccessUnavailable: '現有安裝缺少相容的 HTTPS 存取位址或連接埠,請檢查應用程式設定。',
agent: 'Agent',
account: '模型帳號',
account: '模型服務',
batchOperation: '批次操作',
operationType: '操作類型',
batchAction: '批次{0}',
@@ -780,10 +780,10 @@ const message = {
skillSource: 'Skill 來源',
skillKeyword: 'Skill 關鍵字',
clawHubSkillPlaceholder: '請先搜尋並選擇 Skill',
noAccountHint: '選擇現有模型帳號,或新增帳號。',
accountCount: '{0} 個模型帳號',
noAccountHint: '選擇現有模型服務,或新增帳號。',
accountCount: '{0} 個模型服務',
syncAgents: '同步相關 Agent',
syncAgentsHelper: '更新所有使用此模型帳號的 Agent 設定檔 openclaw.json',
syncAgentsHelper: '更新所有使用此模型服務的 Agent 設定檔 openclaw.json',
appVersion: '應用程式版本',
webuiPort: 'WebUI 埠',
tokenOrAuth: 'Token/Auth',
@@ -820,7 +820,7 @@ const message = {
useModelDefault: '使用模型預設值',
reasoning: '推理模型',
verified: '驗證成功',
verifySkipped: '略過驗證',
verifySkipped: '無需驗證',
skillsTab: 'Skill',
pluginsTab: '外掛',
pluginsInstalled: '已安裝',
@@ -1143,9 +1143,9 @@ const message = {
notInstalled: '未安裝',
usage: '用量統計',
accountPool: '帳號池',
importModelAccount: '匯入模型帳號',
editModelAccount: '編輯模型帳號',
selectModelAccount: '選擇已有模型帳號',
importModelAccount: '匯入模型服務',
editModelAccount: '編輯模型服務',
selectModelAccount: '選擇已有模型服務',
upstreamApiAddress: '上游 API 地址',
priority: '優先級',
healthStatus: '健康狀態',
@@ -1199,8 +1199,8 @@ const message = {
waitingQueue: '目前等待佇列',
currentActiveUsers: '目前活躍使用者',
activeStreamingRequests: '目前串流請求',
modelAccountConcurrency: '模型帳號併發',
accountAvailability: '模型帳號可用性',
modelAccountConcurrency: '模型服務併發',
accountAvailability: '模型服務可用性',
capacityFull: '已滿載',
groupConcurrency: '使用者群組併發',
apiKeyConcurrency: 'API Key 併發',
@@ -1252,7 +1252,7 @@ const message = {
esLogCircuitUntil: 'ES 熔斷結束時間',
serviceOperateConfirm: '確認{0} AI 閘道服務?',
deleteTargetConfirm: '確認刪除{0} {1}?',
deleteBackendTitle: '刪除模型帳號',
deleteBackendTitle: '刪除模型服務',
userFallback: '已刪除使用者 (ID: {0})',
requestModel: '請求模型',
upstreamModel: '上游模型',
@@ -1265,7 +1265,7 @@ const message = {
usageTrend: '使用趨勢',
distributionBy: '按{0}分佈',
unmatched: '未匹配',
modelAccount: '模型帳號',
modelAccount: '模型服務',
serviceProvider: '服務商',
tokenUsage: 'Token 用量',
percent: '佔比',
@@ -1596,6 +1596,7 @@ const message = {
timeToFirstToken: '平均首 Token 延遲',
timePerOutputToken: '平均 Token 間延遲',
requestLatency: '平均請求延遲',
noMetrics: '指標介面可存取,但暫無可用的 vLLM 指標;部分指標可能在首次推論請求後才會產生。',
unavailable: '無法採集指標,請確認實例已啟動且 /metrics 可存取。',
loadFailed: '監控資料載入失敗,請重試。',
helper: '採集開關、頻率和儲存天數統一在監控設定中調整。',
@@ -2660,7 +2661,7 @@ const message = {
scrollback: '滾動行數',
scrollSensitivity: '滾動速度',
aiAssistant: 'AI 助手',
aiAccountHelper: '使用所選模型帳號生成並回填命令。Ollama、vLLM 本地模型請使用自訂模型帳號。',
aiAccountHelper: '使用所選模型服務生成並回填命令。Ollama、vLLM 本地模型請使用自訂模型服務。',
aiPrefix: '觸發前綴',
aiPrefixHelper: '輸入「前綴 + 空格」並按下 Enter 時,將觸發 AI 指令生成,例如:{0} 幫我查詢磁碟資訊。',
aiRiskCommands: '風險命令攔截',
@@ -2893,7 +2894,7 @@ const message = {
aiSearchHint:
'按檔案內容逐行比對;比對方式見搜尋列右側按鈕與下方「進階條件」。啟用並儲存 AI 帳號後,還可產生 Markdown 摘要。',
aiSearchAccountTitle: 'AI 帳號',
aiSearchAccountIntro: '選擇用於產生摘要的大模型帳號,修改後請點選儲存。',
aiSearchAccountIntro: '選擇用於產生摘要的大模型服務,修改後請點選儲存。',
aiSearchAccountEnable: '啟用檔案 AI 搜尋',
aiSearchSaveAccount: '儲存帳號設定',
aiSearchSectionQuery: '搜尋',
+15 -14
View File
@@ -783,7 +783,7 @@ const message = {
initialCredentials: '初始登录信息;若已在应用内修改,以当前密码为准。',
nativeAgentAccessUnavailable: '现有安装缺少兼容的 HTTPS 访问地址或端口,请检查应用设置。',
agent: '智能体',
account: '模型账号',
account: '模型服务',
batchOperation: '批量操作',
operationType: '操作类型',
batchAction: '批量{0}',
@@ -797,10 +797,10 @@ const message = {
skillSource: 'Skill 来源',
skillKeyword: 'Skill 关键词',
clawHubSkillPlaceholder: '请先搜索并选择 Skill',
noAccountHint: '选择已有模型账号,或直接创建',
accountCount: '模型账号 {0} 个',
noAccountHint: '选择已有模型服务,或直接创建',
accountCount: '模型服务 {0} 个',
syncAgents: '同步关联智能体',
syncAgentsHelper: '更新使用该模型账号的智能体 openclaw.json',
syncAgentsHelper: '更新使用该模型服务的智能体 openclaw.json',
appVersion: '应用版本',
webuiPort: 'WebUI 端口',
tokenOrAuth: 'Token/Auth',
@@ -837,7 +837,7 @@ const message = {
useModelDefault: '使用模型默认值',
reasoning: '推理模型',
verified: '验证成功',
verifySkipped: '不验证',
verifySkipped: '无需验证',
skillsTab: '技能',
pluginsTab: '插件',
pluginsInstalled: '已安装',
@@ -1156,9 +1156,9 @@ const message = {
notInstalled: '未安装',
usage: '用量统计',
accountPool: '账号池',
importModelAccount: '导入模型账号',
editModelAccount: '编辑模型账号',
selectModelAccount: '选择已有模型账号',
importModelAccount: '导入模型服务',
editModelAccount: '编辑模型服务',
selectModelAccount: '选择已有模型服务',
upstreamApiAddress: '上游 API 地址',
priority: '优先级',
healthStatus: '健康状态',
@@ -1213,8 +1213,8 @@ const message = {
waitingQueue: '当前等待队列',
currentActiveUsers: '当前活跃用户',
activeStreamingRequests: '当前流式请求',
modelAccountConcurrency: '模型账号并发',
accountAvailability: '模型账号可用性',
modelAccountConcurrency: '模型服务并发',
accountAvailability: '模型服务可用性',
capacityFull: '满载',
groupConcurrency: '用户组并发',
apiKeyConcurrency: 'API Key 并发',
@@ -1266,7 +1266,7 @@ const message = {
esLogCircuitUntil: 'ES 熔断结束时间',
serviceOperateConfirm: '确认{0} AI 网关服务?',
deleteTargetConfirm: '确认删除{0} {1}?',
deleteBackendTitle: '删除模型账号',
deleteBackendTitle: '删除模型服务',
userFallback: '已删除用户 (ID: {0})',
requestModel: '请求模型',
upstreamModel: '上游模型',
@@ -1279,7 +1279,7 @@ const message = {
usageTrend: '使用趋势',
distributionBy: '按{0}分布',
unmatched: '未匹配',
modelAccount: '模型账号',
modelAccount: '模型服务',
serviceProvider: '服务商',
tokenUsage: 'Token 用量',
percent: '占比',
@@ -1609,6 +1609,7 @@ const message = {
timeToFirstToken: '平均首 Token 延迟',
timePerOutputToken: '平均 Token 间延迟',
requestLatency: '平均请求延迟',
noMetrics: '指标接口可访问,但暂无可用的 vLLM 指标;部分指标可能在首次推理请求后才会产生。',
unavailable: '无法采集指标,请确认实例已启动且 /metrics 可访问。',
loadFailed: '监控数据加载失败,请重试。',
helper: '采集开关、频率和保存天数在监控设置的 vLLM 监控中独立调整。',
@@ -2685,7 +2686,7 @@ const message = {
scrollback: '滚动行数',
scrollSensitivity: '滚动速度',
aiAssistant: 'AI 助手',
aiAccountHelper: '使用所选模型账号生成并回填命令。Ollama、vLLM 本地模型请用自定义模型账号。',
aiAccountHelper: '使用所选模型服务生成并回填命令。Ollama、vLLM 本地模型请用自定义模型服务。',
aiPrefix: '触发前缀',
aiPrefixHelper: '输入“前缀 + 空格”并回车时,将触发 AI 命令生成,例如:{0} 帮我查询磁盘信息。',
aiRiskCommands: '风险命令拦截',
@@ -2903,7 +2904,7 @@ const message = {
aiSearchHint:
'按文件内容逐行匹配;匹配方式见搜索框右侧按钮与下方「高级条件」。启用并保存 AI 账号后,还可生成 Markdown 总结。',
aiSearchAccountTitle: 'AI 账号',
aiSearchAccountIntro: '选择用于生成总结的大模型账号,修改后请点击保存。',
aiSearchAccountIntro: '选择用于生成总结的大模型服务,修改后请点击保存。',
aiSearchAccountEnable: '启用文件 AI 搜索',
aiSearchSaveAccount: '保存账号配置',
aiSearchSectionQuery: '搜索',
+2 -2
View File
@@ -46,12 +46,12 @@ const aiRouter = {
},
{
path: '/ai/model/account',
hidden: true,
name: 'ModelServices',
component: () => import('@/views/ai/model/index.vue'),
meta: {
icon: 'p-moxing-menu',
title: 'aiTools.model.services',
activeMenu: '/ai/model',
activeMenu: '/ai/model/account',
permission: 'ai_model_view',
},
},
@@ -1,3 +1,5 @@
import menuLogo from '../assets/images/1panel-menu-logo.svg?raw';
export interface AgentProviderLogo {
src?: string;
mark: string;
@@ -52,6 +54,12 @@ const providerLogos: Record<string, AgentProviderLogo> = {
borderColor: '#dcdfe6',
source: 'https://vllm.ai/vLLM-Logo.svg',
},
'1panel-ai-gateway': {
src: `data:image/svg+xml,${encodeURIComponent(menuLogo.replace('currentColor', '#005eeb'))}`,
mark: '1P',
background: '#ffffff',
color: '#005eeb',
},
deepseek: {
src: asset('deepseek.png'),
mark: 'DS',
@@ -127,7 +127,9 @@
<el-form-item>
<el-checkbox v-model="form.rememberApiKey">{{ $t('terminal.rememberPassword') }}</el-checkbox>
</el-form-item>
<el-form-item>
<el-form-item
v-if="isImageAPIType || isEmbeddingAPIType || !isAgentAccountVerificationSkipped(form.provider)"
>
<el-switch v-model="form.validateAvailability" />
<el-text class="validate-availability-label">{{ $t('aiTools.agents.validateAvailability') }}</el-text>
<span class="input-help">
+7 -4
View File
@@ -342,11 +342,14 @@ const isCurrentPage = computed(() => route.path === pagePath);
const { isProductPro, isIntl, currentNode, isAdminOrNodeAdmin } = useGlobalStore();
const isFiles = pagePath === '/ai/model/files';
const isLocal = pagePath === '/ai/model/local';
const tabs = computed(() => [
const tabs = computed(() =>
isFiles || isLocal
? [
{ label: i18n.global.t('aiTools.model.files'), path: '/ai/model/files' },
{ label: i18n.global.t('aiTools.model.deployments'), path: '/ai/model/local' },
{ label: i18n.global.t('aiTools.model.services'), path: '/ai/model/account' },
]);
]
: [{ label: i18n.global.t('aiTools.model.services'), path: '/ai/model/account' }],
);
const downloaderView = defineAsyncComponent(() => import('@/views/model-downloader/index.vue'));
const createRef = ref();
const manageRef = ref();
@@ -504,7 +507,7 @@ const search = async () => {
const connectionStatus = (row: AI.AgentAccountItem) => {
if (isAgentAccountVerificationSkipped(row.provider)) {
return { type: 'info' as const, label: i18n.global.t('aiTools.agents.verifySkipped') };
return { type: 'success' as const, label: i18n.global.t('aiTools.agents.verifySkipped') };
}
return {
type: row.verified ? ('success' as const) : ('warning' as const),
@@ -670,7 +670,7 @@ const fileAiVerificationLabel = (item: { provider?: string; verified?: boolean }
const fileAiVerificationTagType = (item: { provider?: string; verified?: boolean }) => {
if (isAgentAccountVerificationSkipped(item.provider)) {
return 'info';
return 'success';
}
return item.verified ? 'success' : 'warning';
};
@@ -135,7 +135,7 @@ const verificationLabel = (item: AgentAccountOption) => {
const verificationTagType = (item: AgentAccountOption) => {
if (isAgentAccountVerificationSkipped(item.provider)) {
return 'info';
return 'success';
}
return item.verified ? 'success' : 'warning';
};