Copilot进Teams后,Agent协作不该只剩聊天记录

一个 Agent 任务如果持续 20 分钟,参与者有 5 个人,期间改了 8 个文件、跑了 3 轮测试、请求了一次审批,最后只把这些信息折叠成几十条聊天消息,协作成本其实并没有消失,只是从“做事”转移成了“翻记录”。

GitHub 在 8 月 21 日把 Copilot Cloud Agent 的共享会话带进 Microsoft Teams:频道、线程和私聊里可以直接 @GitHub 发起 Agent Session,参与者能补充上下文、追问、共同引导;拥有仓库写权限的人还能触发代码修改。Agent 在云端沙箱异步工作,进度继续回到 Teams 线程里,生成的 Artifact 又可以转到终端、Copilot App 或 IDE 继续处理。

真正值得研究的不是“Copilot 多了一个入口”,而是:多人共同驱动一个 Agent Run 时,哪些东西应该进入聊天,哪些东西必须成为结构化状态?

聊天适合表达意图,不适合承载整个 Run

群里的一句话:

@GitHub 帮忙查一下订单服务最近 401 增加的原因,
先不要改生产配置。

这里至少包含四个字段:

Goal: 定位 401 增加原因
Scope: 订单服务
Constraint: 不能修改生产配置
Initiator: 当前用户

如果 Agent 只保存原始自然语言,后续任何人补一句“顺便把配置改了吧”,就会出现约束冲突。所以群聊消息进入 Agent 之前,应该先投影成 Run Contract。

public record RunContract(
        String runId,
        String goal,
        Set scopes,
        Set constraints,
        String initiatedBy,
        Instant createdAt,
        long version) {
}

每次关键约束变化都形成新版本,而不是覆盖第一条消息。

共同引导,不等于所有人权限相同

GitHub 当前的 Teams 预览有一个重要边界:参与者都可以参与讨论和补充上下文,但真正触发仓库修改,还要求用户拥有对应仓库写权限。

多人协作至少应该拆成三类权限:

VIEW
STEER
MUTATE

更细可以定义:

public enum SessionPermission {
    VIEW,
    ADD_CONTEXT,
    STEER,
    APPROVE,
    EXECUTE_WRITE,
    CANCEL
}

同一个频道里,产品经理可以补充需求,QA 可以补测试条件,研发可以批准代码修改,普通观察者只能查看,只有 Run Owner 能 Cancel。

不要把“在群里能看到线程”直接等同于“可以让 Agent 做任何事”。

第一个真实故障模式:多人指令竞争

假设线程变成:

10:05 张三:只查原因,不改代码
10:07 李四:如果确定是超时,就顺手修掉
10:08 王五:今天不要碰支付模块
10:09 张三:先跑测试

模型看到的是四条自然语言。

执行系统真正需要的是:

Constraint Set
Action Policy
Authority
Version

例如:

{
  "run_id": "run-812",
  "goal": "diagnose-401",
  "constraints": [
    "no-production-config-change",
    "do-not-touch-payment-module"
  ],
  "allowed_actions": [
    "read-code",
    "run-tests",
    "create-patch"
  ],
  "forbidden_actions": [
    "merge",
    "deploy"
  ]
}

任何后续消息如果试图删除 forbidden_actions,必须重新做权限判断。不能让模型按“最近一句话优先”自行覆盖约束。

第二个故障模式:线程越长,真正重要的信息越少

多人讨论很容易积累:

需求说明
日志
猜测
截图
会议结论
代码片段
重复追问

把整个 Teams Thread 每轮都喂给模型,Token 会持续上涨,历史噪声也会越来越多。

更合理的链路是:

聊天原始记录
↓
Event Store
↓
Current Run Projection
↓
Task Context Manifest
↓
LLM

真正给 Agent 的 Manifest 只保留当前有效状态:

{
  "goal": "diagnose-401",
  "constraints": [
    "no-production-config-change"
  ],
  "current_hypotheses": [
    "JWT refresh race",
    "gateway timeout"
  ],
  "verified_facts": [
    "error started after release-1842"
  ],
  "artifacts": [
    "trace-91",
    "log-sample-17"
  ],
  "pending_decisions": [
    "allow-source-code-change"
  ]
}

聊天是证据源,Projection 才是执行状态。

第三个故障模式:所有人都以为“别人已经看过”

Agent 改完代码后,群里出现一句:

Patch ready.

团队很容易出现一种心理:

应该有人看了吧。

最后没人真正 Review。

所以需要显式 Review Gate:

public record ReviewGate(
        String artifactId,
        Set requiredReviewerRoles,
        Set approvedBy,
        ReviewStatus status) {
}

例如:

代码 Patch:Backend Owner
数据库 Migration:DBA + Backend Owner
权限变化:Security

“群里没人反对”不能替代批准。

Teams 只是入口,Source of Truth 应该在服务端

GitHub 的共享 Agent 设计允许任务在 Cloud Sandbox 中异步执行,即使用户离开当前界面,任务仍然继续;不同界面可以继续接手同一任务产生的 Artifact。

这意味着真正的 Run State 必须在服务端:

Teams
IDE
CLI
Web

只是客户端。

服务端维护:

Run
Thread
Turn
Artifact
Approval
Budget
Audit

否则 Teams 消息删除、客户端断线、用户换设备后,Agent Run 就无法正确恢复。

一个最小 Run Event 模型

public sealed interface RunEvent
        permits RunCreated,
                ContextAdded,
                ConstraintChanged,
                StepStarted,
                ArtifactCreated,
                ApprovalRequested,
                ApprovalGranted,
                RunCompleted {
}

事件示例:

{
  "event_id": "evt-912",
  "run_id": "run-812",
  "type": "CONSTRAINT_CHANGED",
  "actor": "user-17",
  "payload": {
    "add": ["do-not-touch-payment-module"]
  },
  "occurred_at": "2026-08-23T10:08:22Z"
}

Teams UI 只负责把事件渲染成易读消息。

“谁说了算”必须是确定性规则

可以设计权限层级:

Security Policy
>
Run Owner
>
Repository Owner
>
Contributor
>
Viewer

但真正执行应该由 Policy Engine 判定,而不是塞进 Prompt。

public Decision evaluate(
        Participant participant,
        RequestedMutation mutation,
        RunContract contract) {

    if (!participant.permissions()
            .contains(mutation.requiredPermission())) {
        return Decision.DENY;
    }

    if (mutation.conflictsWith(contract.constraints())) {
        return Decision.REQUIRE_OVERRIDE_APPROVAL;
    }

    return Decision.ALLOW;
}

LLM 负责理解意图,不能负责最终授权。

共享会话有一个很实际的问题:成本可能比私聊更高

GitHub 说明里明确提到,Teams 中发起的 Cloud Agent Session 会消耗 AI Credits;Cloud Sandbox 使用又可以单独计费和配置预算。

多人 Steering 会增加:

上下文
Turn 数
重新规划次数
测试次数

所以群聊 Agent 最好直接展示:

Current Cost
Budget
Model Calls
Sandbox Minutes

例如:

AI Credits:31 / 50
Sandbox:18 min / 30 min
Model Calls:12

有人说“再从另一个方向全部查一遍”时,团队能知道这不是零成本操作。

Steering 也需要预算

collaboration:
  max_steering_turns: 12
  max_context_additions: 30
  max_replans: 4

达到阈值后:

继续执行需要 Run Owner 确认

避免讨论无限延长 Agent Run。

Agent 产出必须从消息升级成 Artifact

代码修改:

Patch Artifact

测试:

Test Report Artifact

调查结论:

Incident Findings Artifact

对象模型:

public record Artifact(
        String artifactId,
        ArtifactType type,
        String version,
        String contentRef,
        String contentHash,
        String createdByStep,
        ArtifactStatus status) {
}

Teams、IDE、Web 都引用同一个 Artifact,而不是各自复制一份文本。

我会只在 Teams 里固定展示 5 类卡片

1. Goal
2. Progress
3. Artifact
4. Decision Needed
5. Final Result

例如:

[Decision Needed]

Agent:
order-incident-agent

Action:
修改 JwtRefreshService.java

Reason:
复现到并发刷新竞争

Evidence:
test-run-912

Risk:
MEDIUM

[Approve Patch] [Keep Investigating]

比一句“我已经分析了问题,接下来建议……”有用得多。

共享讨论不能直接写入长期 Memory

频道里会出现猜测、玩笑和未经确认的信息。

至少区分:

Conversation Context
Run State
Verified Fact
Long-term Memory

只有经过确认的事实才能进入长期 Memory。

例如:

订单服务使用 JWT

可以。

我觉得一定是 Redis

不能。


GitHub 把 Copilot Agent 拉进 Teams,表面看是入口扩展,真正重要的是它让一个问题无法再回避:Agent 不再只有一个用户。

多人共同指导时,聊天记录只能是输入界面,不能再充当执行系统本身。

生产级协作 Agent 至少需要:

Run Contract
Participant Permission
State Projection
Artifact
Approval
Budget
Audit

否则群里越多人参与,Agent 的上下文越丰富,系统反而越难回答最基本的问题:

现在到底要做什么?
谁允许改?
哪个结果已经确认?
下一步由谁决定?

这才是多人 Agent 协作真正的工程边界。


更多企业级 AI 应用、Agent、RAG 与大模型工程化内容,我会继续整理在 智元界

https://www.zyentor.com/