Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions ui/src/api/API_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` 向各自
`/<applicationId>/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`、
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import type { ParamsPage, ResponsePage } from '@/api/admin/core/types'
import type {
ApplicationAccessToken,
ApplicationAccessTokenPayload,
ApplicationApiKeyEnable,
ApplicationApiKeyEnablePayload,
ApplicationDetail,
ApplicationDisplaySetting,
ApplicationFormPayload,
Expand Down Expand Up @@ -50,6 +52,11 @@ const getAccessToken = (applicationId: string) => get<ApplicationAccessToken>(`$
const putAccessToken = (applicationId: string, payload: ApplicationAccessTokenPayload) =>
put<ApplicationAccessTokenPayload, ApplicationAccessToken>(`${prefix}/${applicationId}/access_token`, payload)

/** 启用或禁用 System 资源管理智能体后端 API 访问,返回保存后的状态。 */
// TODO:当前仓库未提供 System 路由,需在部署环境确认 enable_api_key 路径及响应协议。
const putEnableApiKey = (applicationId: string, payload: ApplicationApiKeyEnablePayload) =>
put<ApplicationApiKeyEnablePayload, ApplicationApiKeyEnable>(`${prefix}/${applicationId}/enable_api_key`, payload)

/** 获取智能体展示设置,仅许可证有效的专业版、企业版提供;未保存过的字段可能缺失。 */
const getDisplaySetting = (applicationId: string) => get<Partial<ApplicationDisplaySetting>>(`${prefix}/${applicationId}/setting`)

Expand All @@ -71,6 +78,7 @@ export default {
getApplicationDetail,
getAccessToken,
putAccessToken,
putEnableApiKey,
getDisplaySetting,
putDisplaySetting,
putApplication,
Expand Down
7 changes: 7 additions & 0 deletions ui/src/api/admin/workspace/application/application.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import type { ParamsPage, ResponsePage } from '../../core/types'
import type {
ApplicationAccessToken,
ApplicationAccessTokenPayload,
ApplicationApiKeyEnable,
ApplicationApiKeyEnablePayload,
ApplicationDetail,
ApplicationDisplaySetting,
ApplicationFormPayload,
Expand Down Expand Up @@ -39,6 +41,10 @@ const getAccessToken = (applicationId: string) => get<ApplicationAccessToken>(`$
const putAccessToken = (applicationId: string, payload: ApplicationAccessTokenPayload) =>
put<ApplicationAccessTokenPayload, ApplicationAccessToken>(`${getPrefix()}/${applicationId}/access_token`, payload)

/** 启用或禁用智能体后端 API 访问,返回保存后的状态。 */
const putEnableApiKey = (applicationId: string, payload: ApplicationApiKeyEnablePayload) =>
put<ApplicationApiKeyEnablePayload, ApplicationApiKeyEnable>(`${getPrefix()}/${applicationId}/enable_api_key`, payload)

/** 获取智能体展示设置,仅许可证有效的专业版、企业版提供;未保存过的字段可能缺失。 */
const getDisplaySetting = (applicationId: string) => get<Partial<ApplicationDisplaySetting>>(`${getPrefix()}/${applicationId}/setting`)

Expand Down Expand Up @@ -111,6 +117,7 @@ export default {
getApplicationDetail,
getAccessToken,
putAccessToken,
putEnableApiKey,
getDisplaySetting,
putDisplaySetting,
deleteApplication,
Expand Down
12 changes: 12 additions & 0 deletions ui/src/api/types/application.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ export interface ApplicationAccessToken extends Partial<ApplicationDisplaySettin
application_id: string
access_token: string
is_active: boolean
enable_api_key: boolean
access_num: number
white_active: boolean
white_list: string[]
Expand All @@ -85,6 +86,17 @@ export interface ApplicationAccessTokenPayload {
authentication_value?: ApplicationAuthenticationConfig
}

/** 智能体后端 API 访问开关。 */
export interface ApplicationApiKeyEnablePayload {
enable_api_key: boolean
}

/** 保存智能体后端 API 访问开关后的状态。 */
export interface ApplicationApiKeyEnable extends ApplicationApiKeyEnablePayload {
workspace_id?: string | null
application_id: string
}

export interface ApplicationDetail extends Omit<ApplicationFormPayload, 'desc'> {
/** 详情接口返回的主模型 ID。 */
model?: string | null
Expand Down
4 changes: 3 additions & 1 deletion ui/src/views/VIEW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
26 changes: 21 additions & 5 deletions ui/src/views/application-detail/overview/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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$/, '')

Expand Down Expand Up @@ -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 访问开关;接入前保留禁用态。
</script>

<template>
Expand Down Expand Up @@ -147,8 +163,8 @@ onMounted(() => {
<div class="mk-gray-card-lg space-y-4">
<div class="flex-between">
<h6>后端 API 访问</h6>
<!-- TODO:接入后端 API 访问开关 -->
<el-switch size="small" disabled />
<!-- 后端 API 访问开关 -->
<el-switch :model-value="apiKeyEnabled" size="small" :disabled="apiKeySaving" :before-change="handleChangeApiKeyAccess" />
</div>
<div class="space-y-2">
<div>API 文档</div>
Expand Down
Loading