From 1739c4f67cdc97ef1455d927b53d403c10706e0f Mon Sep 17 00:00:00 2001 From: "xinxin.wu" Date: Thu, 29 Oct 2026 15:04:04 +0800 Subject: [PATCH] feat: api key enable --- ui/src/api/API_README.md | 4 +++ .../application/application.ts | 8 ++++++ .../workspace/application/application.ts | 7 +++++ ui/src/api/types/application.ts | 12 +++++++++ ui/src/views/VIEW_README.md | 4 ++- .../application-detail/overview/index.vue | 26 +++++++++++++++---- 6 files changed, 55 insertions(+), 6 deletions(-) diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index 52f5700ce02..1092e0d0531 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -405,6 +405,10 @@ Workspace 与 System 资源管理的 `application/application.ts` 提供 `getAcc 概览使用 `access_token` 拼接 Web 链接,不使用智能体 ID 或 API Key 替代;API 文档地址使用 Chat 部署前缀。 两范围的 `putAccessToken` 向同一路径提交 `{ access_token_reset: true }` 重置链接,或 `{ is_active: boolean }` 修改 Web 访问状态; 载荷复用 `ApplicationAccessTokenPayload`,使用返回的访问凭证与启用状态回显,不二次查询。 +后端 API 访问状态读取同次 GET 返回的 `enable_api_key`,两范围通过 `putEnableApiKey` 向各自 +`//enable_api_key` 发送 PUT,仅提交 `{ enable_api_key: boolean }`,ID 由 URL 传递。 +返回 `workspace_id`、`application_id` 与 `enable_api_key`,用于保存后回显;该开关独立于 Web 访问和单个密钥启停。 +Workspace 后台已提供此接口;System 路径按资源管理前缀接入,当前仓库无对应后台路由,需部署环境联调确认。 访问限制复用上述 GET/PUT,读取与保存 `access_num`、`white_active`、`white_list`、`authentication` 和 `authentication_value`。提问次数为 0~10000000 的整数;社区版仅编辑认证开关,保留已有 `authentication_value`, 不生成登录配置字段,身份认证读写待后台联调。Xpack 版认证配置使用 `type: 'login'`、`login_value`、 diff --git a/ui/src/api/admin/system/resource-management/application/application.ts b/ui/src/api/admin/system/resource-management/application/application.ts index a7b271efbb7..d43e254fca5 100644 --- a/ui/src/api/admin/system/resource-management/application/application.ts +++ b/ui/src/api/admin/system/resource-management/application/application.ts @@ -3,6 +3,8 @@ import type { ParamsPage, ResponsePage } from '@/api/admin/core/types' import type { ApplicationAccessToken, ApplicationAccessTokenPayload, + ApplicationApiKeyEnable, + ApplicationApiKeyEnablePayload, ApplicationDetail, ApplicationDisplaySetting, ApplicationFormPayload, @@ -50,6 +52,11 @@ const getAccessToken = (applicationId: string) => get(`$ const putAccessToken = (applicationId: string, payload: ApplicationAccessTokenPayload) => put(`${prefix}/${applicationId}/access_token`, payload) +/** 启用或禁用 System 资源管理智能体后端 API 访问,返回保存后的状态。 */ +// TODO:当前仓库未提供 System 路由,需在部署环境确认 enable_api_key 路径及响应协议。 +const putEnableApiKey = (applicationId: string, payload: ApplicationApiKeyEnablePayload) => + put(`${prefix}/${applicationId}/enable_api_key`, payload) + /** 获取智能体展示设置,仅许可证有效的专业版、企业版提供;未保存过的字段可能缺失。 */ const getDisplaySetting = (applicationId: string) => get>(`${prefix}/${applicationId}/setting`) @@ -71,6 +78,7 @@ export default { getApplicationDetail, getAccessToken, putAccessToken, + putEnableApiKey, getDisplaySetting, putDisplaySetting, putApplication, diff --git a/ui/src/api/admin/workspace/application/application.ts b/ui/src/api/admin/workspace/application/application.ts index 492a5eeeeb7..b587879af46 100644 --- a/ui/src/api/admin/workspace/application/application.ts +++ b/ui/src/api/admin/workspace/application/application.ts @@ -3,6 +3,8 @@ import type { ParamsPage, ResponsePage } from '../../core/types' import type { ApplicationAccessToken, ApplicationAccessTokenPayload, + ApplicationApiKeyEnable, + ApplicationApiKeyEnablePayload, ApplicationDetail, ApplicationDisplaySetting, ApplicationFormPayload, @@ -39,6 +41,10 @@ const getAccessToken = (applicationId: string) => get(`$ const putAccessToken = (applicationId: string, payload: ApplicationAccessTokenPayload) => put(`${getPrefix()}/${applicationId}/access_token`, payload) +/** 启用或禁用智能体后端 API 访问,返回保存后的状态。 */ +const putEnableApiKey = (applicationId: string, payload: ApplicationApiKeyEnablePayload) => + put(`${getPrefix()}/${applicationId}/enable_api_key`, payload) + /** 获取智能体展示设置,仅许可证有效的专业版、企业版提供;未保存过的字段可能缺失。 */ const getDisplaySetting = (applicationId: string) => get>(`${getPrefix()}/${applicationId}/setting`) @@ -111,6 +117,7 @@ export default { getApplicationDetail, getAccessToken, putAccessToken, + putEnableApiKey, getDisplaySetting, putDisplaySetting, deleteApplication, diff --git a/ui/src/api/types/application.ts b/ui/src/api/types/application.ts index 5cfa36f5003..e4233342b90 100644 --- a/ui/src/api/types/application.ts +++ b/ui/src/api/types/application.ts @@ -64,6 +64,7 @@ export interface ApplicationAccessToken extends Partial { /** 详情接口返回的主模型 ID。 */ model?: string | null diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index 5a9e44aa8a1..8b231c5b8a6 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -365,7 +365,9 @@ View 负责路由、资源与模式、图加载、保存/发布/调试编排 Web 链接通过当前范围的 Application API 查询访问凭证,使用当前域名、Chat 部署前缀与访问凭证生成,不追加工作流输入参数; API 文档地址为 Chat 部署前缀下的 `/api-doc/`。两个地址使用只读输入框展示并支持复制;链接重置先确认, 成功后用返回的访问凭证更新链接,失败保留原链接。Web 访问开关查询后回填 `is_active`, - 保存成功后按响应回显、失败保留原状态;开关保存与链接重置共用 loading,操作期间禁用开关,重置按钮显示 loading。后端 API 访问开关仍待接入。 + 保存成功后按响应回显、失败保留原状态;开关保存与链接重置共用 loading,操作期间禁用开关,重置按钮显示 loading。 + 后端 API 访问开关从同次查询的 `enable_api_key` 回填,通过当前范围的 `putEnableApiKey` 独立保存; + 保存期间仅禁用右侧开关,成功按响应回显,失败保留原状态,不影响 Web 访问与链接重置。 “去对话”按钮直接在概览页维护;其余四个按钮流程分别放在 `embed-third-party/`、`access-restriction/`、 `display-setting/`、`api-key/`,入口和对应弹窗同目录维护。API Key 弹窗通过 `resourceApi.apiKey` 传入当前范围的完整 API 与智能体 ID, 复用 `business/api-key-list/`,Base URL 使用 Chat API 部署前缀加智能体 ID; diff --git a/ui/src/views/application-detail/overview/index.vue b/ui/src/views/application-detail/overview/index.vue index b2d36054804..29d9b586f39 100644 --- a/ui/src/views/application-detail/overview/index.vue +++ b/ui/src/views/application-detail/overview/index.vue @@ -35,10 +35,12 @@ function applicationOverviewPermission(method: ApplicationOverviewPermissionMeth return Boolean(perm.application.workspace[method](applicationId.value)) } -/* 基本信息:Web 访问链接与开关 */ +/* 基本信息:Web 访问链接与访问开关 */ const accessToken = ref('') const webAccessActive = ref(false) const loading = ref(false) +const apiKeyEnabled = ref(false) +const apiKeySaving = ref(false) const chatBasePath = CHAT_API_BASE_PATH.replace(/\/api$/, '') @@ -87,14 +89,28 @@ function handleResetAccessToken() { ) } +function handleChangeApiKeyAccess() { + if (apiKeySaving.value) return false + apiKeySaving.value = true + return resourceApi.application + .putEnableApiKey(applicationId.value, { enable_api_key: !apiKeyEnabled.value }) + .then((config) => { + apiKeyEnabled.value = config.enable_api_key + MsgSuccess(config.enable_api_key ? '已启用' : '已禁用') + return true + }) + .finally(() => { + apiKeySaving.value = false + }) +} + onMounted(() => { return resourceApi.application.getAccessToken(applicationId.value).then((config) => { accessToken.value = config.access_token webAccessActive.value = config.is_active + apiKeyEnabled.value = config.enable_api_key ?? false }) }) - -// TODO:接入后端 API 访问开关;接入前保留禁用态。