ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

GitHub 今日推荐|company-brain:在 Slack 里给团队装个会主动干活的 AI

GitHub 今日推荐|company-brain:在 Slack 里给团队装个会主动干活的 AI 一句话看懂项目地址https://github.com/supermemoryai/company-brain在 Slack 频道里 这个机器人提问它从团队历史对话和已连接的 GitHub、Linear、Notion 中检索答案并回复讨论新功能时它自动创建 issue 并分配负责人需要写操作时会弹出审批卡片点击同意后继续执行。曾是付费产品现已开源需自行部署到 Cloudflare Workers。它解决什么问题团队在 Slack 里讨论的决策、项目进度、负责人分工散落在成百上千条消息里新人或跨时区同事很难快速找到上下文。传统 Slack bot 只能响应固定命令或查询外部知识库无法理解团队内部对话的语境。手动创建 GitHub issue、查询 Linear 工单、读取 Notion 文档需要在多个工具间切换。Company Brain 持续跟踪 Slack 频道中的对话按频道、DM、私有频道分隔成记忆容器memory container附带 person_、topic_、project_ 等标签。提问时它根据提问者的频道权限只检索该用户有权访问的记忆容器避免私有频道信息泄露到公共频道。检索到相关记忆后它能直接在 GitHub、Linear、Notion、Google Workspace 等工具中执行操作比如创建 issue、读取 PR、运行脚本。写操作需要用户审批审批卡片 6 小时后过期。核心概念速览Memory Container / Brain Tags按频道、DM、私有频道分隔的记忆空间附带 person_、topic_、project_ 等标签。在项目中src/brain/memory/search-brain.ts里的resolveBrainReadContainerTags和buildBrainFocusFilter根据提问者所在频道和权限决定从哪些容器中检索记忆。Turn一次完整的对话回合从用户消息到机器人回复结束。在src/brain/slack/turn.ts中runSlackTurn启动computeTurn执行完整推理循环包含工具调用、审批、流式输出。Journey / Beats / Rungs渐进式引导新用户的自动化流程分阶段解锁功能。在src/brain/journey/engine.ts中runJourneyTick按时间表发送不同阶段的引导消息beat用户完成目标后授予权限rung。MCP (Model Context Protocol)第三方工具接口协议连接 GitHub、Linear 等服务。在src/brain/tools/mcp/下实现getCatalogEntry和startMcpConnect负责发现和连接工具。架构拆解整个系统围绕 Slack 事件驱动的推理循环展开。brain/slack模块接收 Slack 事件、消息路由、权限检查、流式输出、工具连接卡片。收到消息后调用brain/turn模块的runSlackTurn启动推理。brain/turn编排推理循环、审批流程、恢复中断对话、模型选择。推理过程中调用brain/memory的searchBrain检索相关记忆并传入 prompt。brain/memory负责记忆检索、标签管理、权限范围解析、个人配置同步。推理过程中需要调用工具时brain/turn调用brain/tools/mcp执行操作。brain/tools/mcp负责 MCP 工具发现、OAuth 授权、工具目录管理、执行请求。工具需要权限时brain/turn调用brain/lease插入审批请求并暂停推理。brain/lease负责工具使用审批决策、权限升级请求、租约存储。用户点击审批按钮后brain/slack调用brain/lease的runSlackApprovalDecision审批通过后brain/turn的resumeTurnAfterApproval加载 checkpoint 从中断点继续推理。brain/journey定时触发 beat 消息发送到 Slack 频道引导新用户上手。auth模块处理用户登录、会话管理、Slack OAuth 回调完成 OAuth 后初始化 workspace 配置。关键实现走读权限隔离的记忆检索export async function searchBrain( agent: CompanyBrainAgent, org: SlackOrg, userId: string, q: string, scope?: SlackMemoryScope, traceId?: string, focusTags?: string[], containerTagsOverride?: string[], ) { const startedAt Date.now() const deps await getTurnDeps() const c deps.makeSlackSearchContext( brainAgent(agent).env, undefined, org, userId, ) const vectordb await deps.Effect.runPromise( deps.Effect.gen(function* () { return yield* deps.VectorDBService }).pipe( deps.Effect.provide( deps.makeAppLayer({ env: brainAgent(agent).env, orgId: org.id }), ), ), ) const include { documents: false, summaries: false, relatedMemories: false, forgottenMemories: false, chunks: true, } const containerTags resolveBrainReadContainerTags( agent, scope, containerTagsOverride, ) const filters buildBrainFocusFilter(focusTags)做了什么根据提问者的userId和scope公共频道、私有频道、DM调用resolveBrainReadContainerTags解析出该用户有权访问的记忆容器标签列表然后用buildBrainFocusFilter构造focusTags过滤条件最后在向量数据库中执行检索。为什么这样写不同频道的记忆用容器标签隔离公共频道的记忆所有人可见私有频道的记忆只有成员可见。resolveBrainReadContainerTags根据scope和用户在该频道的成员关系动态计算出允许检索的容器列表防止私有频道信息泄露到公共频道回复中。没有它会怎样所有记忆混在一起检索私有频道讨论的敏感信息可能出现在公共频道的回复里导致权限泄露。引导流程的定时触发export async function runJourneyTick( agent: CompanyBrainAgent, payload: JourneyTickPayload, ): Promisevoid { const orgId agent.name if (journeyStatus(agent).exitedAt ! null) return const decision await decideNextBeat( agent, Date.now(), payload.force, payload.fast, ) if (decision.action exit) { const status journeyStatus(agent) const state await readRungState(agent) exitJourney(agent, decision.reason) await captureJourneyExited({ orgId, reason: decision.reason, rungsGranted: JOURNEY_RUNGS.filter((rung) state[rung]).length, beatsSent: status.beatsSent, }) return } if (decision.action suppress) { const rung decision.rung ?? null recordBeat(agent, { rung, outcome: suppressed, reason: decision.reason }) await captureBeatSuppressed({ orgId, rung: rung ?? unknown, reason: decision.reason, }) await rearm(agent, payload, decision.reason) return }做了什么检查引导流程是否已退出调用decideNextBeat根据当前时间和用户已完成的阶段rung决定下一步动作。如果决定退出exit记录退出原因和已授予的权限数量。如果决定抑制suppress记录抑制原因并调用rearm安排下次触发时间。为什么这样写引导流程分多个阶段beat每个阶段有时间间隔要求和前置条件已完成的 rung。decideNextBeat根据当前状态判断是否该发送下一条引导消息避免过于频繁打扰用户。退出和抑制决策都记录到遥测方便分析引导效果。没有它会怎样引导消息会在不合适的时机发送或者用户已完成某阶段后仍收到重复提示影响用户体验。动手上手bun install cp .dev.vars.example .dev.vars编辑.dev.vars填入 Slack App Token 和 Cloudflare 相关配置。运行bun run dev在 Slack workspace 中 机器人 或发送 DM观察终端输出的推理循环日志确认消息被正确接收和处理。应用场景团队知识问答在 Slack 频道中 机器人 或 DM 提问机器人从团队对话和已连接工具中检索答案并回复。回复范围受提问者频道权限限制私有频道记忆不会泄露到公共频道。自动化工作流讨论新功能时机器人自动在 Linear 创建 issue 并分配代码评审时读取 PR 内容并总结差异。工具写操作需要用户审批审批卡片 6 小时后过期。定时摘要与研究配置夜间定时任务机器人推送每日/每周工作摘要或启动长周期研究并在完成后发送结果。定时任务需在设置页面配置。独立分析适合需要自动化 issue 创建、PR 评审、代码执行的技术团队。README 中明确说明 Acts in your tools: GitHub, Linear, Notion, Google Workspace and hundreds more over MCP. It opens the issue instead of telling you to. 和 Runs code: Its own sandbox: clones repos, runs scripts, and hands back charts, CSVs and PDFs right in Slack.证明项目定位在可执行操作的自动化而非纯问答。权限模型防止信息泄露公共频道无法访问私有频道记忆。README 中权限表格说明 A public channel: The shared brain everyone in the org can see vs A private channel: That channels memory, plus the shared brain且src/brain/memory/search-brain.ts中resolveBrainReadContainerTags根据scope限制容器确保私有频道记忆只在该频道内可见。与传统 Slack bot 或聊天机器人相比传统 bot 通常只响应固定命令或外部知识库Company Brain 持续记忆团队对话并基于内部上下文回答且能主动发声和执行工具操作。与付费 Company Brain 产品相比README 中 Used to be a paid product with thousands of users. Now its free and open source. 表明本项目是原付费产品的开源版本需自行部署到 Cloudflare。局限与风险部署步骤细节与配置文件完整格式未在 README 中详述需要一定 Cloudflare Workers 经验。代码执行沙箱的安全性与资源限制未在 README 中详细说明生产环境使用需自行评估。Cloudflare 免费计划每请求限制 50 次外部调用长推理可能被截断。定时任务和自动化流程的配置界面和参数格式未在素材中完整展示。结论卡片适合需要自动化工作流、代码执行、团队知识检索的技术团队和开发者。不适合不熟悉 Cloudflare Workers 部署或无法承担向量数据库和 LLM API 成本的个人用户。已从付费转开源社区贡献活跃Star 增长迅速适合有云部署能力的团队尝试。项目地址https://github.com/supermemoryai/company-brain
返回列表