每个 agent 演示之所以能够工作,是因为 agent 只需要回答。当 agent 需要执行操作时,生产才真正开始:克隆仓库、创建拉取请求、查询数据库、退款支付、提交工单。agent 一旦开始行动,四个问题会同时出现。凭证存放在哪里。谁有权批准写操作。失败时会发生什么。此次运行的成本是多少。
本文介绍了为 agent 提供工具的五种方式及各自的权衡。下半部分是对 DigitalOcean Action Gateway 的动手实操演练。该演练中的每条命令和每个输出均来自于 2026 年 9 月 2 日的现场会话,使用了 doctl 1.168.0-beta。
DigitalOcean Managed Agents Runtime Services 在 DigitalOcean 基础设施上以隔离的 Firecracker microVM 运行编码 agent。它提供两种工具。Harness Runtime 是 agents 运行、持久化和扩展的托管环境。Action Gateway 为这些 agent 提供对所需工具、API 和 SaaS 系统的受控访问。
M.A.R.S. 目前仅通过邀请制的私有预览提供。点此申请访问权限。
DigitalOcean Action Gateway 解决的问题
想象一个支持代理关闭一张工单。它在数据库中查找订单,通过 Stripe 发起退款,并在 Slack 中发布摘要。这涉及三个系统、三个集成和三组凭证。如果你自己来连接这些部分,你就要负责演示中通常不会出现的细节:每个令牌存放的位置及其轮换方式,谁有权批准退款,当 Stripe 在凌晨 2 点返回速率限制错误时会发生什么,以及是否有人能够重建代理一周前的操作。再加上第四个工具,你就需要重复完成所有这些步骤。
工具正常工作后,第二个问题随之出现。代理发送了格式错误的参数,并在被拒绝时陷入循环。供应商返回一个裸露的 401 错误,模型猜测是应该重试、重新授权还是停止。数据库查询返回 40 KB 的 JSON,此后会话中的每一轮都会为这些 token 付费。团队最终不得不在代理周围搭建执行层,而不是去构建客户购买的产品。
Action Gateway 同时解决了这两个问题。 凭据在代理外部解析,因此泄漏的转录不会泄漏令牌。已批准的工具只需配置一次即可复用。故障会以结构化错误的形式返回,代理可以从中恢复,而不是原始状态码。工具发现通过搜索实现,因此模型只看到任务所需的少量工具,而不是每轮都看到完整的目录。你将放弃对执行路径的一些控制,以换取不必维护它。

托管代理运行时服务提供的功能

-
Harness Runtime 为您的 AI 编码代理(Claude Code、Codex CLI、OpenCode)或自定义的 LangGraph/CrewAI 代理提供一个与笔记本独立运行的隔离、持久的云沙箱,无需构建或管理任何基础设施。
-
Action Gateway 为这些代理提供受管控的工具访问权限,如 GitHub、Jira、Notion、Linear、Postgres 以及 1000+ 种 SaaS 工具,无需逐一配置凭据。
托管代理运行时服务具有以下功能:
| 功能 | 含义 |
|---|---|
| 持久会话 | 暂停和恢复时不会丢失会话的环境或状态 |
| 隔离执行 | 代理生成的代码在专用的 Firecracker 微型虚拟机中运行 |
| 人工审批 | 定义哪些操作可以自主运行,哪些需要审批签发 |
| 原生 GitHub 支持 | 克隆仓库、创建分支、提交更改、打开拉取请求 |
| 托管工具访问 | 通过集中认证和策略控制访问外部系统 |
| Harness 灵活性 | 支持的编码代理、LangGraph 工作负载或自定义环境 |
会话启动时间不到一秒,从暂停恢复只需不到 200 毫秒,期间保留文件、进程和工作状态。支持的代理包括 Claude Code、Codex CLI 和 OpenCode,以及基于 LangGraph 或 CrewAI 构建的代理。与其在专有框架周围重新构建您的代理,不如定义一个环境模板,将您的 harness、依赖、工具和配置打包在一起。对于 Action Gateway,DigitalOcean 将 GitHub、Jira、Notion、Linear 和 Postgres 列为受管控的服务,认证、权限、审批和审计控制均由中心统一管理。
这三个用例是实用的而非抽象的:从另一台设备继续会话、在任务进行中将工作交给队友、以及在不增加基础设施的情况下并行运行多个代理。
要点摘要
- Action Gateway 不会将工具目录加载到您的模型上下文中。该端点仅暴露三个工具:
action_search用于按用例查找工具,action_invoke用于并行运行最多 10 个工具,以及action_code用于在临时沙箱中执行 Python。 - 在 Managed Agents 沙箱中,网关解析为 DigitalOcean 内部地址,而非公共主机名,且客户端配置不携带 bearer 令牌。
- DigitalOcean 管理的工具无需凭据设置。通过网关进行的网页搜索在会话文件中没有 API key,沙箱中也没有,因而成功。
- 需要用户授权的工具会返回一个结构化的
unauthorized错误,其中携带登录链接、验证码以及recovery_hint字段,而不是单纯的 401。 - 对于网关工具调用,默认权限
ask不起作用。API 会在会话创建时返回警告。请使用显式的allow规则。 - 在送达沙箱的策略中,网关工具的权限执行被标记为
best-effort;沙箱内部的直接调用在无规则的默认ask策略下运行。应将该策略视为代理工具路径的防护栏,而非网络边界。
瓶颈已从推理转移到行动
Arcade.dev 在 2026 年 6 月融资 6000 万美元的 A 轮,使总融资额达到 7200 万美元,并在 我们看到了行动层的到来。现在我们将掌控它 中明确阐述了问题。
他们的观点很明确:代理失败并非因为模型能力不足。代理失败的原因是没有系统能证明代表此用户的该代理被允许在该资源上执行此操作。他们报告称,工具调用量在六个月内增长了 25 倍,且拥有超过 8000 个针对代理优化的工具。
请将其视为市场证据,而非 DigitalOcean 的宣称。在专用动作层中进行如此规模的融资表明,问题已成为一个产品类别,而非每个团队只需编写一次的胶水代码。
DigitalOcean 的定位是相邻性。无服务器推理 提供模型。Harness Runtime 运行沙箱。Action Gateway 代理工具。一个账户,一个令牌,数据与计算资源相邻。
一个用于推理的具体工作负载
抽象的比较难以评估,因此我们在整个过程中使用一个工作负载。一个在基准仓库中工作的托管编码代理,包含三个难度递增的任务:
- 读取原始结果并重新运行分析脚本。仅使用文件系统和 Python。
- 创建分支、编辑文件、提交、推送、打开拉取请求。需要 Git 和一个凭据。
- 在公开网络上查询当前定价,列出 Droplet 规格,添加带日期的备注,提交工单。需要 Web 访问、云 API 和第三方系统。
任务 1 不需要外部工具。任务 2 需要一个凭据。任务 3 是布线选择开始产生成本的地方,也是 Action Gateway 发挥作用的地方。

该阶梯的每一步都是向代理提供工具的一种方式。向右移动时,密码会离代理越来越远;向上移动时,您对运行内容的控制力更强,并且能获得更多事后发生情况的证据。每个块底部的小灰线是人们在选择时常被忽略的部分:即在凌晨 2 时系统出故障时您所看到的内容。
-
本地沙箱工具。 代理在自己的机器内获得 shell、文件和 git,除此之外一无所有。由于没有任何内容会离开该盒子,因此不会有密码泄露的风险。当出现故障时,您会得到一个退出码,就像脚本崩溃时一样。
-
环境中的凭据。 您将 API 密钥粘贴到会话文件中。五分钟的工作后它就会运行。该密钥还以明文形式放置在代理旁边,因此任何拥有 shell 的进程都能读取它。这就是块上的琥珀色警告。出现故障时,您会得到供应商返回的内容,通常只是一个裸露的数字。
-
规范中的提供商 OAuth。 您只需为团队一次性授权 GitHub,并指向一个槽位,而不是粘贴令牌。您的 YAML 中不会包含任何秘密信息,这才是真正的收益。令牌仍会落入沙箱内,因此代理仍能读取它,故障仍然表现为原始的 git 或 API 错误。
每个供应商一个 MCP 服务器。 你运行一个使用标准协议的服务器,这样 Claude Code、Codex 和 Cursor 都能直接访问,无需三次重写集成。可移植性是胜利所在。随着规模扩大,成本也随之而来——十个供应商意味着十个服务器、十个登录以及十种不同的错误形态,当工作流停滞时需要逐一解码。
-
连接器目录。 其他人已经构建并维护了数百个应用集成,登录信息预先连好。你第一天就能获得广泛的覆盖。但你无法决定某个具体调用是否应运行,也无法在模型读取响应之前对响应进行任何塑造。
-
Action Gateway。 密码永不会进入沙箱,因为它是在请求离开后才被附加的。每个最终用户授权自己的账户,因此一个人的访问不会触及另一个人的范围。失败时会带有标签,附带一个
recovery_hint字段,告知代理是重试还是让用户重新登录,而不是返回一个代理必须猜测的 401 错误。
正如本节图片所示,Action Gateway 的优势在于 它提供了一种安全且灵活的方式,使代理能够连接外部工具而不在代理沙箱中暴露凭据。
随着你逐步上升,Action Gateway 代表了最高级别的控制:代理永不会直接获得凭据或原始 API 密钥的访问权限。相反,网关会对每次工具调用集中执行身份验证、权限、审批和审计控制。
Action Gateway 将信任边界从代理处移开。代理请求使用某个工具。网关检查策略,附加凭据,并返回代理可使用的结果。
动手实践:创建代理,连接 Action Gateway,然后合并 GitHub 拉取请求
此演练按顺序完成三件事。
- Harness Runtime 启动一个名为
anish-claude-code-test的 Claude Code 会话,并提供 Linux 工作区以及 GitHub。 - Action Gateway 允许同一会话搜索 GitHub 工具并调用它,而无需在规范中放置 GitHub API 令牌。
- 与代理的聊天 创建分支,打开拉取请求并将其合并。
所有下面的命令在 2026 年 9 月 2 日的实时 Private Preview 会话中运行,使用 doctl 1.168.0-beta。公开结果是 拉取请求 #1,位于 anishsingh20/serverless-inference-tail-latency-study。令牌和连接代码已被编辑。
M.A.R.S. 在 Private Preview 期间仅限受邀请。在开始之前 请求访问。直到该功能在您的团队中启用之前,Agent 命令将返回 403。
您需要
- 拥有已记录付款方式的 DigitalOcean 账户。如果您没有账户,请在 cloud.digitalocean.com 注册。
- 预览访问您团队的托管代理运行时服务。
- 终端。在 Mac 上,打开 Terminal。在 Windows 上,使用 PowerShell 或 WSL。
- 具有完全访问权限的 DigitalOcean 个人访问令牌,在控制面板的 API 下创建。请参阅 API 快速入门。
- 一个您可以推送到的 GitHub 仓库。本演练使用了 anishsingh20/serverless-inference-tail-latency-study。
您不需要 Anthropic 密钥。我在此演练中使用了 DigitalOcean Serverless Inference。
您可以在 DigitalOcean 控制面板中完成相同的工作。预览访问启用后,在左侧导航中打开 Managed Agents。Harness Runtime 是代理所在的位置。Action Gateway 是工具、连接和会话所在的位置。

打开 Harness Runtime,点击 Sessions,您应该能看到您的代理。此代理为 anish-claude-code-test。我已经通过导入您将在 Step 4 中创建的 agents.yaml 文件来创建此代理。
P.S. 您还可以通过 GUI(云控制面板)创建代理,或直接导入 agents.yaml 文件。

点击上面的 import agent.yaml 按钮,系统会提示您上传 agents.yaml 文件,或者您也可以从预定义的 agents.yaml 清单中选择一个模板并根据需求进行编辑。

这将创建一个名为 anish-claude-code-test 的 Agent,适配器为 claude-code。
适配器是 Claude Code。状态为 Running。点击名称打开实时聊天。右侧的 创建会话 开启新运行。右上角的 创建代理 从零开始创建新的 Agent。

控制台向导包含五个步骤:适配器、连接、配置、功能、权限。本教程使用 Claude Code 和 YAML 规范,然后是 CLI,这样您可以复制相同的设置。控制台路径与产品相同。
但在这样做之前,让我们先安装 doctl CLI 并设置环境。
步骤 1. 安装 doctl beta
agent 命令随 beta 版一起提供,不在 Homebrew 或 Snap 中。从 GitHub 安装预构建的二进制文件。无需 Go 编译器。
在 doctl 安装 Beta 版本 页面查找最新的 -beta 标签。本演练使用了 v1.168.0-beta.1。
在 Apple Silicon Mac 上:
curl -sL https://github.com/digitalocean/doctl/releases/download/v1.168.0-beta.1/doctl-1.168.0-beta.1-darwin-arm64.tar.gz | tar -xzv
mkdir -p ~/.local/bin
mv ./doctl ~/.local/bin/
export PATH="$HOME/.local/bin:$PATH"
在 Linux amd64 上,将归档文件名替换为 doctl-1.168.0-beta.1-linux-amd64.tar.gz。在 Intel Mac 上,使用 darwin-amd64。
确认 beta 版本,然后确认代理命令存在:
doctl version
doctl agent --help
这是您应该看到的输出:
doctl version 1.168.0-beta
Git commit hash: e2d11070
doctl harness-runtime
Managed Agents Runtime Services (M.A.R.S)
Managed Agents Runtime Services (M.A.R.S) — run a coding agent (Claude Code, OpenCode, Codex, …) in a DigitalOcean sandbox.
Create a session and attach in one step:
╭────────────────────────────────╮
│ doctl harness-runtime run \ │
│ --harness claude-code \ │
│ --gh-repo owner/repo \ │
│ --prompt "Review the README" │
╰────────────────────────────────╯
Create without attaching (ready summary only), then attach later:
╭─────────────────────────────────────────╮
│ doctl harness-runtime start \ │
│ --harness claude-code \ │
│ --gh-repo owner/repo \ │
│ --prompt "Review the README" │
│ doctl harness-runtime attach my-session │
╰─────────────────────────────────────────╯
Session commands accept a session ID or an exact unique name.
Usage:
doctl harness-runtime [flags]
doctl harness-runtime [command]
Aliases:
harness-runtime, agent, agents, ohr
Available Commands:
approve Resolve a pending HITL request out of band
attach Attach to a session
auth Connect an external provider (e.g. github) for agent git operations
checkpoint Manage session checkpoints (save points)
config Manage reusable agent configs
download Download a file from a session workspace
exec Run a command in a session's sandbox
fork Fork a session into independent child sessions
list List your sessions
logs Replay the event history for a session
pause Pause a session
port-forward Forward local TCP ports into the session's sandbox
remove Remove a session
resume Resume a paused session
rollback Roll a session back to a checkpoint in place
run Start one session and attach
show Show one session
sizes List available sandbox sizes
start Start a new session
start-proxy Bridge the Codex CLI to a hosted session
triggers Manage webhook and cron triggers for hosted agent runs
upload Upload a file into a session workspace
validate Validate an agent manifest
Flags:
-h, --help help for harness-runtime
Global Flags:
-t, --access-token string API V2 access token
-u, --api-url string Override default API endpoint
-c, --config string Specify a custom config file
--context string Specify a custom authentication context name
--http-retry-max int Set maximum number of retries for requests that fail with a 429 or 500-level error (default 5)
--interactive Enable interactive behavior. Defaults to true if the terminal supports it (default true)
-o, --output string Desired output format [text|json] (default "text")
--trace Show a log of network activity while performing a command
-v, --verbose Enable verbose output
Use "doctl harness-runtime [command] --help" for more information about a command.
doctl agent --help 列出 start、attach、list、pause、resume、remove、exec、auth、logs 和 validate。如果你看到 unknown command agent,说明 shell 仍在使用正式发布版。运行 rehash 或打开新终端,并检查 which doctl 是否指向 beta 版本。

前两行表明你已经安装了 beta 版。接下来的教程将使用这些命令。auth 用于稍后连接 GitHub。attach 用于与代理聊天。exec 用于在沙箱中运行命令而不附加。logs 在你脱离后回放聊天记录。
步骤 2. 将 doctl 登录到您的账户
doctl auth init
doctl account get
提示时粘贴令牌。 Validating token: OK 表示 CLI 能够访问 API。 doctl account get 会打印您的团队。如果代理命令返回 403,则表示预览标志尚未在该团队上启用。
步骤 3. 为团队一次性连接 GitHub
Harness Runtime 可使用团队 GitHub 授权进行克隆和推送。您只需授权一次。永不需要在 YAML 中粘贴个人访问令牌。
doctl agent auth github
CLI 会打印一个 URL 并自动打开浏览器。请批准访问,等待提示已连接。团队中的每个会话随后会共享该授权。这就是 gh 和 git push 在沙盒中所使用的授权。Action Gateway 的 GitHub API 工具在第 8 步会建立第二个连接。
步骤 4. 为 Claude Code Agent 编写规范
agents.yaml 文件是本演练所使用的规范。请将此文件保留在当前目录。
name: anish-claude-code-test
agent: claude-code
size: mv-2vcpu-4gb
persistent_workspace: true
repos:
- anishsingh20/serverless-inference-tail-latency-study
env:
HARNESS_INFERENCE_BASE_URL: "https://inference.do-ai.run/v1"
HARNESS_INFERENCE_MODEL: anthropic-claude-4.6-sonnet
ANTHROPIC_BASE_URL: "https://inference.do-ai.run"
ANTHROPIC_MODEL: sonnet
secrets:
HARNESS_INFERENCE_API_KEY: "${DIGITALOCEAN_ACCESS_TOKEN}"
GITHUB_TOKEN: "oauth/github"
tools:
- do.actions
permissions:
default: ask
rules:
- tool: bash
match: { command: "git *" }
action: allow
- tool: bash
match: { command: "gh *" }
action: allow
- tool: mcp
action: allow
每个块的作用:
agent: claude-code选择编码代理。size: mv-2vcpu-4gb是默认的沙盒,具有 2 个 vCPU 和 4 GB 内存。repos记录会话应在哪个仓库上工作。它不会为你克隆文件。你将在下一步克隆。env将 Claude Code 指向 DigitalOcean 托管的推理。env中的内容不应是机密。secrets.HARNESS_INFERENCE_API_KEY是你的 DigitalOcean 令牌,用作模型密钥。secrets.GITHUB_TOKEN: "oauth/github"是来自步骤 3 的团队 GitHub 授权。tools: [do.actions]为本会话启用 Action Gateway。mcp允许规则是必需的。网关工具调用没有带内批准提示。ask默认会导致这些调用失败。gh *允许规则使代理能够在不为每个gh命令停止的情况下打开并合并拉取请求。
您也可以使用 GUI 创建代理。打开 Harness Runtime,点击 Agents,然后点击 Create Agent。
GUI 控制台向导包含五个步骤:adapter、connections、configure、capabilities、permissions。本教程使用 Claude Code 和 YAML 规范,然后使用 CLI,这样您可以复制相同的设置。
步骤 5. 验证,然后启动会话
export DIGITALOCEAN_ACCESS_TOKEN="dop_v1_..."
doctl agent validate agents.yaml
✓ Manifest looks valid
validate 在您的机器上运行。它会检测放置在 env 中的缺失密钥和密钥。API 仍然是最终的检查。
doctl agent start 用于 Claude Code 会从您的笔记本电脑检查 ANTHROPIC_API_KEY 是否能访问 api.anthropic.com。DigitalOcean 令牌会导致该检查返回 HTTP 401。请改为将规范发送到会话 API:
sed "s|\${DIGITALOCEAN_ACCESS_TOKEN}|$DIGITALOCEAN_ACCESS_TOKEN|" \
agents.yaml > /tmp/agent.yaml
curl -sS -X POST https://api.digitalocean.com/v2/agents/sessions \
-H "Authorization: Bearer $DIGITALOCEAN_ACCESS_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/x-yaml" \
--data-binary @/tmp/agent.yaml
{
"session": {
"name": "anish-claude-code-test",
"agent_kind": "AGENT_KIND_CLAUDE_CODE",
"status": "SESSION_STATUS_READY"
}
}
会话返回 READY。若 API 警告 ask 默认设置不允许网关调用,这属于预期行为。规范已有 mcp 允许规则,网关调用因而可直接运行。
doctl agent list
doctl agent show anish-claude-code-test
Session anish-claude-code-test
Agent Claude Code
Status ● ready
Next step
attach doctl harness-runtime attach anish-claude-code-test

绿色 ready 行是关键状态。attach 打开与代理的实时聊天。教程先用 exec 让你看到机器,再用 attach 观看代理完成工作。
同一会话也会出现在控制面板的 操作网关 → 会话 页面。该页面展示代理代表的对象以及它接收的 MCP 端点。

步骤 6. 使用 Harness Runtime:代理拥有机器
Harness Runtime 是 Managed Agents Runtime Services 的前半部分。会话是一个包含 shell、Python、Node、git 的 Firecracker microVM。使用 doctl agent attach anish-claude-code-test 与代理通话,或使用 exec 执行单条命令。
doctl agent exec anish-claude-code-test -- sh -c \
'uname -srm; python3 --version; git --version; ls /workspace'
Linux 6.1.176 x86_64
Python 3.12.3
git version 2.43.0
claude-code.log
mcp-config.json
repos 未填充工作树。克隆研究仓库。以 agent 用户身份运行克隆,否则代理以后将无法写入:
doctl agent exec anish-claude-code-test -- sh -c '
git clone --depth 1 \
https://github.com/anishsingh20/serverless-inference-tail-latency-study.git \
/workspace/serverless-inference-tail-latency-study
chown -R agent:agent /workspace/serverless-inference-tail-latency-study
git -C /workspace/serverless-inference-tail-latency-study log -1 --oneline
'
Cloning into 'serverless-inference-tail-latency-study'...
5ce6d3b Add link to published DigitalOcean tutorial in README

Harness Runtime 正在执行它的工作。代理拥有一台计算机。仓库位于磁盘上。Git 正常工作。gh 已使用步骤 3 中的 GitHub 账号登录。尚未涉及 Action 网关。
如果会话暂停,请恢复它。工作区保持不变:
doctl agent resume anish-claude-code-test
步骤 7. 启用 Action Gateway 并查找 GitHub 工具
Action Gateway 是 Managed Agents Runtime Services 的第二部分。在控制台中,它位于 Managed Agents 下的下一项。

Tools 是目录。每张卡片代表一个提供者。View tools 打开该提供者的操作。

在之前步骤 4 中添加到 spec 的 agents.yaml 文件中的 tools: [do.actions] 行将网关端点附加到会话。让我们确认一下:
doctl agent exec anish-claude-code-test -- cat /workspace/mcp-config.json
{
"mcpServers": {
"do_actions": {
"type": "http",
"url": "http://trusted-actions.vpc-endpoint.internal.digitalocean.com/mcp/session/"
}
}
}
该 URL 为 DigitalOcean 内部地址。此沙箱的流量停留在 DigitalOcean 网络中。文件中不包含 bearer 令牌。
网关不会将目录转储到模型中。它公开了三个工具:action_search、action_invoke 和 action_code。首先让我们搜索 GitHub 拉取请求工具:
doctl agent exec anish-claude-code-test -- sh -c '
URL=$(echo "$HARNESS_MCP_SERVERS" | base64 -d \
| sed -n "s/.*\"url\":\"\\([^\"]*\\)\".*/\\1/p")
curl -sS -X POST "$URL" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{
\"name\":\"action_search\",
\"arguments\":{\"queries\":[
{\"use_case\":\"create a GitHub pull request and merge it\"}
],\"limit\":5,\"providers\":[\"github\"]}}}"
'
github_create_pull_request score=31.67
github_get_pull_request score=28.09
github_get_pr_review score=26.88
github_list_pr_commits score=26.78
github_list_pr_reviews score=26.78

providers: ["github"] 将提供者列表保存在 GitHub 中。顶部结果是 github_create_pull_request,这是通过网关打开 PR 的工具。
您可以在控制台中浏览相同的目录。打开 操作网关 → 工具,输入 github,然后点击 查看工具。

步骤 8. 调用 GitHub 工具。首次调用时会要求您进行连接
doctl agent exec anish-claude-code-test -- sh -c '
URL=$(echo "$HARNESS_MCP_SERVERS" | base64 -d \
| sed -n "s/.*\"url\":\"\\([^\"]*\\)\".*/\\1/p")
curl -sS -X POST "$URL" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d "{\"jsonrpc\":\"2.0\",\"id\":4,\"method\":\"tools/call\",\"params\":{
\"name\":\"action_invoke\",
\"arguments\":{
\"rationale\":\"Confirm the study repository is visible to GitHub tools\",
\"tools\":[{\"tool\":\"github_search_repositories\",\"arguments\":{
\"q\":\"repo:anishsingh20/serverless-inference-tail-latency-study\",
\"max_results\":1}}]}}}"
'
第一次调用尚未搜索 GitHub。它会要求您为 Action Gateway 连接 GitHub。此授权与 步骤 3 中的 doctl agent auth github 授权不同。步骤 3 用于在沙盒中执行 git clone、git push 和 gh。
步骤 8 用于网关上的 GitHub API 工具。
{
"total_count": 1,
"success_count": 0,
"error_count": 1,
"results": [
{
"tool": "github_search_repositories",
"result": {
"status": "failed",
"error": {
"class": "unauthorized",
"message": "Tool \"github_search_repositories\" requires an OAuth connection for provider \"github\" ... Open https://cloud.digitalocean.com/security/connectlinks/confirm?token=®ion=nyc3 to authorize." ,
"retriable": true,
"recovery_hint": "refresh_auth"
}
}
}
]
}

您也可以在控制台完成该登录。打开 操作网关 → 连接,然后点击 添加连接,选择 GitHub。连接会与团队共享。这就是恢复链接将您引导到的页面。

这里有三点需要注意。
-
该规范仍然没有 GitHub API 令牌。沙盒在此路径下也没有 GitHub API 令牌。网关正在要求用户登录。
-
错误已被标记。
class的值为unauthorized。retriable为true。recovery_hint为refresh_auth。代理可以读取这些字段并发送该链接给您,而不是盲目猜测一个裸露的 401 错误。 -
验证码的存在是为了让您确认该页面与请求匹配。请将连接令牌和验证码视为机密信息。不要将它们粘贴到工单或聊天中。
打开该链接,对照验证码,完成 GitHub 授权,然后再次运行相同的 action_invoke。之后,网关会在执行时附加凭据并返回仓库结果。
本演练在此无需等待第二次 OAuth。Harness Runtime 已通过 步骤 3 拥有 GitHub,因此代理仍可使用 git 和 gh 打开并合并拉取请求。这是下一步。
步骤 9. 与代理聊天以打开并合并拉取请求
如果您仅连接了工具,这一步是缺失的。请附加到会话并让它完成工作。
doctl agent attach anish-claude-code-test
随后在终端中发送此提示:
Work in /workspace/serverless-inference-tail-latency-study.
1. Use Action Gateway action_search to find GitHub pull request tools.
2. Create a branch named docs/action-gateway-walkthrough from main.
3. Add only ACTION_GATEWAY_WALKTHROUGH.md, a short note that this session verified Harness Runtime and Action Gateway.
4. Commit, push, open a pull request into main titled "Add Action Gateway walkthrough note".
5. Merge the pull request. Squash is fine.
6. Reply with the PR URL, whether it is merged, and the merge commit.
如果代理在审批时暂停,请在附加会话中输入 y。不是 git *、gh * 或 mcp 的命令仍然使用 ask 默认值。
2026年9月2日,代理执行了以下操作:
- 调用了 Action Gateway
action_search并返回了github_create_pull_request。网关已附加并正在响应。 - 创建了分支
docs/action-gateway-walkthrough。 - 编写了
ACTION_GATEWAY_WALKTHROUGH.md。 - 提交、推送并打开了 拉取请求 #1。
- 将其合并。合并提交为
66be5f1481e0ca0cf6bd338ff562d8a8e29af186。状态为MERGED。

让我们从 CLI 重播同样的运行以确认拉取请求已被合并:
doctl agent logs anish-claude-code-test
All steps completed successfully.
PR URL: https://github.com/anishsingh20/serverless-inference-tail-latency-study/pull/1
Merged: Yes
Merge commit: 66be5f1481e0ca0cf6bd338ff562d8a8e29af186
Who created the PR: gh
gh pr view 1 -R anishsingh20/serverless-inference-tail-latency-study \
--json url,state,title,mergedAt,mergeCommit
state MERGED
title Add Action Gateway walkthrough note
url https://github.com/anishsingh20/serverless-inference-tail-latency-study/pull/1

这就是完整的循环。Action Gateway 发现了 GitHub 工具并请求了自己的连接。Harness Runtime 已经拥有 GitHub,因此代理完成了拉取请求。您可以点击下面的 PR 链接 查看。
步骤 10. 暂停会话
会话在空闲时会自动暂停。完成后您可以主动暂停:
doctl agent pause anish-claude-code-test
✓ Session <SESSION_ID> paused
稍后想继续时,运行 doctl agent resume anish-claude-code-test 即可恢复,工作区依然保留在那里。
何时使用托管代理运行时服务的哪一半
Harness Runtime 是机器。只要工作涉及文件、shell 和 git,就使用它。Action Gateway 是该机器与您其余技术栈通信的方式,无需持有密钥。当代理需要在其他产品中执行操作时,请使用 Action Gateway。
| 您想要 | 使用 | 为什么选择此方案 |
|---|---|---|
| 具备 shell、文件、测试和 git 的编码代理 | Harness Runtime | 沙盒即为产品。无需将任何内容离开 /workspace。 |
| 使用团队 GitHub 授权进行克隆、提交和推送 | Harness Runtime 加上 doctl agent auth github |
Git 操作留在机器上。只需一次团队登录,YAML 中无需令牌。 |
| 以 API 方式调用 GitHub:搜索问题、创建工单、读取拉取请求 | Action Gateway | GitHub API 令牌永不进入沙盒。代理会查找工具并调用它。 |
| 一个支持代理,可查询订单、在 Stripe 中退款并在 Slack 中发布 | Action Gateway | 三个供应商,一个 MCP 端点。凭证保留在网关。聊天泄露不会导致 Stripe 密钥泄露。 |
| 在同一编码会话中,创建 Jira 或 Linear 工单,或更新 Notion 页面 | Action Gateway | DigitalOcean 已将 GitHub、Jira、Notion、Linear 和 Postgres 列为受管服务。您只需连接一次。 |
| 在不将数据库密码放置在模型旁边的情况下查询 Postgres | Action Gateway | 网关在调用时附加凭证。代理看到的是数据行,而非连接字符串。 |
| 多人使用同一代理,各自对应自己的 GitHub 或 Jira | Action Gateway | 按用户 OAuth。一个人的访问不会出现在另一个人的会话中。 |
| 在 Claude Code、Codex、Cursor 或您自己的应用中使用相同的工具集 | Action Gateway | 任何支持 MCP 的客户端都可以调用同一端点。您无需为每个 harness 重新构建每个供应商的集成。 |
| 跨越两个或多个系统的工作流,且必须以代理能够从中恢复的方式失败 | Action Gateway | 失败会返回带标签的结果,并附带 recovery_hint。代理会重试或发送登录链接,而不是猜测一个裸露的 401。 |
| 永不离开工作区的工作 | 仅使用本地沙盒工具 | 跳过网关。运行测试或编辑文件时不需要它。 |
Action Gateway 在演示需要成为产品时是默认选择。本演练中的编码代理已经需要两部分:Harness Runtime 用于保存仓库,以及 Action Gateway 用于在 spec 中不使用 token 的情况下查找 GitHub 工具。添加 Jira、数据库或第二个用户后,网关就是实现扩展的部分。您只需配置一次工具。之后的每个会话会搜索并调用,而不是为每个供应商重新构建集成。
仅在作业为本地时才跳过 Action Gateway。如果代理永不离开 /workspace,沙盒就足够了。
当它需要在 GitHub、Jira、Slack、Stripe 或您的数据库上执行操作时,请使用 Action Gateway。这就是 Managed Agents Runtime Services 的要点:机器和密钥是独立的产品,但属于同一账户。
常见问题?
1. Action Gateway 是什么?
Action Gateway 是 DigitalOcean 的托管服务,用于让 AI 代理访问工具、API 和 SaaS 系统。您选择工具,连接凭据并设置权限。网关通过单个 MCP 端点公开该设置。代理会搜索合适的工具并运行它。您无需自行将每个供应商集成到代理中。
2. Action Gateway 能否帮助降低我的 token 成本?
是的。当工具调用失败、返回噪声输出、触发重试或需要额外的模型轮次来恢复时,代理工作流可能会变得昂贵。Action Gateway 通过在执行前、中、后改进工具调用来减少这种浪费:工具搜索有助于在不将每个工具加载到上下文的情况下选择已批准的操作;验证和修复减少畸形调用;自动重试和超时被限制以防止失控执行;结果压缩限制返回给模型的不必要数据。Action Gateway 还会跨工作流记录成本和使用情况,以便团队能够看到哪些工具、重试和制品在推动支出。
3. 我可以将自己的 MCP 服务器和工具注册到 Action Gateway 吗?
是的。您可以通过 Action Gateway 注册 MCP 兼容的服务器和工具。Action Gateway 会导入 MCP 暴露的工具定义,并可通过网关路由经过批准的调用。DigitalOcean 负责管理这些调用,而不管客户自有的 MCP 服务器内部做了什么。对于客户自有的工具,Action Gateway 负责策略、分发、追踪、已配置的重试以及操作记录。除非工具通过受信任的 DigitalOcean 控制的执行路径进行路由,否则客户自有的 MCP 服务器仍然控制其自身的逻辑、输出、副作用、合规态势以及工具注解。
4. Action Gateway 与沙盒中已有的工具有什么不同?
Harness Runtime 已经为代理提供了 shell、文件系统和 git。这些工具位于该机器上。您可以在 spec 中的 permissions 块来管理它们。Action Gateway 用于处理机器外的工作:GitHub issue、Jira 工单、Slack 消息、数据库查询。凭据、重试以及失败的形状都在网关处处理,而不是在您的 YAML 中。
5. Action Gateway 的费用是多少?
Action Gateway 会直接显示基础设施或提供商产生的费用,例如 Code Interpreter 计算以及 Web Search、Web Fetch、Browser Automation 将单独计量。DigitalOcean Inference 和 Managed Agents 遵循各自的定价。
工具调用:
- GA:每 1,000 次非原生调用收费 0.299 美元
代码解释器工具:
- CPU 优化的 DigitalOcean 计算资源:每 vCPU 小时 0.05 美元,每 GB 内存 0.015 美元
浏览器自动化工具:
- CPU 优化的 DigitalOcean 计算资源:每 vCPU 小时 0.09 美元,每 GB 内存 0.020 美元
网页搜索工具:
- 每 1,000 次请求收费 7.00 美元
Web 抓取工具:
- $3.00/1K 请求
注意:价格是动态的,可能会根据使用情况而变化。Action Gateway 正式发布后,价格将会公布。
6. Action Gateway 如何处理密钥?
凭证永不会进入模型上下文。这是最大的区别。它们不会被编辑,也永不存在。代理请求该操作,网关执行它。
您可以连接 API 密钥、共享的 OAuth 应用或按用户的 OAuth。网关在调用运行时附加凭证。令牌不会进入代理或沙箱。当用户在通话过程中必须登录时,网关会返回一个链接和验证码,完成后继续。
凭证在执行时解析,仅在单次调用后被丢弃。令牌永不会到达代理、沙箱或最终用户,且刷新令牌始终锁定在 DigitalOcean Secrets Manager 中。每次调用仅请求其所需的范围,受您每个连接设置的上限限制。由于没有凭证缓存,轮换和撤销将在下一次调用时立即生效,没有滞后窗口;不可达的密钥会直接失败(关闭),而不会回退。每次访问都通过引用进行审计,而不会通过值。
7. 我可以将 Action Gateway 与 Claude Code、Codex 或 Cursor 一起使用吗?
是的。任何支持 MCP 的代理都可以调用网关。一级支持包括 Claude Code、Codex 和 Cursor。本教程在 DigitalOcean 无服务器推理 上使用了 Claude Code。
8. 这与 SaaS 连接器目录有何不同?
目录告诉代理哪些应用存在。Action Gateway 决定是否运行调用,将凭据保存在代理之外,并返回代理可以恢复的失败。当一个工作流跨越 GitHub 和另一个系统时这一点尤为重要。应用的广度是目录的优势。完成工作流是网关的职责。
基本上,连接器目录暴露了代理可以调用的内容。Action Gateway 帮助代理正确地调用正确的工具,并将这些调用转换为受管控且可靠的生产操作。通过管理上下文膨胀并提供优化的工具搜索,网关提高了工具调用效率,从而降低成本和失败率。
结论
本教程展示了如何使用 Action Gateway 为代理提供对 GitHub 工具的访问,而无需在规范中放置令牌。您可以使用相同的模式为代理提供对 Jira、Notion、Linear、Postgres、Slack、Stripe 以及任何其他 SaaS 系统的访问。托管代理运行时服务 是跨多个系统扩展代理工作流的强大方式,且 Action Gateway 有助于代理以受管方式使用已批准的工具。
它通过单一端点保障对 1,000+ 工具集成的访问,使团队能够以更低的成本、更少的故障且无需管理基础设施交付生产工作流。
来源
- Salman Paracha(工程副总裁),DigitalOcean 托管代理运行时服务私有预览,DigitalOcean,2026 年 8 月 25 日。
- DigitalOcean 托管代理运行时服务在 X 上的私有预览,DigitalOcean,2026 年 9 月 1 日。
- Alex Salazar,我们看到了动作层的到来。现在我们将拥有它,Arcade.dev,2026 年 6 月 12 日。
- 直播会话
anish-claude-code-test,2026 年 9 月 2 日:doctl1.168.0-beta,Claude Code 在mv-2vcpu-4gb,DigitalOcean 托管推理。已合并 拉取请求 #1。令牌和连接代码已被编辑。