Commit b46748e1 by Finley Ge Committed by GitHub

feat: gate app api keys by auth option (#7162)

* feat: gate app api keys by auth option

* openapi doc

* appopenapi

* doc

* doc

* apikey

* ui

* i18n

* doc

* max openapi

---------

Co-authored-by: archer <545436317@qq.com>
parent 4dbfe20c
...@@ -282,19 +282,19 @@ mcpServer: 'MCP 发布管理' ...@@ -282,19 +282,19 @@ mcpServer: 'MCP 发布管理'
{ {
name: '应用管理', name: '应用管理',
tags: [ tags: [
TagsMap.appCommon, DevApiTagsMap.appCommon,
TagsMap.appFolder, DevApiTagsMap.appFolder,
TagsMap.appPer, DevApiTagsMap.appPer,
TagsMap.appVersion, DevApiTagsMap.appVersion,
TagsMap.appTemplate, DevApiTagsMap.appTemplate,
TagsMap.appLog, DevApiTagsMap.appLog,
TagsMap.publishChannel, DevApiTagsMap.publishChannel,
TagsMap.apiKey DevApiTagsMap.apiKey
] ]
}, },
{ {
name: '工具管理', name: '工具管理',
tags: [TagsMap.httpTools, TagsMap.mcpTools, TagsMap.mcpServer] tags: [DevApiTagsMap.httpTools, DevApiTagsMap.mcpTools, DevApiTagsMap.mcpServer]
} }
``` ```
......
...@@ -102,7 +102,7 @@ export default NextAPI(handler); ...@@ -102,7 +102,7 @@ export default NextAPI(handler);
**3a. 添加标签** (如果是新模块): `packages/global/openapi/tag.ts` **3a. 添加标签** (如果是新模块): `packages/global/openapi/tag.ts`
```typescript ```typescript
export const TagsMap = { export const DevApiTagsMap = {
// Dataset // Dataset
datasetCommon: '知识库管理', // ← 新增 datasetCommon: '知识库管理', // ← 新增
datasetCollection: '集合管理', datasetCollection: '集合管理',
...@@ -114,7 +114,7 @@ export const TagsMap = { ...@@ -114,7 +114,7 @@ export const TagsMap = {
```typescript ```typescript
import type { OpenAPIPath } from '../../type'; import type { OpenAPIPath } from '../../type';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
import { CreateDatasetBodySchema } from './api'; import { CreateDatasetBodySchema } from './api';
export const DatasetPath: OpenAPIPath = { export const DatasetPath: OpenAPIPath = {
...@@ -122,7 +122,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -122,7 +122,7 @@ export const DatasetPath: OpenAPIPath = {
post: { post: {
summary: '创建知识库', summary: '创建知识库',
description: '创建新的知识库,支持多种类型', description: '创建新的知识库,支持多种类型',
tags: [TagsMap.datasetCommon], tags: [DevApiTagsMap.datasetCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -327,7 +327,7 @@ export type DatasetCreateResponse = CreateDatasetResponseType; ...@@ -327,7 +327,7 @@ export type DatasetCreateResponse = CreateDatasetResponseType;
**OpenAPI 注册** (`packages/global/openapi/.../index.ts`): **OpenAPI 注册** (`packages/global/openapi/.../index.ts`):
- [ ] 路由已在 index.ts 中注册 - [ ] 路由已在 index.ts 中注册
- [ ] 使用了正确的 `TagsMap` 标签 - [ ] 使用了正确的 `DevApiTagsMap` 标签
- [ ] 新模块已在 `tag.ts` 中添加标签 - [ ] 新模块已在 `tag.ts` 中添加标签
**类型引用**: **类型引用**:
......
...@@ -476,8 +476,8 @@ export const ChatPath: OpenAPIPath = { ...@@ -476,8 +476,8 @@ export const ChatPath: OpenAPIPath = {
post: { post: {
summary: '停止 Agent 运行', summary: '停止 Agent 运行',
description: `优雅停止正在运行的 Agent, 会尝试等待当前节点结束后返回,最长 5s,超过 5s 仍未结束,则会返回成功。 description: `优雅停止正在运行的 Agent, 会尝试等待当前节点结束后返回,最长 5s,超过 5s 仍未结束,则会返回成功。
LLM 节点,流输出时会同时被终止,但 HTTP 请求节点这种可能长时间运行的,不会被终止。`, LLM 节点,流输出时会同时被终止,但 HTTP 请求节点这种可能长时间运行的,不会被终止。仅适用于 v2/chat/completions 接口`,
tags: [TagsMap.chatPage], tags: [DevApiTagsMap.chatPage],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
...@@ -5,17 +5,17 @@ description: Access FastGPT app via API ...@@ -5,17 +5,17 @@ description: Access FastGPT app via API
import { Alert } from '@/components/docs/Alert'; import { Alert } from '@/components/docs/Alert';
In FastGPT, the API entry under Publish Channels only creates **App API Keys**. App API Keys are isolated by app: each key belongs to the current app only and can only access that app's chat endpoint. In FastGPT, the API entry under Publish Channels shows **API Keys** available to the current signed-in member. API Keys are member credentials for OpenAPI calls and are no longer created as app-scoped keys.
If you need to call general OpenAPI endpoints such as Knowledge Base or app management APIs, or use `authProxy` in `chat/completions` to proxy a team member identity, create a **Global API Key** in account settings. For the full distinction, [see the OpenAPI Introduction](../../../openapi/intro.en.mdx). When calling this app through `chat/completions`, passing `appId` in the request body is recommended. If a third-party app only supports OpenAI SDK-style key configuration, you can use the `apiKey-appId` compatibility format. For details, [see the OpenAPI Introduction](../../../openapi/intro.en.mdx).
## Get an App API Key ## Get an API Key
Go to App -> "Publish Channels" -> "API", then click "New" to create a key. Go to App -> "Publish Channels" -> "API", then click "New" to create a key.
<Alert context="warning"> <Alert context="warning">
App API Keys can only access the current app. Keep your key safe. To copy it again later, use the An API Key represents the current signed-in member's OpenAPI credential. Keep your key safe. To
copy button in this app's API publish channel list. copy it again later, use the copy button in the API list.
</Alert> </Alert>
![](/imgs/fastgpt-api1.jpg) ![](/imgs/fastgpt-api1.jpg)
...@@ -28,7 +28,7 @@ Go to App -> "Publish Channels" -> "API", then click "New" to create a key. ...@@ -28,7 +28,7 @@ Go to App -> "Publish Channels" -> "API", then click "New" to create a key.
```bash ```bash
OPENAI_API_BASE_URL: http://localhost:3000/api (replace with your deployed domain) OPENAI_API_BASE_URL: http://localhost:3000/api (replace with your deployed domain)
OPENAI_API_KEY = the key obtained in the previous step OPENAI_API_KEY = the key obtained in the previous step (passing appId in the request body is recommended; if the third-party app only accepts a key, use the apiKey-appId compatibility format)
``` ```
**[ChatGPT Next Web](https://github.com/Yidadaa/ChatGPT-Next-Web) Example:** **[ChatGPT Next Web](https://github.com/Yidadaa/ChatGPT-Next-Web) Example:**
......
...@@ -5,17 +5,17 @@ description: 通过 API 访问 FastGPT 应用 ...@@ -5,17 +5,17 @@ description: 通过 API 访问 FastGPT 应用
import { Alert } from '@/components/docs/Alert'; import { Alert } from '@/components/docs/Alert';
在 FastGPT 中,发布渠道里的 API 入口只能创建 **应用 APIKey**。应用 APIKey 按应用隔离,每个密钥只属于当前应用,只能用于访问该应用的对话接口。 在 FastGPT 中,发布渠道里的 API 入口展示当前登录成员可用的 **APIKey**。APIKey 是团队成员的开放接口调用凭证,不再按应用创建专属密钥。
如果你需要调用知识库、应用管理等通用 OpenAPI,或需要在 `chat/completions` 中使用 `authProxy` 代理团队成员身份,请到账号设置里创建 **全局 APIKey**。完整的概念区分可以[查看 OpenAPI 介绍](../../../openapi/intro.mdx)。 调用当前应用的 `chat/completions` 接口时,推荐在请求体传入 `appId`。如果第三方应用只能配置 OpenAI SDK 风格的密钥,也可以使用 `apiKey-appId` 兼容格式。完整说明可以[查看 OpenAPI 介绍](../../../openapi/intro.mdx)。
## 获取应用 APIKey ## 获取 APIKey
依次选择应用 ->「发布渠道」->「API」,然后点击「新建」创建密钥。 依次选择应用 ->「发布渠道」->「API」,然后点击「新建」创建密钥。
<Alert context="warning"> <Alert context="warning">
应用 APIKey 只能访问当前应用。请妥善保管密钥;如需再次复制,可在当前应用的 API APIKey 代表当前登录成员的开放接口调用凭证。请妥善保管密钥;如需再次复制,可在 API
发布渠道列表中点击复制按钮。 列表中点击复制按钮。
</Alert> </Alert>
![](/imgs/fastgpt-api1.jpg) ![](/imgs/fastgpt-api1.jpg)
...@@ -28,7 +28,7 @@ import { Alert } from '@/components/docs/Alert'; ...@@ -28,7 +28,7 @@ import { Alert } from '@/components/docs/Alert';
```bash ```bash
OPENAI_API_BASE_URL: http://localhost:3000/api (改成自己部署的域名) OPENAI_API_BASE_URL: http://localhost:3000/api (改成自己部署的域名)
OPENAI_API_KEY = 上一步获取到的密钥 OPENAI_API_KEY = 上一步获取到的密钥(推荐在请求体传 appId;如第三方应用只能配置密钥,可填 apiKey-appId 兼容格式)
``` ```
**[ChatGPT Next Web](https://github.com/Yidadaa/ChatGPT-Next-Web) 示例:** **[ChatGPT Next Web](https://github.com/Yidadaa/ChatGPT-Next-Web) 示例:**
......
...@@ -5,12 +5,31 @@ description: FastGPT OpenAPI Introduction ...@@ -5,12 +5,31 @@ description: FastGPT OpenAPI Introduction
## Automated API Documentation ## Automated API Documentation
The automated API documentation covers all endpoints in the current version, regardless of whether they can be called via API Key. Starting with `4.15.0`, FastGPT API docs are generated with `zod-openapi`. Some legacy endpoints have not been migrated yet, so they may not appear in the generated docs. Visit the generated API documentation URL to view the latest endpoint details. The manually maintained endpoint descriptions in the left-hand documentation are no longer updated.
All future endpoints will be auto-generated, with documentation continuously improved. FastGPT provides two generated API documents:
- [China Mainland API Documentation](https://cloud.fastgpt.cn/openapi) - Dev API: all development APIs. Not every endpoint can be called with an API Key.
- [International API Documentation](https://cloud.fastgpt.io/openapi) - System OpenAPI: public endpoints that support API Key authentication.
## API Documentation URLs
Use your FastGPT endpoint as the base URL and append the path below:
- Dev API: `{{endpoint}}/apidoc/devapi`
- System OpenAPI: `{{endpoint}}/apidoc/systemopenapi`
## Cloud API Documentation URLs
**Dev API:**
- [China Mainland Documentation](https://cloud.fastgpt.cn/apidoc/devapi)
- [International Documentation](https://cloud.fastgpt.io/apidoc/devapi)
**System OpenAPI:**
- [China Mainland Documentation](https://cloud.fastgpt.cn/apidoc/systemopenapi)
- [International Documentation](https://cloud.fastgpt.io/apidoc/systemopenapi)
## Usage Guide ## Usage Guide
...@@ -22,20 +41,14 @@ FastGPT OpenAPI lets you authenticate with an API Key to access FastGPT services ...@@ -22,20 +41,14 @@ FastGPT OpenAPI lets you authenticate with an API Key to access FastGPT services
![](../../public/imgs/fastgpt-api-baseurl.png) ![](../../public/imgs/fastgpt-api-baseurl.png)
## API Key Types ## API Key
FastGPT has **two types of API Keys**: **Global API Keys** and **App API Keys**. They are created in different places, have different isolation boundaries, and support different APIs.
| Type | Where to create it | Isolation | Typical use |
| -------------- | ------------------------------ | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Global API Key | Account settings -> API Keys | Team-level key that is not bound to a single app | Call general OpenAPI endpoints that support API Key authentication. To call `chat/completions`, pass `appId` in the request body. Since `v4.15.0`, the team owner can enable `authProxy` for the key to proxy a team member identity, and the request body must include `authProxy`. |
| App API Key | App -> Publish Channels -> API | App-scoped key. Each key belongs to one app only | Call the `chat/completions` endpoint for that app. The key is already bound to the app, so you do not need to pass `appId`. App API Keys do not support `authProxy`. |
Use an `App API Key` when a third-party client or external system only needs to chat with one app. Use a `Global API Key` for server-side integrations that manage shared resources such as Knowledge Bases or apps, or when `chat/completions` needs `authProxy`. FastGPT uses a unified API Key model. API Keys are member credentials and are not bound to a single app.
| Global API Key | App API Key | - For app-related endpoints other than `chat/completions`, pass `appId` explicitly in the request body or query.
| --------------------------------------- | --------------------------------------- | - For `chat/completions`, passing `body.appId` is recommended.
| ![](../../public/imgs/fastgpt-api2.jpg) | ![](../../public/imgs/fastgpt-api1.jpg) | - For OpenAI SDK compatibility, `Authorization: Bearer <apiKey>-<appId>` is also supported for `chat/completions`. The `-<appId>` suffix is only a transport compatibility format and is not stored.
- Team owners can enable `authProxy` on an API Key to let `chat/completions` run as another team member. This does not skip app or chat permission checks.
## Basic Configuration ## Basic Configuration
...@@ -55,6 +68,7 @@ curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \ ...@@ -55,6 +68,7 @@ curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \
--header 'Authorization: Bearer fastgpt-xxxxxx' \ --header 'Authorization: Bearer fastgpt-xxxxxx' \
--header 'Content-Type: application/json' \ --header 'Content-Type: application/json' \
--data-raw '{ --data-raw '{
"appId": "your_app_id",
"chatId": "111", "chatId": "111",
"stream": false, "stream": false,
"detail": false, "detail": false,
...@@ -76,6 +90,7 @@ curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \ ...@@ -76,6 +90,7 @@ curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \
--header 'Authorization: Bearer fastgpt-xxxxxx' \ --header 'Authorization: Bearer fastgpt-xxxxxx' \
--header 'Content-Type: application/json' \ --header 'Content-Type: application/json' \
--data-raw '{ --data-raw '{
"appId": "your_app_id",
"chatId": "111", "chatId": "111",
"stream": false, "stream": false,
"detail": false, "detail": false,
......
--- ---
title: OpenAPI 介绍 title: API 文档介绍
description: FastGPT OpenAPI 介绍 description: FastGPT API 文档介绍
--- ---
## 自动化 API 文档 从 `4.15.0` 开始,FastGPT API 文档均采用 `zod-openapi` 自动生成的方式(部分旧接口未改造,所以不显示)。可通过访问 API 文档地址查看最新的接口情况,该文档里左侧手动编辑的接口说明不再更新。
自动化 API 文档为当前版本系统的所有接口,不区分是否可通过 API Key 调用。 FastGPT API 文档一共分成两套:
后续所有接口都将做自动化生成,会逐步完善文档。 - Dev API: 所有开发的 API,不一定能通过 ApiKey 调用。
- System OpenAPI: 系统所有开放的接口,可以通过系统 ApiKey 调用。
- [中国大陆版 API 文档](https://cloud.fastgpt.cn/openapi) ## API 文档地址
- [国际版 API 文档](https://cloud.fastgpt.io/openapi)
## 使用说明 endpoint 是你的 FastGPT 访问地址,拼上对应 path 即可打开文档。
FastGPT OpenAPI 接口允许你使用 API Key 进行鉴权,从而操作 FastGPT 上的相关服务和资源,例如:调用应用对话接口、上传知识库数据、搜索测试等等。出于兼容性和安全考虑,并不是所有的接口都允许通过 API Key 访问。 - Dev API: `{{endpoint}}/apidoc/devapi`
- System OpenAPI: `{{endpoint}}/apidoc/systemopenapi`
## 如何查看 BaseURL ## 云服务 API 文档地址
**注意:BaseURL 不是接口地址,而是所有接口的根地址,直接请求 BaseURL 是没有用的。** **Dev API:**
![](../../public/imgs/fastgpt-api-baseurl.png) - [中国大陆版文档](https://cloud.fastgpt.cn/apidoc/devapi)
- [国际版文档](https://cloud.fastgpt.io/apidoc/devapi)
## API Key 类型 **System OpenAPI**
FastGPT 的 API Key 分为 **全局 APIKey** 和 **应用 APIKey**。这两个概念的生成位置、隔离范围和可调用接口不同,请按实际场景选择。 - [中国大陆版文档](https://cloud.fastgpt.cn/apidoc/systemopenapi)
- [国际版文档](https://cloud.fastgpt.io/apidoc/systemopenapi)
| 类型 | 生成位置 | 隔离范围 | 典型用途 | ## 使用说明
| ----------- | ----------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 全局 APIKey | 账号设置 -> API 密钥 | 团队级全局密钥,不绑定单个应用 | 调用支持 API Key 鉴权的通用 OpenAPI。调用 `chat/completions` 时需要在请求体传入 `appId`;如需代理团队成员身份,`v4.15.0` 版本后可由团队所有者为该 key 开启 `authProxy`,再在请求体传入 `authProxy`。 |
| 应用 APIKey | 应用 -> 发布渠道 -> API | 按应用隔离,每个密钥只属于一个应用 | 只能调用该应用的 `chat/completions` 对话接口。密钥内已绑定应用,无需额外传 `appId`,也不支持 `authProxy`。 |
我们建议:第三方客户端或外部系统只需要对接单个应用对话时,使用 `应用 APIKey`;服务端需要操作知识库、应用管理等通用资源,或需要在对话接口中使用 `authProxy` 代理身份时,使用 `全局 APIKey`。 FastGPT OpenAPI 接口允许你使用 API Key 进行鉴权,从而操作 FastGPT 上的相关服务和资源,例如:调用应用对话接口、上传知识库数据、搜索测试等等。出于兼容性和安全考虑,并不是所有的接口都允许通过 API Key 访问。
| 全局 APIKey | 应用 APIKey | ### 如何查看 BaseURL
| --------------------------------------- | --------------------------------------- |
| ![](../../public/imgs/fastgpt-api2.jpg) | ![](../../public/imgs/fastgpt-api1.jpg) |
## 基本配置 **注意:BaseURL 不是接口地址,而是所有接口的根地址,直接请求 BaseURL 是没有用的。**
![](../../public/imgs/fastgpt-api-baseurl.png)
### 基本配置
OpenAPI 中,所有的接口都通过 Header.Authorization 进行鉴权。 OpenAPI 中,所有的接口都通过 Header.Authorization 进行鉴权。
...@@ -47,46 +49,3 @@ headers: { ...@@ -47,46 +49,3 @@ headers: {
Authorization: "Bearer {{apikey}}" Authorization: "Bearer {{apikey}}"
} }
``` ```
**发起应用对话示例**
```sh
curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \
--header 'Authorization: Bearer fastgpt-xxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"chatId": "111",
"stream": false,
"detail": false,
"messages": [
{
"content": "导演是谁",
"role": "user"
}
]
}'
```
## 自定义用户 ID
`v4.8.13` 后支持传入自定义的用户 ID, 并且存入历史记录中。
```sh
curl --location --request POST 'http://localhost:3000/api/v1/chat/completions' \
--header 'Authorization: Bearer fastgpt-xxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"chatId": "111",
"stream": false,
"detail": false,
"messages": [
{
"content": "导演是谁",
"role": "user"
}
],
"customUid": "xxxxxx"
}'
```
在历史记录中,该条记录的使用者会显示为 `xxxxxx`。
...@@ -10,10 +10,8 @@ translations = { ...@@ -10,10 +10,8 @@ translations = {
'对话接口': 'Chat API', '对话接口': 'Chat API',
'如何获取': 'How to Get', '如何获取': 'How to Get',
'可在应用详情的路径里获取': 'You can find the AppId in your application details URL', '可在应用详情的路径里获取': 'You can find the AppId in your application details URL',
'发起对话': 'Start a Conversation', '发起会话': 'Start a Conversation',
'该接口支持两类 APIKey': 'This API supports two API Key types', '使用 APIKey 鉴权': 'Authenticate with an API Key',
'应用 APIKey': 'App API Key',
'全局 APIKey': 'Global API Key',
'有些包调用时': 'Some packages require', '有些包调用时': 'Some packages require',
'需要添加': 'adding', '需要添加': 'adding',
'路径,有些不需要,如果出现404情况,可补充': 'to the path. If you get a 404 error, try adding', '路径,有些不需要,如果出现404情况,可补充': 'to the path. If you get a 404 error, try adding',
...@@ -139,7 +137,7 @@ for line in lines: ...@@ -139,7 +137,7 @@ for line in lines:
if line.startswith('#'): if line.startswith('#'):
if '如何获取 AppId' in line: if '如何获取 AppId' in line:
output.append('# How to Get AppId\n') output.append('# How to Get AppId\n')
elif '发起对话' in line: elif '发起会话' in line:
output.append('# Start a Conversation\n') output.append('# Start a Conversation\n')
elif '请求对话 Agent 和工作流' in line: elif '请求对话 Agent 和工作流' in line:
output.append('## Request Chat Agent and Workflow\n') output.append('## Request Chat Agent and Workflow\n')
...@@ -237,7 +235,7 @@ for line in lines: ...@@ -237,7 +235,7 @@ for line in lines:
translated = translated.replace('指一个对话窗口下,某一个对话记录的 ID', 'The ID of a chat record under a conversation window') translated = translated.replace('指一个对话窗口下,某一个对话记录的 ID', 'The ID of a chat record under a conversation window')
translated = translated.replace('如果工作流中包含交互节点,依然是调用该 API 接口,需要设置`detail=true`,并可以从`event=interactive`的数据中获取交互节点的配置信息。如果是`stream=false`,则可以从 choice 中获取`type=interactive`的元素,获取交互节点的选择信息。', 'If your workflow contains interactive nodes, still call this API with `detail=true`. Get interactive node config from `event=interactive` data. For `stream=false`, find `type=interactive` elements in choices.') translated = translated.replace('如果工作流中包含交互节点,依然是调用该 API 接口,需要设置`detail=true`,并可以从`event=interactive`的数据中获取交互节点的配置信息。如果是`stream=false`,则可以从 choice 中获取`type=interactive`的元素,获取交互节点的选择信息。', 'If your workflow contains interactive nodes, still call this API with `detail=true`. Get interactive node config from `event=interactive` data. For `stream=false`, find `type=interactive` elements in choices.')
translated = translated.replace('当你调用一个带交互节点的工作流时,如果工作流遇到了交互节点,那么会直接返回,你可以得到下面的信息:', 'When calling a workflow with interactive nodes, if an interactive node is encountered, it returns immediately with this info:') translated = translated.replace('当你调用一个带交互节点的工作流时,如果工作流遇到了交互节点,那么会直接返回,你可以得到下面的信息:', 'When calling a workflow with interactive nodes, if an interactive node is encountered, it returns immediately with this info:')
translated = translated.replace('紧接着上一节,当你接收到交互节点信息后,可以根据这些数据进行 UI 渲染,引导用户输入或选择相关信息。然后需要再次发起对话,来继续工作流。调用的接口与仍是该接口,你需要按以下格式来发起请求:', 'After receiving interactive node info, render your UI to guide user input or selection. Then call this API again to continue the workflow. Use this format:') translated = translated.replace('紧接着上一节,当你接收到交互节点信息后,可以根据这些数据进行 UI 渲染,引导用户输入或选择相关信息。然后需要再次发起会话,来继续工作流。调用的接口与仍是该接口,你需要按以下格式来发起请求:', 'After receiving interactive node info, render your UI to guide user input or selection. Then call this API again to continue the workflow. Use this format:')
translated = translated.replace('对于用户选择,你只需要直接传递一个选择的结果给 messages 即可。', 'For user selection, simply pass the selected value to messages.') translated = translated.replace('对于用户选择,你只需要直接传递一个选择的结果给 messages 即可。', 'For user selection, simply pass the selected value to messages.')
translated = translated.replace('表单输入稍微麻烦一点,需要将输入的内容,以对象形式并序列化成字符串,作为`messages`的值。对象的 key 对应表单的 key,value 为用户输入的值。务必确保`chatId`是一致的。', 'Form input is slightly more complex. Serialize the input as a JSON string for `messages`. Object keys match form keys, values are user inputs. Ensure `chatId` is consistent.') translated = translated.replace('表单输入稍微麻烦一点,需要将输入的内容,以对象形式并序列化成字符串,作为`messages`的值。对象的 key 对应表单的 key,value 为用户输入的值。务必确保`chatId`是一致的。', 'Form input is slightly more complex. Serialize the input as a JSON string for `messages`. Object keys match form keys, values are user inputs. Ensure `chatId` is consistent.')
translated = translated.replace('插件的接口与对话接口一致,仅请求参数略有区别,有以下规定:', 'Plugin API is identical to chat API, with slight parameter differences:') translated = translated.replace('插件的接口与对话接口一致,仅请求参数略有区别,有以下规定:', 'Plugin API is identical to chat API, with slight parameter differences:')
......
...@@ -220,6 +220,7 @@ These variables are mainly read by `projects/app`. Some are currently defined in ...@@ -220,6 +220,7 @@ These variables are mainly read by `projects/app`. Some are currently defined in
| `HIDE_CHAT_COPYRIGHT_SETTING` | `false` | Whether copyright settings are hidden. | | `HIDE_CHAT_COPYRIGHT_SETTING` | `false` | Whether copyright settings are hidden. |
| `APP_REGISTRATION_URL` | Empty | App registration application URL. Currently kept mostly for compatibility. | | `APP_REGISTRATION_URL` | Empty | App registration application URL. Currently kept mostly for compatibility. |
| `PASSWORD_EXPIRED_MONTH` | Empty | Password expiration period in months. Empty means passwords do not expire. | | `PASSWORD_EXPIRED_MONTH` | Empty | Password expiration period in months. Empty means passwords do not expire. |
| `OPENAPI_KEY_MAX_COUNT` | `100` | Maximum number of system API Keys one team member can create. Minimum is 1. |
## Admin-Specific Variables ## Admin-Specific Variables
......
...@@ -207,7 +207,7 @@ description: projects/app、projects/code-sandbox 与 pro/admin 环境变量说 ...@@ -207,7 +207,7 @@ description: projects/app、projects/code-sandbox 与 pro/admin 环境变量说
以下变量主要由 `projects/app` 读取。其中部分变量当前定义在 `packages/service/env.ts` 中做统一校验,但实际消费点仍在 App 层。 以下变量主要由 `projects/app` 读取。其中部分变量当前定义在 `packages/service/env.ts` 中做统一校验,但实际消费点仍在 App 层。
| 变量 | 默认值 | 说明 | | 变量 | 默认值 | 说明 |
| ----------------------------- | -------- | ----------------------------------------------------- | | ----------------------------- | -------- | ------------------------------------------------------- |
| `DEFAULT_ROOT_PSW` | `123456` | 初始化 root 用户默认密码。 | | `DEFAULT_ROOT_PSW` | `123456` | 初始化 root 用户默认密码。 |
| `SYSTEM_NAME` | `AI` | 页面标题默认系统名。 | | `SYSTEM_NAME` | `AI` | 页面标题默认系统名。 |
| `SYSTEM_DESCRIPTION` | 空 | 页面 Meta 描述,不配置时使用默认国际化文案。 | | `SYSTEM_DESCRIPTION` | 空 | 页面 Meta 描述,不配置时使用默认国际化文案。 |
...@@ -220,6 +220,7 @@ description: projects/app、projects/code-sandbox 与 pro/admin 环境变量说 ...@@ -220,6 +220,7 @@ description: projects/app、projects/code-sandbox 与 pro/admin 环境变量说
| `HIDE_CHAT_COPYRIGHT_SETTING` | `false` | 是否隐藏版权信息配置项。 | | `HIDE_CHAT_COPYRIGHT_SETTING` | `false` | 是否隐藏版权信息配置项。 |
| `APP_REGISTRATION_URL` | 空 | 应用备案申请地址;当前主要作为兼容配置保留。 | | `APP_REGISTRATION_URL` | 空 | 应用备案申请地址;当前主要作为兼容配置保留。 |
| `PASSWORD_EXPIRED_MONTH` | 空 | 密码过期月份数;为空表示不过期。 | | `PASSWORD_EXPIRED_MONTH` | 空 | 密码过期月份数;为空表示不过期。 |
| `OPENAPI_KEY_MAX_COUNT` | `100` | 单个团队成员最多可创建的系统 API Key 数量,最小值为 1。 |
## Admin 额外变量 ## Admin 额外变量
......
...@@ -104,6 +104,11 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -104,6 +104,11 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
-d '{"runArchive":true,"inactiveDays":0}' -d '{"runArchive":true,"inactiveDays":0}'
``` ```
## Breaking Changes
1. API Key behavior has changed. FastGPT no longer distinguishes between app keys and system keys; only system keys are kept. For OpenAI SDK compatibility, pass the token as `apikey-appId`. Existing API keys remain compatible and continue to work. For details, see the [FastGPT API documentation](../../../openapi/intro).
2. Some APIs now enforce stricter data format validation. If you see a `zod parse error`, please submit an issue. It may be caused by legacy data or custom data structures that do not match the declared schema.
## 🚀 New Features ## 🚀 New Features
1. Added the Loop node and deprecated the legacy batch execution node. 1. Added the Loop node and deprecated the legacy batch execution node.
...@@ -185,7 +190,7 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -185,7 +190,7 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
1. Reorganized the overall code structure, upgraded Next.js, switched to Turbopack builds, and upgraded the default container Node.js version to 24. 1. Reorganized the overall code structure, upgraded Next.js, switched to Turbopack builds, and upgraded the default container Node.js version to 24.
2. Unified Agent tool declaration and execution behavior. 2. Unified Agent tool declaration and execution behavior.
3. The plugin service moved from the legacy `runtime` structure to a pnpm workspace monorepo, split into HTTP service entry, domain model, use cases, API adapter, infrastructure, SDK, and CLI. 3. The plugin service moved from the legacy `runtime` structure to a pnpm workspace monorepo, split into HTTP service entry, domain model, use cases, API adapter, infrastructure, SDK, and CLI.
4. App API interfaces now use zod schemas consistently and generate documentation. 4. Application-related API interfaces now use zod schemas consistently and generate documentation.
5. Split AI request, Workflow run detail, and chatbox code to reduce module coupling. 5. Split AI request, Workflow run detail, and chatbox code to reduce module coupling.
6. Optimized user-defined API key billing logic and token calculation dependencies. 6. Optimized user-defined API key billing logic and token calculation dependencies.
7. Server-side environment loading now uses `@t3-oss/env-core` with stronger type checks. Other services also use centralized environment exports. 7. Server-side environment loading now uses `@t3-oss/env-core` with stronger type checks. Other services also use centralized environment exports.
......
...@@ -93,29 +93,35 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -93,29 +93,35 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
### 清理重复对话,构建唯一索引 ### 清理重复对话,构建唯一索引
## 功能重大变化
1. ApiKey 功能调整,不再区分应用 key 和系统 key,只保留系统 key,如需兼容 openai sdk 用法,可使用 `apikey-appId` 的方式传递 Token。已有的 apikey 保持兼容,不影响使用。具体和查阅 [FastGPT API 文档说明](../../../openapi/intro)
2. 部分 API 增加了更为严格的数据格式校验,如过遇到报错: `zod parse error` 可提交 issue 反馈,可能因一些旧数据或者自定义数据结构与声明不一致。
## 🚀 新增内容 ## 🚀 新增内容
1. 新增技能模块,Agent V2 可绑定静态 Skill 来运行。 1. 新增技能模块,Agent V2 可绑定静态 Skill 来运行。
2. 重写 Agent V2 loop 逻辑,提升多轮工具调用和流程编排的稳定性。 2. 重写 Agent V2 loop 逻辑,提升多轮工具调用和流程编排的稳定性。
3. 插件系统架构重写,支持插件级 runtime config,系统工具运行迁移到 local-pool。 3. 插件系统架构重写,支持插件级 runtime config,系统工具运行迁移到 local-pool。
4. 新增循环节点,弃用旧的批量执行。 4. 重写 chatbox UI,支持快速滚动到底部、模型生成对话标题和更流畅的流式输出动效。
5. 知识库搜索支持原生多模态 embedding 模型、图搜图和 Agent 模式权限过滤。 5. 新增循环节点,弃用旧的批量执行。
6. 多模态模型支持音视频输入。 6. 知识库搜索支持原生多模态 embedding 模型、图搜图和 Agent 模式权限过滤。
7. 第三方知识库新增钉钉知识库接入。 7. 多模态模型支持音视频输入。
8. 重写 chatbox UI,支持快速滚动到底部、模型生成对话标题和更流畅的流式输出动效。 8. API 密钥逻辑优化,统一 APIKey 管理并由请求显式传入应用上下文。
9. 应用/知识库增加虚拟列表渲染,优化大列表加载性能。 9. 生成 DevAPI 和 System OpenAPI 两套 API 文档。
10. 增加单独的 OpenAPI 文档,区分 DevAPI 文档。 10. 支持快速回复的输出语法。
11. 工作流模板导出支持同时导出名称和介绍。 11. 第三方知识库新增钉钉知识库接入。
12. 全局变量输入框支持输入 object 类型数据。 12. 增加模型思考配置。
13. 工具调用模式下,如果开启虚拟机功能,用户对话框上传的文件会直接注入到虚拟机中。 13. 工作流模板导出支持同时导出名称和介绍。
14. 增加文件解析、HTML 转 Markdown、文本切块 worker pool,避免并发太高导致资源耗尽。 14. 全局变量输入框支持输入 object 类型数据。
15. 增加模型思考配置。 15. 工具调用模式下,如果开启虚拟机功能,用户对话框上传的文件会直接注入到虚拟机中。
16. S3 支持配置 CDN。 16. 增加文件解析、HTML 转 Markdown、文本切块 worker pool,避免并发太高导致资源耗尽。
17. Rerank 支持配置 defaultConfig。 17. 支持目录深度环境变量,避免无限嵌套目录。可配置环境变量 `MAX_FOLDER_DEPTH`。
18. 分享链接/门户页支持语言切换,不再强制自动识别浏览器语言。 18. S3 支持配置 CDN。
19. Chat API 增加 `dataId` 重复校验,避免脏数据进入工作流与流恢复合并逻辑。 19. Rerank 支持配置 defaultConfig。
20. HTTP 节点支持配置忽略 TLS 证书校验,并支持返回完整错误对象。 20. 分享链接/门户页支持语言切换,不再强制自动识别浏览器语言。
21. 支持目录深度环境变量,避免无限嵌套目录。 21. Chat API 增加 `dataId` 重复校验,避免脏数据进入工作流与流恢复合并逻辑。
22. HTTP 节点支持配置忽略 TLS 证书校验,并支持返回完整错误对象。
## ⚙️ 优化 ## ⚙️ 优化
...@@ -126,8 +132,8 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -126,8 +132,8 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
5. 优化工作流节点名称、介绍输入和超长名称适配。 5. 优化工作流节点名称、介绍输入和超长名称适配。
6. 工作流编辑页因登录失效跳出后,自动保存草稿用于恢复。 6. 工作流编辑页因登录失效跳出后,自动保存草稿用于恢复。
7. 工作流运行详情中,表单输入节点的文件字段以文件列表形式展示。 7. 工作流运行详情中,表单输入节点的文件字段以文件列表形式展示。
8. 工作流运行的 nodeResponse 改为扁平化存储,避免大的嵌套工作流保存失败。 8. 工作流数组引用类型增强校验,避免与二维数据冲突。
9. 工作流数组引用类型增强校验,避免与二维数据冲突。 9. 图片处理线程支持配置是否转化成 base64 发送给模型,`MULTIPLE_DATA_TO_BASE64=true` 变量。
10. HTML 输出后自动切换为预览,减少手动打开预览的操作。 10. HTML 输出后自动切换为预览,减少手动打开预览的操作。
11. 流恢复暂停和异常中断恢复体验优化,减少会话卡在「生成中」或停止态不准确的问题。 11. 流恢复暂停和异常中断恢复体验优化,减少会话卡在「生成中」或停止态不准确的问题。
12. 切换应用时按应用恢复最近会话,切换团队时清除本地 chat 缓存。 12. 切换应用时按应用恢复最近会话,切换团队时清除本地 chat 缓存。
...@@ -140,17 +146,16 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -140,17 +146,16 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
19. 输入引导配置增加校验,避免错误配置自定义词库地址。 19. 输入引导配置增加校验,避免错误配置自定义词库地址。
20. 加强第三方知识库请求、HTTP tool parse、IP 检测和 Code Sandbox AST 检查等安全防护。 20. 加强第三方知识库请求、HTTP tool parse、IP 检测和 Code Sandbox AST 检查等安全防护。
21. 文件注入 messages 位置从 system 调整至 user,便于命中缓存。 21. 文件注入 messages 位置从 system 调整至 user,便于命中缓存。
22. 移除所有内置 LLM 请求中的 `temperature` 和 `max_tokens`,避免部分模型不兼容。 22. reason hide 开关完善,确保 UI 不显示时,请求 LLM 仍可保留 reason。
23. reason hide 开关完善,确保 UI 不显示时,请求 LLM 仍可保留 reason。 23. chat2messages adapt 优化,避免出现独立的 reason。
24. chat2messages adapt 优化,避免出现独立的 reason。 24. 工具运行空响应时自动补充 `none`,避免部分模型报错。
25. 工具运行空响应时自动补充 `none`,避免部分模型报错。 25. 非管理员/访客触发余额不足时,优化提示。
26. 非管理员/访客触发余额不足时,优化提示。 26. 无创建权限时隐藏模板功能。
27. 无创建权限时隐藏模板功能。 27. 应用、知识库、文件和文件夹等长名称展示优化:超出宽度时自动省略,hover 名称时展示完整内容。
28. 应用、知识库、文件和文件夹等长名称展示优化:超出宽度时自动省略,hover 名称时展示完整内容。 28. 技能模块相关弹窗、编辑交互和列表接口性能优化。
29. 技能模块相关弹窗、编辑交互和列表接口性能优化。 29. 登录页 UI 优化。
30. 登录页 UI 优化。 30. 站点同步限流错误提示去重。
31. 站点同步限流错误提示去重。 31. 应用/知识库增加虚拟列表渲染,优化大列表加载性能。
32. 图片处理线程支持配置是否转化成 base64 发送给模型。
## 🐛 修复 ## 🐛 修复
...@@ -167,7 +172,7 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -167,7 +172,7 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
11. 修复发布渠道 - 门户 UI 偏移。 11. 修复发布渠道 - 门户 UI 偏移。
12. 修复 v1/completions 接口 `nodeResponse` 中 `quoteList` 未返回 `q`、`a` 的问题。 12. 修复 v1/completions 接口 `nodeResponse` 中 `quoteList` 未返回 `q`、`a` 的问题。
13. 修复对话流恢复过程中的表单回填、文件列表恢复、节点响应保留、重复交互追加、临时历史标题和跨应用会话串显问题。 13. 修复对话流恢复过程中的表单回填、文件列表恢复、节点响应保留、重复交互追加、临时历史标题和跨应用会话串显问题。
14. 停止对话提示改为与后端生成态同步,移除停止时的 warning toast。 14. 停止会话提示改为与后端生成态同步,移除停止时的 warning toast。
## 🛠️ 代码优化 ## 🛠️ 代码优化
...@@ -185,3 +190,5 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -185,3 +190,5 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
12. volume manager 从 Bun 改为 Node.js 运行。 12. volume manager 从 Bun 改为 Node.js 运行。
13. 及时处理 worker 内图片,不再存留 base64,降低内存消耗。 13. 及时处理 worker 内图片,不再存留 base64,降低内存消耗。
14. 增加系统处理字符串时的长度保护,如果长度过大会停止继续同步替换,避免高 CPU 负载。 14. 增加系统处理字符串时的长度保护,如果长度过大会停止继续同步替换,避免高 CPU 负载。
15. 工作流运行的 nodeResponse 改为扁平化存储,避免大的嵌套工作流保存失败。
16. 移除所有内置 LLM 请求中的 `temperature` 和 `max_tokens`,避免部分模型不兼容。
...@@ -51,7 +51,7 @@ description: 'FastGPT V4.15.0-beta2 更新说明' ...@@ -51,7 +51,7 @@ description: 'FastGPT V4.15.0-beta2 更新说明'
- 已提交表单后不再重复追加过期未提交交互;恢复过程中表单默认值能随 `formInputResult` 同步更新。 - 已提交表单后不再重复追加过期未提交交互;恢复过程中表单默认值能随 `formInputResult` 同步更新。
- 新对话发起后,侧栏临时历史项优先展示用户输入生成的标题,服务端标题落库后再覆盖,避免长时间显示「新对话」。 - 新对话发起后,侧栏临时历史项优先展示用户输入生成的标题,服务端标题落库后再覆盖,避免长时间显示「新对话」。
- 切换不同应用时,侧栏或会话内容短暂展示其他应用聊天记录的问题。 - 切换不同应用时,侧栏或会话内容短暂展示其他应用聊天记录的问题。
5. 停止对话提示:移除停止时的 warning toast,改为与后端生成态同步的状态提示。 5. 停止会话提示:移除停止时的 warning toast,改为与后端生成态同步的状态提示。
6. v1/completions 接口,nodeResponse 中,quoteList 未返回 `q` , `a`。 6. v1/completions 接口,nodeResponse 中,quoteList 未返回 `q` , `a`。
## 🛠️ 代码优化 ## 🛠️ 代码优化
......
...@@ -3,6 +3,10 @@ title: 'V4.15.0-beta5 (In Progress)' ...@@ -3,6 +3,10 @@ title: 'V4.15.0-beta5 (In Progress)'
description: 'FastGPT V4.15.0-beta5 Release Notes' description: 'FastGPT V4.15.0-beta5 Release Notes'
--- ---
## Breaking Changes
1. API Key behavior has changed. FastGPT no longer distinguishes between app keys and system keys; only system keys are kept. For OpenAI SDK compatibility, pass the token as `apikey-appId`. Existing API keys remain compatible and continue to work. For details, see the [FastGPT API documentation](../../../openapi/intro).
## 🚀 New Features ## 🚀 New Features
1. The HTTP node now supports ignoring TLS certificate verification, which is useful when calling HTTPS services that use self-signed or internal certificates. 1. The HTTP node now supports ignoring TLS certificate verification, which is useful when calling HTTPS services that use self-signed or internal certificates.
......
--- ---
title: 'V4.15.0-beta5(进行中)' title: 'V4.15.0-beta5'
description: 'FastGPT V4.15.0-beta5 更新说明' description: 'FastGPT V4.15.0-beta5 更新说明'
--- ---
## 📦 升级指南 ## 📦 升级指南
### 修改环境变量 ### 1. 修改环境变量
`fastgpt` 和 `fastgpt-pro` 增加环境变量 `CHAT_TITLE_MODEL`,用于自动生成对话的标题,例如: `fastgpt` 和 `fastgpt-pro` 增加环境变量 `CHAT_TITLE_MODEL`,用于自动生成对话的标题,例如:
...@@ -13,7 +13,14 @@ description: 'FastGPT V4.15.0-beta5 更新说明' ...@@ -13,7 +13,14 @@ description: 'FastGPT V4.15.0-beta5 更新说明'
CHAT_TITLE_MODEL=deepseek-v4-flash CHAT_TITLE_MODEL=deepseek-v4-flash
``` ```
### 升级脚本 ### 2. 镜像变更
- 更新 fastgpt-app(fastgpt 主服务) 镜像 tag: v4.15.0-beta5
- 更新 fastgpt-pro(fastgpt 商业版) 镜像 tag: v4.15.0-beta5
- 更新 fastgpt-plugin 镜像 tag: v1.0.0-beta5
- 更新 aiproxy 镜像 tag: v0.6.2
### 3. 升级脚本
将所有旧的沙盒 workspace 归档到 s3 里,从而更彻底的释放不活跃的沙盒,旧的沙盒可能因为超时安装 zip 失败。因为旧的沙盒大部分关联的是旧的对话,不执行该脚本,直接把旧的沙盒全部移除也可以。该脚本仅影响旧的沙盒,不影响新生成沙盒。 将所有旧的沙盒 workspace 归档到 s3 里,从而更彻底的释放不活跃的沙盒,旧的沙盒可能因为超时安装 zip 失败。因为旧的沙盒大部分关联的是旧的对话,不执行该脚本,直接把旧的沙盒全部移除也可以。该脚本仅影响旧的沙盒,不影响新生成沙盒。
...@@ -24,6 +31,10 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -24,6 +31,10 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
-d '{"runArchive":true,"inactiveDays":0}' -d '{"runArchive":true,"inactiveDays":0}'
``` ```
## 功能重大变化
1. ApiKey 功能调整,不再区分应用 key 和系统 key,只保留系统 key,如需兼容 openai sdk 用法,可使用 `apikey-appId` 的方式传递 Token。已有的 apikey 保持兼容,不影响使用。具体和查阅 [FastGPT API 文档说明](../../../openapi/intro)
## 🚀 新增内容 ## 🚀 新增内容
1. HTTP 节点支持配置忽略 TLS 证书校验,适用于调用使用自签名证书或内部证书的 HTTPS 服务。 1. HTTP 节点支持配置忽略 TLS 证书校验,适用于调用使用自签名证书或内部证书的 HTTPS 服务。
...@@ -34,6 +45,9 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \ ...@@ -34,6 +45,9 @@ curl --location --request POST 'https://{{host}}/api/admin/initSandboxArchive' \
6. 调整 Skill Edit 编辑交互。 6. 调整 Skill Edit 编辑交互。
7. HTTP 节点支持返回完整错误对象。 7. HTTP 节点支持返回完整错误对象。
8. agent 模式知识库搜索,支持权限过滤。 8. agent 模式知识库搜索,支持权限过滤。
9. API 密钥逻辑优化,统一 APIKey 管理并由请求显式传入应用上下文。
10. 优化 agent 上下文压缩逻辑。
11. 支持快速回复的输出语法。
## ⚙️ 优化 ## ⚙️ 优化
......
...@@ -62,7 +62,7 @@ description: FastGPT V4.8.11 更新说明 ...@@ -62,7 +62,7 @@ description: FastGPT V4.8.11 更新说明
} }
``` ```
------- ---
### 3. 修改镜像 tag 并重启 ### 3. 修改镜像 tag 并重启
...@@ -72,7 +72,7 @@ description: FastGPT V4.8.11 更新说明 ...@@ -72,7 +72,7 @@ description: FastGPT V4.8.11 更新说明
### 4. 商业版初始化 ### 4. 商业版初始化
从任意终端,发起 1 个 HTTP 请求。其中 `{{rootkey}}` 替换成环境变量里的 `rootkey`;`{{host}}` 替换成**FastGPT 域名**: 从任意终端,发起 1 个 HTTP 请求。其中 `{{rootkey}}` 替换成环境变量里的 `rootkey`;`{{host}}` 替换成 **FastGPT 域名**:
```bash ```bash
curl --location --request POST 'https://{{host}}/api/admin/init/4811' \ curl --location --request POST 'https://{{host}}/api/admin/init/4811' \
...@@ -91,11 +91,11 @@ curl --location --request POST 'https://{{host}}/api/admin/init/4811' \ ...@@ -91,11 +91,11 @@ curl --location --request POST 'https://{{host}}/api/admin/init/4811' \
5. 新增 - 聊天记录滚动加载,不再只加载 30 条。 5. 新增 - 聊天记录滚动加载,不再只加载 30 条。
6. 新增 - 工作流增加触摸板优先模式,可以通过工作流右下角按键进行切换。 6. 新增 - 工作流增加触摸板优先模式,可以通过工作流右下角按键进行切换。
7. 新增 - 沙盒增加字符串转 base64 全局方法(全局变量 strToBase64)。 7. 新增 - 沙盒增加字符串转 base64 全局方法(全局变量 strToBase64)。
8. 新增 - 支持 Openai o1 模型,需增加模型的 `defaultConfig` 配置,覆盖 `temperature`、`max_tokens` 和 `stream`配置,o1 不支持 stream 模式。 8. 新增 - 支持 Openai o1 模型,需增加模型的 `defaultConfig` 配置,覆盖 `temperature`、`max_tokens` 和 `stream` 配置,o1 不支持 stream 模式。
9. 新增 - AI 对话节点知识库引用,支持配置 role=system 和 role=user,已配置的过自定义提示词的节点将会保持 user 模式,其余用户将转成 system 模式。 9. 新增 - AI 对话节点知识库引用,支持配置 role=system 和 role=user,已配置的过自定义提示词的节点将会保持 user 模式,其余用户将转成 system 模式。
10. 新增 - 插件支持上传系统文件。 10. 新增 - 插件支持上传系统文件。
11. 新增 - 插件输出,支持指定字段作为工具响应。 11. 新增 - 插件输出,支持指定字段作为工具响应。
12. 新增 - 支持工作流嵌套子应用时,可以设置`非流模式`,同时简易模式也可以选择工作流作为插件了,简易模式调用子应用时,都将强制使用非流模式。 12. 新增 - 支持工作流嵌套子应用时,可以设置 `非流模式`,同时简易模式也可以选择工作流作为插件了,简易模式调用子应用时,都将强制使用非流模式。
13. 新增 - 调试模式下,子应用调用,支持返回详细运行数据。 13. 新增 - 调试模式下,子应用调用,支持返回详细运行数据。
14. 新增 - 保留所有模式下子应用嵌套调用的日志。 14. 新增 - 保留所有模式下子应用嵌套调用的日志。
15. 新增 - 对话日志显示成员。 15. 新增 - 对话日志显示成员。
...@@ -111,24 +111,24 @@ curl --location --request POST 'https://{{host}}/api/admin/init/4811' \ ...@@ -111,24 +111,24 @@ curl --location --request POST 'https://{{host}}/api/admin/init/4811' \
25. 优化 - 工作流快捷键,避免调试测试时也会触发复制和回退。 25. 优化 - 工作流快捷键,避免调试测试时也会触发复制和回退。
26. 优化 - 工作流复制时,名字去掉多余“#”。 26. 优化 - 工作流复制时,名字去掉多余“#”。
27. 优化 - 流输出,切换浏览器 Tab 后仍可以继续输出。 27. 优化 - 流输出,切换浏览器 Tab 后仍可以继续输出。
28. 优化 - 完善外部文件知识库相关 API 。 28. 优化 - 完善外部文件知识库相关 API。
29. 优化 - 修改 config.json 的地址。 29. 优化 - 修改 config.json 的地址。
30. 优化 - 正确处理//开头的超链接。 30. 优化 - 正确处理//开头的超链接。
31. 优化 - 工作流 Textarea 滚轮可以正常滚动而不是缩放。 31. 优化 - 工作流 Textarea 滚轮可以正常滚动而不是缩放。
32. 优化 - 去除部分输入框前后空格。 32. 优化 - 去除部分输入框前后空格。
33. 优化 - 工作流返回时,跳转到上一次记忆的 Tab 。 33. 优化 - 工作流返回时,跳转到上一次记忆的 Tab。
34. 优化 - 工作流画布禁止触摸板缩放浏览器。 34. 优化 - 工作流画布禁止触摸板缩放浏览器。
35. 优化 - 工作流部分节点会自动选择用户问题作为初始值。 35. 优化 - 工作流部分节点会自动选择用户问题作为初始值。
36. 优化 - Prompt Editor 支持动态增高。 36. 优化 - Prompt Editor 支持动态增高。
37. 优化 - 自动补全工具描述。 37. 优化 - 自动补全工具描述。
38. 优化 - 文档说明 configuration.md 。 38. 优化 - 文档说明 configuration.md。
39. 优化 - IOS safari 浏览器语音输入不准确。 39. 优化 - iOS safari 浏览器语音输入不准确。
40. 修复 - 知识库选择权限问题。 40. 修复 - 知识库选择权限问题。
41. 修复 - 空 chatId 发起对话,首轮携带用户选择时会异常。 41. 修复 - 空 chatId 发起会话,首轮携带用户选择时会异常。
42. 修复 - createDataset 接口,intro 未赋值。 42. 修复 - createDataset 接口,intro 未赋值。
43. 修复 - 对话框渲染性能问题。 43. 修复 - 对话框渲染性能问题。
44. 修复 - Rerank 文档地址。 44. 修复 - Rerank 文档地址。
45. 修复 - Stream 模式下使用 toolChoice,toolCall 的function 和type 可能为 null 。 45. 修复 - Stream 模式下使用 toolChoice,toolCall 的 function 和 type 可能为 null。
46. 修复 - 站点同步自定义分割符未同步。 46. 修复 - 站点同步自定义分割符未同步。
47. 修复 - 工具调用历史记录存储问题。 47. 修复 - 工具调用历史记录存储问题。
48. 修复 - 对话页面可能无限重定向。 48. 修复 - 对话页面可能无限重定向。
......
...@@ -27,8 +27,8 @@ ...@@ -27,8 +27,8 @@
"content/guide/build/publish/mcp_server.mdx": "2026-06-22T11:01:59+08:00", "content/guide/build/publish/mcp_server.mdx": "2026-06-22T11:01:59+08:00",
"content/guide/build/publish/official_account.en.mdx": "2026-05-07T15:06:40+08:00", "content/guide/build/publish/official_account.en.mdx": "2026-05-07T15:06:40+08:00",
"content/guide/build/publish/official_account.mdx": "2026-05-07T15:06:40+08:00", "content/guide/build/publish/official_account.mdx": "2026-05-07T15:06:40+08:00",
"content/guide/build/publish/openapi.en.mdx": "2026-06-18T10:43:42+08:00", "content/guide/build/publish/openapi.en.mdx": "2026-06-23T11:27:33+08:00",
"content/guide/build/publish/openapi.mdx": "2026-06-18T10:43:42+08:00", "content/guide/build/publish/openapi.mdx": "2026-06-23T11:27:33+08:00",
"content/guide/build/publish/wechat.en.mdx": "2026-05-07T15:06:40+08:00", "content/guide/build/publish/wechat.en.mdx": "2026-05-07T15:06:40+08:00",
"content/guide/build/publish/wechat.mdx": "2026-05-07T15:06:40+08:00", "content/guide/build/publish/wechat.mdx": "2026-05-07T15:06:40+08:00",
"content/guide/build/publish/wecom.en.mdx": "2026-05-07T15:06:40+08:00", "content/guide/build/publish/wecom.en.mdx": "2026-05-07T15:06:40+08:00",
...@@ -139,14 +139,14 @@ ...@@ -139,14 +139,14 @@
"content/guide/workspace/team/team_roles_permissions.mdx": "2026-05-07T15:06:40+08:00", "content/guide/workspace/team/team_roles_permissions.mdx": "2026-05-07T15:06:40+08:00",
"content/openapi/app.en.mdx": "2026-05-29T19:31:16+08:00", "content/openapi/app.en.mdx": "2026-05-29T19:31:16+08:00",
"content/openapi/app.mdx": "2026-05-29T19:31:16+08:00", "content/openapi/app.mdx": "2026-05-29T19:31:16+08:00",
"content/openapi/chat.en.mdx": "2026-06-18T10:43:42+08:00", "content/openapi/chat.en.mdx": "2026-06-23T11:27:33+08:00",
"content/openapi/chat.mdx": "2026-06-18T10:43:42+08:00", "content/openapi/chat.mdx": "2026-06-23T12:10:31+08:00",
"content/openapi/dataset.en.mdx": "2026-05-29T19:31:16+08:00", "content/openapi/dataset.en.mdx": "2026-05-29T19:31:16+08:00",
"content/openapi/dataset.mdx": "2026-05-29T19:31:16+08:00", "content/openapi/dataset.mdx": "2026-05-29T19:31:16+08:00",
"content/openapi/index.en.mdx": "2026-04-26T21:08:47+08:00", "content/openapi/index.en.mdx": "2026-04-26T21:08:47+08:00",
"content/openapi/index.mdx": "2026-04-26T21:08:47+08:00", "content/openapi/index.mdx": "2026-04-26T21:08:47+08:00",
"content/openapi/intro.en.mdx": "2026-06-18T10:43:42+08:00", "content/openapi/intro.en.mdx": "2026-06-23T11:27:33+08:00",
"content/openapi/intro.mdx": "2026-06-18T10:43:42+08:00", "content/openapi/intro.mdx": "2026-06-23T12:10:31+08:00",
"content/plugin/index.en.mdx": "2026-06-04T16:10:15+08:00", "content/plugin/index.en.mdx": "2026-06-04T16:10:15+08:00",
"content/plugin/index.mdx": "2026-06-04T16:10:15+08:00", "content/plugin/index.mdx": "2026-06-04T16:10:15+08:00",
"content/plugin/intro.en.mdx": "2026-06-09T16:03:58+08:00", "content/plugin/intro.en.mdx": "2026-06-09T16:03:58+08:00",
...@@ -257,6 +257,8 @@ ...@@ -257,6 +257,8 @@
"content/self-host/upgrading/4-14/41422.mdx": "2026-05-23T22:47:02+08:00", "content/self-host/upgrading/4-14/41422.mdx": "2026-05-23T22:47:02+08:00",
"content/self-host/upgrading/4-14/41424.en.mdx": "2026-06-10T17:33:23+08:00", "content/self-host/upgrading/4-14/41424.en.mdx": "2026-06-10T17:33:23+08:00",
"content/self-host/upgrading/4-14/41424.mdx": "2026-06-10T17:33:23+08:00", "content/self-host/upgrading/4-14/41424.mdx": "2026-06-10T17:33:23+08:00",
"content/self-host/upgrading/4-14/41425.en.mdx": "2026-06-22T12:20:51+08:00",
"content/self-host/upgrading/4-14/41425.mdx": "2026-06-22T12:20:51+08:00",
"content/self-host/upgrading/4-14/4143.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/4-14/4143.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/4-14/4143.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/4-14/4143.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/4-14/4144.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/4-14/4144.en.mdx": "2026-04-26T21:08:47+08:00",
...@@ -275,17 +277,17 @@ ...@@ -275,17 +277,17 @@
"content/self-host/upgrading/4-14/41481.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/4-14/41481.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/4-14/4149.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/4-14/4149.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/4-14/4149.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/4-14/4149.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/4-15/41500.en.mdx": "2026-06-22T11:01:59+08:00", "content/self-host/upgrading/4-15/41500.en.mdx": "2026-06-23T11:27:33+08:00",
"content/self-host/upgrading/4-15/41500.mdx": "2026-06-22T11:01:59+08:00", "content/self-host/upgrading/4-15/41500.mdx": "2026-06-23T11:27:33+08:00",
"content/self-host/upgrading/4-15/41501.mdx": "2026-06-22T11:01:59+08:00", "content/self-host/upgrading/4-15/41501.mdx": "2026-06-22T11:01:59+08:00",
"content/self-host/upgrading/4-15/41502.en.mdx": "2026-05-25T11:21:30+08:00", "content/self-host/upgrading/4-15/41502.en.mdx": "2026-05-25T11:21:30+08:00",
"content/self-host/upgrading/4-15/41502.mdx": "2026-05-25T11:21:30+08:00", "content/self-host/upgrading/4-15/41502.mdx": "2026-06-22T22:05:59+08:00",
"content/self-host/upgrading/4-15/41503.en.mdx": "2026-05-28T16:21:09+08:00", "content/self-host/upgrading/4-15/41503.en.mdx": "2026-05-28T16:21:09+08:00",
"content/self-host/upgrading/4-15/41503.mdx": "2026-05-28T16:21:09+08:00", "content/self-host/upgrading/4-15/41503.mdx": "2026-05-28T16:21:09+08:00",
"content/self-host/upgrading/4-15/41504.en.mdx": "2026-06-10T19:02:59+08:00", "content/self-host/upgrading/4-15/41504.en.mdx": "2026-06-10T19:02:59+08:00",
"content/self-host/upgrading/4-15/41504.mdx": "2026-06-15T23:34:43+08:00", "content/self-host/upgrading/4-15/41504.mdx": "2026-06-15T23:34:43+08:00",
"content/self-host/upgrading/4-15/41505.en.mdx": "2026-06-12T20:47:04+08:00", "content/self-host/upgrading/4-15/41505.en.mdx": "2026-06-12T20:47:04+08:00",
"content/self-host/upgrading/4-15/41505.mdx": "2026-06-22T11:01:59+08:00", "content/self-host/upgrading/4-15/41505.mdx": "2026-06-23T11:27:33+08:00",
"content/self-host/upgrading/outdated/40.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/40.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/40.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/40.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/41.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/41.en.mdx": "2026-04-26T21:08:47+08:00",
...@@ -353,7 +355,7 @@ ...@@ -353,7 +355,7 @@
"content/self-host/upgrading/outdated/4810.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/4810.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/4810.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/4810.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/4811.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/4811.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/4811.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/4811.mdx": "2026-06-22T22:05:59+08:00",
"content/self-host/upgrading/outdated/4812.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/4812.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/4812.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/outdated/4812.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/outdated/4813.en.mdx": "2026-05-07T15:06:40+08:00", "content/self-host/upgrading/outdated/4813.en.mdx": "2026-05-07T15:06:40+08:00",
...@@ -426,6 +428,6 @@ ...@@ -426,6 +428,6 @@
"content/self-host/upgrading/outdated/499.mdx": "2026-05-07T15:06:40+08:00", "content/self-host/upgrading/outdated/499.mdx": "2026-05-07T15:06:40+08:00",
"content/self-host/upgrading/upgrade-intruction.en.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/upgrade-intruction.en.mdx": "2026-04-26T21:08:47+08:00",
"content/self-host/upgrading/upgrade-intruction.mdx": "2026-04-26T21:08:47+08:00", "content/self-host/upgrading/upgrade-intruction.mdx": "2026-04-26T21:08:47+08:00",
"content/toc.en.mdx": "2026-06-22T11:01:59+08:00", "content/toc.en.mdx": "2026-06-22T12:20:51+08:00",
"content/toc.mdx": "2026-06-22T11:01:59+08:00" "content/toc.mdx": "2026-06-22T12:20:51+08:00"
} }
\ No newline at end of file
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { GetAppsBodySchema, GetAppsResponseSchema } from './api'; import { GetAppsBodySchema, GetAppsResponseSchema } from './api';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
export const AdminAppPath: OpenAPIPath = { export const AdminAppPath: OpenAPIPath = {
'/admin/core/app/getApps': { '/admin/core/app/getApps': {
post: { post: {
summary: '获取应用列表', summary: '获取应用列表',
description: '分页获取应用列表,支持按名称和ID搜索', description: '分页获取应用列表,支持按名称和ID搜索',
tags: [TagsMap.adminApps], tags: [DevApiTagsMap.adminApps],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
...@@ -11,14 +11,14 @@ import { ...@@ -11,14 +11,14 @@ import {
GetAppStatsResponseSchema, GetAppStatsResponseSchema,
GetDatasetStatsResponseSchema GetDatasetStatsResponseSchema
} from './api'; } from './api';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
export const DashboardPath: OpenAPIPath = { export const DashboardPath: OpenAPIPath = {
'/admin/core/dashboard/getUserStats': { '/admin/core/dashboard/getUserStats': {
get: { get: {
summary: '获取用户全局统计', summary: '获取用户全局统计',
description: '获取用户总数和充值总数', description: '获取用户总数和充值总数',
tags: [TagsMap.adminDashboard], tags: [DevApiTagsMap.adminDashboard],
responses: { responses: {
200: { 200: {
description: '成功获取用户统计', description: '成功获取用户统计',
...@@ -35,7 +35,7 @@ export const DashboardPath: OpenAPIPath = { ...@@ -35,7 +35,7 @@ export const DashboardPath: OpenAPIPath = {
get: { get: {
summary: '获取应用全局统计', summary: '获取应用全局统计',
description: '获取工作流、简易应用、工作流工具、HTTP 工具和 MCP 工具的总数', description: '获取工作流、简易应用、工作流工具、HTTP 工具和 MCP 工具的总数',
tags: [TagsMap.adminDashboard], tags: [DevApiTagsMap.adminDashboard],
responses: { responses: {
200: { 200: {
description: '成功获取应用统计', description: '成功获取应用统计',
...@@ -52,7 +52,7 @@ export const DashboardPath: OpenAPIPath = { ...@@ -52,7 +52,7 @@ export const DashboardPath: OpenAPIPath = {
get: { get: {
summary: '获取知识库全局统计', summary: '获取知识库全局统计',
description: '获取通用知识库、Web 站点同步、API、语雀、飞书知识库的总数以及索引总量', description: '获取通用知识库、Web 站点同步、API、语雀、飞书知识库的总数以及索引总量',
tags: [TagsMap.adminDashboard], tags: [DevApiTagsMap.adminDashboard],
responses: { responses: {
200: { 200: {
description: '成功获取知识库统计', description: '成功获取知识库统计',
...@@ -69,7 +69,7 @@ export const DashboardPath: OpenAPIPath = { ...@@ -69,7 +69,7 @@ export const DashboardPath: OpenAPIPath = {
get: { get: {
summary: '获取对话统计数据', summary: '获取对话统计数据',
description: '获取对话数量和对话消息数量的时间序列统计数据', description: '获取对话数量和对话消息数量的时间序列统计数据',
tags: [TagsMap.adminDashboard], tags: [DevApiTagsMap.adminDashboard],
requestParams: { requestParams: {
query: z.object({ query: z.object({
startTime: z.string().meta({ startTime: z.string().meta({
...@@ -93,7 +93,7 @@ export const DashboardPath: OpenAPIPath = { ...@@ -93,7 +93,7 @@ export const DashboardPath: OpenAPIPath = {
get: { get: {
summary: '获取工作流 QPM 范围分布', summary: '获取工作流 QPM 范围分布',
description: '按团队最大 QPM 统计各范围的团队数量', description: '按团队最大 QPM 统计各范围的团队数量',
tags: [TagsMap.adminDashboard], tags: [DevApiTagsMap.adminDashboard],
requestParams: { requestParams: {
query: z.object({ query: z.object({
startTime: z.string().meta({ startTime: z.string().meta({
...@@ -117,7 +117,7 @@ export const DashboardPath: OpenAPIPath = { ...@@ -117,7 +117,7 @@ export const DashboardPath: OpenAPIPath = {
post: { post: {
summary: '获取消费统计数据', summary: '获取消费统计数据',
description: '获取积分消耗的时间序列统计数据', description: '获取积分消耗的时间序列统计数据',
tags: [TagsMap.adminDashboard], tags: [DevApiTagsMap.adminDashboard],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -141,7 +141,7 @@ export const DashboardPath: OpenAPIPath = { ...@@ -141,7 +141,7 @@ export const DashboardPath: OpenAPIPath = {
get: { get: {
summary: '获取支付统计数据', summary: '获取支付统计数据',
description: '获取订单和支付金额的时间序列统计数据', description: '获取订单和支付金额的时间序列统计数据',
tags: [TagsMap.adminDashboard], tags: [DevApiTagsMap.adminDashboard],
requestParams: { requestParams: {
query: z.object({ query: z.object({
startTime: z.string().meta({ startTime: z.string().meta({
...@@ -165,7 +165,7 @@ export const DashboardPath: OpenAPIPath = { ...@@ -165,7 +165,7 @@ export const DashboardPath: OpenAPIPath = {
get: { get: {
summary: '获取用户注册统计数据', summary: '获取用户注册统计数据',
description: '获取用户注册数量的时间序列统计数据', description: '获取用户注册数量的时间序列统计数据',
tags: [TagsMap.adminDashboard], tags: [DevApiTagsMap.adminDashboard],
requestParams: { requestParams: {
query: z.object({ query: z.object({
startTime: z.string().meta({ startTime: z.string().meta({
......
...@@ -8,14 +8,14 @@ import { ...@@ -8,14 +8,14 @@ import {
OperationalAdResponseSchema, OperationalAdResponseSchema,
ActivityAdResponseSchema ActivityAdResponseSchema
} from './api'; } from './api';
import { TagsMap } from '../../../../tag'; import { DevApiTagsMap } from '../../../../tag';
export const AdminInformPath: OpenAPIPath = { export const AdminInformPath: OpenAPIPath = {
'/admin/support/user/inform/sendSystemInform': { '/admin/support/user/inform/sendSystemInform': {
post: { post: {
summary: '发送系统通知给所有用户', summary: '发送系统通知给所有用户',
description: '向所有用户发送系统通知消息', description: '向所有用户发送系统通知消息',
tags: [TagsMap.adminInform], tags: [DevApiTagsMap.adminInform],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -39,7 +39,7 @@ export const AdminInformPath: OpenAPIPath = { ...@@ -39,7 +39,7 @@ export const AdminInformPath: OpenAPIPath = {
get: { get: {
summary: '获取系统弹窗内容', summary: '获取系统弹窗内容',
description: '获取系统消息弹窗的内容', description: '获取系统消息弹窗的内容',
tags: [TagsMap.adminInform], tags: [DevApiTagsMap.adminInform],
responses: { responses: {
200: { 200: {
description: '成功获取系统弹窗内容', description: '成功获取系统弹窗内容',
...@@ -56,7 +56,7 @@ export const AdminInformPath: OpenAPIPath = { ...@@ -56,7 +56,7 @@ export const AdminInformPath: OpenAPIPath = {
post: { post: {
summary: '更新系统弹窗内容', summary: '更新系统弹窗内容',
description: '更新系统消息弹窗的内容', description: '更新系统消息弹窗的内容',
tags: [TagsMap.adminInform], tags: [DevApiTagsMap.adminInform],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -80,7 +80,7 @@ export const AdminInformPath: OpenAPIPath = { ...@@ -80,7 +80,7 @@ export const AdminInformPath: OpenAPIPath = {
get: { get: {
summary: '获取运营广告', summary: '获取运营广告',
description: '获取运营广告的图片和链接', description: '获取运营广告的图片和链接',
tags: [TagsMap.adminInform], tags: [DevApiTagsMap.adminInform],
responses: { responses: {
200: { 200: {
description: '成功获取运营广告', description: '成功获取运营广告',
...@@ -97,7 +97,7 @@ export const AdminInformPath: OpenAPIPath = { ...@@ -97,7 +97,7 @@ export const AdminInformPath: OpenAPIPath = {
post: { post: {
summary: '更新运营广告', summary: '更新运营广告',
description: '更新运营广告的图片和链接', description: '更新运营广告的图片和链接',
tags: [TagsMap.adminInform], tags: [DevApiTagsMap.adminInform],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -121,7 +121,7 @@ export const AdminInformPath: OpenAPIPath = { ...@@ -121,7 +121,7 @@ export const AdminInformPath: OpenAPIPath = {
get: { get: {
summary: '获取活动广告', summary: '获取活动广告',
description: '获取活动广告的图片和链接', description: '获取活动广告的图片和链接',
tags: [TagsMap.adminInform], tags: [DevApiTagsMap.adminInform],
responses: { responses: {
200: { 200: {
description: '成功获取活动广告', description: '成功获取活动广告',
...@@ -138,7 +138,7 @@ export const AdminInformPath: OpenAPIPath = { ...@@ -138,7 +138,7 @@ export const AdminInformPath: OpenAPIPath = {
post: { post: {
summary: '更新活动广告', summary: '更新活动广告',
description: '更新活动广告的图片和链接', description: '更新活动广告的图片和链接',
tags: [TagsMap.adminInform], tags: [DevApiTagsMap.adminInform],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../../type'; import type { OpenAPIPath } from '../../../../type';
import { AdminLoginBodySchema, AdminLoginResponseSchema } from './api'; import { AdminLoginBodySchema, AdminLoginResponseSchema } from './api';
import { TagsMap } from '../../../../tag'; import { DevApiTagsMap } from '../../../../tag';
export const AdminLoginPath: OpenAPIPath = { export const AdminLoginPath: OpenAPIPath = {
'/admin/support/user/login': { '/admin/support/user/login': {
post: { post: {
summary: '管理员登录', summary: '管理员登录',
description: '管理员使用用户名和密码登录', description: '管理员使用用户名和密码登录',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
export const ApiKeyTagMap = {
appLog: 'apiKey:appLog',
chatHistory: 'apiKey:chatHistory',
chatSession: 'apiKey:chatSession',
chat: 'apiKey:chat',
dataset: 'apiKey:dataset',
datasetCollection: 'apiKey:datasetCollection',
datasetCollectionCreate: 'apiKey:datasetCollectionCreate',
datasetData: 'apiKey:datasetData',
datasetDataIndex: 'apiKey:datasetDataIndex',
datasetOther: 'apiKey:datasetOther'
};
export const ApiKeyTagNameMap: Record<string, string> = {
[ApiKeyTagMap.appLog]: '应用日志',
[ApiKeyTagMap.chatHistory]: '历史记录管理',
[ApiKeyTagMap.chatSession]: '会话管理',
[ApiKeyTagMap.chat]: '对话管理',
[ApiKeyTagMap.dataset]: '知识库管理',
[ApiKeyTagMap.datasetCollection]: '集合管理',
[ApiKeyTagMap.datasetCollectionCreate]: '集合创建',
[ApiKeyTagMap.datasetData]: '数据管理',
[ApiKeyTagMap.datasetDataIndex]: '索引管理',
[ApiKeyTagMap.datasetOther]: '其他'
};
export const apiKeyTagGroups = [
{
name: '应用管理',
tags: [ApiKeyTagNameMap[ApiKeyTagMap.appLog]]
},
{
name: '应用对话',
tags: [
ApiKeyTagNameMap[ApiKeyTagMap.chatHistory],
ApiKeyTagNameMap[ApiKeyTagMap.chatSession],
ApiKeyTagNameMap[ApiKeyTagMap.chat]
]
},
{
name: '知识库',
tags: [
ApiKeyTagNameMap[ApiKeyTagMap.dataset],
ApiKeyTagNameMap[ApiKeyTagMap.datasetCollection],
ApiKeyTagNameMap[ApiKeyTagMap.datasetCollectionCreate],
ApiKeyTagNameMap[ApiKeyTagMap.datasetData],
ApiKeyTagNameMap[ApiKeyTagMap.datasetDataIndex],
ApiKeyTagNameMap[ApiKeyTagMap.datasetOther]
]
}
];
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { CreateQuestionGuideBodySchema, CreateQuestionGuideResponseSchema } from './api'; import { CreateQuestionGuideBodySchema, CreateQuestionGuideResponseSchema } from './api';
export const AgentPath: OpenAPIPath = { export const AgentPath: OpenAPIPath = {
...@@ -7,7 +7,7 @@ export const AgentPath: OpenAPIPath = { ...@@ -7,7 +7,7 @@ export const AgentPath: OpenAPIPath = {
post: { post: {
summary: '创建问题引导', summary: '创建问题引导',
description: '根据对话历史生成推荐的引导问题列表', description: '根据对话历史生成推荐的引导问题列表',
tags: [TagsMap.aiCommon], tags: [DevApiTagsMap.aiCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import { ObjectIdSchema } from '../../../common/type/mongo'; import { ObjectIdSchema } from '../../../common/type/mongo';
import z from 'zod'; import z from 'zod';
import { ChatGenerateStatusEnum } from '../../../core/chat/constants';
import { OutLinkChatAuthSchema } from '../../../support/permission/chat'; import { OutLinkChatAuthSchema } from '../../../support/permission/chat';
import { ChatGenerateStatusSchema } from '../chat/api';
// Query Params // Query Params
export const GetLLMRequestRecordParamsSchema = z.object({ export const GetLLMRequestRecordParamsSchema = z.object({
...@@ -89,9 +89,8 @@ export const StreamResumeCompletedRecordsSchema = z.object({ ...@@ -89,9 +89,8 @@ export const StreamResumeCompletedRecordsSchema = z.object({
}); });
export const StreamNoNeedToBeResumeSchema = z.object({ export const StreamNoNeedToBeResumeSchema = z.object({
chatGenerateStatus: z.enum(ChatGenerateStatusEnum).meta({ chatGenerateStatus: ChatGenerateStatusSchema.meta({
example: ChatGenerateStatusEnum.done, example: 1
description: '聊天生成状态'
}), }),
hasBeenRead: z.boolean().meta({ hasBeenRead: z.boolean().meta({
example: true, example: true,
......
import type { OpenAPIPath } from '../../type'; import type { OpenAPIPath } from '../../type';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
import { import {
GetLLMRequestRecordParamsSchema, GetLLMRequestRecordParamsSchema,
LLMRequestRecordSchema, LLMRequestRecordSchema,
...@@ -19,7 +19,7 @@ export const AIPath: OpenAPIPath = { ...@@ -19,7 +19,7 @@ export const AIPath: OpenAPIPath = {
get: { get: {
summary: '获取 LLM 请求追踪记录', summary: '获取 LLM 请求追踪记录',
description: '根据 requestId 查询 LLM 请求的详细信息,包括请求体和响应内容', description: '根据 requestId 查询 LLM 请求的详细信息,包括请求体和响应内容',
tags: [TagsMap.aiCommon], tags: [DevApiTagsMap.aiCommon],
requestParams: { requestParams: {
query: GetLLMRequestRecordParamsSchema query: GetLLMRequestRecordParamsSchema
}, },
...@@ -41,7 +41,7 @@ export const AIPath: OpenAPIPath = { ...@@ -41,7 +41,7 @@ export const AIPath: OpenAPIPath = {
summary: '恢复流式响应', summary: '恢复流式响应',
description: description:
'与 /v2/chat/completions 配套;GET query 传 appId / chatId / teamId。已完成对话可返回 JSON;若对话仍在生成中,则必须请求 SSE,否则返回 406。', '与 /v2/chat/completions 配套;GET query 传 appId / chatId / teamId。已完成对话可返回 JSON;若对话仍在生成中,则必须请求 SSE,否则返回 406。',
tags: [TagsMap.aiCommon], tags: [DevApiTagsMap.aiCommon],
requestParams: { requestParams: {
query: ResumeStreamParamsSchema query: ResumeStreamParamsSchema
}, },
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
SandboxDownloadBodySchema, SandboxDownloadBodySchema,
SandboxDownloadResponseSchema, SandboxDownloadResponseSchema,
...@@ -16,7 +16,7 @@ export const SandboxPath: OpenAPIPath = { ...@@ -16,7 +16,7 @@ export const SandboxPath: OpenAPIPath = {
post: { post: {
summary: '下载沙盒文件或目录', summary: '下载沙盒文件或目录',
description: '下载指定路径的文件,或将目录打包为 ZIP 下载', description: '下载指定路径的文件,或将目录打包为 ZIP 下载',
tags: [TagsMap.sandbox], tags: [DevApiTagsMap.sandbox],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -40,7 +40,7 @@ export const SandboxPath: OpenAPIPath = { ...@@ -40,7 +40,7 @@ export const SandboxPath: OpenAPIPath = {
post: { post: {
summary: '获取 HTML 文件预览链接', summary: '获取 HTML 文件预览链接',
description: '返回用于在浏览器中预览 HTML 文件的链接(S3 托管)', description: '返回用于在浏览器中预览 HTML 文件的链接(S3 托管)',
tags: [TagsMap.sandbox], tags: [DevApiTagsMap.sandbox],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -65,7 +65,7 @@ export const SandboxPath: OpenAPIPath = { ...@@ -65,7 +65,7 @@ export const SandboxPath: OpenAPIPath = {
post: { post: {
summary: '检查沙盒是否存在', summary: '检查沙盒是否存在',
description: '根据 appId 和 chatId 检查对应的沙盒实例是否存在', description: '根据 appId 和 chatId 检查对应的沙盒实例是否存在',
tags: [TagsMap.sandbox], tags: [DevApiTagsMap.sandbox],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -90,7 +90,7 @@ export const SandboxPath: OpenAPIPath = { ...@@ -90,7 +90,7 @@ export const SandboxPath: OpenAPIPath = {
post: { post: {
summary: '获取沙盒 WebSocket 临时凭证', summary: '获取沙盒 WebSocket 临时凭证',
description: '鉴权并返回用于连接 agent-sandbox-proxy 的短期 ticket', description: '鉴权并返回用于连接 agent-sandbox-proxy 的短期 ticket',
tags: [TagsMap.sandbox], tags: [DevApiTagsMap.sandbox],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
...@@ -12,8 +12,8 @@ import { ...@@ -12,8 +12,8 @@ import {
SkillPackageSchema, SkillPackageSchema,
ZipEntryInfoSchema ZipEntryInfoSchema
} from '../../../../core/ai/skill/type'; } from '../../../../core/ai/skill/type';
import { ChatGenerateStatusEnum } from '../../../../core/chat/constants';
import { SkillPermissionSchema } from '../../../../support/permission/skill/controller.schema'; import { SkillPermissionSchema } from '../../../../support/permission/skill/controller.schema';
import { ChatGenerateStatusSchema } from '../../chat/api';
const IdSchema = z.string().min(1).meta({ description: '资源 ID' }); const IdSchema = z.string().min(1).meta({ description: '资源 ID' });
const SandboxInstanceKeySchema = z.string().min(1).describe('FastGPT sandbox instance key'); const SandboxInstanceKeySchema = z.string().min(1).describe('FastGPT sandbox instance key');
...@@ -259,7 +259,7 @@ export type SkillDebugSessionControlBody = z.infer<typeof SkillDebugSessionContr ...@@ -259,7 +259,7 @@ export type SkillDebugSessionControlBody = z.infer<typeof SkillDebugSessionContr
export const SkillDebugSessionStopResponseSchema = z.object({ export const SkillDebugSessionStopResponseSchema = z.object({
success: z.boolean(), success: z.boolean(),
completed: z.boolean().describe('工作流是否已在本次请求等待窗口内完成停止'), completed: z.boolean().describe('工作流是否已在本次请求等待窗口内完成停止'),
chatGenerateStatus: z.enum(ChatGenerateStatusEnum).describe('当前对话生成状态') chatGenerateStatus: ChatGenerateStatusSchema
}); });
export type SkillDebugSessionStopResponse = z.infer<typeof SkillDebugSessionStopResponseSchema>; export type SkillDebugSessionStopResponse = z.infer<typeof SkillDebugSessionStopResponseSchema>;
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
ListAppsBySkillIdResponseSchema, ListAppsBySkillIdResponseSchema,
CreateEditDebugSandboxBodySchema, CreateEditDebugSandboxBodySchema,
...@@ -41,7 +41,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -41,7 +41,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '获取技能列表', summary: '获取技能列表',
description: '分页获取当前团队可见的系统技能或个人技能', description: '分页获取当前团队可见的系统技能或个人技能',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -65,7 +65,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -65,7 +65,7 @@ export const SkillPath: OpenAPIPath = {
get: { get: {
summary: '获取技能详情', summary: '获取技能详情',
description: '根据 skillId 获取技能详情', description: '根据 skillId 获取技能详情',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestParams: { requestParams: {
query: GetSkillDetailQuerySchema query: GetSkillDetailQuerySchema
}, },
...@@ -85,7 +85,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -85,7 +85,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '创建技能', summary: '创建技能',
description: '创建一个新的技能,可选使用 AI 根据 requirements 生成 SKILL.md', description: '创建一个新的技能,可选使用 AI 根据 requirements 生成 SKILL.md',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -109,7 +109,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -109,7 +109,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '更新技能', summary: '更新技能',
description: '更新技能名称、描述、分类和配置', description: '更新技能名称、描述、分类和配置',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -128,7 +128,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -128,7 +128,7 @@ export const SkillPath: OpenAPIPath = {
delete: { delete: {
summary: '删除技能', summary: '删除技能',
description: '根据 skillId 删除技能', description: '根据 skillId 删除技能',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestParams: { requestParams: {
query: DeleteSkillQuerySchema query: DeleteSkillQuerySchema
}, },
...@@ -143,7 +143,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -143,7 +143,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '导入技能', summary: '导入技能',
description: '上传 ZIP / TAR / TAR.GZ 技能压缩包并导入为技能', description: '上传 ZIP / TAR / TAR.GZ 技能压缩包并导入为技能',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'multipart/form-data': { 'multipart/form-data': {
...@@ -167,7 +167,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -167,7 +167,7 @@ export const SkillPath: OpenAPIPath = {
get: { get: {
summary: '导出技能编辑区', summary: '导出技能编辑区',
description: '下载当前技能编辑沙盒工作区 ZIP 包', description: '下载当前技能编辑沙盒工作区 ZIP 包',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestParams: { requestParams: {
query: ExportSkillQuerySchema query: ExportSkillQuerySchema
}, },
...@@ -190,7 +190,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -190,7 +190,7 @@ export const SkillPath: OpenAPIPath = {
get: { get: {
summary: '查询引用技能的应用', summary: '查询引用技能的应用',
description: '查询使用指定 skillId 的应用列表', description: '查询使用指定 skillId 的应用列表',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestParams: { requestParams: {
query: ListAppsBySkillIdQuerySchema query: ListAppsBySkillIdQuerySchema
}, },
...@@ -210,7 +210,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -210,7 +210,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '创建技能文件夹', summary: '创建技能文件夹',
description: '在技能目录树中创建一个文件夹', description: '在技能目录树中创建一个文件夹',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -234,7 +234,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -234,7 +234,7 @@ export const SkillPath: OpenAPIPath = {
get: { get: {
summary: '获取技能文件夹路径', summary: '获取技能文件夹路径',
description: '根据当前 skillId 返回目录路径', description: '根据当前 skillId 返回目录路径',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestParams: { requestParams: {
query: GetSkillFolderPathQuerySchema query: GetSkillFolderPathQuerySchema
}, },
...@@ -254,7 +254,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -254,7 +254,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '创建编辑调试沙盒', summary: '创建编辑调试沙盒',
description: '为技能创建 edit-debug 沙盒,返回 SSE sandboxStatus 事件流', description: '为技能创建 edit-debug 沙盒,返回 SSE sandboxStatus 事件流',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -278,7 +278,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -278,7 +278,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '保存并发布技能', summary: '保存并发布技能',
description: '从 edit-debug 沙盒打包当前技能并创建新版本', description: '从 edit-debug 沙盒打包当前技能并创建新版本',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -302,7 +302,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -302,7 +302,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '技能调试对话', summary: '技能调试对话',
description: '基于 edit-debug 沙盒发起技能调试对话,返回 SSE 流', description: '基于 edit-debug 沙盒发起技能调试对话,返回 SSE 流',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -328,7 +328,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -328,7 +328,7 @@ export const SkillPath: OpenAPIPath = {
get: { get: {
summary: '获取技能调试会话列表', summary: '获取技能调试会话列表',
description: '分页获取技能的调试会话', description: '分页获取技能的调试会话',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestParams: { requestParams: {
query: SkillDebugSessionListQuerySchema query: SkillDebugSessionListQuerySchema
}, },
...@@ -348,7 +348,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -348,7 +348,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '删除技能调试会话', summary: '删除技能调试会话',
description: '软删除一个技能调试会话', description: '软删除一个技能调试会话',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -367,7 +367,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -367,7 +367,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '停止技能调试对话', summary: '停止技能调试对话',
description: '停止指定技能调试会话中正在运行的工作流', description: '停止指定技能调试会话中正在运行的工作流',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -391,7 +391,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -391,7 +391,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '获取技能调试会话记录', summary: '获取技能调试会话记录',
description: '分页获取技能调试会话的聊天记录', description: '分页获取技能调试会话的聊天记录',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -415,7 +415,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -415,7 +415,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '获取技能版本列表', summary: '获取技能版本列表',
description: '分页获取指定技能的版本列表,按创建时间倒序排列', description: '分页获取指定技能的版本列表,按创建时间倒序排列',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -439,7 +439,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -439,7 +439,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '更新技能版本名称', summary: '更新技能版本名称',
description: '更新指定技能版本的名称', description: '更新指定技能版本的名称',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -458,7 +458,7 @@ export const SkillPath: OpenAPIPath = { ...@@ -458,7 +458,7 @@ export const SkillPath: OpenAPIPath = {
post: { post: {
summary: '切换技能当前版本', summary: '切换技能当前版本',
description: '将 skill 主表的当前版本指向指定版本', description: '将 skill 主表的当前版本指向指定版本',
tags: [TagsMap.aiSkill], tags: [DevApiTagsMap.aiSkill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
CopyAppBodySchema, CopyAppBodySchema,
CopyAppResponseSchema, CopyAppResponseSchema,
...@@ -25,7 +25,7 @@ export const AppCommonPath: OpenAPIPath = { ...@@ -25,7 +25,7 @@ export const AppCommonPath: OpenAPIPath = {
post: { post: {
summary: '获取应用列表', summary: '获取应用列表',
description: '获取当前团队下当前用户可读的应用或文件夹列表', description: '获取当前团队下当前用户可读的应用或文件夹列表',
tags: [TagsMap.appCommon], tags: [DevApiTagsMap.appCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -49,7 +49,7 @@ export const AppCommonPath: OpenAPIPath = { ...@@ -49,7 +49,7 @@ export const AppCommonPath: OpenAPIPath = {
post: { post: {
summary: '创建应用', summary: '创建应用',
description: '创建应用或文件夹', description: '创建应用或文件夹',
tags: [TagsMap.appCommon], tags: [DevApiTagsMap.appCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -73,7 +73,7 @@ export const AppCommonPath: OpenAPIPath = { ...@@ -73,7 +73,7 @@ export const AppCommonPath: OpenAPIPath = {
get: { get: {
summary: '获取应用详情', summary: '获取应用详情',
description: '获取应用完整详情。无写权限时会隐藏编排节点和边', description: '获取应用完整详情。无写权限时会隐藏编排节点和边',
tags: [TagsMap.appCommon], tags: [DevApiTagsMap.appCommon],
requestParams: { requestParams: {
query: GetAppDetailQuerySchema query: GetAppDetailQuerySchema
}, },
...@@ -93,7 +93,7 @@ export const AppCommonPath: OpenAPIPath = { ...@@ -93,7 +93,7 @@ export const AppCommonPath: OpenAPIPath = {
put: { put: {
summary: '更新应用', summary: '更新应用',
description: '更新应用基础信息、编排信息或移动应用位置', description: '更新应用基础信息、编排信息或移动应用位置',
tags: [TagsMap.appCommon], tags: [DevApiTagsMap.appCommon],
requestParams: { requestParams: {
query: UpdateAppQuerySchema query: UpdateAppQuerySchema
}, },
...@@ -120,7 +120,7 @@ export const AppCommonPath: OpenAPIPath = { ...@@ -120,7 +120,7 @@ export const AppCommonPath: OpenAPIPath = {
delete: { delete: {
summary: '删除应用', summary: '删除应用',
description: '删除应用或文件夹,并返回被删除的非文件夹应用 ID 列表', description: '删除应用或文件夹,并返回被删除的非文件夹应用 ID 列表',
tags: [TagsMap.appCommon], tags: [DevApiTagsMap.appCommon],
requestParams: { requestParams: {
query: DeleteAppQuerySchema query: DeleteAppQuerySchema
}, },
...@@ -140,7 +140,7 @@ export const AppCommonPath: OpenAPIPath = { ...@@ -140,7 +140,7 @@ export const AppCommonPath: OpenAPIPath = {
post: { post: {
summary: '复制应用', summary: '复制应用',
description: '复制指定应用并返回新应用 ID', description: '复制指定应用并返回新应用 ID',
tags: [TagsMap.appCommon], tags: [DevApiTagsMap.appCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -164,7 +164,7 @@ export const AppCommonPath: OpenAPIPath = { ...@@ -164,7 +164,7 @@ export const AppCommonPath: OpenAPIPath = {
post: { post: {
summary: '批量获取应用基础信息', summary: '批量获取应用基础信息',
description: '根据应用 ID 列表批量获取应用名称和头像', description: '根据应用 ID 列表批量获取应用名称和头像',
tags: [TagsMap.appCommon], tags: [DevApiTagsMap.appCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -188,7 +188,7 @@ export const AppCommonPath: OpenAPIPath = { ...@@ -188,7 +188,7 @@ export const AppCommonPath: OpenAPIPath = {
post: { post: {
summary: '转换为工作流应用', summary: '转换为工作流应用',
description: '将简易应用转换为工作流应用,可选择复制为新应用', description: '将简易应用转换为工作流应用,可选择复制为新应用',
tags: [TagsMap.appCommon], tags: [DevApiTagsMap.appCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
CreateAppFolderBodySchema, CreateAppFolderBodySchema,
CreateAppFolderResponseSchema, CreateAppFolderResponseSchema,
...@@ -12,7 +12,7 @@ export const AppFolderPath: OpenAPIPath = { ...@@ -12,7 +12,7 @@ export const AppFolderPath: OpenAPIPath = {
post: { post: {
summary: '创建应用文件夹', summary: '创建应用文件夹',
description: '在根目录或指定父级文件夹下创建应用文件夹或工具文件夹', description: '在根目录或指定父级文件夹下创建应用文件夹或工具文件夹',
tags: [TagsMap.appFolder], tags: [DevApiTagsMap.appFolder],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -36,7 +36,7 @@ export const AppFolderPath: OpenAPIPath = { ...@@ -36,7 +36,7 @@ export const AppFolderPath: OpenAPIPath = {
get: { get: {
summary: '获取应用文件夹路径', summary: '获取应用文件夹路径',
description: '获取指定应用或文件夹的父级路径', description: '获取指定应用或文件夹的父级路径',
tags: [TagsMap.appFolder], tags: [DevApiTagsMap.appFolder],
requestParams: { requestParams: {
query: GetAppFolderPathQuerySchema query: GetAppFolderPathQuerySchema
}, },
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { CreateAppResponseSchema } from '../common/api'; import { CreateAppResponseSchema } from '../common/api';
import { import {
CreateHttpToolsBodySchema, CreateHttpToolsBodySchema,
...@@ -16,7 +16,7 @@ export const HttpToolsPath: OpenAPIPath = { ...@@ -16,7 +16,7 @@ export const HttpToolsPath: OpenAPIPath = {
post: { post: {
summary: '创建 HTTP 工具集', summary: '创建 HTTP 工具集',
description: '创建 HTTP 工具集应用', description: '创建 HTTP 工具集应用',
tags: [TagsMap.httpTools], tags: [DevApiTagsMap.httpTools],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -40,7 +40,7 @@ export const HttpToolsPath: OpenAPIPath = { ...@@ -40,7 +40,7 @@ export const HttpToolsPath: OpenAPIPath = {
put: { put: {
summary: '更新 HTTP 工具集', summary: '更新 HTTP 工具集',
description: '更新 HTTP 工具集配置', description: '更新 HTTP 工具集配置',
tags: [TagsMap.httpTools], tags: [DevApiTagsMap.httpTools],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -64,7 +64,7 @@ export const HttpToolsPath: OpenAPIPath = { ...@@ -64,7 +64,7 @@ export const HttpToolsPath: OpenAPIPath = {
post: { post: {
summary: '通过 URL 解析 OpenAPI Schema', summary: '通过 URL 解析 OpenAPI Schema',
description: '根据远程 OpenAPI Schema URL 解析并返回结构化的 Schema 对象', description: '根据远程 OpenAPI Schema URL 解析并返回结构化的 Schema 对象',
tags: [TagsMap.httpTools], tags: [DevApiTagsMap.httpTools],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -88,7 +88,7 @@ export const HttpToolsPath: OpenAPIPath = { ...@@ -88,7 +88,7 @@ export const HttpToolsPath: OpenAPIPath = {
post: { post: {
summary: '运行 HTTP 工具', summary: '运行 HTTP 工具',
description: '运行 HTTP 工具并返回调用结果', description: '运行 HTTP 工具并返回调用结果',
tags: [TagsMap.httpTools], tags: [DevApiTagsMap.httpTools],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap, SystemOpenApiTagMap } from '../../../tag';
import { ApiKeyTagMap } from '../../../apikey/tag';
import { import {
GetAppChatLogsBodySchema, GetAppChatLogsBodySchema,
GetAppChatLogsResponseSchema, GetAppChatLogsResponseSchema,
...@@ -23,7 +22,7 @@ export const AppLogPath: OpenAPIPath = { ...@@ -23,7 +22,7 @@ export const AppLogPath: OpenAPIPath = {
get: { get: {
summary: '获取应用日志键', summary: '获取应用日志键',
description: '获取应用的日志键列表', description: '获取应用的日志键列表',
tags: [TagsMap.appLog], tags: [DevApiTagsMap.appLog],
requestParams: { requestParams: {
query: GetLogKeysQuerySchema query: GetLogKeysQuerySchema
}, },
...@@ -43,7 +42,7 @@ export const AppLogPath: OpenAPIPath = { ...@@ -43,7 +42,7 @@ export const AppLogPath: OpenAPIPath = {
put: { put: {
summary: '更新应用日志键', summary: '更新应用日志键',
description: '更新应用的日志键列表', description: '更新应用的日志键列表',
tags: [TagsMap.appLog], tags: [DevApiTagsMap.appLog],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -67,7 +66,7 @@ export const AppLogPath: OpenAPIPath = { ...@@ -67,7 +66,7 @@ export const AppLogPath: OpenAPIPath = {
post: { post: {
summary: '获取应用日志列表', summary: '获取应用日志列表',
description: '分页获取应用的对话日志列表,支持按时间范围、来源、用户等条件筛选', description: '分页获取应用的对话日志列表,支持按时间范围、来源、用户等条件筛选',
tags: [TagsMap.appLog], tags: [DevApiTagsMap.appLog],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -91,7 +90,7 @@ export const AppLogPath: OpenAPIPath = { ...@@ -91,7 +90,7 @@ export const AppLogPath: OpenAPIPath = {
post: { post: {
summary: '导出应用日志', summary: '导出应用日志',
description: '导出应用的对话日志为 CSV 文件,支持自定义导出字段和筛选条件', description: '导出应用的对话日志为 CSV 文件,支持自定义导出字段和筛选条件',
tags: [TagsMap.appLog], tags: [DevApiTagsMap.appLog],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -115,7 +114,7 @@ export const AppLogPath: OpenAPIPath = { ...@@ -115,7 +114,7 @@ export const AppLogPath: OpenAPIPath = {
get: { get: {
summary: '获取应用总体数据统计', summary: '获取应用总体数据统计',
description: '获取应用的总体数据统计,包括总用户数、总对话数、总积分消耗', description: '获取应用的总体数据统计,包括总用户数、总对话数、总积分消耗',
tags: [TagsMap.appLog, ApiKeyTagMap.appLog], tags: [DevApiTagsMap.appLog, SystemOpenApiTagMap.appLog],
requestParams: { requestParams: {
query: GetTotalDataQuerySchema query: GetTotalDataQuerySchema
}, },
...@@ -135,7 +134,7 @@ export const AppLogPath: OpenAPIPath = { ...@@ -135,7 +134,7 @@ export const AppLogPath: OpenAPIPath = {
post: { post: {
summary: '获取应用图表数据', summary: '获取应用图表数据',
description: '获取应用的图表统计数据,包括用户数据、对话数据、应用数据的时序统计', description: '获取应用的图表统计数据,包括用户数据、对话数据、应用数据的时序统计',
tags: [TagsMap.appLog, ApiKeyTagMap.appLog], tags: [DevApiTagsMap.appLog, SystemOpenApiTagMap.appLog],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -159,7 +158,7 @@ export const AppLogPath: OpenAPIPath = { ...@@ -159,7 +158,7 @@ export const AppLogPath: OpenAPIPath = {
post: { post: {
summary: '获取日志用户列表', summary: '获取日志用户列表',
description: '获取应用日志中的用户列表,包括外链用户和团队成员,按对话数量排序', description: '获取应用日志中的用户列表,包括外链用户和团队成员,按对话数量排序',
tags: [TagsMap.appLog], tags: [DevApiTagsMap.appLog],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { CreateAppResponseSchema } from '../common/api'; import { CreateAppResponseSchema } from '../common/api';
import { import {
CreateMcpToolsBodySchema, CreateMcpToolsBodySchema,
...@@ -18,7 +18,7 @@ export const McpToolsPath: OpenAPIPath = { ...@@ -18,7 +18,7 @@ export const McpToolsPath: OpenAPIPath = {
post: { post: {
summary: '解析 MCP 工具列表', summary: '解析 MCP 工具列表',
description: '解析 MCP 工具列表', description: '解析 MCP 工具列表',
tags: [TagsMap.mcpTools], tags: [DevApiTagsMap.mcpTools],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -42,7 +42,7 @@ export const McpToolsPath: OpenAPIPath = { ...@@ -42,7 +42,7 @@ export const McpToolsPath: OpenAPIPath = {
post: { post: {
summary: '运行 MCP 工具', summary: '运行 MCP 工具',
description: '运行 MCP 工具', description: '运行 MCP 工具',
tags: [TagsMap.mcpTools], tags: [DevApiTagsMap.mcpTools],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -66,7 +66,7 @@ export const McpToolsPath: OpenAPIPath = { ...@@ -66,7 +66,7 @@ export const McpToolsPath: OpenAPIPath = {
post: { post: {
summary: '创建 MCP 工具集', summary: '创建 MCP 工具集',
description: '创建 MCP 工具集应用', description: '创建 MCP 工具集应用',
tags: [TagsMap.mcpTools], tags: [DevApiTagsMap.mcpTools],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -90,7 +90,7 @@ export const McpToolsPath: OpenAPIPath = { ...@@ -90,7 +90,7 @@ export const McpToolsPath: OpenAPIPath = {
put: { put: {
summary: '更新 MCP 工具集', summary: '更新 MCP 工具集',
description: '更新 MCP 工具集配置', description: '更新 MCP 工具集配置',
tags: [TagsMap.mcpTools], tags: [DevApiTagsMap.mcpTools],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -114,7 +114,7 @@ export const McpToolsPath: OpenAPIPath = { ...@@ -114,7 +114,7 @@ export const McpToolsPath: OpenAPIPath = {
get: { get: {
summary: '获取 MCP 工具列表', summary: '获取 MCP 工具列表',
description: '获取 MCP 工具集下的工具列表', description: '获取 MCP 工具集下的工具列表',
tags: [TagsMap.mcpTools], tags: [DevApiTagsMap.mcpTools],
requestParams: { requestParams: {
query: GetMcpChildrenQuerySchema query: GetMcpChildrenQuerySchema
}, },
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { AppPermissionCheckSchema } from '../../../../support/permission/app/controller.schema'; import { AppPermissionCheckSchema } from '../../../../support/permission/app/controller.schema';
import { import {
GetAppPermissionQuerySchema, GetAppPermissionQuerySchema,
...@@ -12,7 +12,7 @@ export const AppPermissionPath: OpenAPIPath = { ...@@ -12,7 +12,7 @@ export const AppPermissionPath: OpenAPIPath = {
get: { get: {
summary: '获取应用权限', summary: '获取应用权限',
description: '根据应用 ID 获取当前用户对该应用的权限信息', description: '根据应用 ID 获取当前用户对该应用的权限信息',
tags: [TagsMap.appPer], tags: [DevApiTagsMap.appPer],
requestParams: { requestParams: {
query: GetAppPermissionQuerySchema query: GetAppPermissionQuerySchema
}, },
...@@ -32,7 +32,7 @@ export const AppPermissionPath: OpenAPIPath = { ...@@ -32,7 +32,7 @@ export const AppPermissionPath: OpenAPIPath = {
put: { put: {
summary: '恢复继承权限', summary: '恢复继承权限',
description: '恢复指定应用的继承权限配置', description: '恢复指定应用的继承权限配置',
tags: [TagsMap.appPer], tags: [DevApiTagsMap.appPer],
requestParams: { requestParams: {
query: ResumeInheritPermissionQuerySchema query: ResumeInheritPermissionQuerySchema
}, },
......
...@@ -4,7 +4,7 @@ import { ...@@ -4,7 +4,7 @@ import {
UpdatePlaygroundVisibilityConfigParamsSchema, UpdatePlaygroundVisibilityConfigParamsSchema,
PlaygroundUpdateResponseSchema PlaygroundUpdateResponseSchema
} from './api'; } from './api';
import { TagsMap } from '../../../../tag'; import { DevApiTagsMap } from '../../../../tag';
import { PlaygroundVisibilityConfigSchema } from '../../../../../support/outLink/type'; import { PlaygroundVisibilityConfigSchema } from '../../../../../support/outLink/type';
import z from 'zod'; import z from 'zod';
...@@ -14,7 +14,7 @@ export const PlaygroundPath: OpenAPIPath = { ...@@ -14,7 +14,7 @@ export const PlaygroundPath: OpenAPIPath = {
summary: '获取门户配置', summary: '获取门户配置',
description: description:
'获取指定应用的门户聊天界面的可见性配置,包括节点状态、响应详情、全文显示和原始来源显示的设置', '获取指定应用的门户聊天界面的可见性配置,包括节点状态、响应详情、全文显示和原始来源显示的设置',
tags: [TagsMap.publishChannel], tags: [DevApiTagsMap.publishChannel],
requestParams: { requestParams: {
query: GetPlaygroundVisibilityConfigParamsSchema query: GetPlaygroundVisibilityConfigParamsSchema
}, },
...@@ -51,7 +51,7 @@ export const PlaygroundPath: OpenAPIPath = { ...@@ -51,7 +51,7 @@ export const PlaygroundPath: OpenAPIPath = {
summary: '更新门户配置', summary: '更新门户配置',
description: description:
'更新指定应用的门户聊天界面的可见性配置,包括节点状态、响应详情、全文显示和原始来源显示的设置。如果配置不存在则创建新配置', '更新指定应用的门户聊天界面的可见性配置,包括节点状态、响应详情、全文显示和原始来源显示的设置。如果配置不存在则创建新配置',
tags: [TagsMap.publishChannel], tags: [DevApiTagsMap.publishChannel],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
GetAppTemplateDetailQuerySchema, GetAppTemplateDetailQuerySchema,
GetAppTemplateDetailResponseSchema, GetAppTemplateDetailResponseSchema,
...@@ -12,7 +12,7 @@ export const AppTemplatePath: OpenAPIPath = { ...@@ -12,7 +12,7 @@ export const AppTemplatePath: OpenAPIPath = {
get: { get: {
summary: '获取应用模板列表', summary: '获取应用模板列表',
description: '获取应用模板市场列表,列表项不返回完整 workflow 内容', description: '获取应用模板市场列表,列表项不返回完整 workflow 内容',
tags: [TagsMap.appTemplate], tags: [DevApiTagsMap.appTemplate],
requestParams: { requestParams: {
query: ListAppTemplateQuerySchema query: ListAppTemplateQuerySchema
}, },
...@@ -32,7 +32,7 @@ export const AppTemplatePath: OpenAPIPath = { ...@@ -32,7 +32,7 @@ export const AppTemplatePath: OpenAPIPath = {
get: { get: {
summary: '获取应用模板详情', summary: '获取应用模板详情',
description: '获取应用模板详情', description: '获取应用模板详情',
tags: [TagsMap.appTemplate], tags: [DevApiTagsMap.appTemplate],
requestParams: { requestParams: {
query: GetAppTemplateDetailQuerySchema query: GetAppTemplateDetailQuerySchema
}, },
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
GetPreviewNodeQueryOpenAPISchema, GetPreviewNodeQueryOpenAPISchema,
GetPreviewNodeResponseSchema, GetPreviewNodeResponseSchema,
...@@ -14,7 +14,7 @@ export const ToolPath: OpenAPIPath = { ...@@ -14,7 +14,7 @@ export const ToolPath: OpenAPIPath = {
post: { post: {
summary: '获取系统工具模板列表', summary: '获取系统工具模板列表',
description: '获取可添加到工作流中的系统工具模板列表,支持搜索、标签筛选和工具集子工具查询', description: '获取可添加到工作流中的系统工具模板列表,支持搜索、标签筛选和工具集子工具查询',
tags: [TagsMap.appSystemTool], tags: [DevApiTagsMap.appSystemTool],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -38,7 +38,7 @@ export const ToolPath: OpenAPIPath = { ...@@ -38,7 +38,7 @@ export const ToolPath: OpenAPIPath = {
get: { get: {
summary: '获取工具路径', summary: '获取工具路径',
description: '获取系统工具或工具集子工具在工具树中的路径', description: '获取系统工具或工具集子工具在工具树中的路径',
tags: [TagsMap.appSystemTool], tags: [DevApiTagsMap.appSystemTool],
requestParams: { requestParams: {
query: GetToolPathQuerySchema query: GetToolPathQuerySchema
}, },
...@@ -59,7 +59,12 @@ export const ToolPath: OpenAPIPath = { ...@@ -59,7 +59,12 @@ export const ToolPath: OpenAPIPath = {
summary: '获取工具节点信息', summary: '获取工具节点信息',
description: description:
'根据工具 ID 和版本配置生成可插入工作流画布的工具节点模板,支持系统工具和我的工具(MCP、HTTP、工作流工具)', '根据工具 ID 和版本配置生成可插入工作流画布的工具节点模板,支持系统工具和我的工具(MCP、HTTP、工作流工具)',
tags: [TagsMap.appSystemTool, TagsMap.httpTools, TagsMap.mcpTools, TagsMap.pluginTeam], tags: [
DevApiTagsMap.appSystemTool,
DevApiTagsMap.httpTools,
DevApiTagsMap.mcpTools,
DevApiTagsMap.pluginTeam
],
requestParams: { requestParams: {
query: GetPreviewNodeQueryOpenAPISchema query: GetPreviewNodeQueryOpenAPISchema
}, },
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
AppVersionListBodySchema, AppVersionListBodySchema,
AppVersionListResponseSchema, AppVersionListResponseSchema,
...@@ -19,7 +19,7 @@ export const AppVersionPath: OpenAPIPath = { ...@@ -19,7 +19,7 @@ export const AppVersionPath: OpenAPIPath = {
post: { post: {
summary: '发布或保存应用版本', summary: '发布或保存应用版本',
description: '保存应用版本,支持自动保存、普通保存和发布', description: '保存应用版本,支持自动保存、普通保存和发布',
tags: [TagsMap.appVersion], tags: [DevApiTagsMap.appVersion],
requestParams: { requestParams: {
query: PublishAppQuerySchema query: PublishAppQuerySchema
}, },
...@@ -46,7 +46,7 @@ export const AppVersionPath: OpenAPIPath = { ...@@ -46,7 +46,7 @@ export const AppVersionPath: OpenAPIPath = {
post: { post: {
summary: '获取应用版本列表', summary: '获取应用版本列表',
description: '分页获取指定应用的版本列表', description: '分页获取指定应用的版本列表',
tags: [TagsMap.appVersion], tags: [DevApiTagsMap.appVersion],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -70,7 +70,7 @@ export const AppVersionPath: OpenAPIPath = { ...@@ -70,7 +70,7 @@ export const AppVersionPath: OpenAPIPath = {
get: { get: {
summary: '获取应用版本详情', summary: '获取应用版本详情',
description: '获取指定应用版本的完整编排详情', description: '获取指定应用版本的完整编排详情',
tags: [TagsMap.appVersion], tags: [DevApiTagsMap.appVersion],
requestParams: { requestParams: {
query: GetAppVersionDetailQuerySchema query: GetAppVersionDetailQuerySchema
}, },
...@@ -90,7 +90,7 @@ export const AppVersionPath: OpenAPIPath = { ...@@ -90,7 +90,7 @@ export const AppVersionPath: OpenAPIPath = {
get: { get: {
summary: '获取应用最新版本', summary: '获取应用最新版本',
description: '获取应用最新版本的节点、连线和聊天配置', description: '获取应用最新版本的节点、连线和聊天配置',
tags: [TagsMap.appVersion], tags: [DevApiTagsMap.appVersion],
requestParams: { requestParams: {
query: GetLatestAppVersionQuerySchema query: GetLatestAppVersionQuerySchema
}, },
...@@ -110,7 +110,7 @@ export const AppVersionPath: OpenAPIPath = { ...@@ -110,7 +110,7 @@ export const AppVersionPath: OpenAPIPath = {
put: { put: {
summary: '更新应用版本名称', summary: '更新应用版本名称',
description: '更新指定应用版本的版本名称', description: '更新指定应用版本的版本名称',
tags: [TagsMap.appVersion], tags: [DevApiTagsMap.appVersion],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import { ObjectIdSchema } from '../../../common/type/mongo'; import { ObjectIdSchema } from '../../../common/type/mongo';
import { ChatGenerateStatusEnum } from '../../../core/chat/constants';
import z from 'zod'; import z from 'zod';
export const ChatGenerateStatusSchema = z
.enum(ChatGenerateStatusEnum)
.describe('对话生成状态:0=generating(生成中),1=done(已完成),2=error(生成异常)');
/* Recently Used Apps */ /* Recently Used Apps */
export const GetRecentlyUsedAppsResponseSchema = z.array( export const GetRecentlyUsedAppsResponseSchema = z.array(
z.object({ z.object({
......
...@@ -14,9 +14,12 @@ const nullishToUndefined = <T extends z.ZodTypeAny>(schema: T) => ...@@ -14,9 +14,12 @@ const nullishToUndefined = <T extends z.ZodTypeAny>(schema: T) =>
const WebCompletionsSchema = z.object({ const WebCompletionsSchema = z.object({
chatId: nullishToUndefined(z.string().max(1024).optional()).meta({ chatId: nullishToUndefined(z.string().max(1024).optional()).meta({
description: '聊天ID, 传入的话会自动获取历史记录,不传入则认为是新对话' description: '会话 ID,传入的话会自动获取会话中的对话,不传入则认为是新会话'
}),
appId: nullishToUndefined(ObjectIdSchema.optional()).meta({
description:
'应用 ID。推荐在请求体中传入;APIKey 调用时优先级为 body.appId > Authorization 中的 apiKey-appId 后缀 > 旧 APIKey 绑定 appId。apiKey-appId 仅用于兼容 OpenAI SDK,不会写入数据库'
}), }),
appId: nullishToUndefined(ObjectIdSchema.optional()),
customUid: nullishToUndefined(z.string().max(1024).optional()).meta({ customUid: nullishToUndefined(z.string().max(1024).optional()).meta({
description: '自定义用户ID(分享链接)' description: '自定义用户ID(分享链接)'
}), }),
......
...@@ -5,13 +5,14 @@ import { AppTypeEnum } from '../../../../core/app/constants'; ...@@ -5,13 +5,14 @@ import { AppTypeEnum } from '../../../../core/app/constants';
import { ChatGenerateStatusEnum } from '../../../../core/chat/constants'; import { ChatGenerateStatusEnum } from '../../../../core/chat/constants';
import { OpenAPIFlowNodeInputItemTypeSchema } from '../../workflow/node'; import { OpenAPIFlowNodeInputItemTypeSchema } from '../../workflow/node';
import { OpenAPIAppChatConfigSchema } from '../../app/common/api'; import { OpenAPIAppChatConfigSchema } from '../../app/common/api';
import { ChatGenerateStatusSchema } from '../api';
/* Init */ /* Init */
// Online chat // Online chat
export const InitChatQuerySchema = z export const InitChatQuerySchema = z
.object({ .object({
appId: ObjectIdSchema.describe('应用ID'), appId: ObjectIdSchema.describe('应用ID'),
chatId: z.string().min(1).describe('对话ID'), chatId: z.string().min(1).describe('会话ID'),
loadCustomFeedbacks: z.coerce.boolean().optional().describe('是否加载自定义反馈') loadCustomFeedbacks: z.coerce.boolean().optional().describe('是否加载自定义反馈')
}) })
.meta({ .meta({
...@@ -33,12 +34,12 @@ export const InitTeamChatQuerySchema = z.object({ ...@@ -33,12 +34,12 @@ export const InitTeamChatQuerySchema = z.object({
export type InitTeamChatQueryType = z.infer<typeof InitTeamChatQuerySchema>; export type InitTeamChatQueryType = z.infer<typeof InitTeamChatQuerySchema>;
export const InitChatResponseSchema = z.object({ export const InitChatResponseSchema = z.object({
chatId: z.string().optional().describe('对话ID'), chatId: z.string().optional().describe('会话ID'),
appId: ObjectIdSchema.describe('应用ID'), appId: ObjectIdSchema.describe('应用ID'),
userAvatar: z.string().optional().describe('用户头像'), userAvatar: z.string().optional().describe('用户头像'),
title: z.string().describe('对话标题'), title: z.string().describe('对话标题'),
variables: z.record(z.string(), z.any()).optional().describe('全局变量值'), variables: z.record(z.string(), z.any()).optional().describe('全局变量值'),
chatGenerateStatus: z.enum(ChatGenerateStatusEnum).optional().describe('对话生成状态'), chatGenerateStatus: ChatGenerateStatusSchema.optional(),
hasBeenRead: z.boolean().optional().describe('是否已读'), hasBeenRead: z.boolean().optional().describe('是否已读'),
app: z app: z
.object({ .object({
...@@ -60,7 +61,7 @@ export type InitChatResponseType = z.infer<typeof InitChatResponseSchema>; ...@@ -60,7 +61,7 @@ export type InitChatResponseType = z.infer<typeof InitChatResponseSchema>;
export const StopV2ChatSchema = z export const StopV2ChatSchema = z
.object({ .object({
appId: ObjectIdSchema.describe('应用ID'), appId: ObjectIdSchema.describe('应用ID'),
chatId: z.string().min(1).describe('对话ID'), chatId: z.string().min(1).describe('会话ID'),
outLinkAuthData: OutLinkChatAuthSchema.optional().describe('外链鉴权数据') outLinkAuthData: OutLinkChatAuthSchema.optional().describe('外链鉴权数据')
}) })
.meta({ .meta({
...@@ -79,7 +80,7 @@ export const StopV2ChatResponseSchema = z ...@@ -79,7 +80,7 @@ export const StopV2ChatResponseSchema = z
.object({ .object({
success: z.boolean().describe('是否成功发送停止信号'), success: z.boolean().describe('是否成功发送停止信号'),
completed: z.boolean().describe('工作流是否已在本次请求等待窗口内完成停止'), completed: z.boolean().describe('工作流是否已在本次请求等待窗口内完成停止'),
chatGenerateStatus: z.enum(ChatGenerateStatusEnum).optional().describe('当前对话生成状态') chatGenerateStatus: ChatGenerateStatusSchema.optional()
}) })
.meta({ .meta({
example: { example: {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap, SystemOpenApiTagMap } from '../../../tag';
import { ApiKeyTagMap } from '../../../apikey/tag';
import { import {
StopV2ChatSchema, StopV2ChatSchema,
StopV2ChatResponseSchema, StopV2ChatResponseSchema,
...@@ -13,7 +12,7 @@ export const ChatControllerPath: OpenAPIPath = { ...@@ -13,7 +12,7 @@ export const ChatControllerPath: OpenAPIPath = {
get: { get: {
summary: '获取会话框基本信息', summary: '获取会话框基本信息',
description: '', description: '',
tags: [TagsMap.chatController, ApiKeyTagMap.chatSession], tags: [DevApiTagsMap.chatHistory, SystemOpenApiTagMap.chatHistory],
requestParams: { requestParams: {
query: InitChatQuerySchema query: InitChatQuerySchema
}, },
...@@ -31,10 +30,10 @@ export const ChatControllerPath: OpenAPIPath = { ...@@ -31,10 +30,10 @@ export const ChatControllerPath: OpenAPIPath = {
}, },
'/v2/chat/stop': { '/v2/chat/stop': {
post: { post: {
summary: '停止 Agent 运行', summary: '停止会话',
description: `优雅停止正在运行的 Agent, 会尝试等待当前节点结束后返回,最长 5s,超过 5s 仍未结束,则会返回成功。 description: `停止正在运行的会话, 会尝试等待当前节点结束后返回,最长 5s,超过 5s 仍未结束,则会返回成功。
LLM 节点,流输出时会同时被终止,但 HTTP 请求节点这种可能长时间运行的,不会被终止。`, LLM 节点,流输出时会同时被终止,但 HTTP 请求节点这种可能长时间运行的,不会被终止。`,
tags: [TagsMap.chatController], tags: [DevApiTagsMap.chatController, SystemOpenApiTagMap.chatController],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
...@@ -7,14 +7,14 @@ import { ...@@ -7,14 +7,14 @@ import {
UpdateFavouriteAppTagsParamsSchema UpdateFavouriteAppTagsParamsSchema
} from './api'; } from './api';
import { ObjectIdSchema } from '../../../../common/type/mongo'; import { ObjectIdSchema } from '../../../../common/type/mongo';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
export const ChatFavouriteAppPath: OpenAPIPath = { export const ChatFavouriteAppPath: OpenAPIPath = {
'/proApi/core/chat/setting/favourite/list': { '/proApi/core/chat/setting/favourite/list': {
get: { get: {
summary: '获取精选应用列表', summary: '获取精选应用列表',
description: '获取团队配置的精选应用列表,支持按名称和标签筛选', description: '获取团队配置的精选应用列表,支持按名称和标签筛选',
tags: [TagsMap.chatSetting], tags: [DevApiTagsMap.chatSetting],
requestParams: { requestParams: {
query: GetChatFavouriteListParamsSchema query: GetChatFavouriteListParamsSchema
}, },
...@@ -34,7 +34,7 @@ export const ChatFavouriteAppPath: OpenAPIPath = { ...@@ -34,7 +34,7 @@ export const ChatFavouriteAppPath: OpenAPIPath = {
post: { post: {
summary: '更新精选应用', summary: '更新精选应用',
description: '批量创建或更新精选应用配置,包括应用 ID、标签和排序信息', description: '批量创建或更新精选应用配置,包括应用 ID、标签和排序信息',
tags: [TagsMap.chatSetting], tags: [DevApiTagsMap.chatSetting],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -58,7 +58,7 @@ export const ChatFavouriteAppPath: OpenAPIPath = { ...@@ -58,7 +58,7 @@ export const ChatFavouriteAppPath: OpenAPIPath = {
put: { put: {
summary: '更新精选应用排序', summary: '更新精选应用排序',
description: '批量更新精选应用的显示顺序', description: '批量更新精选应用的显示顺序',
tags: [TagsMap.chatSetting], tags: [DevApiTagsMap.chatSetting],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -90,7 +90,7 @@ export const ChatFavouriteAppPath: OpenAPIPath = { ...@@ -90,7 +90,7 @@ export const ChatFavouriteAppPath: OpenAPIPath = {
put: { put: {
summary: '更新精选应用标签', summary: '更新精选应用标签',
description: '批量更新精选应用的标签分类', description: '批量更新精选应用的标签分类',
tags: [TagsMap.chatSetting], tags: [DevApiTagsMap.chatSetting],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -114,7 +114,7 @@ export const ChatFavouriteAppPath: OpenAPIPath = { ...@@ -114,7 +114,7 @@ export const ChatFavouriteAppPath: OpenAPIPath = {
delete: { delete: {
summary: '删除精选应用', summary: '删除精选应用',
description: '根据 ID 删除指定的精选应用配置', description: '根据 ID 删除指定的精选应用配置',
tags: [TagsMap.chatSetting], tags: [DevApiTagsMap.chatSetting],
requestParams: { requestParams: {
query: z.object({ query: z.object({
id: ObjectIdSchema id: ObjectIdSchema
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { ApiKeyTagMap } from '../../../apikey/tag'; import { SystemOpenApiTagMap } from '../../../tag';
import { import {
UpdateFeedbackReadStatusBodySchema, UpdateFeedbackReadStatusBodySchema,
UpdateFeedbackReadStatusResponseSchema, UpdateFeedbackReadStatusResponseSchema,
...@@ -19,7 +19,7 @@ export const ChatFeedbackPath: OpenAPIPath = { ...@@ -19,7 +19,7 @@ export const ChatFeedbackPath: OpenAPIPath = {
post: { post: {
summary: '添加/更新用户反馈', summary: '添加/更新用户反馈',
description: '用户对消息添加或更新好评/差评反馈', description: '用户对消息添加或更新好评/差评反馈',
tags: [TagsMap.chatFeedback, ApiKeyTagMap.chat], tags: [DevApiTagsMap.chatFeedback, SystemOpenApiTagMap.chatFeedback],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -43,7 +43,7 @@ export const ChatFeedbackPath: OpenAPIPath = { ...@@ -43,7 +43,7 @@ export const ChatFeedbackPath: OpenAPIPath = {
post: { post: {
summary: '获取反馈记录ID列表', summary: '获取反馈记录ID列表',
description: '根据反馈类型和已读状态,获取符合条件的消息ID列表', description: '根据反馈类型和已读状态,获取符合条件的消息ID列表',
tags: [TagsMap.chatFeedback], tags: [DevApiTagsMap.chatFeedback],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -67,7 +67,7 @@ export const ChatFeedbackPath: OpenAPIPath = { ...@@ -67,7 +67,7 @@ export const ChatFeedbackPath: OpenAPIPath = {
post: { post: {
summary: '应用管理员-更新反馈阅读状态', summary: '应用管理员-更新反馈阅读状态',
description: '标记指定消息的反馈为已读或未读状态', description: '标记指定消息的反馈为已读或未读状态',
tags: [TagsMap.chatFeedback], tags: [DevApiTagsMap.chatFeedback],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -91,7 +91,7 @@ export const ChatFeedbackPath: OpenAPIPath = { ...@@ -91,7 +91,7 @@ export const ChatFeedbackPath: OpenAPIPath = {
post: { post: {
summary: '应用管理员-标注反馈', summary: '应用管理员-标注反馈',
description: '管理员为指定消息添加或更新标注反馈,包含数据集关联信息', description: '管理员为指定消息添加或更新标注反馈,包含数据集关联信息',
tags: [TagsMap.chatFeedback], tags: [DevApiTagsMap.chatFeedback],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -115,7 +115,7 @@ export const ChatFeedbackPath: OpenAPIPath = { ...@@ -115,7 +115,7 @@ export const ChatFeedbackPath: OpenAPIPath = {
post: { post: {
summary: '应用管理员-关闭自定义反馈', summary: '应用管理员-关闭自定义反馈',
description: '删除或关闭指定索引位置的自定义反馈条目', description: '删除或关闭指定索引位置的自定义反馈条目',
tags: [TagsMap.chatFeedback], tags: [DevApiTagsMap.chatFeedback],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { PresignChatFilePostUrlSchema, PresignChatFileGetUrlSchema } from './api'; import { PresignChatFilePostUrlSchema, PresignChatFileGetUrlSchema } from './api';
import { CreatePostPresignedUrlResponseSchema } from '../../../../common/file/s3/type'; import { CreatePostPresignedUrlResponseSchema } from '../../../../common/file/s3/type';
import { z } from 'zod'; import { z } from 'zod';
...@@ -9,7 +9,7 @@ export const ChatFilePath: OpenAPIPath = { ...@@ -9,7 +9,7 @@ export const ChatFilePath: OpenAPIPath = {
post: { post: {
summary: '获取文件上传 URL', summary: '获取文件上传 URL',
description: '获取文件上传 URL', description: '获取文件上传 URL',
tags: [TagsMap.chatFile], tags: [DevApiTagsMap.chatFile],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -33,7 +33,7 @@ export const ChatFilePath: OpenAPIPath = { ...@@ -33,7 +33,7 @@ export const ChatFilePath: OpenAPIPath = {
post: { post: {
summary: '获取文件预览地址', summary: '获取文件预览地址',
description: '获取文件预览地址', description: '获取文件预览地址',
tags: [TagsMap.chatFile], tags: [DevApiTagsMap.chatFile],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import z from 'zod'; import z from 'zod';
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
HelperBotCompletionsParamsSchema, HelperBotCompletionsParamsSchema,
DeleteHelperBotChatParamsSchema, DeleteHelperBotChatParamsSchema,
...@@ -13,7 +13,7 @@ export const HelperBotPath: OpenAPIPath = { ...@@ -13,7 +13,7 @@ export const HelperBotPath: OpenAPIPath = {
post: { post: {
summary: '辅助生成统一对话接口', summary: '辅助生成统一对话接口',
description: '辅助生成统一对话接口', description: '辅助生成统一对话接口',
tags: [TagsMap.helperBot], tags: [DevApiTagsMap.helperBot],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -37,7 +37,7 @@ export const HelperBotPath: OpenAPIPath = { ...@@ -37,7 +37,7 @@ export const HelperBotPath: OpenAPIPath = {
get: { get: {
summary: '分页获取记录', summary: '分页获取记录',
description: '分页获取记录', description: '分页获取记录',
tags: [TagsMap.helperBot], tags: [DevApiTagsMap.helperBot],
requestParams: { requestParams: {
query: GetHelperBotChatRecordsParamsSchema query: GetHelperBotChatRecordsParamsSchema
}, },
...@@ -57,7 +57,7 @@ export const HelperBotPath: OpenAPIPath = { ...@@ -57,7 +57,7 @@ export const HelperBotPath: OpenAPIPath = {
delete: { delete: {
summary: '删除单组对话', summary: '删除单组对话',
description: '删除单组对话', description: '删除单组对话',
tags: [TagsMap.helperBot], tags: [DevApiTagsMap.helperBot],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import z from 'zod'; import z from 'zod';
import { ObjectIdSchema } from '../../../../common/type/mongo'; import { ObjectIdSchema } from '../../../../common/type/mongo';
import { OutLinkChatAuthSchema } from '../../../../support/permission/chat'; import { OutLinkChatAuthSchema } from '../../../../support/permission/chat';
import { ChatGenerateStatusEnum, ChatSourceEnum } from '../../../../core/chat/constants'; import { ChatSourceEnum } from '../../../../core/chat/constants';
import { PaginationSchema, PaginationResponseSchema } from '../../../api'; import { PaginationSchema, PaginationResponseSchema } from '../../../api';
import { ChatGenerateStatusSchema } from '../api';
// Get chat histories schema // Get chat sessions schema
export const GetHistoriesBodySchema = PaginationSchema.extend(OutLinkChatAuthSchema.shape).extend({ export const GetHistoriesBodySchema = PaginationSchema.extend(OutLinkChatAuthSchema.shape).extend({
appId: z.string().optional().describe('应用ID'), appId: z.string().optional().describe('应用ID'),
source: z.enum(ChatSourceEnum).optional().describe('对话来源'), source: z.enum(ChatSourceEnum).optional().describe('对话来源'),
...@@ -22,7 +23,7 @@ export const GetHistoriesResponseSchema = PaginationResponseSchema( ...@@ -22,7 +23,7 @@ export const GetHistoriesResponseSchema = PaginationResponseSchema(
customTitle: z.string().optional(), customTitle: z.string().optional(),
title: z.string(), title: z.string(),
top: z.boolean().optional(), top: z.boolean().optional(),
chatGenerateStatus: z.enum(ChatGenerateStatusEnum).optional(), chatGenerateStatus: ChatGenerateStatusSchema.optional(),
hasBeenRead: z.boolean().optional() hasBeenRead: z.boolean().optional()
}) })
); );
...@@ -30,7 +31,7 @@ export type GetHistoriesResponseType = z.infer<typeof GetHistoriesResponseSchema ...@@ -30,7 +31,7 @@ export type GetHistoriesResponseType = z.infer<typeof GetHistoriesResponseSchema
export const GetHistoryStatusBodySchema = OutLinkChatAuthSchema.extend({ export const GetHistoryStatusBodySchema = OutLinkChatAuthSchema.extend({
appId: ObjectIdSchema.optional().describe('应用ID'), appId: ObjectIdSchema.optional().describe('应用ID'),
chatIds: z.array(z.string().min(1)).min(1).max(200).describe('需要刷新状态的对话 ID 列表') chatIds: z.array(z.string().min(1)).min(1).max(200).describe('需要刷新状态的会话 ID 列表')
}); });
export type GetHistoryStatusBodyType = z.infer<typeof GetHistoryStatusBodySchema>; export type GetHistoryStatusBodyType = z.infer<typeof GetHistoryStatusBodySchema>;
...@@ -39,7 +40,7 @@ export const GetHistoryStatusResponseSchema = z.object({ ...@@ -39,7 +40,7 @@ export const GetHistoryStatusResponseSchema = z.object({
z.object({ z.object({
chatId: z.string(), chatId: z.string(),
updateTime: z.coerce.date(), updateTime: z.coerce.date(),
chatGenerateStatus: z.enum(ChatGenerateStatusEnum).optional(), chatGenerateStatus: ChatGenerateStatusSchema.optional(),
hasBeenRead: z.boolean().optional() hasBeenRead: z.boolean().optional()
}) })
) )
...@@ -48,41 +49,41 @@ export type GetHistoryStatusResponseType = z.infer<typeof GetHistoryStatusRespon ...@@ -48,41 +49,41 @@ export type GetHistoryStatusResponseType = z.infer<typeof GetHistoryStatusRespon
export const MarkChatReadBodySchema = OutLinkChatAuthSchema.extend({ export const MarkChatReadBodySchema = OutLinkChatAuthSchema.extend({
appId: ObjectIdSchema.describe('应用ID'), appId: ObjectIdSchema.describe('应用ID'),
chatId: z.string().min(1).describe('对话ID') chatId: z.string().min(1).describe('会话ID')
}); });
export type MarkChatReadBodyType = z.infer<typeof MarkChatReadBodySchema>; export type MarkChatReadBodyType = z.infer<typeof MarkChatReadBodySchema>;
// Update chat history schema // Update chat session schema
export const UpdateHistoryBodySchema = OutLinkChatAuthSchema.extend({ export const UpdateHistoryBodySchema = OutLinkChatAuthSchema.extend({
appId: ObjectIdSchema.describe('应用ID'), appId: ObjectIdSchema.describe('应用ID'),
chatId: z.string().min(1).describe('对话ID'), chatId: z.string().min(1).describe('会话ID'),
title: z.string().optional().describe('标题'), title: z.string().optional().describe('标题'),
customTitle: z.string().optional().describe('自定义标题'), customTitle: z.string().optional().describe('自定义标题'),
top: z.boolean().optional().describe('是否置顶') top: z.boolean().optional().describe('是否置顶')
}); });
export type UpdateHistoryBodyType = z.infer<typeof UpdateHistoryBodySchema>; export type UpdateHistoryBodyType = z.infer<typeof UpdateHistoryBodySchema>;
// Delete single chat history schema // Delete single chat session schema
export const DelChatHistorySchema = OutLinkChatAuthSchema.extend({ export const DelChatHistorySchema = OutLinkChatAuthSchema.extend({
appId: ObjectIdSchema.optional().describe('应用ID'), appId: ObjectIdSchema.optional().describe('应用ID'),
chatId: z.string().min(1).describe('对话ID') chatId: z.string().min(1).describe('会话ID')
}); });
export type DelChatHistoryType = z.infer<typeof DelChatHistorySchema>; export type DelChatHistoryType = z.infer<typeof DelChatHistorySchema>;
// Clear all chat histories schema // Clear all chat sessions schema
export const ClearChatHistoriesSchema = OutLinkChatAuthSchema.extend({ export const ClearChatHistoriesSchema = OutLinkChatAuthSchema.extend({
appId: ObjectIdSchema.optional().describe('应用ID') appId: ObjectIdSchema.optional().describe('应用ID')
}); });
export type ClearChatHistoriesType = z.infer<typeof ClearChatHistoriesSchema>; export type ClearChatHistoriesType = z.infer<typeof ClearChatHistoriesSchema>;
// Batch delete chat histories schema (for log manager) // Batch delete chat sessions schema (for log manager)
export const ChatBatchDeleteBodySchema = z.object({ export const ChatBatchDeleteBodySchema = z.object({
appId: ObjectIdSchema, appId: ObjectIdSchema,
chatIds: z chatIds: z
.array(z.string().min(1)) .array(z.string().min(1))
.min(1) .min(1)
.meta({ .meta({
description: '对话ID列表', description: '会话 ID 列表',
example: ['chat_123456', 'chat_789012'] example: ['chat_123456', 'chat_789012']
}) })
}); });
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap, SystemOpenApiTagMap } from '../../../tag';
import { ApiKeyTagMap } from '../../../apikey/tag';
import { import {
GetHistoriesBodySchema, GetHistoriesBodySchema,
GetHistoriesResponseSchema, GetHistoriesResponseSchema,
...@@ -16,9 +15,9 @@ import { ...@@ -16,9 +15,9 @@ import {
export const ChatHistoryPath: OpenAPIPath = { export const ChatHistoryPath: OpenAPIPath = {
'/core/chat/history/getHistories': { '/core/chat/history/getHistories': {
post: { post: {
summary: '获取历史记录列表', summary: '获取会话列表',
description: '分页获取指定应用的历史记录', description: '分页获取指定应用的会话',
tags: [TagsMap.chatHistory, ApiKeyTagMap.chatHistory], tags: [DevApiTagsMap.chatHistory, SystemOpenApiTagMap.chatHistory],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -28,7 +27,7 @@ export const ChatHistoryPath: OpenAPIPath = { ...@@ -28,7 +27,7 @@ export const ChatHistoryPath: OpenAPIPath = {
}, },
responses: { responses: {
200: { 200: {
description: '成功获取历史记录列表', description: '成功获取会话列表',
content: { content: {
'application/json': { 'application/json': {
schema: GetHistoriesResponseSchema schema: GetHistoriesResponseSchema
...@@ -40,10 +39,10 @@ export const ChatHistoryPath: OpenAPIPath = { ...@@ -40,10 +39,10 @@ export const ChatHistoryPath: OpenAPIPath = {
}, },
'/core/chat/history/getHistoryStatus': { '/core/chat/history/getHistoryStatus': {
post: { post: {
summary: '批量获取历史记录状态(生成中/已读)', summary: '批量获取会话状态(生成中/已读)',
description: description:
'按 chatId 列表返回 chatGenerateStatus、hasBeenRead、updateTime,用于侧栏轻量轮询同步', '按 chatId 列表返回 chatGenerateStatus、hasBeenRead、updateTime,用于侧栏轻量轮询同步',
tags: [TagsMap.chatHistory], tags: [DevApiTagsMap.chatHistory, SystemOpenApiTagMap.chatHistory],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -65,9 +64,9 @@ export const ChatHistoryPath: OpenAPIPath = { ...@@ -65,9 +64,9 @@ export const ChatHistoryPath: OpenAPIPath = {
}, },
'/core/chat/history/markRead': { '/core/chat/history/markRead': {
post: { post: {
summary: '标记历史记录已读', summary: '标记会话已读',
description: '用户在本页看完回复后调用,同步 Mongo hasBeenRead', description: '用户在本页看完回复后调用,同步 Mongo hasBeenRead',
tags: [TagsMap.chatHistory], tags: [DevApiTagsMap.chatHistory, SystemOpenApiTagMap.chatHistory],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -84,9 +83,9 @@ export const ChatHistoryPath: OpenAPIPath = { ...@@ -84,9 +83,9 @@ export const ChatHistoryPath: OpenAPIPath = {
}, },
'/core/chat/history/updateHistory': { '/core/chat/history/updateHistory': {
put: { put: {
summary: '修改历史记录', summary: '修改会话',
description: '修改历史记录的标题、自定义标题或置顶状态', description: '修改会话的标题、自定义标题或置顶状态',
tags: [TagsMap.chatHistory, ApiKeyTagMap.chatHistory], tags: [DevApiTagsMap.chatHistory, SystemOpenApiTagMap.chatHistory],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -96,46 +95,46 @@ export const ChatHistoryPath: OpenAPIPath = { ...@@ -96,46 +95,46 @@ export const ChatHistoryPath: OpenAPIPath = {
}, },
responses: { responses: {
200: { 200: {
description: '成功修改历史记录' description: '成功修改会话'
} }
} }
} }
}, },
'/core/chat/history/delHistory': { '/core/chat/history/delHistory': {
delete: { delete: {
summary: '删除单个历史记录', summary: '删除单个会话',
description: '软删除指定的单个历史记录', description: '软删除指定的单个会话,不会物理删除',
tags: [TagsMap.chatHistory, ApiKeyTagMap.chatHistory], tags: [DevApiTagsMap.chatHistory, SystemOpenApiTagMap.chatHistory],
requestParams: { requestParams: {
query: DelChatHistorySchema query: DelChatHistorySchema
}, },
responses: { responses: {
200: { 200: {
description: '成功删除历史记录' description: '成功删除会话'
} }
} }
} }
}, },
'/core/chat/history/clearHistories': { '/core/chat/history/clearHistories': {
delete: { delete: {
summary: '清空应用历史记录', summary: '清空应用会话',
description: '清空指定应用的所有历史记录(软删除)', description: '清空指定应用的所有会话(软删除)',
tags: [TagsMap.chatHistory, ApiKeyTagMap.chatHistory], tags: [DevApiTagsMap.chatHistory, SystemOpenApiTagMap.chatHistory],
requestParams: { requestParams: {
query: ClearChatHistoriesSchema query: ClearChatHistoriesSchema
}, },
responses: { responses: {
200: { 200: {
description: '成功清空历史记录' description: '成功清空会话'
} }
} }
} }
}, },
'/core/chat/history/batchDelete': { '/core/chat/history/batchDelete': {
post: { post: {
summary: '批量删除历史记录', summary: '批量删除会话',
description: '批量删除指定应用的多个历史记录(真实删除),需应用日志权限。', description: '批量删除指定应用的多个会话(真实删除),需应用日志管理权限。',
tags: [TagsMap.chatHistory], tags: [DevApiTagsMap.chatHistory, SystemOpenApiTagMap.chatHistory],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -145,7 +144,7 @@ export const ChatHistoryPath: OpenAPIPath = { ...@@ -145,7 +144,7 @@ export const ChatHistoryPath: OpenAPIPath = {
}, },
responses: { responses: {
200: { 200: {
description: '成功删除历史记录' description: '成功删除会话'
} }
} }
} }
......
...@@ -4,7 +4,7 @@ import { ChatFavouriteAppPath } from './favourite/index'; ...@@ -4,7 +4,7 @@ import { ChatFavouriteAppPath } from './favourite/index';
import { ChatFeedbackPath } from './feedback/index'; import { ChatFeedbackPath } from './feedback/index';
import { ChatHistoryPath } from './history/index'; import { ChatHistoryPath } from './history/index';
import { GetRecentlyUsedAppsResponseSchema } from './api'; import { GetRecentlyUsedAppsResponseSchema } from './api';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
import { ChatControllerPath } from './controler'; import { ChatControllerPath } from './controler';
import { HelperBotPath } from './helperBot'; import { HelperBotPath } from './helperBot';
import { ChatInputGuidePath } from './inputGuide/index'; import { ChatInputGuidePath } from './inputGuide/index';
...@@ -30,7 +30,7 @@ export const ChatPath: OpenAPIPath = { ...@@ -30,7 +30,7 @@ export const ChatPath: OpenAPIPath = {
get: { get: {
summary: '获取最近使用的应用', summary: '获取最近使用的应用',
description: '获取最近使用的应用', description: '获取最近使用的应用',
tags: [TagsMap.chatPage], tags: [DevApiTagsMap.chatPage],
responses: { responses: {
200: { 200: {
description: '成功返回最近使用的应用', description: '成功返回最近使用的应用',
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
ChatInputGuideListBodySchema, ChatInputGuideListBodySchema,
ChatInputGuideListResponseSchema, ChatInputGuideListResponseSchema,
...@@ -21,7 +21,7 @@ export const ChatInputGuidePath: OpenAPIPath = { ...@@ -21,7 +21,7 @@ export const ChatInputGuidePath: OpenAPIPath = {
post: { post: {
summary: '获取对话输入引导列表', summary: '获取对话输入引导列表',
description: '获取指定应用的对话输入引导列表,支持关键词模糊搜索和分页', description: '获取指定应用的对话输入引导列表,支持关键词模糊搜索和分页',
tags: [TagsMap.chatInputGuide], tags: [DevApiTagsMap.chatInputGuide],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -45,7 +45,7 @@ export const ChatInputGuidePath: OpenAPIPath = { ...@@ -45,7 +45,7 @@ export const ChatInputGuidePath: OpenAPIPath = {
get: { get: {
summary: '统计对话输入引导总数', summary: '统计对话输入引导总数',
description: '获取指定应用的对话输入引导总数', description: '获取指定应用的对话输入引导总数',
tags: [TagsMap.chatInputGuide], tags: [DevApiTagsMap.chatInputGuide],
parameters: [ parameters: [
{ {
in: 'query', in: 'query',
...@@ -70,7 +70,7 @@ export const ChatInputGuidePath: OpenAPIPath = { ...@@ -70,7 +70,7 @@ export const ChatInputGuidePath: OpenAPIPath = {
post: { post: {
summary: '创建对话输入引导', summary: '创建对话输入引导',
description: '批量创建对话输入引导文本', description: '批量创建对话输入引导文本',
tags: [TagsMap.chatInputGuide], tags: [DevApiTagsMap.chatInputGuide],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -94,7 +94,7 @@ export const ChatInputGuidePath: OpenAPIPath = { ...@@ -94,7 +94,7 @@ export const ChatInputGuidePath: OpenAPIPath = {
delete: { delete: {
summary: '删除对话输入引导', summary: '删除对话输入引导',
description: '批量删除指定的对话输入引导', description: '批量删除指定的对话输入引导',
tags: [TagsMap.chatInputGuide], tags: [DevApiTagsMap.chatInputGuide],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -118,7 +118,7 @@ export const ChatInputGuidePath: OpenAPIPath = { ...@@ -118,7 +118,7 @@ export const ChatInputGuidePath: OpenAPIPath = {
delete: { delete: {
summary: '删除应用所有对话输入引导', summary: '删除应用所有对话输入引导',
description: '删除指定应用的所有对话输入引导', description: '删除指定应用的所有对话输入引导',
tags: [TagsMap.chatInputGuide], tags: [DevApiTagsMap.chatInputGuide],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -142,7 +142,7 @@ export const ChatInputGuidePath: OpenAPIPath = { ...@@ -142,7 +142,7 @@ export const ChatInputGuidePath: OpenAPIPath = {
post: { post: {
summary: '查询对话输入引导(公开接口)', summary: '查询对话输入引导(公开接口)',
description: '根据搜索词查询对话输入引导,支持分享链接和团队 Token 鉴权', description: '根据搜索词查询对话输入引导,支持分享链接和团队 Token 鉴权',
tags: [TagsMap.chatInputGuide], tags: [DevApiTagsMap.chatInputGuide],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -166,7 +166,7 @@ export const ChatInputGuidePath: OpenAPIPath = { ...@@ -166,7 +166,7 @@ export const ChatInputGuidePath: OpenAPIPath = {
put: { put: {
summary: '更新对话输入引导', summary: '更新对话输入引导',
description: '更新指定的对话输入引导文本', description: '更新指定的对话输入引导文本',
tags: [TagsMap.chatInputGuide], tags: [DevApiTagsMap.chatInputGuide],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { InitOutLinkChatQuerySchema } from './api'; import { InitOutLinkChatQuerySchema } from './api';
export const OutLinkChatPath: OpenAPIPath = { export const OutLinkChatPath: OpenAPIPath = {
...@@ -7,7 +7,7 @@ export const OutLinkChatPath: OpenAPIPath = { ...@@ -7,7 +7,7 @@ export const OutLinkChatPath: OpenAPIPath = {
get: { get: {
summary: '初始化外链会话', summary: '初始化外链会话',
description: '通过分享链接初始化会话,获取应用配置和历史会话信息', description: '通过分享链接初始化会话,获取应用配置和历史会话信息',
tags: [TagsMap.chatPage], tags: [DevApiTagsMap.chatPage],
requestParams: { requestParams: {
query: InitOutLinkChatQuerySchema query: InitOutLinkChatQuerySchema
}, },
......
...@@ -32,10 +32,10 @@ export const GetResDataQuerySchema = OutLinkChatAuthSchema.extend({ ...@@ -32,10 +32,10 @@ export const GetResDataQuerySchema = OutLinkChatAuthSchema.extend({
export type GetResDataQueryType = z.infer<typeof GetResDataQuerySchema>; export type GetResDataQueryType = z.infer<typeof GetResDataQuerySchema>;
/* ============================================================================ /* ============================================================================
* API: 删除对话记录 * API: 删除对话
* Route: DELETE /api/core/chat/record/delete * Route: DELETE /api/core/chat/record/delete
* Method: DELETE * Method: DELETE
* Description: 软删除指定的对话消息记录(设置 deleteTime) * Description: 软删除指定的对话消息(设置 deleteTime)
* ============================================================================ */ * ============================================================================ */
export const DeleteChatRecordBodySchema = OutLinkChatAuthSchema.extend({ export const DeleteChatRecordBodySchema = OutLinkChatAuthSchema.extend({
...@@ -70,7 +70,7 @@ export const GetQuoteBodySchema = OutLinkChatAuthSchema.extend({ ...@@ -70,7 +70,7 @@ export const GetQuoteBodySchema = OutLinkChatAuthSchema.extend({
appId: ObjectIdSchema.describe('应用 ID'), appId: ObjectIdSchema.describe('应用 ID'),
chatId: z.string().min(1).max(256).meta({ chatId: z.string().min(1).max(256).meta({
example: 'chat_abc123', example: 'chat_abc123',
description: '对话 ID' description: '会话 ID'
}), }),
chatItemDataId: z.string().min(1).max(256).meta({ chatItemDataId: z.string().min(1).max(256).meta({
example: 'item_abc123', example: 'item_abc123',
...@@ -105,7 +105,7 @@ export type GetQuoteResponseType = z.infer<typeof GetQuoteResponseSchema>; ...@@ -105,7 +105,7 @@ export type GetQuoteResponseType = z.infer<typeof GetQuoteResponseSchema>;
export const GetCollectionQuoteBodySchema = OutLinkChatAuthSchema.extend({ export const GetCollectionQuoteBodySchema = OutLinkChatAuthSchema.extend({
appId: ObjectIdSchema.describe('应用 ID'), appId: ObjectIdSchema.describe('应用 ID'),
chatId: z.string().min(1).max(256).describe('对话 ID'), chatId: z.string().min(1).max(256).describe('会话 ID'),
chatItemDataId: z.string().min(1).max(256).describe('对话消息 dataId'), chatItemDataId: z.string().min(1).max(256).describe('对话消息 dataId'),
collectionId: ObjectIdSchema.describe('集合 ID'), collectionId: ObjectIdSchema.describe('集合 ID'),
pageSize: z.number().int().min(1).max(30).default(15).describe('每页条数,范围 [1, 30]'), pageSize: z.number().int().min(1).max(30).default(15).describe('每页条数,范围 [1, 30]'),
...@@ -129,10 +129,10 @@ export const GetCollectionQuoteResSchema = z.object({ ...@@ -129,10 +129,10 @@ export const GetCollectionQuoteResSchema = z.object({
export type GetCollectionQuoteResType = z.infer<typeof GetCollectionQuoteResSchema>; export type GetCollectionQuoteResType = z.infer<typeof GetCollectionQuoteResSchema>;
/* ============================================================================ /* ============================================================================
* API: 分页获取对话记录 * API: 分页获取对话
* Route: POST /api/core/chat/record/getPaginationRecords * Route: POST /api/core/chat/record/getPaginationRecords
* Method: POST * Method: POST
* Description: 分页获取指定应用和会话的对话记录,支持多种鉴权模式 * Description: 分页获取指定应用和会话的对话,支持多种鉴权模式
* ============================================================================ */ * ============================================================================ */
const GetRecordPropsSchema = z.object({ const GetRecordPropsSchema = z.object({
...@@ -157,16 +157,16 @@ export const GetPaginationRecordsBodySchema = PaginationSchema.extend( ...@@ -157,16 +157,16 @@ export const GetPaginationRecordsBodySchema = PaginationSchema.extend(
export type GetPaginationRecordsBodyType = z.infer<typeof GetPaginationRecordsBodySchema>; export type GetPaginationRecordsBodyType = z.infer<typeof GetPaginationRecordsBodySchema>;
export const GetPaginationRecordsResponseSchema = z.object({ export const GetPaginationRecordsResponseSchema = z.object({
list: z.array(z.any()).meta({ description: '对话记录列表' }), list: z.array(z.any()).meta({ description: '对话列表' }),
total: z.number().int().nonnegative().meta({ example: 10, description: '总数' }) total: z.number().int().nonnegative().meta({ example: 10, description: '总数' })
}); });
export type GetPaginationRecordsResponseType = z.infer<typeof GetPaginationRecordsResponseSchema>; export type GetPaginationRecordsResponseType = z.infer<typeof GetPaginationRecordsResponseSchema>;
/* ============================================================================ /* ============================================================================
* API: 获取对话记录(v2) * API: 获取对话(v2)
* Route: POST /api/core/chat/record/getRecordsV2 * Route: POST /api/core/chat/record/getRecordsV2
* Method: POST * Method: POST
* Description: 获取对话记录(v2) * Description: 获取对话(v2)
* ============================================================================ */ * ============================================================================ */
export const GetRecordsV2BodySchema = LinkedPaginationSchema(GetRecordPropsSchema.shape); export const GetRecordsV2BodySchema = LinkedPaginationSchema(GetRecordPropsSchema.shape);
export type GetRecordsV2BodyType = z.infer<typeof GetRecordsV2BodySchema>; export type GetRecordsV2BodyType = z.infer<typeof GetRecordsV2BodySchema>;
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap, SystemOpenApiTagMap } from '../../../tag';
import { import {
GetResDataQuerySchema, GetResDataQuerySchema,
DeleteChatRecordBodySchema, DeleteChatRecordBodySchema,
...@@ -18,9 +18,9 @@ import { ...@@ -18,9 +18,9 @@ import {
export const ChatRecordPath: OpenAPIPath = { export const ChatRecordPath: OpenAPIPath = {
'/core/chat/record/getPaginationRecords': { '/core/chat/record/getPaginationRecords': {
post: { post: {
summary: '分页获取对话记录', summary: '分页获取对话',
description: '分页获取指定应用和会话的对话记录,支持多种鉴权模式', description: '分页获取指定应用和会话的对话,支持多种鉴权模式',
tags: [TagsMap.chatRecord], tags: [DevApiTagsMap.chatRecord, SystemOpenApiTagMap.chat],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -30,7 +30,7 @@ export const ChatRecordPath: OpenAPIPath = { ...@@ -30,7 +30,7 @@ export const ChatRecordPath: OpenAPIPath = {
}, },
responses: { responses: {
200: { 200: {
description: '成功返回对话记录', description: '成功返回对话',
content: { content: {
'application/json': { 'application/json': {
schema: GetPaginationRecordsResponseSchema schema: GetPaginationRecordsResponseSchema
...@@ -42,9 +42,9 @@ export const ChatRecordPath: OpenAPIPath = { ...@@ -42,9 +42,9 @@ export const ChatRecordPath: OpenAPIPath = {
}, },
'/core/chat/record/getRecords_v2': { '/core/chat/record/getRecords_v2': {
post: { post: {
summary: '根据锚点获取对话记录', summary: '根据锚点获取对话',
description: '根据锚点获取指定应用和会话的对话记录,支持多种鉴权模式', description: '根据锚点获取指定应用和会话的对话,支持多种鉴权模式',
tags: [TagsMap.chatRecord], tags: [DevApiTagsMap.chatRecord, SystemOpenApiTagMap.chat],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -54,7 +54,7 @@ export const ChatRecordPath: OpenAPIPath = { ...@@ -54,7 +54,7 @@ export const ChatRecordPath: OpenAPIPath = {
}, },
responses: { responses: {
200: { 200: {
description: '成功返回对话记录', description: '成功返回对话',
content: { content: {
'application/json': { 'application/json': {
schema: GetRecordsV2ResponseSchema schema: GetRecordsV2ResponseSchema
...@@ -69,7 +69,7 @@ export const ChatRecordPath: OpenAPIPath = { ...@@ -69,7 +69,7 @@ export const ChatRecordPath: OpenAPIPath = {
get: { get: {
summary: '获取对话响应详细数据', summary: '获取对话响应详细数据',
description: '根据 dataId 获取对话中某条 AI 回复的详细响应数据', description: '根据 dataId 获取对话中某条 AI 回复的详细响应数据',
tags: [TagsMap.chatRecord], tags: [DevApiTagsMap.chatRecord, SystemOpenApiTagMap.chat],
requestParams: { requestParams: {
query: GetResDataQuerySchema query: GetResDataQuerySchema
}, },
...@@ -85,7 +85,7 @@ export const ChatRecordPath: OpenAPIPath = { ...@@ -85,7 +85,7 @@ export const ChatRecordPath: OpenAPIPath = {
post: { post: {
summary: '获取对话引用数据', summary: '获取对话引用数据',
description: '获取指定对话消息的数据集引用列表,需要对话访问权限', description: '获取指定对话消息的数据集引用列表,需要对话访问权限',
tags: [TagsMap.chatRecord], tags: [DevApiTagsMap.chatRecord],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -109,7 +109,7 @@ export const ChatRecordPath: OpenAPIPath = { ...@@ -109,7 +109,7 @@ export const ChatRecordPath: OpenAPIPath = {
post: { post: {
summary: '获取集合分页引用数据', summary: '获取集合分页引用数据',
description: '以链式分页方式获取指定集合的引用数据,支持前后翻页,需要对话访问权限', description: '以链式分页方式获取指定集合的引用数据,支持前后翻页,需要对话访问权限',
tags: [TagsMap.chatRecord], tags: [DevApiTagsMap.chatRecord],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -132,9 +132,9 @@ export const ChatRecordPath: OpenAPIPath = { ...@@ -132,9 +132,9 @@ export const ChatRecordPath: OpenAPIPath = {
'/core/chat/record/delete': { '/core/chat/record/delete': {
delete: { delete: {
summary: '删除对话记录', summary: '删除对话',
description: '软删除指定的对话消息记录(设置 deleteTime)', description: '软删除指定的对话消息记录(设置 deleteTime)',
tags: [TagsMap.chatRecord], tags: [DevApiTagsMap.chatRecord, SystemOpenApiTagMap.chat],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -158,7 +158,7 @@ export const ChatRecordPath: OpenAPIPath = { ...@@ -158,7 +158,7 @@ export const ChatRecordPath: OpenAPIPath = {
post: { post: {
summary: '获取语音合成', summary: '获取语音合成',
description: '将文本转换为语音,返回二进制音频数据流', description: '将文本转换为语音,返回二进制音频数据流',
tags: [TagsMap.chatRecord], tags: [DevApiTagsMap.chatRecord],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { ChatSettingSchema, ChatSettingModelSchema } from '../../../../core/chat/setting/type'; import { ChatSettingSchema, ChatSettingModelSchema } from '../../../../core/chat/setting/type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
export const ChatSettingPath: OpenAPIPath = { export const ChatSettingPath: OpenAPIPath = {
'/proApi/core/chat/setting/detail': { '/proApi/core/chat/setting/detail': {
...@@ -8,7 +8,7 @@ export const ChatSettingPath: OpenAPIPath = { ...@@ -8,7 +8,7 @@ export const ChatSettingPath: OpenAPIPath = {
summary: '获取门户页设置', summary: '获取门户页设置',
description: description:
'获取当前团队的门户页设置,包括 slogan、对话提示、Logo、快捷应用、已选工具和精选应用标签等配置信息', '获取当前团队的门户页设置,包括 slogan、对话提示、Logo、快捷应用、已选工具和精选应用标签等配置信息',
tags: [TagsMap.chatSetting], tags: [DevApiTagsMap.chatSetting],
responses: { responses: {
200: { 200: {
description: '成功返回门户页设置信息', description: '成功返回门户页设置信息',
...@@ -26,7 +26,7 @@ export const ChatSettingPath: OpenAPIPath = { ...@@ -26,7 +26,7 @@ export const ChatSettingPath: OpenAPIPath = {
summary: '更新门户页设置', summary: '更新门户页设置',
description: description:
'更新团队的门户页设置配置,包括 slogan、对话提示、Logo、快捷应用、已选工具和精选应用标签等信息', '更新团队的门户页设置配置,包括 slogan、对话提示、Logo、快捷应用、已选工具和精选应用标签等信息',
tags: [TagsMap.chatSetting], tags: [DevApiTagsMap.chatSetting],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
GetApiDatasetCatalogBodySchema, GetApiDatasetCatalogBodySchema,
GetApiDatasetFileListBodySchema, GetApiDatasetFileListBodySchema,
...@@ -13,7 +13,7 @@ export const ApiDatasetPath: OpenAPIPath = { ...@@ -13,7 +13,7 @@ export const ApiDatasetPath: OpenAPIPath = {
summary: '获取第三方知识库目录', summary: '获取第三方知识库目录',
description: description:
'列出第三方知识库(API/飞书/语雀)的目录节点,仅返回包含子节点的文件夹,用于构建目录选择器', '列出第三方知识库(API/飞书/语雀)的目录节点,仅返回包含子节点的文件夹,用于构建目录选择器',
tags: [TagsMap.datasetApiDataset], tags: [DevApiTagsMap.datasetApiDataset],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -32,7 +32,7 @@ export const ApiDatasetPath: OpenAPIPath = { ...@@ -32,7 +32,7 @@ export const ApiDatasetPath: OpenAPIPath = {
post: { post: {
summary: '获取第三方知识库节点路径', summary: '获取第三方知识库节点路径',
description: '根据节点 ID 沿父级链向上查找,拼接出完整路径字符串,用于面包屑或路径展示', description: '根据节点 ID 沿父级链向上查找,拼接出完整路径字符串,用于面包屑或路径展示',
tags: [TagsMap.datasetApiDataset], tags: [DevApiTagsMap.datasetApiDataset],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -51,7 +51,7 @@ export const ApiDatasetPath: OpenAPIPath = { ...@@ -51,7 +51,7 @@ export const ApiDatasetPath: OpenAPIPath = {
post: { post: {
summary: '获取第三方知识库文件列表', summary: '获取第三方知识库文件列表',
description: '列出指定知识库下的第三方文件/文件夹,支持关键词与父级筛选', description: '列出指定知识库下的第三方文件/文件夹,支持关键词与父级筛选',
tags: [TagsMap.datasetApiDataset], tags: [DevApiTagsMap.datasetApiDataset],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -70,7 +70,7 @@ export const ApiDatasetPath: OpenAPIPath = { ...@@ -70,7 +70,7 @@ export const ApiDatasetPath: OpenAPIPath = {
get: { get: {
summary: '获取已导入的第三方文件 ID 列表', summary: '获取已导入的第三方文件 ID 列表',
description: '返回指定知识库下已创建集合所对应的 apiFileId,用于导入时的去重判断', description: '返回指定知识库下已创建集合所对应的 apiFileId,用于导入时的去重判断',
tags: [TagsMap.datasetApiDataset], tags: [DevApiTagsMap.datasetApiDataset],
requestParams: { requestParams: {
query: GetApiDatasetFileListExistIdQuerySchema query: GetApiDatasetFileListExistIdQuerySchema
}, },
......
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { ApiKeyTagMap } from '../../../apikey/tag'; import { SystemOpenApiTagMap } from '../../../tag';
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { import {
CreateApiCollectionBodySchema, CreateApiCollectionBodySchema,
...@@ -23,7 +23,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -23,7 +23,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
post: { post: {
summary: '创建空集合/目录', summary: '创建空集合/目录',
description: '创建空数据集合或者目录', description: '创建空数据集合或者目录',
tags: [TagsMap.datasetCollectionCrteate, ApiKeyTagMap.datasetCollectionCreate], tags: [DevApiTagsMap.datasetCollectionCrteate, SystemOpenApiTagMap.datasetCollectionCreate],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -46,7 +46,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -46,7 +46,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
post: { post: {
summary: '重新训练集合', summary: '重新训练集合',
description: '删除原集合并以新参数重新创建并训练,适用于调整分块策略后的重处理场景', description: '删除原集合并以新参数重新创建并训练,适用于调整分块策略后的重处理场景',
tags: [TagsMap.datasetCollectionCrteate], tags: [DevApiTagsMap.datasetCollectionCrteate],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -69,7 +69,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -69,7 +69,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
post: { post: {
summary: '通过文件 ID 创建集合', summary: '通过文件 ID 创建集合',
description: '使用已上传至 S3 的文件对象键创建集合并触发训练', description: '使用已上传至 S3 的文件对象键创建集合并触发训练',
tags: [TagsMap.datasetCollectionCrteate], tags: [DevApiTagsMap.datasetCollectionCrteate],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -93,7 +93,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -93,7 +93,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
summary: '上传本地文件创建集合', summary: '上传本地文件创建集合',
description: description:
'通过 multipart/form-data 上传文件,自动存储至 S3 后创建集合并触发训练。`file` 字段为二进制文件,`data` 字段为 JSON 序列化的集合参数对象', '通过 multipart/form-data 上传文件,自动存储至 S3 后创建集合并触发训练。`file` 字段为二进制文件,`data` 字段为 JSON 序列化的集合参数对象',
tags: [TagsMap.datasetCollectionCrteate, ApiKeyTagMap.datasetCollectionCreate], tags: [DevApiTagsMap.datasetCollectionCrteate, SystemOpenApiTagMap.datasetCollectionCreate],
requestBody: { requestBody: {
content: { content: {
'multipart/form-data': { 'multipart/form-data': {
...@@ -119,7 +119,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -119,7 +119,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
post: { post: {
summary: '通过链接创建集合', summary: '通过链接创建集合',
description: '抓取指定 URL 内容创建集合并触发训练', description: '抓取指定 URL 内容创建集合并触发训练',
tags: [TagsMap.datasetCollectionCrteate, ApiKeyTagMap.datasetCollectionCreate], tags: [DevApiTagsMap.datasetCollectionCrteate, SystemOpenApiTagMap.datasetCollectionCreate],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -142,7 +142,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -142,7 +142,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
post: { post: {
summary: '通过文本创建集合', summary: '通过文本创建集合',
description: '将文本内容存储为文件后创建集合并触发训练', description: '将文本内容存储为文件后创建集合并触发训练',
tags: [TagsMap.datasetCollectionCrteate, ApiKeyTagMap.datasetCollectionCreate], tags: [DevApiTagsMap.datasetCollectionCrteate, SystemOpenApiTagMap.datasetCollectionCreate],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -166,7 +166,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -166,7 +166,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
summary: '通过 API 数据集创建集合(V1)', summary: '通过 API 数据集创建集合(V1)',
description: '根据 apiFileId 从第三方 API 数据源拉取单个文件并创建集合', description: '根据 apiFileId 从第三方 API 数据源拉取单个文件并创建集合',
deprecated: true, deprecated: true,
tags: [TagsMap.datasetCollectionCrteate, ApiKeyTagMap.datasetCollectionCreate], tags: [DevApiTagsMap.datasetCollectionCrteate, SystemOpenApiTagMap.datasetCollectionCreate],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -189,7 +189,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -189,7 +189,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
post: { post: {
summary: '通过 API 数据集批量创建集合(V2)', summary: '通过 API 数据集批量创建集合(V2)',
description: '支持传入文件列表或选择根目录,递归拉取 API 数据源文件并批量创建集合', description: '支持传入文件列表或选择根目录,递归拉取 API 数据源文件并批量创建集合',
tags: [TagsMap.datasetCollectionCrteate], tags: [DevApiTagsMap.datasetCollectionCrteate],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -213,7 +213,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -213,7 +213,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
summary: '上传图片集创建集合', summary: '上传图片集创建集合',
description: description:
'通过 multipart/form-data 批量上传图片,使用 VLM 模型解析后创建集合。`file` 为多个图片文件(多选),`data` 为 JSON 序列化的集合参数对象', '通过 multipart/form-data 批量上传图片,使用 VLM 模型解析后创建集合。`file` 为多个图片文件(多选),`data` 为 JSON 序列化的集合参数对象',
tags: [TagsMap.datasetCollectionCrteate], tags: [DevApiTagsMap.datasetCollectionCrteate],
requestBody: { requestBody: {
content: { content: {
'multipart/form-data': { 'multipart/form-data': {
...@@ -240,7 +240,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -240,7 +240,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
summary: '导入备份 CSV 创建集合', summary: '导入备份 CSV 创建集合',
description: description:
'上传格式为 q,a,indexes 的 CSV 备份文件,恢复数据到知识库集合。`file` 为 CSV 文件,`data` 为 JSON 序列化的集合参数对象', '上传格式为 q,a,indexes 的 CSV 备份文件,恢复数据到知识库集合。`file` 为 CSV 文件,`data` 为 JSON 序列化的集合参数对象',
tags: [TagsMap.datasetCollectionCrteate], tags: [DevApiTagsMap.datasetCollectionCrteate],
requestBody: { requestBody: {
content: { content: {
'multipart/form-data': { 'multipart/form-data': {
...@@ -267,7 +267,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = { ...@@ -267,7 +267,7 @@ export const DatasetCollectionCreatePath: OpenAPIPath = {
summary: '导入模板 CSV 创建集合', summary: '导入模板 CSV 创建集合',
description: description:
'上传格式为 q,a,indexes 的 CSV 模板文件,批量导入数据到知识库集合。`file` 为 CSV 文件,`data` 为 JSON 序列化的集合参数对象', '上传格式为 q,a,indexes 的 CSV 模板文件,批量导入数据到知识库集合。`file` 为 CSV 文件,`data` 为 JSON 序列化的集合参数对象',
tags: [TagsMap.datasetCollectionCrteate], tags: [DevApiTagsMap.datasetCollectionCrteate],
requestBody: { requestBody: {
content: { content: {
'multipart/form-data': { 'multipart/form-data': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { ApiKeyTagMap } from '../../../apikey/tag'; import { SystemOpenApiTagMap } from '../../../tag';
import { import {
DeleteCollectionBodySchema, DeleteCollectionBodySchema,
DeleteCollectionQuerySchema, DeleteCollectionQuerySchema,
...@@ -23,7 +23,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -23,7 +23,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
delete: { delete: {
summary: '删除集合', summary: '删除集合',
description: '删除一个或多个集合及其子集合,支持通过 query.id 或 body.collectionIds 指定', description: '删除一个或多个集合及其子集合,支持通过 query.id 或 body.collectionIds 指定',
tags: [TagsMap.datasetCollection, ApiKeyTagMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection, SystemOpenApiTagMap.datasetCollection],
requestParams: { requestParams: {
query: DeleteCollectionQuerySchema query: DeleteCollectionQuerySchema
}, },
...@@ -45,7 +45,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -45,7 +45,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
get: { get: {
summary: '获取集合详情', summary: '获取集合详情',
description: '获取集合详细信息,包括索引数量、错误数量、文件信息等', description: '获取集合详细信息,包括索引数量、错误数量、文件信息等',
tags: [TagsMap.datasetCollection, ApiKeyTagMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection, SystemOpenApiTagMap.datasetCollection],
requestParams: { requestParams: {
query: GetCollectionDetailQuerySchema query: GetCollectionDetailQuerySchema
}, },
...@@ -60,7 +60,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -60,7 +60,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
post: { post: {
summary: '获取集合列表(分页)', summary: '获取集合列表(分页)',
description: '获取数据集集合列表,支持分页、搜索、标签过滤', description: '获取数据集集合列表,支持分页、搜索、标签过滤',
tags: [TagsMap.datasetCollection, ApiKeyTagMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection, SystemOpenApiTagMap.datasetCollection],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -80,7 +80,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -80,7 +80,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
summary: '获取数据集集合列表(滚动分页)', summary: '获取数据集集合列表(滚动分页)',
description: '已废弃:获取数据集集合列表(滚动分页)。请改用 /core/dataset/collection/listV2', description: '已废弃:获取数据集集合列表(滚动分页)。请改用 /core/dataset/collection/listV2',
deprecated: true, deprecated: true,
tags: [TagsMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -99,7 +99,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -99,7 +99,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
post: { post: {
summary: '更新数据集集合信息', summary: '更新数据集集合信息',
description: '更新数据集集合信息,支持通过集合ID或数据集ID+外部文件ID定位集合', description: '更新数据集集合信息,支持通过集合ID或数据集ID+外部文件ID定位集合',
tags: [TagsMap.datasetCollection, ApiKeyTagMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection, SystemOpenApiTagMap.datasetCollection],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -118,7 +118,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -118,7 +118,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
get: { get: {
summary: '获取集合面包屑路径', summary: '获取集合面包屑路径',
description: '从指定集合向上递归获取父级路径链,用于面包屑导航', description: '从指定集合向上递归获取父级路径链,用于面包屑导航',
tags: [TagsMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection],
requestParams: { requestParams: {
query: GetCollectionPathsQuerySchema query: GetCollectionPathsQuerySchema
}, },
...@@ -133,7 +133,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -133,7 +133,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
post: { post: {
summary: '获取集合资源 URL', summary: '获取集合资源 URL',
description: '获取集合原始文件的访问 URL,支持直接鉴权和对话中鉴权两种模式', description: '获取集合原始文件的访问 URL,支持直接鉴权和对话中鉴权两种模式',
tags: [TagsMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -152,7 +152,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -152,7 +152,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
post: { post: {
summary: '同步集合', summary: '同步集合',
description: '重新拉取集合原始内容并更新数据,支持链接类型和 API 数据集类型', description: '重新拉取集合原始内容并更新数据,支持链接类型和 API 数据集类型',
tags: [TagsMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -171,7 +171,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -171,7 +171,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
post: { post: {
summary: '下载集合的所有数据块', summary: '下载集合的所有数据块',
description: '下载集合的所有数据块', description: '下载集合的所有数据块',
tags: [TagsMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -190,7 +190,7 @@ export const DatasetCollectionPath: OpenAPIPath = { ...@@ -190,7 +190,7 @@ export const DatasetCollectionPath: OpenAPIPath = {
get: { get: {
summary: '获取集合训练详情', summary: '获取集合训练详情',
description: '获取集合的训练状态,包括排队中、训练中、错误数量及已完成的数据量', description: '获取集合的训练状态,包括排队中、训练中、错误数量及已完成的数据量',
tags: [TagsMap.datasetCollection], tags: [DevApiTagsMap.datasetCollection],
requestParams: { requestParams: {
query: GetCollectionTrainingDetailQuerySchema query: GetCollectionTrainingDetailQuerySchema
}, },
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { ApiKeyTagMap } from '../../../apikey/tag'; import { SystemOpenApiTagMap } from '../../../tag';
import { import {
GetDatasetDataDetailQuerySchema, GetDatasetDataDetailQuerySchema,
UpdateDatasetDataBodySchema, UpdateDatasetDataBodySchema,
...@@ -26,7 +26,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -26,7 +26,7 @@ export const DatasetDataPath: OpenAPIPath = {
post: { post: {
summary: '获取数据列表', summary: '获取数据列表',
description: '分页查询集合内的数据列表,支持关键词搜索,包含图片预览 URL', description: '分页查询集合内的数据列表,支持关键词搜索,包含图片预览 URL',
tags: [TagsMap.datasetData, ApiKeyTagMap.datasetData], tags: [DevApiTagsMap.datasetData, SystemOpenApiTagMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -50,7 +50,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -50,7 +50,7 @@ export const DatasetDataPath: OpenAPIPath = {
get: { get: {
summary: '获取数据详情', summary: '获取数据详情',
description: '获取单条数据集数据的详细信息,包括向量索引', description: '获取单条数据集数据的详细信息,包括向量索引',
tags: [TagsMap.datasetData, ApiKeyTagMap.datasetData], tags: [DevApiTagsMap.datasetData, SystemOpenApiTagMap.datasetData],
requestParams: { requestParams: {
query: GetDatasetDataDetailQuerySchema query: GetDatasetDataDetailQuerySchema
}, },
...@@ -71,7 +71,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -71,7 +71,7 @@ export const DatasetDataPath: OpenAPIPath = {
put: { put: {
summary: '更新数据', summary: '更新数据',
description: '更新数据集数据的 q、a 和向量索引,触发重新向量化', description: '更新数据集数据的 q、a 和向量索引,触发重新向量化',
tags: [TagsMap.datasetData, ApiKeyTagMap.datasetData], tags: [DevApiTagsMap.datasetData, SystemOpenApiTagMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -96,7 +96,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -96,7 +96,7 @@ export const DatasetDataPath: OpenAPIPath = {
post: { post: {
summary: '新增数据索引', summary: '新增数据索引',
description: '新增指定数据下的单个自定义索引,不覆盖其它索引', description: '新增指定数据下的单个自定义索引,不覆盖其它索引',
tags: [TagsMap.datasetData], tags: [DevApiTagsMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -121,7 +121,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -121,7 +121,7 @@ export const DatasetDataPath: OpenAPIPath = {
post: { post: {
summary: '更新数据索引', summary: '更新数据索引',
description: '更新指定数据下的单个自定义索引,不覆盖其它索引', description: '更新指定数据下的单个自定义索引,不覆盖其它索引',
tags: [TagsMap.datasetData], tags: [DevApiTagsMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -146,7 +146,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -146,7 +146,7 @@ export const DatasetDataPath: OpenAPIPath = {
post: { post: {
summary: '删除数据索引', summary: '删除数据索引',
description: '删除指定数据下的单个索引,不触发整条数据重建', description: '删除指定数据下的单个索引,不触发整条数据重建',
tags: [TagsMap.datasetData], tags: [DevApiTagsMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -171,7 +171,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -171,7 +171,7 @@ export const DatasetDataPath: OpenAPIPath = {
delete: { delete: {
summary: '删除数据', summary: '删除数据',
description: '删除指定数据集数据,需要写权限', description: '删除指定数据集数据,需要写权限',
tags: [TagsMap.datasetData, ApiKeyTagMap.datasetData], tags: [DevApiTagsMap.datasetData, SystemOpenApiTagMap.datasetData],
requestParams: { requestParams: {
query: DeleteDatasetDataQuerySchema query: DeleteDatasetDataQuerySchema
}, },
...@@ -192,7 +192,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -192,7 +192,7 @@ export const DatasetDataPath: OpenAPIPath = {
post: { post: {
summary: '获取引用数据', summary: '获取引用数据',
description: '获取数据详情用于展示引用,支持直接访问或通过对话鉴权', description: '获取数据详情用于展示引用,支持直接访问或通过对话鉴权',
tags: [TagsMap.datasetData], tags: [DevApiTagsMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -211,7 +211,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -211,7 +211,7 @@ export const DatasetDataPath: OpenAPIPath = {
post: { post: {
summary: '插入单条数据', summary: '插入单条数据',
description: '立即插入一条数据到数据集并生成向量索引', description: '立即插入一条数据到数据集并生成向量索引',
tags: [TagsMap.datasetData], tags: [DevApiTagsMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -230,7 +230,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -230,7 +230,7 @@ export const DatasetDataPath: OpenAPIPath = {
post: { post: {
summary: '插入图片', summary: '插入图片',
description: '上传图片文件并推送到训练队列(multipart/form-data)', description: '上传图片文件并推送到训练队列(multipart/form-data)',
tags: [TagsMap.datasetData], tags: [DevApiTagsMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'multipart/form-data': { 'multipart/form-data': {
...@@ -249,7 +249,7 @@ export const DatasetDataPath: OpenAPIPath = { ...@@ -249,7 +249,7 @@ export const DatasetDataPath: OpenAPIPath = {
post: { post: {
summary: '推送数据到训练队列', summary: '推送数据到训练队列',
description: '批量推送数据到训练队列,最多 200 条', description: '批量推送数据到训练队列,最多 200 条',
tags: [TagsMap.datasetData, ApiKeyTagMap.datasetData], tags: [DevApiTagsMap.datasetData, SystemOpenApiTagMap.datasetData],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
GetSearchTestImagePreviewUrlsBodySchema, GetSearchTestImagePreviewUrlsBodySchema,
GetSearchTestImagePreviewUrlsResponseSchema, GetSearchTestImagePreviewUrlsResponseSchema,
...@@ -16,7 +16,7 @@ export const DatasetFilePath: OpenAPIPath = { ...@@ -16,7 +16,7 @@ export const DatasetFilePath: OpenAPIPath = {
post: { post: {
summary: '预览文件分块', summary: '预览文件分块',
description: '读取数据源并按给定分块参数预览生成的前 10 个分块,用于导入前校验', description: '读取数据源并按给定分块参数预览生成的前 10 个分块,用于导入前校验',
tags: [TagsMap.datasetFile], tags: [DevApiTagsMap.datasetFile],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -40,7 +40,7 @@ export const DatasetFilePath: OpenAPIPath = { ...@@ -40,7 +40,7 @@ export const DatasetFilePath: OpenAPIPath = {
post: { post: {
summary: '获取知识库文件上传预签名 URL', summary: '获取知识库文件上传预签名 URL',
description: '为指定知识库生成 S3 上传预签名 URL,同时校验写权限并对上传频率进行限制', description: '为指定知识库生成 S3 上传预签名 URL,同时校验写权限并对上传频率进行限制',
tags: [TagsMap.datasetFile], tags: [DevApiTagsMap.datasetFile],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -64,7 +64,7 @@ export const DatasetFilePath: OpenAPIPath = { ...@@ -64,7 +64,7 @@ export const DatasetFilePath: OpenAPIPath = {
post: { post: {
summary: '获取搜索测试图片上传预签名 URL', summary: '获取搜索测试图片上传预签名 URL',
description: '获取搜索测试图片上传预签名 URL,仅支持图片文件,上传对象 3 小时后过期', description: '获取搜索测试图片上传预签名 URL,仅支持图片文件,上传对象 3 小时后过期',
tags: [TagsMap.datasetFile], tags: [DevApiTagsMap.datasetFile],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -88,7 +88,7 @@ export const DatasetFilePath: OpenAPIPath = { ...@@ -88,7 +88,7 @@ export const DatasetFilePath: OpenAPIPath = {
post: { post: {
summary: '获取搜索测试图片预览 URL', summary: '获取搜索测试图片预览 URL',
description: '根据搜索测试历史中的临时图片 key 重新生成短期预览 URL', description: '根据搜索测试历史中的临时图片 key 重新生成短期预览 URL',
tags: [TagsMap.datasetFile], tags: [DevApiTagsMap.datasetFile],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../type'; import type { OpenAPIPath } from '../../type';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
import { ApiKeyTagMap } from '../../apikey/tag'; import { SystemOpenApiTagMap } from '../../tag';
import { DatasetDataPath } from './data'; import { DatasetDataPath } from './data';
import { DatasetCollectionPath } from './collection'; import { DatasetCollectionPath } from './collection';
import { ApiDatasetPath } from './apiDataset'; import { ApiDatasetPath } from './apiDataset';
...@@ -26,7 +26,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -26,7 +26,7 @@ export const DatasetPath: OpenAPIPath = {
post: { post: {
summary: '创建知识库', summary: '创建知识库',
description: '创建新的知识库,支持多种类型(普通知识库、文件夹、网站知识库等)', description: '创建新的知识库,支持多种类型(普通知识库、文件夹、网站知识库等)',
tags: [TagsMap.datasetCommon, ApiKeyTagMap.dataset], tags: [DevApiTagsMap.datasetCommon, SystemOpenApiTagMap.dataset],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -45,7 +45,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -45,7 +45,7 @@ export const DatasetPath: OpenAPIPath = {
post: { post: {
summary: '创建知识库并上传文件', summary: '创建知识库并上传文件',
description: '一步完成知识库创建和文件上传,自动创建集合并开始数据处理', description: '一步完成知识库创建和文件上传,自动创建集合并开始数据处理',
tags: [TagsMap.datasetCommon], tags: [DevApiTagsMap.datasetCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -64,7 +64,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -64,7 +64,7 @@ export const DatasetPath: OpenAPIPath = {
post: { post: {
summary: '创建知识库文件夹', summary: '创建知识库文件夹',
description: '创建知识库文件夹,用于组织和管理知识库', description: '创建知识库文件夹,用于组织和管理知识库',
tags: [TagsMap.datasetCommon], tags: [DevApiTagsMap.datasetCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -83,7 +83,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -83,7 +83,7 @@ export const DatasetPath: OpenAPIPath = {
post: { post: {
summary: '获取知识库列表', summary: '获取知识库列表',
description: '获取当前用户有权限访问的知识库列表,支持按类型和关键词筛选', description: '获取当前用户有权限访问的知识库列表,支持按类型和关键词筛选',
tags: [TagsMap.datasetCommon, ApiKeyTagMap.dataset], tags: [DevApiTagsMap.datasetCommon, SystemOpenApiTagMap.dataset],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -102,7 +102,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -102,7 +102,7 @@ export const DatasetPath: OpenAPIPath = {
get: { get: {
summary: '获取知识库路径', summary: '获取知识库路径',
description: '获取知识库的父级路径链,用于面包屑导航', description: '获取知识库的父级路径链,用于面包屑导航',
tags: [TagsMap.datasetCommon], tags: [DevApiTagsMap.datasetCommon],
requestParams: { requestParams: {
query: GetDatasetPathsQuerySchema query: GetDatasetPathsQuerySchema
}, },
...@@ -117,7 +117,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -117,7 +117,7 @@ export const DatasetPath: OpenAPIPath = {
get: { get: {
summary: '获取知识库详情', summary: '获取知识库详情',
description: '获取知识库详细信息,包括模型配置、权限和同步状态', description: '获取知识库详细信息,包括模型配置、权限和同步状态',
tags: [TagsMap.datasetCommon, ApiKeyTagMap.dataset], tags: [DevApiTagsMap.datasetCommon, SystemOpenApiTagMap.dataset],
requestParams: { requestParams: {
query: GetDatasetDetailQuerySchema query: GetDatasetDetailQuerySchema
}, },
...@@ -132,7 +132,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -132,7 +132,7 @@ export const DatasetPath: OpenAPIPath = {
delete: { delete: {
summary: '删除知识库', summary: '删除知识库',
description: '删除知识库及其所有子知识库,需要所有者权限', description: '删除知识库及其所有子知识库,需要所有者权限',
tags: [TagsMap.datasetCommon, ApiKeyTagMap.dataset], tags: [DevApiTagsMap.datasetCommon, SystemOpenApiTagMap.dataset],
requestParams: { requestParams: {
query: DeleteDatasetQuerySchema query: DeleteDatasetQuerySchema
}, },
...@@ -147,7 +147,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -147,7 +147,7 @@ export const DatasetPath: OpenAPIPath = {
put: { put: {
summary: '更新知识库', summary: '更新知识库',
description: '更新知识库信息、配置或移动知识库到其他目录', description: '更新知识库信息、配置或移动知识库到其他目录',
tags: [TagsMap.datasetCommon], tags: [DevApiTagsMap.datasetCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -166,7 +166,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -166,7 +166,7 @@ export const DatasetPath: OpenAPIPath = {
put: { put: {
summary: '恢复知识库继承权限', summary: '恢复知识库继承权限',
description: '恢复知识库的继承权限,使其权限与父级保持一致', description: '恢复知识库的继承权限,使其权限与父级保持一致',
tags: [TagsMap.datasetCommon], tags: [DevApiTagsMap.datasetCommon],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -186,7 +186,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -186,7 +186,7 @@ export const DatasetPath: OpenAPIPath = {
summary: '搜索测试', summary: '搜索测试',
description: description:
'对知识库执行搜索测试,支持多种搜索模式、重排序、问题扩展和临时图片 key 检索。图片检索需先调用 /core/dataset/file/presignSearchTestImage 获取预签名上传 URL 和 temp/${teamId}/... key', '对知识库执行搜索测试,支持多种搜索模式、重排序、问题扩展和临时图片 key 检索。图片检索需先调用 /core/dataset/file/presignSearchTestImage 获取预签名上传 URL 和 temp/${teamId}/... key',
tags: [TagsMap.datasetCommon, ApiKeyTagMap.datasetOther], tags: [DevApiTagsMap.datasetCommon, SystemOpenApiTagMap.datasetOther],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -205,7 +205,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -205,7 +205,7 @@ export const DatasetPath: OpenAPIPath = {
get: { get: {
summary: '导出知识库全部数据', summary: '导出知识库全部数据',
description: '以流式 CSV 格式导出知识库及其所有子知识库的数据', description: '以流式 CSV 格式导出知识库及其所有子知识库的数据',
tags: [TagsMap.datasetCommon], tags: [DevApiTagsMap.datasetCommon],
requestParams: { requestParams: {
query: ExportDatasetQuerySchema query: ExportDatasetQuerySchema
}, },
...@@ -220,7 +220,7 @@ export const DatasetPath: OpenAPIPath = { ...@@ -220,7 +220,7 @@ export const DatasetPath: OpenAPIPath = {
get: { get: {
summary: '获取知识库引用权限', summary: '获取知识库引用权限',
description: '获取当前用户对指定知识库的读写权限,鉴权失败时返回无权限结果而非报错', description: '获取当前用户对指定知识库的读写权限,鉴权失败时返回无权限结果而非报错',
tags: [TagsMap.datasetCommon], tags: [DevApiTagsMap.datasetCommon],
requestParams: { requestParams: {
query: GetDatasetPermissionQuerySchema query: GetDatasetPermissionQuerySchema
}, },
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
UpdateTrainingDataBodySchema, UpdateTrainingDataBodySchema,
RebuildEmbeddingBodySchema, RebuildEmbeddingBodySchema,
...@@ -17,7 +17,7 @@ export const DatasetTrainingPath: OpenAPIPath = { ...@@ -17,7 +17,7 @@ export const DatasetTrainingPath: OpenAPIPath = {
summary: '更新训练数据或重试训练异常', summary: '更新训练数据或重试训练异常',
description: description:
'更新或重试训练异常:传 dataId 时重试或编辑后重训单个 chunk;不传 dataId 时,可按 collectionId 或 datasetId 重试全部最终/阻塞异常', '更新或重试训练异常:传 dataId 时重试或编辑后重训单个 chunk;不传 dataId 时,可按 collectionId 或 datasetId 重试全部最终/阻塞异常',
tags: [TagsMap.datasetTraining], tags: [DevApiTagsMap.datasetTraining],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -37,7 +37,7 @@ export const DatasetTrainingPath: OpenAPIPath = { ...@@ -37,7 +37,7 @@ export const DatasetTrainingPath: OpenAPIPath = {
post: { post: {
summary: '重建数据集向量索引', summary: '重建数据集向量索引',
description: '切换向量模型并重建知识库所有数据的向量索引,需要所有者权限', description: '切换向量模型并重建知识库所有数据的向量索引,需要所有者权限',
tags: [TagsMap.datasetTraining], tags: [DevApiTagsMap.datasetTraining],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -57,7 +57,7 @@ export const DatasetTrainingPath: OpenAPIPath = { ...@@ -57,7 +57,7 @@ export const DatasetTrainingPath: OpenAPIPath = {
post: { post: {
summary: '删除训练数据', summary: '删除训练数据',
description: '删除指定的训练数据条目,需要管理权限', description: '删除指定的训练数据条目,需要管理权限',
tags: [TagsMap.datasetTraining], tags: [DevApiTagsMap.datasetTraining],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -77,7 +77,7 @@ export const DatasetTrainingPath: OpenAPIPath = { ...@@ -77,7 +77,7 @@ export const DatasetTrainingPath: OpenAPIPath = {
post: { post: {
summary: '获取训练数据详情', summary: '获取训练数据详情',
description: '获取单条训练数据的详细信息,包括图片预览 URL', description: '获取单条训练数据的详细信息,包括图片预览 URL',
tags: [TagsMap.datasetTraining], tags: [DevApiTagsMap.datasetTraining],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -97,7 +97,7 @@ export const DatasetTrainingPath: OpenAPIPath = { ...@@ -97,7 +97,7 @@ export const DatasetTrainingPath: OpenAPIPath = {
post: { post: {
summary: '获取集合训练错误列表', summary: '获取集合训练错误列表',
description: '分页查询集合内最终/阻塞异常训练记录', description: '分页查询集合内最终/阻塞异常训练记录',
tags: [TagsMap.datasetTraining], tags: [DevApiTagsMap.datasetTraining],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -118,7 +118,7 @@ export const DatasetTrainingPath: OpenAPIPath = { ...@@ -118,7 +118,7 @@ export const DatasetTrainingPath: OpenAPIPath = {
summary: '获取知识库训练错误列表', summary: '获取知识库训练错误列表',
description: description:
'分页查询知识库内存在最终/阻塞异常的集合,并返回每个集合内的部分异常 chunk;传 collectionId 时加载该集合更多异常 chunk', '分页查询知识库内存在最终/阻塞异常的集合,并返回每个集合内的部分异常 chunk;传 collectionId 时加载该集合更多异常 chunk',
tags: [TagsMap.datasetTraining], tags: [DevApiTagsMap.datasetTraining],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -138,7 +138,7 @@ export const DatasetTrainingPath: OpenAPIPath = { ...@@ -138,7 +138,7 @@ export const DatasetTrainingPath: OpenAPIPath = {
get: { get: {
summary: '检查知识库是否存在训练错误', summary: '检查知识库是否存在训练错误',
description: '轻量检查知识库内是否存在最终/阻塞异常训练记录,用于列表徽章状态探测', description: '轻量检查知识库内是否存在最终/阻塞异常训练记录,用于列表徽章状态探测',
tags: [TagsMap.datasetTraining], tags: [DevApiTagsMap.datasetTraining],
requestParams: { requestParams: {
query: HasDatasetTrainingErrorQuerySchema query: HasDatasetTrainingErrorQuerySchema
}, },
...@@ -154,7 +154,7 @@ export const DatasetTrainingPath: OpenAPIPath = { ...@@ -154,7 +154,7 @@ export const DatasetTrainingPath: OpenAPIPath = {
get: { get: {
summary: '获取训练队列状态', summary: '获取训练队列状态',
description: '获取知识库当前的重建数量和训练队列数量', description: '获取知识库当前的重建数量和训练队列数量',
tags: [TagsMap.datasetTraining], tags: [DevApiTagsMap.datasetTraining],
requestParams: { requestParams: {
query: GetDatasetTrainingQueueQuerySchema query: GetDatasetTrainingQueueQuerySchema
}, },
......
...@@ -5,7 +5,7 @@ import { ...@@ -5,7 +5,7 @@ import {
UploadPkgPluginBodySchema, UploadPkgPluginBodySchema,
UploadPkgPluginResponseSchema UploadPkgPluginResponseSchema
} from './api'; } from './api';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import z from 'zod'; import z from 'zod';
import { AdminPluginToolPath } from './tool'; import { AdminPluginToolPath } from './tool';
...@@ -16,7 +16,7 @@ export const PluginAdminPath: OpenAPIPath = { ...@@ -16,7 +16,7 @@ export const PluginAdminPath: OpenAPIPath = {
post: { post: {
summary: '批量上传系统插件包', summary: '批量上传系统插件包',
description: '上传 .pkg 文件或包含多个 .pkg 的 .zip 文件,需要系统管理员权限', description: '上传 .pkg 文件或包含多个 .pkg 的 .zip 文件,需要系统管理员权限',
tags: [TagsMap.pluginAdmin], tags: [DevApiTagsMap.pluginAdmin],
requestBody: { requestBody: {
required: true, required: true,
content: { content: {
...@@ -42,7 +42,7 @@ export const PluginAdminPath: OpenAPIPath = { ...@@ -42,7 +42,7 @@ export const PluginAdminPath: OpenAPIPath = {
post: { post: {
summary: '从URL安装插件', summary: '从URL安装插件',
description: '从URL安装插件,需要系统管理员权限', description: '从URL安装插件,需要系统管理员权限',
tags: [TagsMap.pluginAdmin], tags: [DevApiTagsMap.pluginAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
...@@ -17,7 +17,7 @@ import { ...@@ -17,7 +17,7 @@ import {
UpdateToolRuntimeConfigBodySchema, UpdateToolRuntimeConfigBodySchema,
UpdateWorkflowToolBodySchema UpdateWorkflowToolBodySchema
} from './api'; } from './api';
import { TagsMap } from '../../../../tag'; import { DevApiTagsMap } from '../../../../tag';
import { z } from 'zod'; import { z } from 'zod';
import { AdminSystemToolDetailSchema } from '../../../../../core/app/tool/systemTool/type'; import { AdminSystemToolDetailSchema } from '../../../../../core/app/tool/systemTool/type';
import { SystemToolTagPath } from './tag'; import { SystemToolTagPath } from './tag';
...@@ -27,7 +27,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -27,7 +27,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
get: { get: {
summary: '获取系统工具列表', summary: '获取系统工具列表',
description: '获取系统工具列表,需要系统管理员权限', description: '获取系统工具列表,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestParams: { requestParams: {
query: GetAdminSystemToolsQuery query: GetAdminSystemToolsQuery
}, },
...@@ -47,7 +47,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -47,7 +47,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
get: { get: {
summary: '获取系统工具详情', summary: '获取系统工具详情',
description: '获取系统工具详情,需要系统管理员权限', description: '获取系统工具详情,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestParams: { requestParams: {
query: GetAdminSystemToolDetailQuerySchema query: GetAdminSystemToolDetailQuerySchema
}, },
...@@ -67,7 +67,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -67,7 +67,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
get: { get: {
summary: '获取系统工具版本列表', summary: '获取系统工具版本列表',
description: '获取系统工具版本列表,需要系统管理员权限', description: '获取系统工具版本列表,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestParams: { requestParams: {
query: GetAdminSystemToolVersionsQuerySchema query: GetAdminSystemToolVersionsQuerySchema
}, },
...@@ -88,7 +88,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -88,7 +88,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
summary: '更新系统工具', summary: '更新系统工具',
description: description:
'更新系统工具配置,包括基础字段和自定义字段,支持递归更新子配置,需要系统管理员权限', '更新系统工具配置,包括基础字段和自定义字段,支持递归更新子配置,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -112,7 +112,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -112,7 +112,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
put: { put: {
summary: '更新系统工具顺序', summary: '更新系统工具顺序',
description: '批量更新系统工具的排序顺序,需要系统管理员权限', description: '批量更新系统工具的排序顺序,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -136,7 +136,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -136,7 +136,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
put: { put: {
summary: '更新工具运行时配置', summary: '更新工具运行时配置',
description: '更新插件服务中的工具运行时配置,需要系统管理员权限', description: '更新插件服务中的工具运行时配置,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -160,7 +160,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -160,7 +160,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
get: { get: {
summary: '获取工具运行时配置', summary: '获取工具运行时配置',
description: '获取插件服务中的工具运行时配置,需要系统管理员权限', description: '获取插件服务中的工具运行时配置,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestParams: { requestParams: {
query: GetToolRuntimeConfigQuerySchema query: GetToolRuntimeConfigQuerySchema
}, },
...@@ -180,7 +180,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -180,7 +180,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
post: { post: {
summary: '重置工具运行时配置', summary: '重置工具运行时配置',
description: '将工具运行时配置重置为插件服务默认值,需要系统管理员权限', description: '将工具运行时配置重置为插件服务默认值,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -204,7 +204,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -204,7 +204,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
delete: { delete: {
summary: '删除系统工具', summary: '删除系统工具',
description: '根据ID删除系统工具,需要系统管理员权限', description: '根据ID删除系统工具,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestParams: { requestParams: {
query: DeleteSystemToolQuerySchema query: DeleteSystemToolQuerySchema
}, },
...@@ -225,7 +225,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -225,7 +225,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
post: { post: {
summary: '获取所有系统工具类型应用', summary: '获取所有系统工具类型应用',
description: '获取所有系统工具类型应用,用于选择系统上的应用作为系统工具。需要系统管理员权限', description: '获取所有系统工具类型应用,用于选择系统上的应用作为系统工具。需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -249,7 +249,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -249,7 +249,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
post: { post: {
summary: '将系统应用设置成系统工具', summary: '将系统应用设置成系统工具',
description: '将系统应用设置成系统工具,需要系统管理员权限', description: '将系统应用设置成系统工具,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -273,7 +273,7 @@ export const AdminPluginToolPath: OpenAPIPath = { ...@@ -273,7 +273,7 @@ export const AdminPluginToolPath: OpenAPIPath = {
put: { put: {
summary: '更新工作流工具', summary: '更新工作流工具',
description: '更新工作流工具配置,需要系统管理员权限', description: '更新工作流工具配置,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../../../type'; import type { OpenAPIPath } from '../../../../../type';
import { TagsMap } from '../../../../../tag'; import { DevApiTagsMap } from '../../../../../tag';
import z from 'zod'; import z from 'zod';
import { import {
CreatePluginToolTagBodySchema, CreatePluginToolTagBodySchema,
...@@ -13,7 +13,7 @@ export const SystemToolTagPath: OpenAPIPath = { ...@@ -13,7 +13,7 @@ export const SystemToolTagPath: OpenAPIPath = {
post: { post: {
summary: '创建工具标签', summary: '创建工具标签',
description: '创建新的工具标签,需要系统管理员权限', description: '创建新的工具标签,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -37,7 +37,7 @@ export const SystemToolTagPath: OpenAPIPath = { ...@@ -37,7 +37,7 @@ export const SystemToolTagPath: OpenAPIPath = {
delete: { delete: {
summary: '删除工具标签', summary: '删除工具标签',
description: '根据标签ID删除工具标签,需要系统管理员权限', description: '根据标签ID删除工具标签,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestParams: { requestParams: {
query: DeletePluginToolTagQuerySchema query: DeletePluginToolTagQuerySchema
}, },
...@@ -57,7 +57,7 @@ export const SystemToolTagPath: OpenAPIPath = { ...@@ -57,7 +57,7 @@ export const SystemToolTagPath: OpenAPIPath = {
put: { put: {
summary: '更新工具标签', summary: '更新工具标签',
description: '更新工具标签的名称,需要系统管理员权限', description: '更新工具标签的名称,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -81,7 +81,7 @@ export const SystemToolTagPath: OpenAPIPath = { ...@@ -81,7 +81,7 @@ export const SystemToolTagPath: OpenAPIPath = {
put: { put: {
summary: '更新工具标签顺序', summary: '更新工具标签顺序',
description: '批量更新工具标签的排序顺序,需要系统管理员权限', description: '批量更新工具标签的排序顺序,需要系统管理员权限',
tags: [TagsMap.pluginToolAdmin], tags: [DevApiTagsMap.pluginToolAdmin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
...@@ -12,13 +12,13 @@ import { ...@@ -12,13 +12,13 @@ import {
GetMarketplaceToolVersionsQuerySchema, GetMarketplaceToolVersionsQuerySchema,
GetMarketplaceToolVersionsResponseSchema GetMarketplaceToolVersionsResponseSchema
} from './api'; } from './api';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
export const MarketplacePath: OpenAPIPath = { export const MarketplacePath: OpenAPIPath = {
'/marketplace/api/tool/list': { '/marketplace/api/tool/list': {
get: { get: {
summary: '获取工具列表', summary: '获取工具列表',
tags: [TagsMap.pluginMarketplace], tags: [DevApiTagsMap.pluginMarketplace],
requestParams: { requestParams: {
query: GetMarketplaceToolsBodySchema query: GetMarketplaceToolsBodySchema
}, },
...@@ -37,7 +37,7 @@ export const MarketplacePath: OpenAPIPath = { ...@@ -37,7 +37,7 @@ export const MarketplacePath: OpenAPIPath = {
'/marketplace/api/tool/detail': { '/marketplace/api/tool/detail': {
get: { get: {
summary: '获取单个工具详情', summary: '获取单个工具详情',
tags: [TagsMap.pluginMarketplace], tags: [DevApiTagsMap.pluginMarketplace],
requestParams: { requestParams: {
query: GetMarketplaceToolDetailQuerySchema query: GetMarketplaceToolDetailQuerySchema
}, },
...@@ -56,7 +56,7 @@ export const MarketplacePath: OpenAPIPath = { ...@@ -56,7 +56,7 @@ export const MarketplacePath: OpenAPIPath = {
'/marketplace/api/tool/tags': { '/marketplace/api/tool/tags': {
get: { get: {
summary: '获取工具标签', summary: '获取工具标签',
tags: [TagsMap.pluginMarketplace], tags: [DevApiTagsMap.pluginMarketplace],
responses: { responses: {
200: { 200: {
description: '获取市场工具标签成功', description: '获取市场工具标签成功',
...@@ -72,7 +72,7 @@ export const MarketplacePath: OpenAPIPath = { ...@@ -72,7 +72,7 @@ export const MarketplacePath: OpenAPIPath = {
'/marketplace/api/tool/versions': { '/marketplace/api/tool/versions': {
get: { get: {
summary: '获取工具版本列表', summary: '获取工具版本列表',
tags: [TagsMap.pluginMarketplace], tags: [DevApiTagsMap.pluginMarketplace],
requestParams: { requestParams: {
query: GetMarketplaceToolVersionsQuerySchema query: GetMarketplaceToolVersionsQuerySchema
}, },
...@@ -91,7 +91,7 @@ export const MarketplacePath: OpenAPIPath = { ...@@ -91,7 +91,7 @@ export const MarketplacePath: OpenAPIPath = {
'/marketplace/api/admin/pkg/upload': { '/marketplace/api/admin/pkg/upload': {
post: { post: {
summary: '上传 marketplace 插件 pkg', summary: '上传 marketplace 插件 pkg',
tags: [TagsMap.pluginMarketplace], tags: [DevApiTagsMap.pluginMarketplace],
requestBody: { requestBody: {
description: 'multipart/form-data, file 字段为 .pkg 文件', description: 'multipart/form-data, file 字段为 .pkg 文件',
required: true, required: true,
...@@ -116,7 +116,7 @@ export const MarketplacePath: OpenAPIPath = { ...@@ -116,7 +116,7 @@ export const MarketplacePath: OpenAPIPath = {
'/marketplace/api/admin/pkg/delete': { '/marketplace/api/admin/pkg/delete': {
post: { post: {
summary: '删除 marketplace 插件 pkg', summary: '删除 marketplace 插件 pkg',
tags: [TagsMap.pluginMarketplace], tags: [DevApiTagsMap.pluginMarketplace],
requestBody: { requestBody: {
description: '指定 pluginId、version 与来源删除某个插件版本', description: '指定 pluginId、version 与来源删除某个插件版本',
required: true, required: true,
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { import {
GetTeamPluginListResponseSchema, GetTeamPluginListResponseSchema,
GetTeamToolDetailQuerySchema, GetTeamToolDetailQuerySchema,
...@@ -13,7 +13,7 @@ export const PluginTeamPath: OpenAPIPath = { ...@@ -13,7 +13,7 @@ export const PluginTeamPath: OpenAPIPath = {
get: { get: {
summary: '获取团队插件列表', summary: '获取团队插件列表',
description: '获取团队插件列表', description: '获取团队插件列表',
tags: [TagsMap.pluginTeam], tags: [DevApiTagsMap.pluginTeam],
responses: { responses: {
200: { 200: {
description: '获取团队插件列表成功', description: '获取团队插件列表成功',
...@@ -31,7 +31,7 @@ export const PluginTeamPath: OpenAPIPath = { ...@@ -31,7 +31,7 @@ export const PluginTeamPath: OpenAPIPath = {
get: { get: {
summary: '获取工具卡片详情', summary: '获取工具卡片详情',
description: '获取工具片详情', description: '获取工具片详情',
tags: [TagsMap.pluginTeam], tags: [DevApiTagsMap.pluginTeam],
requestParams: { requestParams: {
query: GetTeamToolDetailQuerySchema query: GetTeamToolDetailQuerySchema
}, },
...@@ -51,7 +51,7 @@ export const PluginTeamPath: OpenAPIPath = { ...@@ -51,7 +51,7 @@ export const PluginTeamPath: OpenAPIPath = {
get: { get: {
summary: '获取团队工具版本列表', summary: '获取团队工具版本列表',
description: '获取团队工具版本列表', description: '获取团队工具版本列表',
tags: [TagsMap.pluginTeam], tags: [DevApiTagsMap.pluginTeam],
requestParams: { requestParams: {
query: GetTeamToolVersionsQuerySchema query: GetTeamToolVersionsQuerySchema
}, },
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { GetPluginToolTagsResponseSchema } from './api'; import { GetPluginToolTagsResponseSchema } from './api';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import z from 'zod'; import z from 'zod';
export const PluginToolTagPath: OpenAPIPath = { export const PluginToolTagPath: OpenAPIPath = {
...@@ -8,7 +8,7 @@ export const PluginToolTagPath: OpenAPIPath = { ...@@ -8,7 +8,7 @@ export const PluginToolTagPath: OpenAPIPath = {
get: { get: {
summary: '获取工具标签列表', summary: '获取工具标签列表',
description: '获取所有工具标签列表,按排序顺序返回', description: '获取所有工具标签列表,按排序顺序返回',
tags: [TagsMap.pluginToolTag], tags: [DevApiTagsMap.pluginToolTag],
responses: { responses: {
200: { 200: {
description: '成功获取工具标签列表', description: '成功获取工具标签列表',
......
import { createDocument } from 'zod-openapi';
import { openAPIPaths, openAPITagGroups } from './path';
import { ApiKeyTagMap } from './apikey/tag';
const openAPITagSet = new Set<string>(Object.values(ApiKeyTagMap));
const openAPIDocumentPaths = Object.fromEntries(
Object.entries(openAPIPaths).map(([path, pathItem]) => [
path,
Object.fromEntries(
Object.entries(pathItem ?? {}).map(([method, operation]) => {
const tags = (operation as { tags?: string[] } | undefined)?.tags;
return [
method,
tags
? {
...(operation as object),
// ApiKeyTagMap 只作为 /openapi 的筛选标记,不展示在全量开发者文档里。
tags: tags.filter((tag) => !openAPITagSet.has(tag))
}
: operation
];
})
)
])
) as typeof openAPIPaths;
export const openAPIDocument = createDocument({
openapi: '3.1.0',
info: {
title: 'FastGPT API',
version: '0.1.0',
description: 'FastGPT API 文档'
},
paths: openAPIDocumentPaths,
servers: [{ url: '/api' }],
'x-tagGroups': openAPITagGroups
});
...@@ -5,7 +5,7 @@ import { ChatPath } from './core/chat'; ...@@ -5,7 +5,7 @@ import { ChatPath } from './core/chat';
import { DatasetPath } from './core/dataset'; import { DatasetPath } from './core/dataset';
import { PluginPath } from './core/plugin'; import { PluginPath } from './core/plugin';
import { SupportPath } from './support'; import { SupportPath } from './support';
import { TagsMap } from './tag'; import { DevApiTagsMap } from './tag';
import type { OpenAPIPath } from './type'; import type { OpenAPIPath } from './type';
export const openAPIPaths: NonNullable<OpenAPIPath> = { export const openAPIPaths: NonNullable<OpenAPIPath> = {
...@@ -22,71 +22,85 @@ export const openAPITagGroups = [ ...@@ -22,71 +22,85 @@ export const openAPITagGroups = [
{ {
name: '核心-应用管理', name: '核心-应用管理',
tags: [ tags: [
TagsMap.appCommon, DevApiTagsMap.appCommon,
TagsMap.appFolder, DevApiTagsMap.appFolder,
TagsMap.appPer, DevApiTagsMap.appPer,
TagsMap.appVersion, DevApiTagsMap.appVersion,
TagsMap.appTemplate, DevApiTagsMap.appTemplate,
TagsMap.appLog, DevApiTagsMap.appLog,
TagsMap.publishChannel DevApiTagsMap.publishChannel
] ]
}, },
{ {
name: '核心-工具管理', name: '核心-工具管理',
tags: [TagsMap.appSystemTool, TagsMap.httpTools, TagsMap.mcpTools, TagsMap.mcpServer] tags: [
DevApiTagsMap.appSystemTool,
DevApiTagsMap.httpTools,
DevApiTagsMap.mcpTools,
DevApiTagsMap.mcpServer
]
}, },
{ {
name: '核心-AI 相关', name: '核心-AI 相关',
tags: [TagsMap.aiSkill, TagsMap.sandbox, TagsMap.aiCommon] tags: [DevApiTagsMap.aiSkill, DevApiTagsMap.sandbox, DevApiTagsMap.aiCommon]
}, },
{ {
name: '核心-对话模块配置', name: '核心-对话模块配置',
tags: [TagsMap.chatSetting, TagsMap.chatPage, TagsMap.chatInputGuide] tags: [DevApiTagsMap.chatSetting, DevApiTagsMap.chatPage, DevApiTagsMap.chatInputGuide]
}, },
{ {
name: '核心-对话模块使用', name: '核心-对话模块使用',
tags: [ tags: [
TagsMap.chatHistory, DevApiTagsMap.chatHistory,
TagsMap.chatFeedback, DevApiTagsMap.chatFeedback,
TagsMap.chatFile, DevApiTagsMap.chatFile,
TagsMap.chatRecord, DevApiTagsMap.chatRecord,
TagsMap.chatController DevApiTagsMap.chatController
] ]
}, },
{ {
name: '核心-知识库', name: '核心-知识库',
tags: [ tags: [
TagsMap.datasetCommon, DevApiTagsMap.datasetCommon,
TagsMap.datasetCollection, DevApiTagsMap.datasetCollection,
TagsMap.datasetCollectionCrteate, DevApiTagsMap.datasetCollectionCrteate,
TagsMap.datasetData, DevApiTagsMap.datasetData,
TagsMap.datasetFile, DevApiTagsMap.datasetFile,
TagsMap.datasetTraining, DevApiTagsMap.datasetTraining,
TagsMap.datasetApiDataset DevApiTagsMap.datasetApiDataset
] ]
}, },
{ {
name: '核心-插件系统', name: '核心-插件系统',
tags: [TagsMap.pluginToolTag, TagsMap.pluginTeam] tags: [DevApiTagsMap.pluginToolTag, DevApiTagsMap.pluginTeam]
}, },
{ {
name: '辅助-用户体系', name: '辅助-用户体系',
tags: [TagsMap.userInform, TagsMap.walletBill, TagsMap.walletDiscountCoupon, TagsMap.userLogin] tags: [
DevApiTagsMap.userInform,
DevApiTagsMap.walletBill,
DevApiTagsMap.walletDiscountCoupon,
DevApiTagsMap.userLogin
]
}, },
{ {
name: '辅助-权限管理', name: '辅助-权限管理',
tags: [TagsMap.permissionResource, TagsMap.permissionCollaborator] tags: [DevApiTagsMap.permissionResource, DevApiTagsMap.permissionCollaborator]
}, },
{ {
name: '通用-基础功能', name: '通用-基础功能',
tags: [TagsMap.apiKey, TagsMap.customDomain] tags: [DevApiTagsMap.apiKey, DevApiTagsMap.customDomain]
}, },
{ {
name: '管理员-插件管理', name: '管理员-插件管理',
tags: [TagsMap.pluginAdmin, TagsMap.pluginMarketplace, TagsMap.pluginToolAdmin] tags: [
DevApiTagsMap.pluginAdmin,
DevApiTagsMap.pluginMarketplace,
DevApiTagsMap.pluginToolAdmin
]
}, },
{ {
name: '系统接口', name: '系统接口',
tags: [TagsMap.helperBot] tags: [DevApiTagsMap.helperBot]
} }
]; ];
import { createDocument } from 'zod-openapi'; import { createDocument } from 'zod-openapi';
import { AdminCorePath } from './admin/core'; import { AdminCorePath } from '../admin/core';
import { TagsMap } from './tag'; import { AdminSupportPath } from '../admin/support';
import { AdminSupportPath } from './admin/support'; import { DevApiTagsMap } from '../tag';
export const adminOpenAPIDocument = createDocument({ export const adminOpenAPIDocument = createDocument({
openapi: '3.1.0', openapi: '3.1.0',
...@@ -18,15 +18,15 @@ export const adminOpenAPIDocument = createDocument({ ...@@ -18,15 +18,15 @@ export const adminOpenAPIDocument = createDocument({
'x-tagGroups': [ 'x-tagGroups': [
{ {
name: '仪表盘', name: '仪表盘',
tags: [TagsMap.adminDashboard] tags: [DevApiTagsMap.adminDashboard]
}, },
{ {
name: '核心资源管理', name: '核心资源管理',
tags: [TagsMap.adminApps] tags: [DevApiTagsMap.adminApps]
}, },
{ {
name: '系统配置', name: '系统配置',
tags: [TagsMap.adminInform] tags: [DevApiTagsMap.adminInform]
} }
] ]
}); });
import { createDocument } from 'zod-openapi';
import { openAPIPaths, openAPITagGroups } from '../path';
import { SystemOpenApiTagMap } from '../tag';
import type { OpenAPIPath } from '../type';
type DefinedOpenAPIPath = NonNullable<OpenAPIPath>;
/**
* Dev API 是完整开发者文档,SystemOpenAPI 标签只作为 systemopenapi 的筛选标记。
* 这里复制并过滤 operation tags,避免内部筛选标签展示到 Dev API 文档中。
*/
const omitSystemOpenApiTags = (paths: DefinedOpenAPIPath) => {
const systemOpenApiTagSet = new Set<string>(Object.values(SystemOpenApiTagMap));
const filteredPaths: DefinedOpenAPIPath = {};
for (const [path, pathItem] of Object.entries(paths)) {
const filteredPathItem: NonNullable<DefinedOpenAPIPath[string]> = {};
for (const [method, operation] of Object.entries(pathItem ?? {})) {
const tags = (operation as { tags?: string[] } | undefined)?.tags;
filteredPathItem[method as keyof typeof filteredPathItem] = (
tags
? {
...(operation as object),
tags: tags.filter((tag) => !systemOpenApiTagSet.has(tag))
}
: operation
) as never;
}
filteredPaths[path] = filteredPathItem;
}
return filteredPaths;
};
export const openAPIDocument = createDocument({
openapi: '3.1.0',
info: {
title: 'FastGPT Dev API',
version: '0.1.0',
description: 'FastGPT 所有 API 的文档'
},
paths: omitSystemOpenApiTags(openAPIPaths),
servers: [{ url: '/api' }],
'x-tagGroups': openAPITagGroups
});
import { createDocument } from 'zod-openapi'; import { createDocument } from 'zod-openapi';
import { SystemOpenApiTagMap } from '../tag';
import { openAPIPaths } from '../path'; import { openAPIPaths } from '../path';
import type { OpenAPIPath } from '../type'; import type { OpenAPIPath } from '../type';
import { ApiKeyTagMap, ApiKeyTagNameMap, apiKeyTagGroups } from './tag';
const ApiKeyTagNameMap: Record<string, string> = {
[SystemOpenApiTagMap.appLog]: '应用日志',
[SystemOpenApiTagMap.chatHistory]: '会话管理',
[SystemOpenApiTagMap.chat]: '对话管理',
[SystemOpenApiTagMap.chatFeedback]: '反馈管理',
[SystemOpenApiTagMap.chatController]: '会话操作',
[SystemOpenApiTagMap.dataset]: '知识库管理',
[SystemOpenApiTagMap.datasetCollection]: '集合管理',
[SystemOpenApiTagMap.datasetCollectionCreate]: '集合创建',
[SystemOpenApiTagMap.datasetData]: '数据管理',
[SystemOpenApiTagMap.datasetDataIndex]: '索引管理',
[SystemOpenApiTagMap.datasetOther]: '其他'
};
export const tagGroups = [
{
name: '应用管理',
tags: [ApiKeyTagNameMap[SystemOpenApiTagMap.appLog]]
},
{
name: '应用对话',
tags: [
ApiKeyTagNameMap[SystemOpenApiTagMap.chatHistory],
ApiKeyTagNameMap[SystemOpenApiTagMap.chat],
ApiKeyTagNameMap[SystemOpenApiTagMap.chatFeedback],
ApiKeyTagNameMap[SystemOpenApiTagMap.chatController]
]
},
{
name: '知识库',
tags: [
ApiKeyTagNameMap[SystemOpenApiTagMap.dataset],
ApiKeyTagNameMap[SystemOpenApiTagMap.datasetCollection],
ApiKeyTagNameMap[SystemOpenApiTagMap.datasetCollectionCreate],
ApiKeyTagNameMap[SystemOpenApiTagMap.datasetData],
ApiKeyTagNameMap[SystemOpenApiTagMap.datasetDataIndex],
ApiKeyTagNameMap[SystemOpenApiTagMap.datasetOther]
]
}
];
type DefinedOpenAPIPath = NonNullable<OpenAPIPath>; type DefinedOpenAPIPath = NonNullable<OpenAPIPath>;
/** /**
* API key 文档只展示显式打了 ApiKeyTagMap 标签的 operation。 * System OpenAPI 只展示显式打了 SystemOpenApiTagMap 标签的 operation。
* *
* 主文档继续保留原有业务标签;这里在生成 API key 专用文档时过滤并重写 tags, * 主文档继续保留原有业务标签;这里在生成 System OpenAPI 文档时过滤并重写 tags,
* 避免没有开放的同模块接口被带入 /openapi。 * 避免没有开放的同模块接口被带入 /apidoc/systemopenapi。
*/ */
const pickApiKeyPathsByTags = (paths: DefinedOpenAPIPath) => { const pickApiKeyPathsByTags = (paths: DefinedOpenAPIPath) => {
const apiKeyTags = new Set<string>(Object.values(ApiKeyTagMap)); const apiKeyTags = new Set<string>(Object.values(SystemOpenApiTagMap));
const pickedPaths: DefinedOpenAPIPath = {}; const pickedPaths: DefinedOpenAPIPath = {};
for (const [path, pathItem] of Object.entries(paths)) { for (const [path, pathItem] of Object.entries(paths)) {
...@@ -43,7 +86,7 @@ const apiKeyOpenAPIPaths = pickApiKeyPathsByTags(openAPIPaths); ...@@ -43,7 +86,7 @@ const apiKeyOpenAPIPaths = pickApiKeyPathsByTags(openAPIPaths);
export const apiDocOpenAPIDocument = createDocument({ export const apiDocOpenAPIDocument = createDocument({
openapi: '3.1.0', openapi: '3.1.0',
info: { info: {
title: 'FastGPT OpenAPI', title: 'FastGPT System OpenAPI',
version: '0.1.0', version: '0.1.0',
description: 'FastGPT 开放 API 文档,仅包含支持 API key 鉴权的接口。' description: 'FastGPT 开放 API 文档,仅包含支持 API key 鉴权的接口。'
}, },
...@@ -55,10 +98,11 @@ export const apiDocOpenAPIDocument = createDocument({ ...@@ -55,10 +98,11 @@ export const apiDocOpenAPIDocument = createDocument({
type: 'http', type: 'http',
scheme: 'bearer', scheme: 'bearer',
bearerFormat: 'API Key', bearerFormat: 'API Key',
description: '在 Authorization 请求头中传入 Bearer <apiKey>。' description:
'在 Authorization 请求头中传入 Bearer <apiKey>。除 chat/completions 外,对话相关接口必须在 body/query 中显式传入 appId。chat/completions 推荐传 body.appId;为兼容 OpenAI SDK,也允许 Bearer <apiKey>-<appId>,该后缀仅作为传输兼容,不会写入数据库。'
} }
} }
}, },
security: [{ ApiKeyAuth: [] }], security: [{ ApiKeyAuth: [] }],
'x-tagGroups': apiKeyTagGroups 'x-tagGroups': tagGroups
}); });
...@@ -76,9 +76,15 @@ const scalarApiReferenceCss = ` ...@@ -76,9 +76,15 @@ const scalarApiReferenceCss = `
`; `;
export const getScalarOpenApiReferenceConfig = (url: string) => export const getScalarOpenApiReferenceConfig = (
url: string,
options?: {
defaultOpenAllTags?: boolean;
}
) =>
({ ({
customCss: scalarApiReferenceCss, customCss: scalarApiReferenceCss,
defaultOpenAllTags: options?.defaultOpenAllTags,
hideDarkModeToggle: false, hideDarkModeToggle: false,
hideClientButton: true, hideClientButton: true,
showToolbar: 'never', showToolbar: 'never',
......
...@@ -12,7 +12,7 @@ import { ...@@ -12,7 +12,7 @@ import {
UpdateDomainVerifyFileBodySchema, UpdateDomainVerifyFileBodySchema,
UpdateDomainVerifyFileResponseSchema UpdateDomainVerifyFileResponseSchema
} from './api'; } from './api';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
export const CustomDomainPath: OpenAPIPath = { export const CustomDomainPath: OpenAPIPath = {
'/proApi/support/customDomain/create': { '/proApi/support/customDomain/create': {
...@@ -20,7 +20,7 @@ export const CustomDomainPath: OpenAPIPath = { ...@@ -20,7 +20,7 @@ export const CustomDomainPath: OpenAPIPath = {
summary: '创建自定义域名', summary: '创建自定义域名',
description: description:
'创建一个新的自定义域名配置,需要高级套餐权限。创建后域名会自动部署到 K8s 集群中', '创建一个新的自定义域名配置,需要高级套餐权限。创建后域名会自动部署到 K8s 集群中',
tags: [TagsMap.customDomain], tags: [DevApiTagsMap.customDomain],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -44,7 +44,7 @@ export const CustomDomainPath: OpenAPIPath = { ...@@ -44,7 +44,7 @@ export const CustomDomainPath: OpenAPIPath = {
get: { get: {
summary: '获取自定义域名列表', summary: '获取自定义域名列表',
description: '获取当前团队的所有自定义域名配置列表', description: '获取当前团队的所有自定义域名配置列表',
tags: [TagsMap.customDomain], tags: [DevApiTagsMap.customDomain],
responses: { responses: {
200: { 200: {
description: '成功获取自定义域名列表', description: '成功获取自定义域名列表',
...@@ -61,7 +61,7 @@ export const CustomDomainPath: OpenAPIPath = { ...@@ -61,7 +61,7 @@ export const CustomDomainPath: OpenAPIPath = {
delete: { delete: {
summary: '删除自定义域名', summary: '删除自定义域名',
description: '删除指定的自定义域名配置,同时会从 K8s 集群中移除相关资源', description: '删除指定的自定义域名配置,同时会从 K8s 集群中移除相关资源',
tags: [TagsMap.customDomain], tags: [DevApiTagsMap.customDomain],
requestParams: { requestParams: {
query: DeleteCustomDomainQuerySchema query: DeleteCustomDomainQuerySchema
}, },
...@@ -81,7 +81,7 @@ export const CustomDomainPath: OpenAPIPath = { ...@@ -81,7 +81,7 @@ export const CustomDomainPath: OpenAPIPath = {
post: { post: {
summary: '检查 DNS 解析', summary: '检查 DNS 解析',
description: '检查自定义域名的 CNAME 记录是否正确配置和解析', description: '检查自定义域名的 CNAME 记录是否正确配置和解析',
tags: [TagsMap.customDomain], tags: [DevApiTagsMap.customDomain],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -105,7 +105,7 @@ export const CustomDomainPath: OpenAPIPath = { ...@@ -105,7 +105,7 @@ export const CustomDomainPath: OpenAPIPath = {
post: { post: {
summary: '激活自定义域名', summary: '激活自定义域名',
description: '将自定义域名状态设置为激活,并重新部署到 K8s 集群', description: '将自定义域名状态设置为激活,并重新部署到 K8s 集群',
tags: [TagsMap.customDomain], tags: [DevApiTagsMap.customDomain],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -130,7 +130,7 @@ export const CustomDomainPath: OpenAPIPath = { ...@@ -130,7 +130,7 @@ export const CustomDomainPath: OpenAPIPath = {
summary: '更新域名验证文件', summary: '更新域名验证文件',
description: description:
'更新域名验证文件配置,用于 SSL 证书验证。更新后会在 K8s 中创建或更新对应的 Ingress', '更新域名验证文件配置,用于 SSL 证书验证。更新后会在 K8s 中创建或更新对应的 Ingress',
tags: [TagsMap.customDomain], tags: [DevApiTagsMap.customDomain],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import { type OpenAPIPath } from '../../type'; import { type OpenAPIPath } from '../../type';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
import { import {
McpCreateBodySchema, McpCreateBodySchema,
McpCreateResponseSchema, McpCreateResponseSchema,
...@@ -15,7 +15,7 @@ export const McpPath: OpenAPIPath = { ...@@ -15,7 +15,7 @@ export const McpPath: OpenAPIPath = {
get: { get: {
summary: '获取 MCP Server 列表', summary: '获取 MCP Server 列表',
description: '获取当前团队(或个人)可见的 MCP Server 列表', description: '获取当前团队(或个人)可见的 MCP Server 列表',
tags: [TagsMap.mcpServer], tags: [DevApiTagsMap.mcpServer],
responses: { responses: {
200: { 200: {
description: 'MCP Server 列表', description: 'MCP Server 列表',
...@@ -32,7 +32,7 @@ export const McpPath: OpenAPIPath = { ...@@ -32,7 +32,7 @@ export const McpPath: OpenAPIPath = {
post: { post: {
summary: '创建 MCP Server', summary: '创建 MCP Server',
description: '创建一个新的 MCP Server,将若干应用以 MCP 工具的形式对外暴露', description: '创建一个新的 MCP Server,将若干应用以 MCP 工具的形式对外暴露',
tags: [TagsMap.mcpServer], tags: [DevApiTagsMap.mcpServer],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -56,7 +56,7 @@ export const McpPath: OpenAPIPath = { ...@@ -56,7 +56,7 @@ export const McpPath: OpenAPIPath = {
put: { put: {
summary: '更新 MCP Server', summary: '更新 MCP Server',
description: '更新已存在的 MCP Server 名称或应用列表', description: '更新已存在的 MCP Server 名称或应用列表',
tags: [TagsMap.mcpServer], tags: [DevApiTagsMap.mcpServer],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -80,7 +80,7 @@ export const McpPath: OpenAPIPath = { ...@@ -80,7 +80,7 @@ export const McpPath: OpenAPIPath = {
delete: { delete: {
summary: '删除 MCP Server', summary: '删除 MCP Server',
description: '根据 ID 删除 MCP Server', description: '根据 ID 删除 MCP Server',
tags: [TagsMap.mcpServer], tags: [DevApiTagsMap.mcpServer],
requestParams: { requestParams: {
query: McpDeleteQuerySchema query: McpDeleteQuerySchema
}, },
......
...@@ -31,9 +31,8 @@ export const OpenApiKeySchema = z.object({ ...@@ -31,9 +31,8 @@ export const OpenApiKeySchema = z.object({
canCopy: z.boolean().default(false).meta({ canCopy: z.boolean().default(false).meta({
description: '当前用户是否可以复制该 API Key 明文' description: '当前用户是否可以复制该 API Key 明文'
}), }),
appId: ObjectIdSchema.optional().meta({ description: '绑定应用 ID' }),
authProxy: z.boolean().default(false).meta({ authProxy: z.boolean().default(false).meta({
description: '是否允许团队级 API Key 在 chat/completions 请求中通过 authProxy 代理团队成员身份' description: '是否允许 API Key 在 chat/completions 请求中通过 authProxy 代理团队成员身份'
}), }),
name: z.string().default('Api Key').meta({ description: 'API Key 名称' }), name: z.string().default('Api Key').meta({ description: 'API Key 名称' }),
usagePoints: z.number().default(0).meta({ description: '累计使用积分' }), usagePoints: z.number().default(0).meta({ description: '累计使用积分' }),
...@@ -47,17 +46,16 @@ export type OpenApiKeySchemaType = z.infer<typeof OpenApiKeySchema>; ...@@ -47,17 +46,16 @@ export type OpenApiKeySchemaType = z.infer<typeof OpenApiKeySchema>;
* API: 创建 API Key * API: 创建 API Key
* Route: POST /api/support/openapi/create * Route: POST /api/support/openapi/create
* Method: POST * Method: POST
* Description: 创建团队级或应用级 API Key。 * Description: 创建系统 API Key。
* Tags: ['API Key 管理'] * Tags: ['API Key 管理']
* ============================================================================ */ * ============================================================================ */
export const CreateApiKeyBodySchema = z.object({ export const CreateApiKeyBodySchema = z.object({
appId: ObjectIdSchema.optional().meta({ description: '绑定应用 ID,不传则创建团队级 API Key' }),
name: z.string().min(1).meta({ example: '生产环境 Key', description: 'API Key 名称' }), name: z.string().min(1).meta({ example: '生产环境 Key', description: 'API Key 名称' }),
authProxy: z.boolean().optional().meta({ authProxy: z.boolean().optional().meta({
example: false, example: false,
description: description:
'是否允许团队级 API Key 在 chat/completions 请求中代理团队成员身份;仅团队 owner 可开启' '是否允许系统 API Key 在 chat/completions 请求中代理团队成员身份;仅团队 owner 可开启'
}), }),
limit: ApiKeyLimitSchema.meta({ limit: ApiKeyLimitSchema.meta({
description: 'API Key 使用限制,未配置时表示不限制过期时间和积分用量' description: 'API Key 使用限制,未配置时表示不限制过期时间和积分用量'
...@@ -74,13 +72,11 @@ export type CreateApiKeyResponseType = z.infer<typeof CreateApiKeyResponseSchema ...@@ -74,13 +72,11 @@ export type CreateApiKeyResponseType = z.infer<typeof CreateApiKeyResponseSchema
* API: 获取 API Key 列表 * API: 获取 API Key 列表
* Route: GET /api/support/openapi/list * Route: GET /api/support/openapi/list
* Method: GET * Method: GET
* Description: 获取团队级或指定应用下的 API Key 列表。 * Description: 获取当前登录成员创建的系统 API Key 列表。
* Tags: ['API Key 管理'] * Tags: ['API Key 管理']
* ============================================================================ */ * ============================================================================ */
export const GetApiKeyListQuerySchema = z.object({ export const GetApiKeyListQuerySchema = z.object({});
appId: ObjectIdSchema.optional().meta({ description: '应用 ID,不传则查询团队级 API Key' })
});
export type GetApiKeyListQueryType = z.infer<typeof GetApiKeyListQuerySchema>; export type GetApiKeyListQueryType = z.infer<typeof GetApiKeyListQuerySchema>;
export const GetApiKeyListResponseSchema = z.array(OpenApiKeySchema).meta({ export const GetApiKeyListResponseSchema = z.array(OpenApiKeySchema).meta({
...@@ -164,9 +160,12 @@ export const ApiKeyHealthParamsSchema = z.object({ ...@@ -164,9 +160,12 @@ export const ApiKeyHealthParamsSchema = z.object({
export type ApiKeyHealthParamsType = z.infer<typeof ApiKeyHealthParamsSchema>; export type ApiKeyHealthParamsType = z.infer<typeof ApiKeyHealthParamsSchema>;
export const ApiKeyHealthResponseSchema = z.object({ export const ApiKeyHealthResponseSchema = z.object({
valid: z.literal(true).meta({
description: 'API Key 是否有效'
}),
appId: ObjectIdSchema.optional().meta({ appId: ObjectIdSchema.optional().meta({
example: '68ad85a7463006c963799a05', example: '68ad85a7463006c963799a05',
description: 'API Key 绑定的应用 ID;团队级 API Key 不返回' description: '旧应用 API Key 绑定的应用 ID;系统 API Key 不返回'
}) })
}); });
export type ApiKeyHealthResponseType = z.infer<typeof ApiKeyHealthResponseSchema>; export type ApiKeyHealthResponseType = z.infer<typeof ApiKeyHealthResponseSchema>;
......
...@@ -14,14 +14,14 @@ import { ...@@ -14,14 +14,14 @@ import {
UpdateApiKeyBodySchema, UpdateApiKeyBodySchema,
UpdateApiKeyResponseSchema UpdateApiKeyResponseSchema
} from './api'; } from './api';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
export const ApiKeyPath: OpenAPIPath = { export const ApiKeyPath: OpenAPIPath = {
'/support/openapi/create': { '/support/openapi/create': {
post: { post: {
summary: '创建 API Key', summary: '创建 API Key',
description: '创建团队级或应用级 API Key', description: '创建 API Key',
tags: [TagsMap.apiKey], tags: [DevApiTagsMap.apiKey],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -44,8 +44,8 @@ export const ApiKeyPath: OpenAPIPath = { ...@@ -44,8 +44,8 @@ export const ApiKeyPath: OpenAPIPath = {
'/support/openapi/list': { '/support/openapi/list': {
get: { get: {
summary: '获取 API Key 列表', summary: '获取 API Key 列表',
description: '获取团队级或指定应用下的 API Key 列表', description: '获取当前登录成员创建的 API Key 列表',
tags: [TagsMap.apiKey], tags: [DevApiTagsMap.apiKey],
requestParams: { requestParams: {
query: GetApiKeyListQuerySchema query: GetApiKeyListQuerySchema
}, },
...@@ -65,7 +65,7 @@ export const ApiKeyPath: OpenAPIPath = { ...@@ -65,7 +65,7 @@ export const ApiKeyPath: OpenAPIPath = {
put: { put: {
summary: '更新 API Key', summary: '更新 API Key',
description: '更新 API Key 名称或使用限制', description: '更新 API Key 名称或使用限制',
tags: [TagsMap.apiKey], tags: [DevApiTagsMap.apiKey],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -89,7 +89,7 @@ export const ApiKeyPath: OpenAPIPath = { ...@@ -89,7 +89,7 @@ export const ApiKeyPath: OpenAPIPath = {
delete: { delete: {
summary: '删除 API Key', summary: '删除 API Key',
description: '删除指定 API Key', description: '删除指定 API Key',
tags: [TagsMap.apiKey], tags: [DevApiTagsMap.apiKey],
requestParams: { requestParams: {
query: DeleteApiKeyQuerySchema query: DeleteApiKeyQuerySchema
}, },
...@@ -109,7 +109,7 @@ export const ApiKeyPath: OpenAPIPath = { ...@@ -109,7 +109,7 @@ export const ApiKeyPath: OpenAPIPath = {
post: { post: {
summary: '复制 API Key', summary: '复制 API Key',
description: '返回 API Key 明文并记录用户复制审计日志', description: '返回 API Key 明文并记录用户复制审计日志',
tags: [TagsMap.apiKey], tags: [DevApiTagsMap.apiKey],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -132,7 +132,7 @@ export const ApiKeyPath: OpenAPIPath = { ...@@ -132,7 +132,7 @@ export const ApiKeyPath: OpenAPIPath = {
'/support/openapi/health': { '/support/openapi/health': {
get: { get: {
summary: '检查 API Key 是否健康', summary: '检查 API Key 是否健康',
tags: [TagsMap.apiKey], tags: [DevApiTagsMap.apiKey],
requestParams: { requestParams: {
query: ApiKeyHealthParamsSchema query: ApiKeyHealthParamsSchema
}, },
......
import type { OpenAPIPath } from '../../type'; import type { OpenAPIPath } from '../../type';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
import { import {
OutLinkCreateBodySchema, OutLinkCreateBodySchema,
OutLinkCreateResponseSchema, OutLinkCreateResponseSchema,
...@@ -16,7 +16,7 @@ export const OutLinkPath: OpenAPIPath = { ...@@ -16,7 +16,7 @@ export const OutLinkPath: OpenAPIPath = {
get: { get: {
summary: '获取应用的发布渠道列表', summary: '获取应用的发布渠道列表',
description: '查询指定应用的所有 OutLink 发布渠道配置', description: '查询指定应用的所有 OutLink 发布渠道配置',
tags: [TagsMap.publishChannel], tags: [DevApiTagsMap.publishChannel],
requestParams: { requestParams: {
query: OutLinkListQuerySchema query: OutLinkListQuerySchema
}, },
...@@ -36,7 +36,7 @@ export const OutLinkPath: OpenAPIPath = { ...@@ -36,7 +36,7 @@ export const OutLinkPath: OpenAPIPath = {
post: { post: {
summary: '创建发布渠道', summary: '创建发布渠道',
description: '为指定应用创建发布渠道', description: '为指定应用创建发布渠道',
tags: [TagsMap.publishChannel], tags: [DevApiTagsMap.publishChannel],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -60,7 +60,7 @@ export const OutLinkPath: OpenAPIPath = { ...@@ -60,7 +60,7 @@ export const OutLinkPath: OpenAPIPath = {
put: { put: {
summary: '更新发布渠道', summary: '更新发布渠道',
description: '更新发布渠道配置', description: '更新发布渠道配置',
tags: [TagsMap.publishChannel], tags: [DevApiTagsMap.publishChannel],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -84,7 +84,7 @@ export const OutLinkPath: OpenAPIPath = { ...@@ -84,7 +84,7 @@ export const OutLinkPath: OpenAPIPath = {
delete: { delete: {
summary: '删除发布渠道', summary: '删除发布渠道',
description: '删除指定发布渠道', description: '删除指定发布渠道',
tags: [TagsMap.publishChannel], tags: [DevApiTagsMap.publishChannel],
requestParams: { requestParams: {
query: OutLinkDeleteQuerySchema query: OutLinkDeleteQuerySchema
}, },
......
import type { OpenAPIPath } from '../../type'; import type { OpenAPIPath } from '../../type';
import { TagsMap } from '../../tag'; import { DevApiTagsMap } from '../../tag';
import { import {
GetAppCollaboratorListQuerySchema, GetAppCollaboratorListQuerySchema,
GetAppCollaboratorListResponseSchema, GetAppCollaboratorListResponseSchema,
...@@ -12,7 +12,7 @@ export const PermissionPath: OpenAPIPath = { ...@@ -12,7 +12,7 @@ export const PermissionPath: OpenAPIPath = {
get: { get: {
summary: '获取应用协作者列表', summary: '获取应用协作者列表',
description: '获取应用或应用文件夹的协作者列表,包含继承权限场景下的父级协作者信息', description: '获取应用或应用文件夹的协作者列表,包含继承权限场景下的父级协作者信息',
tags: [TagsMap.permissionCollaborator, TagsMap.appPer], tags: [DevApiTagsMap.permissionCollaborator, DevApiTagsMap.appPer],
requestParams: { requestParams: {
query: GetAppCollaboratorListQuerySchema query: GetAppCollaboratorListQuerySchema
}, },
...@@ -32,7 +32,7 @@ export const PermissionPath: OpenAPIPath = { ...@@ -32,7 +32,7 @@ export const PermissionPath: OpenAPIPath = {
post: { post: {
summary: '更新应用协作者', summary: '更新应用协作者',
description: '覆盖更新应用或应用文件夹的协作者权限', description: '覆盖更新应用或应用文件夹的协作者权限',
tags: [TagsMap.permissionCollaborator, TagsMap.appPer], tags: [DevApiTagsMap.permissionCollaborator, DevApiTagsMap.appPer],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../../type'; import type { OpenAPIPath } from '../../../../type';
import { TagsMap } from '../../../../tag'; import { DevApiTagsMap } from '../../../../tag';
import { import {
LoginByPasswordBodySchema, LoginByPasswordBodySchema,
PreLoginQuerySchema, PreLoginQuerySchema,
...@@ -17,7 +17,7 @@ export const LoginPath: OpenAPIPath = { ...@@ -17,7 +17,7 @@ export const LoginPath: OpenAPIPath = {
get: { get: {
summary: 'Token 登录', summary: 'Token 登录',
description: '通过已有的登录令牌获取用户信息', description: '通过已有的登录令牌获取用户信息',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
responses: { responses: {
200: { 200: {
description: '成功获取用户信息', description: '成功获取用户信息',
...@@ -34,7 +34,7 @@ export const LoginPath: OpenAPIPath = { ...@@ -34,7 +34,7 @@ export const LoginPath: OpenAPIPath = {
get: { get: {
summary: '预登录获取验证码', summary: '预登录获取验证码',
description: '通过用户名获取预登录验证码,用于密码登录时的验证', description: '通过用户名获取预登录验证码,用于密码登录时的验证',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestParams: { requestParams: {
query: PreLoginQuerySchema query: PreLoginQuerySchema
}, },
...@@ -54,7 +54,7 @@ export const LoginPath: OpenAPIPath = { ...@@ -54,7 +54,7 @@ export const LoginPath: OpenAPIPath = {
post: { post: {
summary: '用户密码登录', summary: '用户密码登录',
description: '通过用户名和密码进行登录,需要先获取预登录验证码', description: '通过用户名和密码进行登录,需要先获取预登录验证码',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -78,7 +78,7 @@ export const LoginPath: OpenAPIPath = { ...@@ -78,7 +78,7 @@ export const LoginPath: OpenAPIPath = {
post: { post: {
summary: 'OAuth 登录', summary: 'OAuth 登录',
description: '使用第三方 OAuth 授权登录', description: '使用第三方 OAuth 授权登录',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -102,7 +102,7 @@ export const LoginPath: OpenAPIPath = { ...@@ -102,7 +102,7 @@ export const LoginPath: OpenAPIPath = {
post: { post: {
summary: '快捷登录', summary: '快捷登录',
description: '使用 Token 和 Code 进行快捷登录', description: '使用 Token 和 Code 进行快捷登录',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -126,7 +126,7 @@ export const LoginPath: OpenAPIPath = { ...@@ -126,7 +126,7 @@ export const LoginPath: OpenAPIPath = {
get: { get: {
summary: '获取微信登录二维码', summary: '获取微信登录二维码',
description: '获取微信登录二维码', description: '获取微信登录二维码',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
responses: { responses: {
200: { 200: {
description: '获取微信登录二维码成功', description: '获取微信登录二维码成功',
...@@ -143,7 +143,7 @@ export const LoginPath: OpenAPIPath = { ...@@ -143,7 +143,7 @@ export const LoginPath: OpenAPIPath = {
post: { post: {
summary: '获取微信登录结果', summary: '获取微信登录结果',
description: '提交微信登录 Code 以获取登录结果', description: '提交微信登录 Code 以获取登录结果',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -167,7 +167,7 @@ export const LoginPath: OpenAPIPath = { ...@@ -167,7 +167,7 @@ export const LoginPath: OpenAPIPath = {
get: { get: {
summary: '退出登录', summary: '退出登录',
description: '退出当前用户的所有会话并清除登录凭证', description: '退出当前用户的所有会话并清除登录凭证',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
responses: { responses: {
200: { 200: {
description: '退出登录成功' description: '退出登录成功'
......
import type { OpenAPIPath } from '../../../../type'; import type { OpenAPIPath } from '../../../../type';
import { TagsMap } from '../../../../tag'; import { DevApiTagsMap } from '../../../../tag';
import { import {
UpdatePasswordByOldBodySchema, UpdatePasswordByOldBodySchema,
UpdatePasswordByOldResponseSchema, UpdatePasswordByOldResponseSchema,
...@@ -14,7 +14,7 @@ export const PasswordPath: OpenAPIPath = { ...@@ -14,7 +14,7 @@ export const PasswordPath: OpenAPIPath = {
post: { post: {
summary: '通过旧密码修改密码', summary: '通过旧密码修改密码',
description: '使用旧密码验证后修改为新密码,修改成功后其他会话将被注销', description: '使用旧密码验证后修改为新密码,修改成功后其他会话将被注销',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -38,7 +38,7 @@ export const PasswordPath: OpenAPIPath = { ...@@ -38,7 +38,7 @@ export const PasswordPath: OpenAPIPath = {
get: { get: {
summary: '检查密码是否过期', summary: '检查密码是否过期',
description: '检查当前用户的密码是否已过期,需要强制修改', description: '检查当前用户的密码是否已过期,需要强制修改',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
responses: { responses: {
200: { 200: {
description: '返回密码是否过期', description: '返回密码是否过期',
...@@ -55,7 +55,7 @@ export const PasswordPath: OpenAPIPath = { ...@@ -55,7 +55,7 @@ export const PasswordPath: OpenAPIPath = {
post: { post: {
summary: '重置过期密码', summary: '重置过期密码',
description: '当密码过期时,使用此接口重置密码,重置后其他会话将被注销', description: '当密码过期时,使用此接口重置密码,重置后其他会话将被注销',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -79,7 +79,7 @@ export const PasswordPath: OpenAPIPath = { ...@@ -79,7 +79,7 @@ export const PasswordPath: OpenAPIPath = {
post: { post: {
summary: '通过验证码找回/修改密码', summary: '通过验证码找回/修改密码',
description: '通过邮箱/手机验证码找回或修改密码', description: '通过邮箱/手机验证码找回或修改密码',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../../type'; import type { OpenAPIPath } from '../../../../type';
import { TagsMap } from '../../../../tag'; import { DevApiTagsMap } from '../../../../tag';
import { AccountRegisterBodySchema } from './api'; import { AccountRegisterBodySchema } from './api';
export const RegisterPath: OpenAPIPath = { export const RegisterPath: OpenAPIPath = {
...@@ -7,7 +7,7 @@ export const RegisterPath: OpenAPIPath = { ...@@ -7,7 +7,7 @@ export const RegisterPath: OpenAPIPath = {
post: { post: {
summary: '邮箱/手机号注册', summary: '邮箱/手机号注册',
description: '使用邮箱或手机号验证码注册新账号', description: '使用邮箱或手机号验证码注册新账号',
tags: [TagsMap.userLogin], tags: [DevApiTagsMap.userLogin],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
...@@ -4,14 +4,14 @@ import { ...@@ -4,14 +4,14 @@ import {
OperationalAdResponseSchema, OperationalAdResponseSchema,
ActivityAdResponseSchema ActivityAdResponseSchema
} from '../../../admin/support/user/inform/api'; } from '../../../admin/support/user/inform/api';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
export const UserInformPath: OpenAPIPath = { export const UserInformPath: OpenAPIPath = {
'/proApi/support/user/inform/getSystemMsgModal': { '/proApi/support/user/inform/getSystemMsgModal': {
get: { get: {
summary: '获取系统弹窗内容', summary: '获取系统弹窗内容',
description: '获取系统消息弹窗的内容', description: '获取系统消息弹窗的内容',
tags: [TagsMap.userInform], tags: [DevApiTagsMap.userInform],
responses: { responses: {
200: { 200: {
description: '成功获取系统弹窗内容', description: '成功获取系统弹窗内容',
...@@ -28,7 +28,7 @@ export const UserInformPath: OpenAPIPath = { ...@@ -28,7 +28,7 @@ export const UserInformPath: OpenAPIPath = {
get: { get: {
summary: '获取运营广告', summary: '获取运营广告',
description: '获取运营广告的图片和链接', description: '获取运营广告的图片和链接',
tags: [TagsMap.userInform], tags: [DevApiTagsMap.userInform],
responses: { responses: {
200: { 200: {
description: '成功获取运营广告', description: '成功获取运营广告',
...@@ -45,7 +45,7 @@ export const UserInformPath: OpenAPIPath = { ...@@ -45,7 +45,7 @@ export const UserInformPath: OpenAPIPath = {
get: { get: {
summary: '获取活动广告', summary: '获取活动广告',
description: '获取活动广告的图片和链接', description: '获取活动广告的图片和链接',
tags: [TagsMap.userInform], tags: [DevApiTagsMap.userInform],
responses: { responses: {
200: { 200: {
description: '成功获取活动广告', description: '成功获取活动广告',
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { UpdateTeamBodySchema } from './api'; import { UpdateTeamBodySchema } from './api';
export const TeamPath: OpenAPIPath = { export const TeamPath: OpenAPIPath = {
...@@ -7,7 +7,7 @@ export const TeamPath: OpenAPIPath = { ...@@ -7,7 +7,7 @@ export const TeamPath: OpenAPIPath = {
post: { post: {
summary: '更新团队信息', summary: '更新团队信息',
description: '更新团队名称、头像、域名、第三方账号(OpenAI)及外部工作流变量', description: '更新团队名称、头像、域名、第三方账号(OpenAI)及外部工作流变量',
tags: [TagsMap.teamManage], tags: [DevApiTagsMap.teamManage],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
...@@ -12,7 +12,7 @@ import { ...@@ -12,7 +12,7 @@ import {
CheckPayResultQuerySchema, CheckPayResultQuerySchema,
BillDetailQuerySchema BillDetailQuerySchema
} from './api'; } from './api';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
import { ObjectIdSchema } from '../../../../common/type/mongo'; import { ObjectIdSchema } from '../../../../common/type/mongo';
export const BillPath: OpenAPIPath = { export const BillPath: OpenAPIPath = {
...@@ -20,7 +20,7 @@ export const BillPath: OpenAPIPath = { ...@@ -20,7 +20,7 @@ export const BillPath: OpenAPIPath = {
post: { post: {
summary: '创建订单', summary: '创建订单',
description: '创建订单订单,支持标准订阅套餐、额外积分、额外数据集存储三种类型', description: '创建订单订单,支持标准订阅套餐、额外积分、额外数据集存储三种类型',
tags: [TagsMap.walletBill], tags: [DevApiTagsMap.walletBill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -44,7 +44,7 @@ export const BillPath: OpenAPIPath = { ...@@ -44,7 +44,7 @@ export const BillPath: OpenAPIPath = {
post: { post: {
summary: '更新支付方式', summary: '更新支付方式',
description: '为未支付的订单更新支付方式,返回新的支付二维码或链接', description: '为未支付的订单更新支付方式,返回新的支付二维码或链接',
tags: [TagsMap.walletBill], tags: [DevApiTagsMap.walletBill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -68,7 +68,7 @@ export const BillPath: OpenAPIPath = { ...@@ -68,7 +68,7 @@ export const BillPath: OpenAPIPath = {
get: { get: {
summary: '检查支付结果', summary: '检查支付结果',
description: '检查订单的支付状态,用于轮询支付结果', description: '检查订单的支付状态,用于轮询支付结果',
tags: [TagsMap.walletBill], tags: [DevApiTagsMap.walletBill],
requestParams: { requestParams: {
query: CheckPayResultQuerySchema query: CheckPayResultQuerySchema
}, },
...@@ -88,7 +88,7 @@ export const BillPath: OpenAPIPath = { ...@@ -88,7 +88,7 @@ export const BillPath: OpenAPIPath = {
get: { get: {
summary: '获取订单详情', summary: '获取订单详情',
description: '根据订单 ID 获取订单详细信息,包括优惠券名称等', description: '根据订单 ID 获取订单详细信息,包括优惠券名称等',
tags: [TagsMap.walletBill], tags: [DevApiTagsMap.walletBill],
requestParams: { requestParams: {
query: BillDetailQuerySchema query: BillDetailQuerySchema
}, },
...@@ -108,7 +108,7 @@ export const BillPath: OpenAPIPath = { ...@@ -108,7 +108,7 @@ export const BillPath: OpenAPIPath = {
post: { post: {
summary: '获取订单列表', summary: '获取订单列表',
description: '分页获取团队的订单列表,支持按类型筛选', description: '分页获取团队的订单列表,支持按类型筛选',
tags: [TagsMap.walletBill], tags: [DevApiTagsMap.walletBill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
...@@ -135,7 +135,7 @@ export const BillPath: OpenAPIPath = { ...@@ -135,7 +135,7 @@ export const BillPath: OpenAPIPath = {
post: { post: {
summary: '取消订单', summary: '取消订单',
description: '取消未支付的订单,如果使用了优惠券会自动返还', description: '取消未支付的订单,如果使用了优惠券会自动返还',
tags: [TagsMap.walletBill], tags: [DevApiTagsMap.walletBill],
requestBody: { requestBody: {
content: { content: {
'application/json': { 'application/json': {
......
import type { OpenAPIPath } from '../../../type'; import type { OpenAPIPath } from '../../../type';
import { DiscountCouponListResponseSchema } from './api'; import { DiscountCouponListResponseSchema } from './api';
import { TagsMap } from '../../../tag'; import { DevApiTagsMap } from '../../../tag';
export const DiscountCouponPath: OpenAPIPath = { export const DiscountCouponPath: OpenAPIPath = {
'/support/wallet/discountCoupon/list': { '/support/wallet/discountCoupon/list': {
get: { get: {
summary: '获取优惠券列表', summary: '获取优惠券列表',
description: '获取团队的优惠券列表,包括优惠券状态、使用情况等信息', description: '获取团队的优惠券列表,包括优惠券状态、使用情况等信息',
tags: [TagsMap.walletDiscountCoupon], tags: [DevApiTagsMap.walletDiscountCoupon],
responses: { responses: {
200: { 200: {
description: '成功获取优惠券列表', description: '成功获取优惠券列表',
......
export const TagsMap = { export const DevApiTagsMap = {
/* 核心-应用管理 */ /* 核心-应用管理 */
appCommon: '基础管理', appCommon: '基础管理',
appFolder: '文件夹管理', appFolder: '文件夹管理',
...@@ -25,11 +25,11 @@ export const TagsMap = { ...@@ -25,11 +25,11 @@ export const TagsMap = {
chatInputGuide: '对话输入引导', chatInputGuide: '对话输入引导',
/* 核心-对话模块使用 */ /* 核心-对话模块使用 */
chatHistory: '历史记录管理', chatHistory: '会话管理',
chatFeedback: '对话反馈', chatFeedback: '对话反馈',
chatFile: '文件操作', chatFile: '文件操作',
chatRecord: '对话记录管理', chatRecord: '对话管理',
chatController: '对话操作', chatController: '会话操作',
/* 核心-知识库 */ /* 核心-知识库 */
datasetCommon: '知识库管理', datasetCommon: '知识库管理',
...@@ -72,3 +72,19 @@ export const TagsMap = { ...@@ -72,3 +72,19 @@ export const TagsMap = {
adminInform: '通知管理', adminInform: '通知管理',
adminApps: '应用管理' adminApps: '应用管理'
}; };
export const SystemOpenApiTagMap = {
appLog: 'systemOpenAPI:appLog',
chatHistory: 'systemOpenAPI:chatHistory',
chat: 'systemOpenAPI:chat',
chatFeedback: 'systemOpenAPI:chatFeedback',
chatController: 'systemOpenAPI:chatController',
dataset: 'systemOpenAPI:dataset',
datasetCollection: 'systemOpenAPI:datasetCollection',
datasetCollectionCreate: 'systemOpenAPI:datasetCollectionCreate',
datasetData: 'systemOpenAPI:datasetData',
datasetDataIndex: 'systemOpenAPI:datasetDataIndex',
datasetOther: 'systemOpenAPI:datasetOther'
};
import { describe, expect, it } from 'vitest'; import { describe, expect, it } from 'vitest';
import { openAPIDocument } from '@fastgpt/global/openapi'; import { openAPIDocument } from '@fastgpt/global/openapi/provider/devapi';
import { GetPreviewNodeQuerySchema } from '@fastgpt/global/openapi/core/app/tool/api'; import { GetPreviewNodeQuerySchema } from '@fastgpt/global/openapi/core/app/tool/api';
describe('GetPreviewNodeQuerySchema', () => { describe('GetPreviewNodeQuerySchema', () => {
...@@ -56,4 +56,11 @@ describe('GetPreviewNodeQuerySchema', () => { ...@@ -56,4 +56,11 @@ describe('GetPreviewNodeQuerySchema', () => {
it('keeps full OpenAPI document generation compatible with query params', () => { it('keeps full OpenAPI document generation compatible with query params', () => {
expect(openAPIDocument.paths['/core/app/tool/getPreviewNode']?.get).toBeDefined(); expect(openAPIDocument.paths['/core/app/tool/getPreviewNode']?.get).toBeDefined();
}); });
it('does not expose SystemOpenAPI filter tags in dev API document', () => {
const tags = openAPIDocument.paths['/core/chat/history/getHistories']?.post?.tags ?? [];
expect(tags).toContain('会话管理');
expect(tags.some((tag) => tag.startsWith('systemOpenAPI:'))).toBe(false);
});
}); });
...@@ -225,8 +225,8 @@ export const deleteAppDataProcessor = async ({ ...@@ -225,8 +225,8 @@ export const deleteAppDataProcessor = async ({
{ {
// 删除分享链接 // 删除分享链接
await MongoOutLink.deleteMany({ appId }); await MongoOutLink.deleteMany({ appId });
// 删除 OpenAPI 配置 // 旧应用 APIKey 保留为系统 APIKey,仅移除 deprecated appId 兼容字段。
await MongoOpenApi.deleteMany({ appId }); await MongoOpenApi.updateMany({ appId }, { $unset: { appId: '' } });
// 删除应用版本 // 删除应用版本
await MongoAppVersion.deleteMany({ appId }); await MongoAppVersion.deleteMany({ appId });
// 删除聊天输入引导 // 删除聊天输入引导
......
...@@ -247,10 +247,12 @@ export const scheduleGeneratedChatTitleFromUserContent = (params: { ...@@ -247,10 +247,12 @@ export const scheduleGeneratedChatTitleFromUserContent = (params: {
export const createGeneratedChatTitleSender = ({ export const createGeneratedChatTitleSender = ({
titleGeneration, titleGeneration,
stream, stream,
detail,
writeChatTitle writeChatTitle
}: { }: {
titleGeneration?: Promise<GeneratedChatTitleResult | undefined>; titleGeneration?: Promise<GeneratedChatTitleResult | undefined>;
stream: boolean; stream: boolean;
detail: boolean;
writeChatTitle?: (payload: { writeChatTitle?: (payload: {
event: SseResponseEventEnum.chatTitle; event: SseResponseEventEnum.chatTitle;
data: { title: string }; data: { title: string };
...@@ -268,7 +270,7 @@ export const createGeneratedChatTitleSender = ({ ...@@ -268,7 +270,7 @@ export const createGeneratedChatTitleSender = ({
const { title } = titleResult; const { title } = titleResult;
if (stream) { if (stream && detail) {
writeChatTitle?.({ writeChatTitle?.({
event: SseResponseEventEnum.chatTitle, event: SseResponseEventEnum.chatTitle,
data: { data: {
......
...@@ -2,55 +2,52 @@ import { ERROR_ENUM } from '@fastgpt/global/common/error/errorCode'; ...@@ -2,55 +2,52 @@ import { ERROR_ENUM } from '@fastgpt/global/common/error/errorCode';
import { updateApiKeyUsedTime } from './tools'; import { updateApiKeyUsedTime } from './tools';
import { MongoOpenApi } from './schema'; import { MongoOpenApi } from './schema';
import type { OpenApiSchema } from '@fastgpt/global/support/openapi/type'; import type { OpenApiSchema } from '@fastgpt/global/support/openapi/type';
import type { ApiRequestProps } from '../../type/next';
export type AuthOpenApiLimitProps = { openApi: OpenApiSchema }; export type AuthOpenApiLimitProps = { openApi: OpenApiSchema };
type ApiKeyRequest = Pick<ApiRequestProps, 'method' | 'url'>; const ApiKeyAppIdCredentialReg = /^(.+)-([a-fA-F0-9]{24})$/;
const AppApiKeyChatCompletionPaths = new Set([
'/api/v1/chat/completions',
'/v1/chat/completions',
'/api/v2/chat/completions',
'/v2/chat/completions'
]);
const getRequestPath = (url?: string) => {
if (!url) return '';
const path = new URL(url, 'http://fastgpt.local').pathname;
return path.replace(/\/+$/, '') || '/';
};
/** /**
* 判断当前请求是否为 app 级 APIKey 允许的应用对话调用入口。 * 解析开放接口 Authorization 中的 APIKey 凭证。
* app 级 APIKey 只绑定单个应用,不能复用团队级 APIKey 的其它开放 API 权限面。 *
* `apiKey-appId` 仅用于 OpenAI SDK 兼容,后缀必须是 24 位 ObjectId;
* 命中时只用真实 APIKey 查库,`parsedAppId` 作为 completions 的 appId 兜底来源。
*/ */
export const isAppApiKeyChatCompletionsRequest = (req?: ApiKeyRequest) => { export function resolveOpenApiCredential(rawCredential: string) {
if (req?.method?.toUpperCase() !== 'POST') return false; const credential = rawCredential.trim();
const match = credential.match(ApiKeyAppIdCredentialReg);
return AppApiKeyChatCompletionPaths.has(getRequestPath(req.url)); if (!match) {
}; return {
apikey: credential,
parsedAppId: ''
};
}
return {
apikey: match[1],
parsedAppId: match[2]
};
}
export async function authOpenApiKey({ export async function authOpenApiKey({
apikey, apikey,
req, authApiKey = true
authorizationAppId
}: { }: {
apikey: string; apikey: string;
req?: ApiKeyRequest; authApiKey?: boolean;
authorizationAppId?: string;
}) { }) {
if (!apikey) { if (!apikey) {
return Promise.reject(ERROR_ENUM.unAuthApiKey); return Promise.reject(ERROR_ENUM.unAuthApiKey);
} }
try { try {
const openApi = await MongoOpenApi.findOne({ apiKey: apikey.trim() }).lean(); if (!authApiKey) {
if (!openApi) {
return Promise.reject(ERROR_ENUM.unAuthApiKey); return Promise.reject(ERROR_ENUM.unAuthApiKey);
} }
if ((openApi.appId || authorizationAppId) && !isAppApiKeyChatCompletionsRequest(req)) { const { apikey: realApiKey, parsedAppId } = resolveOpenApiCredential(apikey);
const openApi = await MongoOpenApi.findOne({ apiKey: realApiKey }).lean();
if (!openApi) {
return Promise.reject(ERROR_ENUM.unAuthApiKey); return Promise.reject(ERROR_ENUM.unAuthApiKey);
} }
...@@ -62,10 +59,11 @@ export async function authOpenApiKey({ ...@@ -62,10 +59,11 @@ export async function authOpenApiKey({
updateApiKeyUsedTime(openApi._id); updateApiKeyUsedTime(openApi._id);
return { return {
apikey, apikey: realApiKey,
teamId: String(openApi.teamId), teamId: String(openApi.teamId),
tmbId: String(openApi.tmbId), tmbId: String(openApi.tmbId),
appId: openApi.appId || '', legacyAppId: openApi.appId || '',
parsedAppId,
authProxy: !!openApi.authProxy, authProxy: !!openApi.authProxy,
sourceName: openApi.name sourceName: openApi.name
}; };
......
This diff is collapsed. Click to expand it.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment