block/buzz深度解析:给AI Agent一把钥匙,让它和你在同一个群里上班
7月21日,Jack Dorsey旗下的Block公司开源了一个叫Buzz的项目,当天的GitHub star涨了2162个,直接冲上热榜第一。说实话,我第一眼看到这个项目的时候,反应是"又一个协作工具"——但花了两个小时看完它的架构设计之后,我意识到这玩意儿和Slack、Discord、Teams完全不是一个物种。
Buzz的核心想法很朴素也很激进:给AI Agent发一把和人类同事一样的钥匙,让它在真正的工作空间里"打卡上班"。 不是把AI当成一个被调用的API,而是把它当成一个team member——有权限、有身份、有工作流。—## Buzz到底是什么Buzz是一个自托管的协作工作区,底层跑的是Nostr协议,后端用Rust写的,前端支持桌面端和移动端。它把消息、反应、工作流步骤、评审批准、git事件全部放在同一个"房间"里,人类和AI Agent共享这个空间。mermaidgraph TD A[Buzz 工作区] --> B[人类成员] A --> C[AI Agent 成员] B --> B1[发消息] B --> B2[审批工作流] B --> B3[代码评审] B --> B4[创建任务] C --> C1[自动回复消息] C --> C2[执行工作流步骤] C --> C3[代码审查] C --> C4[监控告警] D[Nostr Relay] --> A D --> E[自托管服务器<br/>完全数据主权] F[Git 事件] --> A G[CI/CD 通知] --> A style A fill:#1565c0,stroke:#333,color:#fff style D fill:#e65100,stroke:#333,color:#fff style C fill:#43a047,stroke:#333,color:#fff和传统的协作工具比,Buzz有几个关键区别:第一,Agent是一等公民。 在Slack里,AI bot只是一个被@才会回复的"机器人"。在Buzz里,Agent有自己的身份、权限、可以主动发起工作流。比如一个代码审查Agent可以自动监控git push事件,然后在房间里直接发消息:"我看了你刚才的PR,第3个文件第47行有个潜在的内存泄漏,要不要改一下?“第二,底层是Nostr协议。 这可能是Buzz最被低估的设计选择。Nostr是一个去中心化的消息协议,每个用户有一对公私钥,消息通过Relay服务器中继。这意味着Buzz的数据不属于任何公司——你自己部署Relay,数据完全在你手里。第三,Rust后端带来的性能优势。 一个协作工具为什么用Rust写?因为Buzz要处理大量并发事件——git webhook、CI/CD通知、Agent的实时推理结果、人类的聊天消息。Rust的零成本抽象和内存安全特性在这种场景下是天然的加分项。—## 为什么说"把Agent放进工作群"是范式转变我们现在的AI Agent使用方式,本质上都是"调用-响应"模式:你给Agent发一条指令,Agent执行完返回结果。这个模式的问题在于:Agent是"被动"的,它不知道上下文,不了解团队动态,每次调用都是一次性的。Buzz的模式完全不同——Agent是"常驻"的。它一直在房间里,看着所有的对话、代码变更、CI/CD状态。它能主动发现问题、主动提出建议。mermaidgraph LR subgraph 传统模式 A1[开发者] -->|"帮我审查这段代码"| A2[AI Agent] A2 -->|"审查结果"| A1 A1 -.->|"Agent 不知道自己错过了什么"| A1 end subgraph Buzz 模式 B1[开发者 push 代码] -->|Git Webhook| B2[Buzz 房间] B2 -->|事件通知| B3[AI Agent 常驻] B3 -->|"发现潜在 Bug,建议修改"| B2 B2 -->|消息通知| B1 B4[CI/CD 失败] -->|自动通知| B2 B3 -->|"构建失败,检查到依赖版本冲突"| B2 end style A2 fill:#90a4ae,stroke:#333,color:#fff style B3 fill:#43a047,stroke:#333,color:#fff举个具体的例子:假设你们的CI/CD流水线失败了。在传统模式下,你需要手动把错误日志贴给Agent,让它分析。在Buzz模式下,Agent一直在房间里,它看到CI/CD失败的通知后,自动拉取日志、分析原因、在房间里发消息:“构建失败是因为package-lock.json里lodash的版本被锁死在4.17.20,但新引入的依赖要求4.17.21+。建议改一下版本范围。“这个过程不需要任何人"调用"Agent——它自己就做了。—## Nostr协议:为什么这个选择很关键很多人可能对Nostr不太熟悉,我简单说一下。Nostr(Notes and Other Stuff Transmitted by Relays)是一个极简的社交协议,由比特币社区的开发者创建。它的核心概念非常简单:- 每个用户有一对公私钥- 用户发布"事件”(Event),用私钥签名- Relay服务器中继这些事件- 任何客户端可以连接到任何Relay来获取事件python# Nostr 事件结构(简化版)import jsonimport hashlibfrom datetime import datetimeclass NostrEvent: def __init__(self, pubkey: str, content: str, kind: int, tags: list = None): self.pubkey = pubkey self.created_at = int(datetime.now().timestamp()) self.kind = kind # 1=文本消息, 2=工作流, 3=git事件 self.tags = tags or [] self.content = content def serialize(self) -> dict: return { "pubkey": self.pubkey, "created_at": self.created_at, "kind": self.kind, "tags": self.tags, "content": self.content, } def id(self) -> str: """事件 ID = 序列化数据的 SHA256""" data = json.dumps([ 0, # Nostr 协议保留字段 self.pubkey, self.created_at, self.kind, self.tags, self.content ], sort_keys=True) return hashlib.sha256(data.encode()).hexdigest()Buzz选择Nostr有两个关键原因:第一,数据主权。 企业可以部署自己的Relay服务器,所有数据都在自己的服务器上。不存在"数据被第三方平台看到"的风险。第二,身份体系天然适合Agent。 每个Agent就是一个Nostr用户,有自己的公私钥。Agent的身份、权限、消息签名都通过这套公私钥体系管理。这和传统的"API Key"模式完全不同——API Key可以随时被撤销,但公私钥的身份是密码学意义上不可伪造的。—## 实际部署:怎么跑起来Buzz的部署并不复杂,官方提供了Docker Compose一键部署。核心组件包括:bash# 克隆仓库git clone https://github.com/block/buzz.gitcd buzz# 部署(需要 Docker 和 Rust 工具链)docker compose up -d# 启动后访问# Web: http://localhost:3000# Nostr Relay: ws://localhost:8080添加一个AI Agent到Buzz房间里的流程也很直观:pythonimport nostrimport asyncioclass BuzzAgent: """Buzz 工作区中的 AI Agent""" def __init__(self, private_key: str, relay_url: str): self.key = nostr.Key.from_hex(private_key) self.relay_url = relay_url self.client = nostr.Client(self.key) async def connect(self): """连接到 Buzz Relay""" await self.client.connect(self.relay_url) print(f"Agent {self.key.public_key_hex()[:8]}... 已上线") async def listen_and_respond(self): """监听房间消息并自动回复""" async for event in self.client.subscribe(kinds=[1]): if event.pubkey == self.key.public_key_hex(): continue # 跳过自己的消息 # 分析消息内容,决定是否回复 response = await self._analyze(event.content) if response: reply = nostr.Event( kind=1, content=response, tags=[["e", event.id]] # 引用原消息 ) reply.sign(self.key.private_key_hex()) await self.client.publish(reply) async def _analyze(self, content: str) -> str | None: """分析消息,决定是否回复(简化版)""" if 'bug' in content.lower() or '报错' in content: return "检测到 Bug 报告,正在拉取相关日志..." if 'PR' in content or 'pull request' in content.lower(): return "检测到新 PR,启动代码审查流程..." return None—## 写在最后Buzz的出现,让我重新思考了"人机协作"这件事。以前我们觉得AI是一个工具——你用它,它帮你。但Buzz提供了另一种可能:AI是一个同事——你不需要"调用"它,它就在那里,看到问题自己会出声。当然,Buzz目前还处于早期阶段(v0.4.21),有很多不完善的地方。但方向是对的——把Agent从"被动调用"变成"主动参与”,从"一次性使用"变成"常驻协作”。这个范式转变如果走通了,可能会改变我们组织团队和分配工作的方式。标签: block/buzz、Nostr协议、AI Agent、人机协作、开源协作平台
更多推荐


所有评论(0)