Skip to content

Release 管理 API ​

管理项目的 Release(对外发布的 API 集合),包括 Release CRUD、别名管理和版本管理。

基础路径 ​

/projects/:projectId/releases

认证方式 ​

本模块管理操作使用 JWT 用户会话。以下三条读取额外接受带 project:releases:read scope 的 OAuth Bearer Token;API Key 和 Agent Token 不能调用这些管理读取接口:

  • GET /projects/:projectId/releases/documents
  • GET /projects/:projectId/releases/documents/:documentId
  • GET /projects/:projectId/releases/deployments

OAuth 应用需先获准该能力并取得用户同意,不能凭已有 token 自动获得新 scope。读取仍要求授权用户具有目标项目的 read 权限,且项目未删除。此处与对外运行 /api/released-app/... 的认证合同不同。

权限说明 ​

管理读取要求项目 read 权限;管理写操作要求项目 write 权限。项目可见但没有写权限时返回 403,项目不存在或调用者不可见时返回 404。

OAuth 读取部署 schema ​

文档列表用于发现 Flow;文档详情的 liveApiSchema 是当前草稿,deployments[].apiSchema 才是对应发布版本。部署列表支持可选查询参数 deploymentId=<uuid>,不匹配返回 { "deployments": [] },非法 UUID 返回 400 invalid_deployment_id。查询始终限定目标项目和未删除部署。

部署条目保留原 version(如 2.3)、apiSchema 等字段,并提供 id、revisionId、versionMajor、versionMinor、versionPatch。历史没有的版本元数据返回 null,不补造。响应不返回工作流快照、内部 manifest 或 Output 取值表达式。

apiSchema.metadataVersion=1 的投影包括 Input 完整 schema(含嵌套 items/properties/required,保留 schemaType)及 Output 顶层 nullable。nullable 与 required 独立;旧投影缺少 nullable 不代表 false。

schemaStatus含义
complete已声明 Output,已有声明被完整投影
legacy没有 Output 声明,保持历史数据块枚举,不能当成完整业务输出契约
incomplete历史元数据无法可靠恢复,保留可读旧 schema,检查 schemaWarnings

schemaWarnings 返回机器可读代码:output_not_declared(legacy),或 api_schema_invalid、snapshot_missing、snapshot_invalid、snapshot_query_failed、output_config_invalid、schema_snapshot_mismatch(incomplete)。无效旧 schema 返回 apiSchema:null,不会伪造完整结构。

历史补全只读取该部署的冻结快照,不修改历史数据或用当前草稿替换旧版。部署 Input 只列实际引用的输入,草稿 liveApiSchema 沿用编辑器的全部 Input 绑定视图。

历史 Output 绑定或出口覆盖损坏时,发布预览保守显示 major;有效旧绑定的纯元数据补齐仍为 minor。

本项不改变现有运行校验或版本调用规则:完整元数据不代表新增 Input 深层校验,Output 嵌套 null 仍不支持。已有运行接口不传 version 仍选择对应文档的最新发布;要与某次历史 schema 匹配,须沿用显式版本参数。

新生成的公开 API 文档同步 nullable;已经发布的公开文档缓存保持冻结,不会自动改写。本项原生 apiSchema 合同与历史 OpenAPI 缓存应分别使用。

术语说明 ​

术语说明
Release对外发布的完整 API 集合
AliasRelease 的人类可读别名(如 my-app),用于构建访问 URL
VersionRelease 的版本快照,支持发布/废弃/下线生命周期
Deployment文档的部署版本,可绑定到 Release 端点

一、Release 管理 ​

1. 获取项目的 Release ​

GET /projects/:projectId/releases

获取项目关联的 Release 信息。

Path 参数

参数类型必填说明
projectIdstring是项目 ID

响应 200

json
{
  "release": {
    "id": "uuid",
    "project_id": "uuid",
    "name": "My API",
    "alias": "my-api",
    "content": { ... },
    "created_at": "2026-01-01T00:00:00Z"
  }
}

如果项目没有 Release,返回 { "release": null }。

错误码

状态码说明
401未认证
404项目不存在或无权访问
500操作失败

2. 创建 Release ​

POST /projects/:projectId/releases

为项目创建一个新的 Release。

Path 参数

参数类型必填说明
projectIdstring是项目 ID

Body 参数(JSON)

参数类型必填说明
namestring是Release 名称

响应 201

json
{
  "release": { ... }
}

错误码

状态码说明
401未认证
404项目不存在或无权访问
409别名冲突
500操作失败

3. 更新 Release 内容 ​

PUT /projects/:projectId/releases/:releaseId

更新 Release 的配置内容,包括端点配置、鉴权设置等。

认证与权限:仅 JWT/API Key;需要 project:write。Agent Token 或项目可见但缺少写权限时返回 403。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID

Body 参数(JSON)

参数类型必填说明
contentReleaseDocumentContent是Release 配置内容

校验规则:

  • 关闭鉴权(requireAuth === false)时,必须指定 apiKeyId
  • 端点级跳过鉴权(skipAuth === true)时,必须有端点级或全局 apiKeyId
  • billingMode === 'release' 时必须开启鉴权,且所有端点都禁止 skipAuth

billingMode 缺失或为 default 时保持现有结算规则;设为 release 时,仅允许含 release:invoke Scope 的 OAuth Token 调用,由 Release 所属 Team 付款,数据仍写入绑定的 Deployment Project。

响应 200

json
{
  "release": { ... }
}

错误码

状态码说明
400content 缺失、鉴权配置不合法
401未认证
403Agent Token,或项目可见但缺少 project:write 权限
404项目不存在、调用者不可见或 Release 不存在
409别名冲突
500操作失败

4. 删除 Release ​

DELETE /projects/:projectId/releases/:releaseId

删除指定的 Release。

认证与权限:仅 JWT/API Key;需要 project:write。Agent Token 或项目可见但缺少写权限时返回 403。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID

响应 200

json
{
  "success": true
}

错误码

状态码说明
401未认证
403Agent Token,或项目可见但缺少 project:write 权限
404项目不存在、调用者不可见或 Release 不存在
500操作失败

二、别名管理 ​

5. 检查别名可用性 ​

GET /projects/:projectId/releases/check-alias/:alias

检查指定别名是否可用。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
aliasstring是要检查的别名

响应 200

返回别名可用性检查结果。

错误码

状态码说明
401未认证
404项目不存在或无权访问
409别名已被占用
500操作失败

6. 设置别名 ​

POST /projects/:projectId/releases/:releaseId/alias

为 Release 设置别名。别名用于构建对外访问 URL。

认证与权限:仅 JWT/API Key;需要 project:write。Agent Token 或项目可见但缺少写权限时返回 403。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID

Body 参数(JSON)

参数类型必填说明
aliasstring是别名。只允许小写字母、数字和连字符,格式匹配 /^[a-z0-9][a-z0-9-]*[a-z0-9]$/ 或单字符 /^[a-z0-9]$/

响应 200

json
{
  "success": true,
  "alias": "my-api"
}

错误码

状态码说明
400alias 缺失或格式不合法
401未认证
403Agent Token,或项目可见但缺少 project:write 权限
404项目不存在、调用者不可见或 Release 不存在
409别名已被其他 Release 占用
500操作失败

7. 删除别名 ​

DELETE /projects/:projectId/releases/:releaseId/alias

删除 Release 的别名。

认证与权限:仅 JWT/API Key;需要 project:write。Agent Token 或项目可见但缺少写权限时返回 403。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID

响应 200

json
{
  "success": true
}

错误码

状态码说明
401未认证
403Agent Token,或项目可见但缺少 project:write 权限
404项目不存在、调用者不可见或 Release 不存在
500操作失败

三、Deployment 列表 ​

8. 获取 Deployment 列表 ​

GET /projects/:projectId/releases/deployments

获取项目下的 Deployment 列表,用于端点绑定选择。

Path 参数

参数类型必填说明
projectIdstring是项目 ID

响应 200

json
{
  "deployments": [
    {
      "id": "uuid",
      "title": "文档标题",
      "version": "1.2",
      "documentId": "uuid",
      "visibility": "public",
      "createdAt": "2026-01-01T00:00:00Z"
    }
  ]
}

错误码

状态码说明
401未认证
404项目不存在或无权访问
500查询失败

四、版本管理 ​

9. 创建版本 ​

POST /projects/:projectId/releases/:releaseId/versions

创建版本快照(快照当前 Release 内容)。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID

响应 201

json
{
  "version": {
    "id": "uuid",
    "version": "1.0",
    "status": "draft",
    "created_at": "2026-01-01T00:00:00Z"
  }
}

错误码

状态码说明
401未认证
404项目不存在、无权访问、Release 不存在或 ID 不匹配
500操作失败

10. 列出版本 ​

GET /projects/:projectId/releases/:releaseId/versions

获取 Release 的所有版本列表。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID

响应 200

json
{
  "versions": [
    {
      "id": "uuid",
      "version": "1.0",
      "status": "published",
      "published_at": "2026-01-01T00:00:00Z"
    }
  ]
}

错误码

状态码说明
401未认证
404项目不存在、无权访问、Release 不存在或 ID 不匹配
500操作失败

11. 发布版本 ​

POST /projects/:projectId/releases/:releaseId/versions/:versionId/publish

校验版本可执行性,生成脱敏 REST/OpenAPI 静态缓存,并以一次原子更新将版本设为已发布。无论 private、unlisted 还是 public 都会生成缓存;文档缓存不会包含内部工作流或字段映射。

输出字段类型的补齐:输出映射的 type 定义上是「从绑定的部署输出继承」。若配置里该字段缺失, 发布时会从绑定源的 variableType 取回来,并把补齐后的配置随本次发布一起落库。 绑定源也给不出类型时返回 400,提示重新选择该字段的输出绑定来源——不会猜一个类型顶上, 猜出来的类型会被固化进对外 API 文档。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID
versionIdstring是版本 ID

Body 参数(JSON,可选)

参数类型必填说明
releaseNotesstring否对外发布说明,trim 后最多 4000 字符

响应 200

json
{
  "success": true,
  "docs": {
    "visibility": "public",
    "alias": "my-api",
    "version": "1.0.0",
    "publisher": {
      "name": "Example Team",
      "slug": "example-team",
      "isOfficial": false
    }
  }
}

错误码

状态码说明
400发布前校验不通过:非 draft 状态、alias 无效、releaseNotes 超长、端点绑定/输入输出映射有问题(含输出字段缺类型且无法从绑定源继承)
401未认证
404项目不存在、无权访问或版本不存在
500操作失败

12. 废弃版本 ​

POST /projects/:projectId/releases/:releaseId/versions/:versionId/deprecate

将版本标记为已废弃。仅允许对 published 版本操作 —— 「废弃」的语义前提是它曾经对外可用, 从未发布过的草稿不能被废弃(详见下方「版本状态机」)。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID
versionIdstring是版本 ID

响应 200

json
{
  "success": true
}

错误码

状态码说明
400状态流转非法(如草稿直接废弃、已下线回退),或版本状态被并发修改需重试
401未认证
404项目不存在、无权访问或版本不存在
500操作失败

13. 下线版本 ​

POST /projects/:projectId/releases/:releaseId/versions/:versionId/offline

将版本设为下线状态。仅允许对 published 或 deprecated 版本操作(详见下方「版本状态机」)。

Path 参数

参数类型必填说明
projectIdstring是项目 ID
releaseIdstring是Release ID
versionIdstring是版本 ID

响应 200

json
{
  "success": true
}

错误码

状态码说明
400状态流转非法(如草稿直接下线、已下线重复下线),或版本状态被并发修改需重试
401未认证
404项目不存在、无权访问或版本不存在
500操作失败

版本状态机 ​

版本状态单向流转,不可回退:

draft ──发布──> published ──废弃──> deprecated
                    │                    │
                    └─────下线───────────┴──> offline
当前状态允许流转到说明
draftpublished只有草稿能发布
publisheddeprecated / offline已发布的版本才谈得上废弃或下线
deprecatedoffline废弃后仍可下线
offline无终态

任何不在上表中的流转一律返回 400,并说明当前状态与目标状态。

服务端在读取当前状态与写入新状态之间使用条件更新(CAS):若两者之间状态被并发改动, 更新命中 0 行并返回 400 提示刷新重试,而不会越过状态机。

历史:这套状态机此前只写在代码注释里、实现从未校验,导致生产库出现过 「已废弃但从无发布记录」的版本(草稿被直接标记为废弃)。现由服务层强制。


五、匿名动态文档 API ​

以下端点无需认证,只返回发布时固化的脱敏文档 DTO。private 与不存在统一返回 404;unlisted 不进入目录但可通过链接访问。

GET /public/release-docs ​

列出可见性为 public 的最新 Release 文档。支持 query、page、pageSize(最大 50),响应包含 ETag 与短缓存头。

GET /public/release-docs/:alias ​

返回指定 alias 的最新可访问版本、版本摘要列表、公开 REST 契约、Changelog 和 OpenAPI 内容。

GET /public/release-docs/:alias/versions/:version ​

返回指定版本。version 支持 latest、v1、v1.2、v1.2.3。历史版本访问受最新发布快照的可见性总闸控制,历史 private 快照不会进入版本列表或被直接读取。

GET /public/release-docs/:alias/versions/:version/openapi.json ​

下载 OpenAPI 3.0.3 JSON。servers 按当前 API 请求的可信 origin 生成,因此 ETag 按 origin 隔离。

所有公开端点支持 If-None-Match;命中时返回 304。


六、文档站登录访问 ​

文档站登录后通过同源 /docs-api/release-docs/* 读取授权目录和详情。浏览器只发送 HttpOnly wn_docs_session Cookie;nginx 转发到内部路由并注入共享密钥,前端不会把 OAuth access token 放入文档请求头或 URL。

授权目录包含:

  • 全部 public 文档;
  • 当前用户可读取项目中的 private 与 unlisted 文档。

项目读取权限与项目页一致:项目所有者、Team Owner、accepted Team member 或显式 project/read grant。site:admin 不自动获得所有项目的私有文档。无权限与不存在统一返回 404。

认证通道的成功和错误响应均使用 Cache-Control: private, no-store 与 Vary: Cookie,不会复用匿名公开端点的 ETag/共享缓存。私有 OpenAPI 的 server origin 只从后端 BACKEND_URL 推导,配置缺失或非法时 fail closed。

早于文档缓存功能发布、且版本内没有 publicDocsCache 的历史 Release 不会在读取时动态生成文档。需要重新发布该版本配置后才可在文档站查看。


七、官方团队名单管理 ​

以下端点位于 /admin/site-settings,只接受 JWT,要求 site:admin,并记录 adminAudit:

  • GET /admin/site-settings/release-docs-official-teams
  • PUT /admin/site-settings/release-docs-official-teams,Body:{ "teamIds": ["uuid"] }

PUT 校验 UUID 和团队存在性,写后回读,并返回 previousTeamIds/currentTeamIds。误配时由管理员从响应或审计记录恢复旧完整数组。名单变化只影响之后的新发布,不改写历史文档快照。


源码 ​

  • 路由:apps/backend/src/routes/releases.ts
  • 服务:apps/backend/src/services/release.ts、release-version.ts、release-public-doc.ts、release-public-doc-store.ts
  • 类型:apps/backend/src/types/release.ts
  • 参考文档:应用发布指南

补充端点 ​

本节补充 plans/need-update-api.md 中尚未覆盖到 docs-site 的接口。端点标题保持严格的 METHOD /path 格式,便于后台文档覆盖率服务识别。

GET /projects/:projectId/releases/:releaseId/debug-logs ​

获取指定 Release 端点的调试日志。

认证与权限:仅接受 JWT 用户会话(Authorization: Bearer <用户会话 JWT>),调用者必须具有目标项目的 write 权限。API Key、Agent Token 和 OAuth Token 不作为本接口的用户会话凭据。

路径参数

参数说明
projectId项目 ID
releaseIdRelease ID

Query 参数(无请求体)

参数必填说明
endpointKey是要查询的 Release 端点 key
limit否每页条数,默认 50。按十进制 parseInt 解析,解析失败时使用 50,解析结果限制在 1~100
beforeCreatedAt与 beforeId 成对上一页最后一条日志的 created_at。格式为带 Z 或 ±HH:MM 时区的时间,如 2026-10-03T10:00:00.123456+00:00;小数秒可省略,最多 6 位
beforeId与 beforeCreatedAt 成对上一页最后一条日志的 id,必须为 UUID v1~v5

日志按 created_at、id 双降序返回。第一页不传游标;当 hasMore=true 时,使用当前页最后一条日志的两个字段查询下一页。必须对 Query 值做 URL 编码,时区中的 + 编码为 %2B。例如,page 为当前页响应时,可这样构造下一页参数:

js
const lastLog = page.logs[page.logs.length - 1]
const query = new URLSearchParams({
  endpointKey,
  limit: '50',
  beforeCreatedAt: lastLog.created_at,
  beforeId: lastLog.id,
})
// query.toString() 会编码时间中的 +,避免它被解析为空格。

响应(200)

json
{
  "logs": [],
  "hasMore": false
}

logs 为当前页记录,hasMore 表示还有更早的记录。响应不包含 nextCursor。每条日志返回以下字段,字段值沿用已存储的值;JSON 字段可能为对象、数组、标量或 null。

字段说明
id日志 ID;与 created_at 共同组成游标
release_document_idRelease 文档 ID
endpoint_keyRelease 端点 key
alias请求使用的 Release 别名
version请求使用的版本
methodHTTP 方法
path请求路径
request_headers已存储的请求头
request_body已存储的请求体(JSON)
query_params已存储的 Query 参数(JSON)
mapped_inputs已存储的工作流映射输入(JSON)
status_code请求的 HTTP 状态码,可能为 null
response_body已存储的响应体(JSON)
error已记录的错误,可能为 null
run_id关联的 Run ID,可能为 null
duration_ms请求耗时,单位为毫秒
created_at日志创建时间

查询限定在当前项目的 Release 与所选 endpointKey。接口验证 Release 归属,但不检查该 key 的端点配置是否存在;没有匹配日志时返回空列表。此响应包含端点请求记录,完整 Run timeline 需使用对应的 Run 接口。

定时清理任务删除 created_at 早于任务执行时刻减 7 天的端点调试日志。实际删除随任务执行发生,不保证满 7 天立即删除。该清理阈值只用于端点调试日志。

常见错误:先验证身份和项目权限,再校验业务参数。

状态码条件
400缺少 endpointKey;游标未成对提供;时间或 UUID 格式无效
401未认证或凭据失效
403已通过凭据验证但不是用户会话(User session token required);或项目可见但没有 write 权限(项目写权限不足)
404项目不存在或不可见(项目不存在或无权访问);或 Release 不存在、已删除或不属于该项目(Release 不存在)
500日志查询或服务端操作失败

DELETE /projects/:projectId/releases/:releaseId/debug-logs ​

清空指定 Release 端点的调试日志。

认证与权限:仅接受 JWT 用户会话,调用者必须具有目标项目的 write 权限。API Key、Agent Token 和 OAuth Token 不作为本接口的用户会话凭据。

路径参数

参数说明
projectId项目 ID
releaseIdRelease ID

Query 参数(无请求体)

参数必填说明
endpointKey是要清空日志的 Release 端点 key

删除范围仅为当前 Release 与该 endpointKey 的日志,其他端点的日志保留。接口验证 Release 归属,不检查端点配置是否存在;没有匹配日志也返回成功。此操作不关闭调试模式,后续请求仍可产生新日志。

响应(200)

json
{ "success": true }

常见错误:先验证身份和项目权限,再校验业务参数。

状态码条件
400缺少 endpointKey
401未认证或凭据失效
403已通过凭据验证但不是用户会话(User session token required);或项目可见但没有 write 权限(项目写权限不足)
404项目不存在或不可见(项目不存在或无权访问);或 Release 不存在、已删除或不属于该项目(Release 不存在)
500清空日志或服务端操作失败

PATCH /projects/:projectId/releases/:releaseId/endpoints/:endpointKey/debug ​

切换端点调试模式。

认证与权限:仅接受 JWT 用户会话,调用者必须具有目标项目的 write 权限。API Key、Agent Token 和 OAuth Token 不作为本接口的用户会话凭据。

路径参数

参数说明
projectId项目 ID
releaseIdRelease ID
endpointKeyRelease 端点 key

请求体:JSON 对象,debug 为必填布尔值。

json
{ "debug": true }

true 开启调试,false 关闭调试。仅更新该端点的 settings.debug。关闭调试不会删除已有日志;要清空历史记录,使用上面的 DELETE 接口。

响应(200)

json
{ "success": true }

常见错误:先验证身份和项目权限,再校验业务参数。

状态码条件
400请求体不是合法 JSON;或 JSON 对象中 debug 缺失或不是布尔值
401未认证或凭据失效
403已通过凭据验证但不是用户会话(User session token required);或项目可见但没有 write 权限(项目写权限不足)
404项目不存在或不可见(项目不存在或无权访问);Release 不存在、已删除或不属于该项目;或端点配置不存在
409Release 已被并发修改(Release 已被其他修改更新,请刷新后重试)
500更新或服务端操作失败

GET /projects/:projectId/releases/documents ​

可发布文档列表

认证:JWT Bearer Token、API Key 或 Agent Token(combinedAuth)。 路径参数

参数说明
projectId项目 ID

请求:无请求体。Query 参数用于分页、过滤、搜索或状态筛选;未传时按后端默认排序与分页返回。

响应:成功时返回列表数据,通常包含 items / data / rows 与分页或统计字段。

常见错误:400 参数非法,401 未认证,403 权限不足,404 资源不存在;服务端或上游异常返回 500。


GET /projects/:projectId/releases/documents/:documentId ​

获取文档发布状态

认证:JWT Bearer Token、API Key 或 Agent Token(combinedAuth)。 路径参数

参数说明
projectId项目 ID
documentId文档 ID

请求:无请求体。Query 参数用于分页、过滤、搜索或状态筛选;未传时按后端默认排序与分页返回。

响应:成功时返回目标资源详情、状态或配置对象。

常见错误:400 参数非法,401 未认证,403 权限不足,404 资源不存在;服务端或上游异常返回 500。

AI Workflow Editor