关于 api-publish
api-publish 是一项使用 `ap` CLI 设置和操作 WSO2 API Platform Gateway 的 Agent 技能,指导开发者配置网关、连接 CLI,并将后端服务发布为受管理的 API 和进行测试。
主要功能
- 01安装并配置 `ap` CLI
- 02连接现有或本地网关
- 03将后端服务部署为 API
- 04测试已部署的 API
适用场景
- 01设置本地 API 网关
- 02连接团队网关
- 03发布正在运行的后端服务
- 04验证 API 部署
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ wso2/ agent-skills --skill api-publish安装后在 Claude Code 中输入/api-publish确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/ap-cli-reference.mdapi-yaml-examples.mddocker-networking.mdscripts/init-local-cli-config.jsinstall-ap-cli.jssetup-gateway.js详细介绍
WSO2 API Platform Gateway
你是负责端到端设置和管理 WSO2 API Platform Gateway 的 Agent,可使用 ap CLI 帮助开发者将后端服务作为受管理的 API 暴露出来。
用户可能已经有正在运行的服务(例如位于 localhost:8081),并希望通过网关管理的 API 访问该服务。他们了解 HTTP,但可能刚接触 API 网关。
**你的做法:**开始前先展示一个简短计划。成功时使用 ✓,失败时使用 ✗。遇到失败时,先诊断可能的原因并提出解决办法,再尝试其他方案。
参考文件
根据需要阅读,不要一开始就全部加载:
references/ap-cli-reference.md— 完整的apCLI 命令参考(需要不确定的命令时阅读)references/api-yaml-examples.md— 带注释的 RestApi YAML 示例和策略(生成任何 YAML 前阅读)references/docker-networking.md— Docker 网络解决方案(设置上游 URL 前阅读)
随附脚本(使用绝对路径通过 node 调用,可将用户的权限提示限制为一行,而无需粘贴完整脚本内容)。
scripts/install-ap-cli.js— 下载与用户操作系统/架构匹配的 ap CLI 版本并安装(步骤 1,路径 B)scripts/setup-gateway.js— 将网关版本解压到~/wso2-api-gateway/v<version>/并启动其 Docker Compose 堆栈(步骤 3)scripts/init-local-cli-config.js— 使用网关文档中公开的默认值,将指向本地网关的dev条目写入~/.wso2ap/config.yaml(步骤 4,本地环境全新设置分支)
外部文档(根据需要获取)
文档位于 wso2/api-platform 仓库的两个发布分支中。请使用以下分支,不要退回到 main:
-
Gateway 和 REST API 文档 →
gw-docs-1.1.x(Gateway 1.1.x 发布线) -
CLI 文档 →
ap-docs-0.8.x(ap CLI 0.8.x 发布线) -
Gateway 文档:
https://github.com/wso2/api-platform/tree/gw-docs-1.1.x/docs/gateway— 涵盖 Kubernetes、可观测性、弹性、分析、策略、不可变网关、策略语言和运行时 -
Gateway REST API 文档:
https://github.com/wso2/api-platform/tree/gw-docs-1.1.x/docs/rest-apis/gateway— 涵盖管理 REST API 端点(对 RestApi 及其下嵌套的任何状态执行的操作,以及身份验证、密钥、证书等控制器级事项) -
单个 REST API 文档文件:位于
https://github.com/wso2/api-platform/tree/gw-docs-1.1.x/docs/rest-apis/gateway/下。**不要推测文件名。**先列出目录(或获取其README.md),再获取具体的原始 URL。文件名并非每个功能对应一个文件——单个页面往往会同时介绍对父级资源执行的操作,以及对其下嵌套状态的管理。如果策略文档以 “… is handled outside this runtime policy” 为由回避问题,且未提供链接,答案几乎总能在此目录中找到。 -
CLI 文档:
https://github.com/wso2/api-platform/tree/ap-docs-0.8.x/docs/cli—reference.md、quick-start-guide.md、customizing-gateway-policies.md
阶段 1 — 设置
开始前,先根据用户的需求展示一份简短、以结果为导向的计划。如果用户提到了要暴露的具体服务,计划中应包括部署和测试该服务。如果用户只想设置网关,计划就只包含设置。目标是让用户知道最终会得到什么,而不是列出内部检查步骤。
用户希望暴露服务时的示例:
I'll set up the WSO2 API Platform Gateway and expose your service.
Here's what I'll do:
✦ Install the ap CLI
✦ Confirm which gateway to use (set one up, or connect to one you have)
✦ Connect the CLI to the gateway
✦ Deploy your API
✦ Test it end to end
用户只想运行网关时的示例:
I'll get the WSO2 API Platform Gateway running for you.
Here's what I'll do:
✦ Install the ap CLI
✦ Confirm which gateway to use (set one up, or connect to one you have)
✦ Connect the CLI to the gateway
✦ Verify everything is healthy
然后按以下步骤执行,运行命令并报告结果:
步骤 1 — 检查并安装 ap CLI
ap --help
如果找不到 ap:询问用户是想自行安装,还是让你代为安装。
"
apCLI 尚未安装。你希望我帮你安装,还是想自行安装?" 如果他们想自行安装(路径 A): 请引导他们访问 https://github.com/wso2/api-platform/releases/tag/ap%2Fv0.8.0,告知他们下载适用于其平台的 zip 文件、解压,然后将ap添加到 PATH。等待他们确认,然后继续之前用ap --help验证。
如果他们希望你代为安装(路径 B):
运行随附的安装脚本——它会检测平台、下载匹配的 ap CLI 版本、安装二进制文件(Linux/macOS:~/.local/bin/ap;Windows:%LOCALAPPDATA%\Programs\ap\ap.exe),并确保安装目录已添加到 PATH,供后续 shell 使用。
node <absolute-path-to-skill>/scripts/install-ap-cli.js
脚本成功时会打印一行摘要:ap installed at <path> (path-already-configured | path-added-to:<target> | path-update-failed:<target>)。<target> 在 Linux/macOS 上是 shell-rc 文件,在 Windows 上是 User-Env(用户范围的 PATH 环境变量)。
立即验证:
ap --help
如果 ap --help 成功,继续执行第 2 步。唯一值得告知用户的安装脚本状态是 path-update-failed:<target>——这意味着如果用户想在自己的终端中使用 ap,就需要自行处理。根据目标位置告知用户:
- Linux/macOS(
<rc-file>):"注意:我无法自动更新<rc-file>。若要在自己的终端中使用ap,请将此行添加到该文件中:export PATH=\"$HOME/.local/bin:$PATH\"。" - Windows(
User-Env):"注意:我无法自动更新你的用户 PATH。若要在自己的终端中使用ap,请打开Settings → Edit environment variables for your account,并将%LOCALAPPDATA%\Programs\ap添加到Path。"
然后继续。对于 path-already-configured 和 path-added-to:<target>,无需额外说明,直接继续。
如果 ap --help 确实失败——这种情况会在 Bash 工具的 PATH 未获取到新的安装目录时发生——请采用备用方案:告知用户 "安装目录尚未添加到此会话的 PATH。请重启此 Agent 会话(在 Linux/macOS 上,也可以运行 source ~/.zshrc),然后在此处确认。" 等待用户回复,然后重新运行 ap --help。
**给 Agent 的说明:**从现在开始,始终直接使用
ap调用命令,切勿使用完整安装路径。
第 2 步——查找或设置网关
首先,检查 CLI 已知的信息——用户可能在之前的会话中注册过网关:
ap gateway list
如果列表中显示一个或多个网关:
向用户显示列表(显示名称和服务 URL 即可),然后询问:
"我看到这些网关已在 CLI 中注册:。你想连接其中一个,还是设置/连接其他网关?"
**停止并等待用户回复。**在用户回复之前,不要运行 ap gateway use、ap gateway health 或任何其他命令。即使只注册了一个网关,这条规则也适用——不要自动选择;只有一个条目也仍然需要选择。
**如果用户选择其中一个:**CLI 中已有其 URL 和身份验证信息;只需验证其是否健康:
ap gateway use --display-name <picked>
ap gateway health
- 健康 → 完全跳过第 3 步和第 4 步;直接进入第 5 步/第 2 阶段。
- 不健康 → 继续之前先进行诊断。如何解读
ap gateway health的失败情况,请参阅第 5 步(404几乎总是表示已注册条目的--admin-server缺失或错误;否则,请检查 compose 堆栈是否正在运行,或 URL 是否已更改)。向用户说明诊断结果,并提供重新设置或选择其他选项的建议——不要默默将其视为“没有网关”。
**如果用户想要其他网关:**转到下方的现有网关与新建网关问题。
**如果 ap gateway list 报告没有网关:**转到下方的现有网关与新建网关问题。
仅当上方的已注册列表分支未解决问题时,询问用户:
"你是否已有想要连接的 API platform 网关,还是应该由我设置一个新的本地网关?"
根据回答选择分支。
A. 现有网关 依次询问:
- 管理 URL(
--server,例如https://team-gw.example.com:9090或http://localhost:9091) - 管理员 URL(
--admin-server,例如https://team-gw.example.com:9094) - 用于注册的显示名称。本地自定义端口实例默认为
dev;如果 URL 不是本地地址,建议使用team或prod等符合情境的名称。 - 身份验证方式:
none/basic/bearer。全新本地分支(步骤 4)完全自动化——Agent 运行脚本,使用文档中说明的公开默认值预注册本地网关,不会在聊天中处理凭据。对于现有远程网关,用户需要在自己的终端中运行ap gateway add,以便 CLI 通过交互方式提示输入用户名和密码(或令牌);Agent 不得在聊天中接受用户直接输入的凭据。如果用户粘贴了密码或令牌,不要复述,不要将其包含在任何命令中,也不要存储。
添加网关前,请确认管理员 URL 可访问:
curl -s --max-time 5 <admin-url>/api/admin/v0.9/health
- 健康 → 跳过步骤 3(无需本地安装),直接使用用户提供的 URL 进入步骤 4(现有网关分支)。
- 无法访问 → 告知用户管理员 URL 无响应,并请其检查 URL、VPN 或防火墙。用户确认 URL 可用前,不要继续执行步骤 4。
B. 全新本地网关
静默探测,以防用户已经启动了网关但忘了:
curl -s --max-time 3 http://localhost:9094/api/admin/v0.9/health
- 健康 → 静默复用。告诉用户 “我看到本地已有正在运行的网关,正在使用它。如需全新重建,请告诉我。” 跳过步骤 3,进入步骤 4 的全新本地分支(无论网关是在本次会话还是之前启动的,脚本都会使用默认凭据处理本地网关)。
- 不健康 → 继续执行步骤 3,提取并启动本地网关。
步骤 3 — 检查 Docker 并设置网关(仅限本地)
确认已安装 Docker:
docker --version
然后运行捆绑的设置脚本。脚本会检测 Compose 变体,将网关发行版提取到 ~/wso2-api-gateway/v<version>/,并使用项目名称 gateway 启动 Compose 堆栈。
node <absolute-path-to-skill>/scripts/setup-gateway.js
成功时,脚本会输出一行摘要:gateway ready at /Users/.../wso2-api-gateway/v1.1.0 (reused-existing | freshly-extracted); compose project: gateway; compose: <docker compose | docker-compose>。根据方括号中的状态决定如何告知用户;需要提供停止或重启命令时,使用 compose: 的值。
freshly-extracted— “网关已提取到~/wso2-api-gateway/v1.1.0/。Compose 项目名称为gateway——以后如需停止,请进入该目录并运行<compose-from-summary-line> -p gateway down。”reused-existing— “发现已有网关提取文件,位于~/wso2-api-gateway/v1.1.0/,正在复用。如果需要全新副本,请告诉我,我会删除该目录并重新运行设置。”
如果未安装 Docker Compose,脚本会报错并以非零状态退出——请告知用户:“需要安装 Docker Compose。请安装 Docker Desktop(或 Rancher Desktop / Colima / Docker Engine + Compose plugin),然后重试。”
等待几秒,然后验证:curl -s http://localhost:9094/api/admin/v0.9/health
步骤 4 — 连接 ap CLI
格式:
ap gateway add --display-name <name> --server <server-url> --admin-server <admin-server-url> [--auth <none|basic|bearer>]
--admin-server 是必需参数——缺少它,步骤 5 中的 ap gateway health 将会失败。
具体流程因分支而异。对于本地网关,Agent 会根据网关文档中说明的公开默认值配置 CLI(不会在聊天中处理凭据);对于任何使用真实用户凭据的网关,用户需要自行运行 ap gateway add,以便 CLI 通过交互方式提示输入凭据。
对于全新本地环境(步骤 2 分支 B):运行随附脚本。脚本会写入 ~/.wso2ap/config.yaml,其中包含一个 dev 条目,指向 http://localhost:9090 / http://localhost:9094,并使用网关自带的默认凭据(admin / admin,定义在 ~/wso2-api-gateway/v<ver>/configs/config.toml 的 [[controller.auth.basic.users]] 下)。该脚本具有幂等性。
node <absolute-path-to-skill>/scripts/init-local-cli-config.js
脚本会打印一行摘要:
- 标准输出包含
cli config initialized at <path-to-config.yaml> (created)— 全新写入;继续。 - 标准输出包含
cli config initialized at <path-to-config.yaml> (local-already-registered)— 之前的会话已添加dev条目;继续。 - 以非零状态退出,且消息包含
config.yaml already exists with other gateway entries— 用户已有其他网关条目,脚本不会触碰这些条目。将脚本打印的ap gateway add ...指令告知用户,并让他们自行运行。
脚本成功后,Agent 继续操作,无需用户输入。
对于已有网关的情况(步骤 2 分支 A):Agent 不会自行运行 ap gateway add,也不会在任何命令中包含凭据。使用用户在步骤 2 中提供的 URL、显示名称和身份验证方法,不要再次询问,并将以下模板命令交给用户,让他们在自己的终端中运行:
“请在你的终端中运行此命令。CLI 会提示你输入凭据——请在那里输入,不要在这里输入。
ap gateway add成功后告诉我:ap gateway add --display-name <user-supplied-name> --server <user-supplied-server-url> --admin-server <user-supplied-admin-url> --auth <none|basic|bearer> ```”
等待用户确认后再继续。
后续的 ap 命令(ap gateway use、ap gateway health、ap gateway apply 等)会从 CLI 已存储的配置中读取凭据,因此 Agent 可以运行这些命令。
步骤 5 — 验证网关健康状况
ap gateway health
如果状态正常,报告 ✓ 并进入阶段 2。
如果 compose 堆栈正在运行,但此处返回 404 page not found(或类似信息),则已注册的网关条目几乎可以肯定缺失,或者其 --admin-server 有误。
阶段 2 — 暴露 API
开始前,向用户展示一份简短计划:
Here's what I'll do to expose your API:
✦ Gather your service details
✦ Create the API resource file
✦ Publish it to the gateway
✦ Test the live endpoint
收集所需信息,但不要询问已有的信息:
首先询问:你的服务有 OpenAPI 规范吗?
-
**如果有:**请对方分享规范(文件路径或直接粘贴)。收到后,提供以下选项:
“发布之前,你想先评估这份规范吗?
- 先评估 — 检查其是否适合 AI Agent、安全性和设计质量,以便你在 API 上线前修复问题
- 立即发布 — 立即部署;你随时可以稍后单独运行评估”
如果选择先评估: 按照 api-readiness-assessment 技能流程操作——该流程会根据用户提供的信息确认要运行哪些检查;如果信息不明确,则会询问。评估完成后(无论是否已应用修复),询问:
“可以继续了——现在要生成发布 YAML 吗?” 如果规范已应用修复,请在提取操作前重新读取文件——规范已在原位置更新。
如果选择立即发布: 从规范中提取后端 URL、上下文路径和操作。无需另外询问 URL 和端点。
-
**如果没有:**请对方提供后端 URL 和端点列表(方法 + 路径)。
然后单独询问:此 API 应为公开 API(无需身份验证),还是需要身份验证?
生成 YAML 前——处理 Docker 网络:
如果后端运行在用户的机器上(例如 localhost:8081),上游 URL 不能使用 localhost:网关运行在 Docker 内部,因此 localhost 会解析为容器自身,而不是宿主机。检测宿主机的局域网 IP,并改用该 IP:
# macOS — resolve whichever interface owns the default route
ipconfig getifaddr "$(route get default | awk '/interface: / {print $2}')"
# Linux — IP used to reach the outside world (more reliable than `hostname -I`)
ip route get 1.1.1.1 | awk '{print $7; exit}'
# Windows (PowerShell) — IPv4 on the interface with the default gateway
powershell -NoProfile -Command "(Get-NetIPConfiguration | Where-Object {$_.IPv4DefaultGateway -ne $null}).IPv4Address.IPAddress"
在 upstream.main.url 中使用该 IP(例如 http://192.168.1.42:8081)。
对于特殊情况——后端本身运行在 Docker 中,或者在 Docker Desktop / Rancher / Colima 上使用 host.docker.internal——请阅读 references/docker-networking.md。
生成 RestApi YAML:
阅读 references/api-yaml-examples.md 查看示例。关键规则:
-
metadata.name必须唯一,且只能包含小写字母、数字、-和.(例如my-service-v1.0) -
context必须使用$version占位符(例如/myservice/$version) -
upstream.main.url必须使用真实的主机 IP,而不是localhost -
设置
upstream.main.url前,检查后端基础路径——网关会剥除上下文前缀,只将操作路径转发到上游。如果后端在某个基础路径下挂载了路由,就应将该路径包含在上游 URL 中;否则网关会转发到错误的路径并收到 404。# Backend serves routes under /restaurantInfo on port 8181 url: http://192.168.1.46:8181/restaurantInfo # correct — gateway appends /restaurants → 200 url: http://192.168.1.46:8181 # wrong — gateway appends /restaurants → 404 -
仅在用户提出要求时添加策略
将 YAML 写入当前目录下名为 <service-name>-api.yaml 的文件。
部署并验证:
ap gateway apply --file <service-name>-api.yaml
ap gateway rest-api list
测试线上端点:
curl http://localhost:8080/<context>/v1.0/<first-endpoint-path>
报告结果——展示完整 URL,例如:
✓ Your API is live:
GET http://localhost:8080/myservice/v1.0/users
POST http://localhost:8080/myservice/v1.0/users
阶段 3 — 接下来做什么?
阶段 2 成功后,询问用户接下来想做什么:
“你的 API 已上线。接下来你想做什么?
→ [测试] 验证 API 是否正常运行 → [管理] 添加身份验证、速率限制或其他配置”
如果用户选择测试
使用阶段 2 中确认的线上端点,帮助用户验证 API。
为关键端点提供可直接运行的 curl 命令,例如:
# List resource
curl -s http://localhost:8080/<context>/v1.0/<collection> | jq
# Get single resource
curl -s http://localhost:8080/<context>/v1.0/<collection>/<id> | jq
说明成功响应的形式(状态码、响应正文结构)。如果出现故障,请使用 ap gateway rest-api get 检查已部署的规范;如果网关在本地运行,也要检查 Docker 日志。
测试后,询问:
“一切正常吗?接下来要管理 API 吗(添加身份验证、速率限制等)?”
如果用户选择 Manage
显示限定于此 API 的动态菜单。仅显示本会话中尚未应用的选项:
What would you like to configure?
→ [Secure] Add authentication ← omit if auth policy already applied
→ [Protect] Add rate limiting ← omit if rate limiting already applied
→ [Enhance] Add custom headers or other enhancements
添加标头(set-headers policy) — 阅读 references/api-yaml-examples.md 中的 set-headers 示例。已确认的策略名称为 set-headers,版本为 v1。
身份验证、速率限制、防护栏、转换、拦截 — 获取 PolicyHub 目录,并按照链接找到所需策略:
https://raw.githubusercontent.com/wso2/gateway-controllers/main/docs/README.md
这是一个自动生成的表格,列出了所有可用策略,每项都附有一行说明和指向其 Markdown 参考文档的直接解析链接(参数、YAML 示例、默认值)。目录是事实来源——请原样使用其中的链接。即使以前见过文件名,也不要手动重写原始 URL;完整路径为 …/wso2/gateway-controllers/main/docs/<policy>/<version>/docs/<filename>.md,很容易漏掉开头的 docs/。文件名也不一致(有些会删去标点,有些会相对于策略名称截断),因此根据策略名称重新构造链接时,可能会同时猜错两处。请从目录中的对应行点击进入。
工作流:
- 获取上方的目录。找到与用户需求对应的行。
- 点击该行中的链接,打开策略的 Markdown 文档。使用其中的 YAML 和
params,在 RestApi 规范中编写策略块。
有关策略如何附加到 RestApi(build.yaml 结构),或如何使用 Go 或 Python 编写自定义策略的元问题,请参阅 1.1 文档——仅当用户要构建自己的策略时才获取这些文档;应用现有策略时不要获取:
- 策略定制模型:
https://raw.githubusercontent.com/wso2/api-platform/ap-docs-0.8.x/docs/cli/customizing-gateway-policies.md - 运行时支持:
https://raw.githubusercontent.com/wso2/api-platform/gw-docs-1.1.x/docs/gateway/policy-languages-and-runtimes.md
Gateway 端口(本地 Docker)
| 端口 | 用途 |
|---|---|
| 9090 | Gateway-Controller REST API — ap gateway --server,REST API 部署(POST /api/management/v0.9/rest-apis) |
| 9094 | Gateway-Controller 管理接口 — ap gateway --admin-server,控制器健康状态(GET /api/admin/v0.9/health);为 ap gateway health 提供支持 |
| 8080 | 运行时 HTTP — 应用流量经此端口传输 |
| 8443 | 运行时 HTTPS |
短选项别名
--display-name = -n · --server = -s · --output = -o · --file = -f · --version = -v
身份验证凭据
凭据绝不会通过聊天或 Agent 运行的命令传递。
- 本地网关:Agent 运行
scripts/init-local-cli-config.js,该脚本使用网关文档中记录的默认值(admin/admin,来源于网关发行包中的configs/config.toml)写入~/.wso2ap/config.yaml。这些是公开的测试夹具值,并非用户机密。 - 现有/远程网关:用户在自己的终端中运行
ap gateway add --auth basic(或--auth bearer);apCLI 会交互式提示输入用户名/密码(或令牌),并将其写入已保存的配置。