(() => {
+ if (!isActive)
+ return []
+ return instances.map((instance) => {
+ const app = appMap.get(instance.appId)
+ return {
+ id: instance.id,
+ name: instance.name,
+ link: `/deployments/${instance.id}/overview`,
+ icon_type: (app?.iconType ?? null) as AppIconType | null,
+ icon: app?.icon ?? '',
+ icon_background: app?.iconBackground ?? null,
+ icon_url: app?.iconUrl ?? null,
+ mode: app?.mode as unknown as AppModeEnum | undefined,
+ }
+ })
+ }, [instances, appMap, isActive])
+
+ const curNav = useMemo(() => {
+ if (!instanceId)
+ return undefined
+ return navigationItems.find(item => item.id === instanceId)
+ }, [instanceId, navigationItems])
+
+ const handleCreate = useCallback(() => {
+ openCreateInstanceModal()
+ if (selectedSegment !== 'deployments' || instanceId)
+ router.push('/deployments')
+ }, [openCreateInstanceModal, router, selectedSegment, instanceId])
+
+ return (
+ }
+ activeIcon={}
+ text={t('menus.deployments', { ns: 'common' })}
+ activeSegment="deployments"
+ link="/deployments"
+ curNav={curNav}
+ navigationItems={navigationItems}
+ createText={t('deployments:createModal.title')}
+ onCreate={handleCreate}
+ />
+ )
+}
+
+export default DeploymentsNav
diff --git a/web/app/components/header/index.tsx b/web/app/components/header/index.tsx
index c7c12f1e35..d8d26b738d 100644
--- a/web/app/components/header/index.tsx
+++ b/web/app/components/header/index.tsx
@@ -15,6 +15,7 @@ import { Plan } from '../billing/type'
import AccountDropdown from './account-dropdown'
import AppNav from './app-nav'
import DatasetNav from './dataset-nav'
+import DeploymentsNav from './deployments-nav'
import EnvNav from './env-nav'
import ExploreNav from './explore-nav'
import LicenseNav from './license-env'
@@ -85,6 +86,7 @@ const Header = () => {
{!isCurrentWorkspaceDatasetOperator && }
{(isCurrentWorkspaceEditor || isCurrentWorkspaceDatasetOperator) && }
{!isCurrentWorkspaceDatasetOperator && }
+ {isCurrentWorkspaceEditor && }
)
@@ -105,6 +107,7 @@ const Header = () => {
{!isCurrentWorkspaceDatasetOperator && }
{(isCurrentWorkspaceEditor || isCurrentWorkspaceDatasetOperator) && }
{!isCurrentWorkspaceDatasetOperator && }
+ {isCurrentWorkspaceEditor && }
diff --git a/web/i18n-config/resources.ts b/web/i18n-config/resources.ts
index 857440a1ee..9fc9183926 100644
--- a/web/i18n-config/resources.ts
+++ b/web/i18n-config/resources.ts
@@ -13,6 +13,7 @@ import type datasetHitTesting from '../i18n/en-US/dataset-hit-testing.json'
import type datasetPipeline from '../i18n/en-US/dataset-pipeline.json'
import type datasetSettings from '../i18n/en-US/dataset-settings.json'
import type dataset from '../i18n/en-US/dataset.json'
+import type deployments from '../i18n/en-US/deployments.json'
import type education from '../i18n/en-US/education.json'
import type explore from '../i18n/en-US/explore.json'
import type layout from '../i18n/en-US/layout.json'
@@ -46,6 +47,7 @@ export type Resources = {
datasetHitTesting: typeof datasetHitTesting
datasetPipeline: typeof datasetPipeline
datasetSettings: typeof datasetSettings
+ deployments: typeof deployments
education: typeof education
explore: typeof explore
layout: typeof layout
@@ -79,6 +81,7 @@ export const namespaces = [
'datasetHitTesting',
'datasetPipeline',
'datasetSettings',
+ 'deployments',
'education',
'explore',
'layout',
diff --git a/web/i18n/en-US/common.json b/web/i18n/en-US/common.json
index d4f72c242d..f2e41b5820 100644
--- a/web/i18n/en-US/common.json
+++ b/web/i18n/en-US/common.json
@@ -276,6 +276,7 @@
"menus.apps": "Studio",
"menus.datasets": "Knowledge",
"menus.datasetsTips": "COMING SOON: Import your own text data or write data in real-time via Webhook for LLM context enhancement.",
+ "menus.deployments": "Deployments",
"menus.explore": "Explore",
"menus.exploreMarketplace": "Explore Marketplace",
"menus.newApp": "New App",
diff --git a/web/i18n/en-US/deployments.json b/web/i18n/en-US/deployments.json
new file mode 100644
index 0000000000..2d8b00b9dc
--- /dev/null
+++ b/web/i18n/en-US/deployments.json
@@ -0,0 +1,280 @@
+{
+ "access.api.backendTitle": "Backend service API",
+ "access.api.description": "Access this instance over HTTP. Each API key is scoped to one environment.",
+ "access.api.developerTitle": "Developer API",
+ "access.api.disabled": "API access is turned off for this instance.",
+ "access.api.empty": "Deploy to an environment first to start issuing API keys.",
+ "access.api.envPrefix": "env: {{env}}",
+ "access.api.keyList": "API key list",
+ "access.api.newKey": "New key",
+ "access.api.newKeyForEnv": "Generate for {{env}}",
+ "access.api.noKeys": "No API keys yet. Create one to start calling the API.",
+ "access.api.title": "API",
+ "access.channels.description": "WebApp and CLI entry points use the access permissions above.",
+ "access.channels.disabled": "Access channels are turned off for this instance.",
+ "access.channels.followPermission": "Follows permissions",
+ "access.channels.title": "Access channels",
+ "access.cli.description": "Use the unified domain when accessing this instance from the CLI.",
+ "access.cli.docs": "Usage guide",
+ "access.cli.domain": "Domain",
+ "access.cli.empty": "CLI endpoint not configured.",
+ "access.cli.install": "Install CLI",
+ "access.cli.title": "CLI",
+ "access.copied": "Copied",
+ "access.copy": "Copy",
+ "access.copyFailed": "Copy failed",
+ "access.copyToast": "Copied to clipboard",
+ "access.hide": "Hide",
+ "access.members.clearAll": "Clear all",
+ "access.members.empty": "No matches found.",
+ "access.members.groupCount_one": "{{count}} group",
+ "access.members.groupCount_other": "{{count}} groups",
+ "access.members.groups": "Groups",
+ "access.members.individuals": "Members",
+ "access.members.memberCount_one": "{{count}} member",
+ "access.members.memberCount_other": "{{count}} members",
+ "access.members.pickPlaceholder": "Select groups or members",
+ "access.members.searchPlaceholder": "Search groups and members",
+ "access.members.selectedLabel": "Selected",
+ "access.permission.anyone": "Anyone",
+ "access.permission.anyoneDesc": "Anyone with the link, no login required",
+ "access.permission.comingSoon": "Coming soon",
+ "access.permission.external": "Authenticated external users",
+ "access.permission.externalDesc": "External users who completed SSO/OIDC authentication",
+ "access.permission.memberCount_one": "{{count}} member",
+ "access.permission.memberCount_other": "{{count}} members",
+ "access.permission.organization": "Only members within the organization",
+ "access.permission.organizationDesc": "All internal members of your workspace",
+ "access.permission.specific": "Specific members",
+ "access.permission.specificDesc": "Pick groups or individual members",
+ "access.permission.specificUnavailable": "Specific member selection is disabled until real workspace subjects are connected.",
+ "access.permissions.description": "Configure who can access this instance in each deployed environment.",
+ "access.permissions.title": "Access permissions",
+ "access.revoke": "Revoke",
+ "access.runAccess.description": "Manage how users can run this app and who is allowed to access it per environment.",
+ "access.runAccess.disabled": "Run access is turned off for this instance.",
+ "access.runAccess.mcp": "MCP",
+ "access.runAccess.mcpDesc": "Expose this instance as a Model Context Protocol server.",
+ "access.runAccess.mcpEmpty": "MCP endpoint not configured.",
+ "access.runAccess.noEnvs": "Deploy to an environment to configure access permissions.",
+ "access.runAccess.openWebapp": "Open WebApp",
+ "access.runAccess.permissions": "Access permissions",
+ "access.runAccess.permissionsDesc": "Who can access this instance in each environment.",
+ "access.runAccess.title": "Run access",
+ "access.runAccess.urlLabel": "URL",
+ "access.runAccess.webapp": "WebApp",
+ "access.runAccess.webappDesc": "Hosted web page for end users.",
+ "access.runAccess.webappEmpty": "WebApp URL not configured.",
+ "access.show": "Show",
+ "appMode.advanced-chat": "Chatflow",
+ "appMode.agent-chat": "Agent",
+ "appMode.chat": "Chatbot",
+ "appMode.completion": "Completion",
+ "appMode.workflow": "Workflow",
+ "card.deploying": "{{count}} deploying",
+ "card.failed": "{{count}} failed",
+ "card.fromApp": "From {{name}}",
+ "card.lastDeployed": "Last deployed {{time}}",
+ "card.menu.delete": "Delete instance",
+ "card.menu.deploy": "Deploy to an environment",
+ "card.menu.viewDetail": "View instance detail",
+ "card.moreActions": "More actions",
+ "card.neverDeployed": "Not deployed yet",
+ "card.notDeployed": "Not deployed",
+ "card.ready": "{{count}} ready",
+ "card.tooltip.notDeployed": "This instance has not been deployed to any environment yet.",
+ "createModal.appPickerPlaceholder": "Select a source app",
+ "createModal.appSearchEmpty": "No matching apps",
+ "createModal.appSearchPlaceholder": "Search apps…",
+ "createModal.cancel": "Cancel",
+ "createModal.create": "Create",
+ "createModal.createAndDeploy": "Create and deploy",
+ "createModal.description": "Pick a source app from Studio and create a deployable instance.",
+ "createModal.descriptionLabel": "Description",
+ "createModal.descriptionPlaceholder": "Describe what this instance is used for",
+ "createModal.loadingApps": "Loading apps…",
+ "createModal.nameLabel": "Instance name",
+ "createModal.namePlaceholder": "Instance name",
+ "createModal.noApps": "No apps found in this workspace. Create one in Studio first.",
+ "createModal.selected": "Selected",
+ "createModal.sourceApp": "Source app (required)",
+ "createModal.title": "Create app instance",
+ "deployDrawer.cancel": "Cancel",
+ "deployDrawer.defaultSelect": "Select...",
+ "deployDrawer.deploy": "Deploy",
+ "deployDrawer.description": "Create a new release from the current app YAML and deploy it to a target environment.",
+ "deployDrawer.envVars": "Environment variables",
+ "deployDrawer.existingReleaseHint": "This existing release will be deployed as-is. No new release will be created.",
+ "deployDrawer.lockedHint": "Locked to current environment",
+ "deployDrawer.modelCreds": "Model credentials",
+ "deployDrawer.needsValidation": " (needs validation)",
+ "deployDrawer.newReleaseHint": "A new release will be created from the current app YAML.",
+ "deployDrawer.notFound": "Instance not found.",
+ "deployDrawer.noteLabel": "Release note (optional)",
+ "deployDrawer.notePlaceholder": "e.g. Ship onboarding copy tweak",
+ "deployDrawer.pluginCreds": "Plugin credentials",
+ "deployDrawer.promote": "Promote",
+ "deployDrawer.promoteDescription": "Deploy an existing release from the version history to a target environment.",
+ "deployDrawer.promoteTitle": "Promote release",
+ "deployDrawer.releaseLabel": "Release",
+ "deployDrawer.runtimeCredentials": "Runtime credentials",
+ "deployDrawer.secretPlaceholder": "secret",
+ "deployDrawer.selectEnv": "Select an environment",
+ "deployDrawer.selectProviderCred": "Select {{provider}} credential",
+ "deployDrawer.selectProviderKey": "Select {{provider}} key",
+ "deployDrawer.selectRelease": "Select a release",
+ "deployDrawer.targetEnv": "Target environment",
+ "deployDrawer.title": "Deploy to environment",
+ "deployDrawer.valuePlaceholder": "value",
+ "deployTab.cancelDeployment": "Cancel deployment",
+ "deployTab.col.currentRelease": "Current release",
+ "deployTab.col.environment": "Environment",
+ "deployTab.col.status": "Status",
+ "deployTab.col.updated": "Updated",
+ "deployTab.deployOtherVersion": "Deploy another version",
+ "deployTab.deployToEnv": "Deploy to {{name}}",
+ "deployTab.deployToNewEnv": "Deploy to new environment...",
+ "deployTab.empty": "No deployments yet. Deploy this instance to an environment to get started.",
+ "deployTab.envCount": "Environments",
+ "deployTab.moreActions": "More actions",
+ "deployTab.newDeployment": "New deployment",
+ "deployTab.panel.commit": "Commit ID",
+ "deployTab.panel.createdAt": "Created at",
+ "deployTab.panel.deploymentId": "Deployment ID",
+ "deployTab.panel.endpoints": "Endpoints",
+ "deployTab.panel.envVars": "Environment variables",
+ "deployTab.panel.failedRelease": "Failed release",
+ "deployTab.panel.health": "Health",
+ "deployTab.panel.instanceInfo": "Instance info",
+ "deployTab.panel.modelCreds": "Model credentials",
+ "deployTab.panel.pluginCreds": "Plugin credentials",
+ "deployTab.panel.release": "Release",
+ "deployTab.panel.releaseInfo": "Release info",
+ "deployTab.panel.replicas": "Replicas",
+ "deployTab.panel.run": "Run",
+ "deployTab.panel.runtimeMode": "Runtime mode",
+ "deployTab.panel.runtimeNote": "Runtime note",
+ "deployTab.panel.targetRelease": "Target release",
+ "deployTab.promote": "Promote",
+ "deployTab.retry": "Retry",
+ "deployTab.rollback": "Rollback...",
+ "deployTab.shortcut": "Shortcut",
+ "deployTab.status.deployingRelease": "Deploying ({{release}})",
+ "deployTab.status.runningWithFailed": "Running (last deployment failed)",
+ "deployTab.undeploy": "Undeploy",
+ "deployTab.undeployFrom": "Undeploy from {{name}}",
+ "deployTab.viewLogs": "View logs",
+ "deployTab.viewProgress": "View progress",
+ "detail.backToInstances": "Back to app instances",
+ "detail.deployingCount": "{{count}} deploying",
+ "detail.envCount_one": "{{count}} env",
+ "detail.envCount_other": "{{count}} envs",
+ "detail.failedCount": "{{count}} failed",
+ "detail.notFound": "Instance not found",
+ "detail.sourceAppDeleted": "Source app deleted",
+ "documentTitle.detail": "Instance · Deployments",
+ "documentTitle.list": "Deployments",
+ "filter.allEnvs": "All environments",
+ "filter.notDeployed": "Not deployed",
+ "filter.searchPlaceholder": "Search instances",
+ "health.degraded": "Degraded",
+ "health.ready": "Ready",
+ "mode.isolated": "Isolated",
+ "mode.shared": "Shared",
+ "newInstance.comingSoon": "Coming soon",
+ "newInstance.fromGitHub": "Create from GitHub",
+ "newInstance.fromStudio": "Select from Studio",
+ "newInstance.importDSL": "Import DSL",
+ "newInstance.title": "Create app instance",
+ "overview.accessStatus": "Access status",
+ "overview.api": "API",
+ "overview.apiKeysCount_one": "{{count}} API key",
+ "overview.apiKeysCount_other": "{{count}} API keys",
+ "overview.appMode": "App mode",
+ "overview.basicInfo": "Basic info",
+ "overview.cli": "CLI",
+ "overview.configureAccess": "Configure access",
+ "overview.created": "Created",
+ "overview.deploy": "Deploy",
+ "overview.deploymentStatus": "Deployment status",
+ "overview.description": "Description",
+ "overview.developerApi": "Developer API",
+ "overview.disabled": "Disabled",
+ "overview.emptyValue": "Not set",
+ "overview.enabled": "Enabled",
+ "overview.endUserAccess": "End-user access",
+ "overview.instanceId": "Instance ID",
+ "overview.manageDeployments": "Manage deployments",
+ "overview.name": "Name",
+ "overview.noAccessConfig": "No access configuration.",
+ "overview.notConfigured": "Not configured",
+ "overview.notDeployedYet": "Not deployed yet.",
+ "overview.sourceApp": "Source app",
+ "overview.sourceAppDeletedDescription": "Historical releases are still deployable, but new releases cannot be generated from the deleted source app. Switch to another source app to continue.",
+ "overview.sourceAppDeletedTitle": "Source app was deleted",
+ "overview.sourceAppDeletedValue": "Deleted source app",
+ "overview.sourceAppUnavailable": "Unavailable",
+ "overview.switchSourceApp": "Switch source app",
+ "overview.switchSourceAppDescription": "Choose the Studio app that future releases should use as their DSL source.",
+ "overview.switchSourceAppHint": "After switching, only newly created releases use the new source app. Historical releases and existing deployments are not changed.",
+ "overview.viewDeployments": "View deployments",
+ "overview.webapp": "WebApp",
+ "rollback.cancel": "Cancel",
+ "rollback.confirm": "Deploy release",
+ "rollback.currentRelease": "Current release",
+ "rollback.description": "Deploying an existing release switches this environment's active release pointer; the underlying Runtime Shell is not rebuilt.",
+ "rollback.environment": "Environment",
+ "rollback.impactingBody": "The target release is loaded first, then the pointer is switched. In-flight workers drain before the cutover completes.",
+ "rollback.impactingTitle": "Impacting action",
+ "rollback.instance": "Instance",
+ "rollback.rollbackTo": "Target release",
+ "rollback.sourceApp": "Source app",
+ "rollback.title": "Deploy {{release}}",
+ "settings.danger": "Danger zone",
+ "settings.dangerDesc": "Deleting an instance removes all associated API keys, access config and deployment history. This action cannot be undone.",
+ "settings.delete": "Delete instance",
+ "settings.description": "Description",
+ "settings.general": "General",
+ "settings.name": "Instance name",
+ "settings.reset": "Reset",
+ "settings.safeToDelete": "No active deployments. Safe to delete.",
+ "settings.save": "Save changes",
+ "settings.undeployFirst": "Undeploy from all environments before deleting.",
+ "settings.updated": "Instance updated",
+ "status.deployFailed": "Deploy failed",
+ "status.deploying": "Deploying",
+ "status.ready": "Ready",
+ "subtitle": "Deploy and manage your apps across environments.",
+ "tabs.access.description": "API keys and run-time access for this instance.",
+ "tabs.access.name": "Access",
+ "tabs.deploy.description": "Environments this instance is deployed to and their current releases.",
+ "tabs.deploy.name": "Deploy",
+ "tabs.overview.description": "Summary of this app instance across all environments.",
+ "tabs.overview.name": "Overview",
+ "tabs.settings.description": "Edit instance name, description and other preferences.",
+ "tabs.settings.name": "Settings",
+ "tabs.versions.description": "All releases for this app. Deploy any release to an environment.",
+ "tabs.versions.name": "Versions",
+ "title": "App instances",
+ "versions.col.action": "Action",
+ "versions.col.author": "Author",
+ "versions.col.commit": "Commit",
+ "versions.col.createdAt": "Created at",
+ "versions.col.deployedTo": "Deployed to",
+ "versions.col.release": "Release",
+ "versions.commitTooltip": "Commit {{commit}}",
+ "versions.currentOn": "Current on {{name}}",
+ "versions.deploy": "Deploy",
+ "versions.deployTo": "Deploy to {{name}}",
+ "versions.deployedStatus.active": "Running",
+ "versions.deployedStatus.deploying": "Deploying",
+ "versions.deployedStatus.failed": "Failed",
+ "versions.deployingTo": "{{name}} is deploying",
+ "versions.empty": "No releases available yet.",
+ "versions.hideYaml": "Hide YAML",
+ "versions.moreActions": "More actions",
+ "versions.promote": "Promote",
+ "versions.promoteTo": "Promote to {{name}}",
+ "versions.releaseHistory": "Release history",
+ "versions.viewYaml": "View YAML"
+}
diff --git a/web/i18n/zh-Hans/common.json b/web/i18n/zh-Hans/common.json
index b2bdf8f1f1..7909d6bc58 100644
--- a/web/i18n/zh-Hans/common.json
+++ b/web/i18n/zh-Hans/common.json
@@ -276,6 +276,7 @@
"menus.apps": "工作室",
"menus.datasets": "知识库",
"menus.datasetsTips": "即将到来:上传自己的长文本数据,或通过 Webhook 集成自己的数据源",
+ "menus.deployments": "部署",
"menus.explore": "探索",
"menus.exploreMarketplace": "探索 Marketplace",
"menus.newApp": "创建应用",
diff --git a/web/i18n/zh-Hans/deployments.json b/web/i18n/zh-Hans/deployments.json
new file mode 100644
index 0000000000..c2042809f3
--- /dev/null
+++ b/web/i18n/zh-Hans/deployments.json
@@ -0,0 +1,280 @@
+{
+ "access.api.backendTitle": "后端服务 API",
+ "access.api.description": "通过 HTTP 调用该实例。每个 API 密钥仅在一个环境中生效。",
+ "access.api.developerTitle": "开发者 API",
+ "access.api.disabled": "该实例的 API 接入已关闭。",
+ "access.api.empty": "请先部署到环境后再签发 API 密钥。",
+ "access.api.envPrefix": "env:{{env}}",
+ "access.api.keyList": "API Key 列表",
+ "access.api.newKey": "生成新 Key",
+ "access.api.newKeyForEnv": "为 {{env}} 生成",
+ "access.api.noKeys": "尚无 API 密钥,创建一个即可调用 API。",
+ "access.api.title": "API",
+ "access.channels.description": "WebApp 与 CLI 入口遵循上方访问权限。",
+ "access.channels.disabled": "该实例的接入渠道已关闭。",
+ "access.channels.followPermission": "随权限开放",
+ "access.channels.title": "接入渠道",
+ "access.cli.description": "通过 CLI 访问此实例时使用统一域名。",
+ "access.cli.docs": "使用说明",
+ "access.cli.domain": "域名",
+ "access.cli.empty": "尚未配置 CLI 接入地址。",
+ "access.cli.install": "安装 CLI",
+ "access.cli.title": "CLI",
+ "access.copied": "已复制",
+ "access.copy": "复制",
+ "access.copyFailed": "复制失败",
+ "access.copyToast": "已复制到剪贴板",
+ "access.hide": "隐藏",
+ "access.members.clearAll": "全部清除",
+ "access.members.empty": "未找到匹配结果。",
+ "access.members.groupCount_one": "{{count}} 个分组",
+ "access.members.groupCount_other": "{{count}} 个分组",
+ "access.members.groups": "分组",
+ "access.members.individuals": "成员",
+ "access.members.memberCount_one": "{{count}} 位成员",
+ "access.members.memberCount_other": "{{count}} 位成员",
+ "access.members.pickPlaceholder": "选择分组或成员",
+ "access.members.searchPlaceholder": "搜索分组和成员",
+ "access.members.selectedLabel": "已选择",
+ "access.permission.anyone": "任何人",
+ "access.permission.anyoneDesc": "任何拥有链接的人,无需登录",
+ "access.permission.comingSoon": "即将支持",
+ "access.permission.external": "已认证的外部用户",
+ "access.permission.externalDesc": "通过 SSO / OIDC 完成认证的外部用户",
+ "access.permission.memberCount_one": "{{count}} 位成员",
+ "access.permission.memberCount_other": "{{count}} 位成员",
+ "access.permission.organization": "仅组织内成员",
+ "access.permission.organizationDesc": "工作区内所有内部成员",
+ "access.permission.specific": "特定成员",
+ "access.permission.specificDesc": "选择指定的分组或单个成员",
+ "access.permission.specificUnavailable": "特定成员暂未启用,需接入真实工作区成员与分组后再开放。",
+ "access.permissions.description": "配置该实例在每个已部署环境中的访问人员。",
+ "access.permissions.title": "访问权限",
+ "access.revoke": "撤销",
+ "access.runAccess.description": "管理用户如何运行该应用,以及在每个环境里谁可以访问。",
+ "access.runAccess.disabled": "该实例的运行时接入已关闭。",
+ "access.runAccess.mcp": "MCP",
+ "access.runAccess.mcpDesc": "将此实例作为 Model Context Protocol 服务器对外提供。",
+ "access.runAccess.mcpEmpty": "尚未配置 MCP 端点。",
+ "access.runAccess.noEnvs": "请先部署到环境后再配置访问权限。",
+ "access.runAccess.openWebapp": "打开 WebApp",
+ "access.runAccess.permissions": "访问权限",
+ "access.runAccess.permissionsDesc": "每个环境里可以访问该实例的人员。",
+ "access.runAccess.title": "访问控制(Run)",
+ "access.runAccess.urlLabel": "访问地址",
+ "access.runAccess.webapp": "WebApp",
+ "access.runAccess.webappDesc": "面向终端用户的托管 Web 页面。",
+ "access.runAccess.webappEmpty": "尚未配置 WebApp 访问地址。",
+ "access.show": "显示",
+ "appMode.advanced-chat": "Chatflow",
+ "appMode.agent-chat": "Agent",
+ "appMode.chat": "聊天助手",
+ "appMode.completion": "文本生成",
+ "appMode.workflow": "Workflow",
+ "card.deploying": "{{count}} 个部署中",
+ "card.failed": "{{count}} 个失败",
+ "card.fromApp": "来自 {{name}}",
+ "card.lastDeployed": "上次部署于 {{time}}",
+ "card.menu.delete": "删除实例",
+ "card.menu.deploy": "部署到环境",
+ "card.menu.viewDetail": "查看实例详情",
+ "card.moreActions": "更多操作",
+ "card.neverDeployed": "尚未部署",
+ "card.notDeployed": "未部署",
+ "card.ready": "{{count}} 个就绪",
+ "card.tooltip.notDeployed": "该实例尚未部署到任何环境。",
+ "createModal.appPickerPlaceholder": "选择源应用",
+ "createModal.appSearchEmpty": "没有匹配的应用",
+ "createModal.appSearchPlaceholder": "搜索应用…",
+ "createModal.cancel": "取消",
+ "createModal.create": "创建",
+ "createModal.createAndDeploy": "创建并部署",
+ "createModal.description": "从 Studio 选择一个源应用并创建可部署的实例。",
+ "createModal.descriptionLabel": "描述",
+ "createModal.descriptionPlaceholder": "描述该实例的用途",
+ "createModal.loadingApps": "正在加载应用…",
+ "createModal.nameLabel": "实例名称",
+ "createModal.namePlaceholder": "实例名称",
+ "createModal.noApps": "当前工作区还没有应用,请先在 Studio 创建一个。",
+ "createModal.selected": "已选择",
+ "createModal.sourceApp": "源应用(必选)",
+ "createModal.title": "创建应用实例",
+ "deployDrawer.cancel": "取消",
+ "deployDrawer.defaultSelect": "选择...",
+ "deployDrawer.deploy": "部署",
+ "deployDrawer.description": "基于当前应用 YAML 创建一个新的发布版本,并部署到目标环境。",
+ "deployDrawer.envVars": "环境变量",
+ "deployDrawer.existingReleaseHint": "将直接部署该已有发布版本,不会创建新的版本。",
+ "deployDrawer.lockedHint": "已锁定至当前环境",
+ "deployDrawer.modelCreds": "模型凭据",
+ "deployDrawer.needsValidation": "(待验证)",
+ "deployDrawer.newReleaseHint": "将基于当前应用 YAML 创建一个新的发布版本。",
+ "deployDrawer.notFound": "未找到实例。",
+ "deployDrawer.noteLabel": "发布备注(可选)",
+ "deployDrawer.notePlaceholder": "例如:优化引导文案",
+ "deployDrawer.pluginCreds": "插件凭据",
+ "deployDrawer.promote": "推送",
+ "deployDrawer.promoteDescription": "从版本历史中选择一个已有发布版本,部署到目标环境。",
+ "deployDrawer.promoteTitle": "推送发布版本",
+ "deployDrawer.releaseLabel": "发布版本",
+ "deployDrawer.runtimeCredentials": "运行时凭据",
+ "deployDrawer.secretPlaceholder": "机密值",
+ "deployDrawer.selectEnv": "选择一个环境",
+ "deployDrawer.selectProviderCred": "选择 {{provider}} 凭据",
+ "deployDrawer.selectProviderKey": "选择 {{provider}} 密钥",
+ "deployDrawer.selectRelease": "选择一个发布版本",
+ "deployDrawer.targetEnv": "目标环境",
+ "deployDrawer.title": "部署到环境",
+ "deployDrawer.valuePlaceholder": "值",
+ "deployTab.cancelDeployment": "取消部署",
+ "deployTab.col.currentRelease": "当前发布",
+ "deployTab.col.environment": "环境",
+ "deployTab.col.status": "状态",
+ "deployTab.col.updated": "更新时间",
+ "deployTab.deployOtherVersion": "部署其他版本",
+ "deployTab.deployToEnv": "部署到 {{name}}",
+ "deployTab.deployToNewEnv": "部署到新环境...",
+ "deployTab.empty": "暂无部署。将此实例部署到环境以开始使用。",
+ "deployTab.envCount": "环境",
+ "deployTab.moreActions": "更多操作",
+ "deployTab.newDeployment": "新建部署",
+ "deployTab.panel.commit": "Commit ID",
+ "deployTab.panel.createdAt": "创建时间",
+ "deployTab.panel.deploymentId": "部署 ID",
+ "deployTab.panel.endpoints": "端点",
+ "deployTab.panel.envVars": "环境变量",
+ "deployTab.panel.failedRelease": "失败版本",
+ "deployTab.panel.health": "健康检查",
+ "deployTab.panel.instanceInfo": "实例信息",
+ "deployTab.panel.modelCreds": "模型凭据",
+ "deployTab.panel.pluginCreds": "插件凭据",
+ "deployTab.panel.release": "Release",
+ "deployTab.panel.releaseInfo": "版本信息",
+ "deployTab.panel.replicas": "副本数",
+ "deployTab.panel.run": "运行",
+ "deployTab.panel.runtimeMode": "运行模式",
+ "deployTab.panel.runtimeNote": "运行时备注",
+ "deployTab.panel.targetRelease": "目标版本",
+ "deployTab.promote": "发布",
+ "deployTab.retry": "重试",
+ "deployTab.rollback": "回滚...",
+ "deployTab.shortcut": "快捷",
+ "deployTab.status.deployingRelease": "部署中({{release}})",
+ "deployTab.status.runningWithFailed": "运行中(上次部署失败)",
+ "deployTab.undeploy": "下线",
+ "deployTab.undeployFrom": "从 {{name}} 取消部署",
+ "deployTab.viewLogs": "查看日志",
+ "deployTab.viewProgress": "查看进度",
+ "detail.backToInstances": "返回应用实例",
+ "detail.deployingCount": "{{count}} 个部署中",
+ "detail.envCount_one": "{{count}} 个环境",
+ "detail.envCount_other": "{{count}} 个环境",
+ "detail.failedCount": "{{count}} 个失败",
+ "detail.notFound": "未找到实例",
+ "detail.sourceAppDeleted": "源应用已删除",
+ "documentTitle.detail": "实例 · 部署",
+ "documentTitle.list": "部署",
+ "filter.allEnvs": "全部环境",
+ "filter.notDeployed": "未部署",
+ "filter.searchPlaceholder": "搜索实例",
+ "health.degraded": "降级",
+ "health.ready": "就绪",
+ "mode.isolated": "独立",
+ "mode.shared": "共享",
+ "newInstance.comingSoon": "即将支持",
+ "newInstance.fromGitHub": "从 GitHub 创建",
+ "newInstance.fromStudio": "从 Studio 选择",
+ "newInstance.importDSL": "导入 DSL",
+ "newInstance.title": "创建应用实例",
+ "overview.accessStatus": "接入状态",
+ "overview.api": "API",
+ "overview.apiKeysCount_one": "{{count}} 个 API Key",
+ "overview.apiKeysCount_other": "{{count}} 个 API Key",
+ "overview.appMode": "应用类型",
+ "overview.basicInfo": "基本信息",
+ "overview.cli": "CLI",
+ "overview.configureAccess": "配置接入",
+ "overview.created": "创建时间",
+ "overview.deploy": "部署",
+ "overview.deploymentStatus": "部署状态",
+ "overview.description": "描述",
+ "overview.developerApi": "开发者 API",
+ "overview.disabled": "未启用",
+ "overview.emptyValue": "未设置",
+ "overview.enabled": "已启用",
+ "overview.endUserAccess": "终端用户接入",
+ "overview.instanceId": "实例 ID",
+ "overview.manageDeployments": "管理部署",
+ "overview.name": "名称",
+ "overview.noAccessConfig": "未配置接入方式。",
+ "overview.notConfigured": "未配置",
+ "overview.notDeployedYet": "尚未部署。",
+ "overview.sourceApp": "源应用",
+ "overview.sourceAppDeletedDescription": "历史 Release 仍可继续部署,但无法再基于已删除的源应用生成新 Release。请切换到其他源应用后继续使用。",
+ "overview.sourceAppDeletedTitle": "源应用已被删除",
+ "overview.sourceAppDeletedValue": "已删除的源应用",
+ "overview.sourceAppUnavailable": "不可用",
+ "overview.switchSourceApp": "切换源应用",
+ "overview.switchSourceAppDescription": "选择后续新建 Release 使用的 Studio 应用 DSL 来源。",
+ "overview.switchSourceAppHint": "切换后,仅新建 Release 会使用新的源应用;历史 Release 和现有部署不受影响。",
+ "overview.viewDeployments": "查看部署",
+ "overview.webapp": "WebApp",
+ "rollback.cancel": "取消",
+ "rollback.confirm": "确认部署",
+ "rollback.currentRelease": "当前发布",
+ "rollback.description": "部署已有发布版本会切换该环境的活动发布指针,不会重建底层 Runtime Shell。",
+ "rollback.environment": "环境",
+ "rollback.impactingBody": "先加载目标发布版本,再切换指针。进行中的工作者会先完成排空再执行切换。",
+ "rollback.impactingTitle": "影响操作",
+ "rollback.instance": "实例",
+ "rollback.rollbackTo": "目标发布",
+ "rollback.sourceApp": "源应用",
+ "rollback.title": "部署 {{release}}",
+ "settings.danger": "危险区域",
+ "settings.dangerDesc": "删除实例会一并删除所有关联的 API 密钥、接入配置和部署历史。此操作无法撤销。",
+ "settings.delete": "删除实例",
+ "settings.description": "描述",
+ "settings.general": "常规",
+ "settings.name": "实例名称",
+ "settings.reset": "重置",
+ "settings.safeToDelete": "无活动部署,可安全删除。",
+ "settings.save": "保存修改",
+ "settings.undeployFirst": "请先在所有环境取消部署后再删除。",
+ "settings.updated": "实例已更新",
+ "status.deployFailed": "部署失败",
+ "status.deploying": "部署中",
+ "status.ready": "就绪",
+ "subtitle": "在不同环境中部署和管理你的应用。",
+ "tabs.access.description": "该实例的 API 密钥和运行时访问设置。",
+ "tabs.access.name": "接入",
+ "tabs.deploy.description": "该实例已部署的环境及其当前发布版本。",
+ "tabs.deploy.name": "部署",
+ "tabs.overview.description": "该应用实例在所有环境中的概览。",
+ "tabs.overview.name": "概览",
+ "tabs.settings.description": "编辑实例名称、描述及其它偏好。",
+ "tabs.settings.name": "设置",
+ "tabs.versions.description": "此应用的所有发布版本,可将任一版本发布到环境。",
+ "tabs.versions.name": "版本",
+ "title": "应用实例",
+ "versions.col.action": "操作",
+ "versions.col.author": "作者",
+ "versions.col.commit": "提交",
+ "versions.col.createdAt": "创建时间",
+ "versions.col.deployedTo": "已部署到",
+ "versions.col.release": "发布",
+ "versions.commitTooltip": "Commit {{commit}}",
+ "versions.currentOn": "{{name}} 当前版本",
+ "versions.deploy": "部署",
+ "versions.deployTo": "部署到 {{name}}",
+ "versions.deployedStatus.active": "运行中",
+ "versions.deployedStatus.deploying": "部署中",
+ "versions.deployedStatus.failed": "失败",
+ "versions.deployingTo": "{{name}} 正在部署",
+ "versions.empty": "暂无可用的发布版本。",
+ "versions.hideYaml": "隐藏 YAML",
+ "versions.moreActions": "更多操作",
+ "versions.promote": "发布",
+ "versions.promoteTo": "发布到 {{name}}",
+ "versions.releaseHistory": "发布历史",
+ "versions.viewYaml": "查看 YAML"
+}