在 Slack 和 Teams 里把工作交给代理

上午十点多,#payments 里的一个话题串。有人问 @Archyl 是什么在调用 webhook sender,机器人回答:Checkout 和 Billing 这两个 container,都经由 Payments API。两条消息之后,出现了这类话题串总会落到的那句话:"那里应该加上重试,谁能接一下?"

然后话题串就没动静了。总得有人打开 Archyl,找到项目,选一个代理配置文件,再把一个已经存在的任务重新敲一遍,一字不差,就在往上三条消息的地方。

从六月起,Archyl 机器人就在 Slack 和 Microsoft Teams 里回答问题。从今天起,它也能动手了。同一个话题串可以把工作交给一个托管代理:

@Archyl run [Payments API] add retries with backoff to the webhook sender

代理以输入这条命令的人的身份运行,机器人会在话题串里一路跟进这次运行,直到出现 pull request。

一个话题串,从头到尾

下面是那段对话的后续。Archyl 发出的消息就是机器人实际发布的格式。人名、问题和 pull request 都是示例。

Marie:   @Archyl run [Payments API] add retries with backoff to the webhook sender

Archyl:  🚀 Agent `backend-fixer` started on Payments API. Follow it in Archyl
         — I'll post here when it needs you or when it's done.

"Follow it in Archyl" 链接到运行页面,计划会在那里以检查清单的形式逐步填满,每一次工具调用都会出现在活动动态里。没有人需要一直开着这个页面。

二十分钟后,代理遇到了一个不该由它独自拍板的决定:

Archyl:  @Marie ❓ The agent has a question:
         > Should retries also cover 4xx responses from receivers, or only
         > 5xx and timeouts?
         Answer in Archyl.

Marie 点进去,从建议的回答里选了 "only 5xx and timeouts",然后回去继续做手头的事。运行结束时:

Archyl:  @Marie ✅ The agent finished and opened a pull request:
         https://github.com/acme/payments-api/pull/412
         See the run.

如果配置文件开启了 先审阅计划,那么在任何代码改动之前还会多停一站:"📋 The agent proposed a plan and is waiting for your review",附带一个链接。如果运行失败,或者触到了时间或成本上限,最后一条消息会说明原因,并链接到保存了截至当时工作成果的草稿 pull request。

在 Slack 中,每条更新都会 @提及发起这次运行的人,让它出现在对方的通知里。在 Teams 中,更新以同一话题串里的回复送达,不带提及。

这几条消息之间发生了什么

话题串里只有三条消息。这次运行做的事情要多得多,而这部分正是这次发布的重点。

在碰任何文件之前,这次运行针对任务涉及的架构元素开启了一个工作会话,这里就是 Payments API 里的 webhook sender component。它在这些元素上拿了租约,所以之后有开发者在同一个 component 上启动 Claude Code 时,会被告知已经有人在那里工作。它的简报里带着挂在这些元素上的 ADR、合规规则和 API 契约,以及之前的会话关于它们记住的一切。它写入的每个文件都要经过 Guard,Guard 会拒绝违反 critical 级别合规规则的写入。完成后,它的摘要成为了记忆,挂在被修改文件真正所属的元素上;它记录下的每一项决策都开启了一份 Architecture Change Request(架构变更请求)草稿,等人来评审。

这些都不是聊天场景特有的。每一次 Archyl 运行都是这样做的。变化的是请求从哪里来。

这就是这个功能背后的判断。一个托管的、让代理运行的地方,正在变成可以从列表里挑选的东西:正如我们两周前指出的,Anthropic、OpenAI 和 Cursor 现在各自都提供一个。运行时不知道的,是你的系统:webhook sender 属于哪个 container,谁负责它,哪条规则规定出站 HTTP 要走共享客户端,以及此刻还有哪个代理在里面干活。这些知识存在于架构模型里。而工作是在聊天里被提出来的。这次发布把两者连了起来,让话题串里提出的请求带着代理把事做好所需的上下文抵达。

为什么运行以你的身份创建

机器人回答问题时,使用的是连接工作区的那位管理员的权限。对于读取来说这没问题。频道里的每个人看到的都是同一份架构视图,如果你按频道做了限定,就只看到限定范围内的内容。

动手就不一样了。一次运行会写代码、开 pull request。如果 @Archyl run 借用安装机器人的人的权限,那么 Slack 频道里的任何人都能让代理去修改一个自己无权编辑的项目,而运行历史会在每一次这样的运行上都写着那位管理员的名字。

所以,运行以输入命令的那个人的身份创建,并受这个人对项目的编辑权限约束。在聊天用户自己说明之前,机器人无从知道他在 Archyl 上是谁,这意味着每个人需要做一步,只做一次:

  1. 在 Archyl 中前往 个人资料 → 聊天账号,点击 关联我的 Slack 账号 或 关联我的 Microsoft Teams 账号。
  2. 在该平台上任何有机器人的地方,发送页面上显示的命令 @Archyl connect <code>。

这个代码只能用一次,有效期 15 分钟,而且是你在登录状态下亲自生成的,这正是证明这个聊天账号属于你的依据。Slack 和 Teams 需要分别关联。@Archyl disconnect 会解除关联;机器人会继续回答你的问题,但不再替你启动代理。

如果你跳过这一步,直接输入 run,机器人不会去猜,而是告诉你缺了什么:

I don't know who you are on Archyl yet, and agents run as the person who asks.
Generate a code in Profile → Chat accounts, then send @Archyl connect <code>.

命令是怎么解析的

@Archyl run [Project name] <task>,外加两个可选部分。

项目放在方括号里。 目前方括号是必需的,这样机器人永远不用去猜你的项目名在哪里结束、任务从哪里开始。在限定到单个项目的频道里,可以省略项目:@Archyl run fix the flaky login test。限定到多个项目的频道只接受其范围内的项目。要是指定了范围之外的项目,机器人会回复说在这个频道的范围里找不到该项目。

配置文件放在任务前面。 不指定时,运行使用你所在组织的默认配置文件。要选别的,把 profile:<name> 放在最前面:

@Archyl run [Web] profile:frontend-fixer align the pricing cards

如果配置文件名不存在,机器人会回复现有配置文件的列表。

其余的一切都和在应用里一样。你需要拥有该项目的编辑权限。这次运行会计入你组织每月的代理运行次数,和从 代理中心 → 执行记录 启动的运行一样(与应用中一致,使用自有 AI 提供商的组织不计入)。如果配置文件开启了 尊重其他代理的工作,而另一个代理持有相同元素的租约,机器人会回复说预检关卡拒绝了这次运行。如果关卡只是给出警告,运行会被挂起等待批准,机器人会把链接发给你。

我们特别留意的两件小事

不可信的文本无法惊动整个频道。 任务、项目名和代理的问题最后都会被引用回频道里。每一项在发布前都会按其所在平台进行转义,所以包含 Slack 的 <!channel> 或 Teams 的 <at> 提及的任务或问题,会以纯文本送达,而不会通知所有人。

运行向哪个话题串汇报,不是客户端能改的。 运行往哪个频道和话题串发帖,是在运行创建时存储在服务器端的,而不是存在运行的元数据里,因为 API 客户端可以写入元数据。此外,更新只会发往与拥有该运行的组织相连接的工作区。

它暂时还做不到的

计划审阅和回答都在 Archyl 里进行,而不是在话题串里。 机器人会告诉你代理在等待,并链接到运行页面。你没法在 Slack 或 Teams 里批准计划或回答问题。这一点比听起来更要紧:一个问题如果一小时内没人回答,代理就会按自己的判断继续;一份计划如果一小时内没人审阅,运行就会失败。@提及就是为了不让这一小时在无人察觉中过去。

项目名必须恰好匹配一个项目。 没有模糊匹配;如果两个项目同名,机器人会请你重命名其中一个,或者从应用里启动。

Teams 的更新不会提及你。 它们是话题串里的回复,所以能不能看到,取决于你怎么关注这个话题串。

pull request 需要受支持的托管平台。 运行会在 github.com、gitlab.com 和 bitbucket.org 上开 pull request。Bitbucket 没有草稿 pull request,所以在那里失败的运行会推送分支,但不会开 pull request。自托管 Git 服务器上的仓库拿不到 pull request,因此最后一条消息会说明代理已完成,并链接到这次运行。

试一试

从聊天中启动运行需要托管代理(Scale 和 Custom 套餐提供),以及一个已连接的 Slack 或 Teams 工作区。在 个人资料 → 聊天账号 里关联你的聊天账号,然后挑一个刚有人提了件小而明确的事的话题串,输入 @Archyl run。

完整的参考说明,包括权限和频道范围如何生效,见 Slack 和 Teams 机器人文档中的"从 Slack 或 Teams 启动智能体运行"一节。


相关阅读:Slack 和 Teams 机器人发布、按频道限定机器人、托管代理现在受 Harness 约束,以及实时查看并引导一次运行。