Standup Pulse

1个月前发布 42 00

Standup Pulse 是一个本地优先的 Slack 异步站会代理,带有 Angular 管理仪表板。它通过 llama.cpp 运行一个优化的 Unsloth Gemma 4 26B A4B MoE GGUF,带有 MTP 推测解码,使用 Mastra 作为代理,CopilotKit Channels 作为 Slack 传输,以及 ...

所在地:
美国
收录时间:
2026-09-15
Standup PulseStandup Pulse

Standup Pulse 是一个注重隐私和本地控制的 Slack 异步站会(Daily Standup)解决方案。它利用本地运行的大语言模型处理团队每日更新,并通过一个功能丰富的 Angular 管理仪表板展示团队状态。

Standup Pulse

该项目展示了如何将高性能本地模型、现代 Web 框架和 AI 代理框架结合,构建出一个完全自托管、数据不出本地的企业级应用。

核心技术栈

Standup Pulse 采用了一套前沿且高度模块化的技术组合:

  • AI 引擎:
    • 模型:unsloth/gemma-4-26B-A4B-it-GGUF (Q4_K_M 量化),基于 Gemma 4 架构的混合专家 (MoE) 模型。
    • 推理后端:llama.cpp,启用 MTP (Multi-Token Prediction) 推测解码以加速生成。
    • 代理框架:Mastra,用于编排代理逻辑、工具调用和工作流。
  • 前端界面:
    • 框架:Angular 22,配合 NgRx SignalStore 进行状态管理。
    • UI/UX:Tailwind CSS 4 + daisyUI 5,提供现代化的组件样式。
    • AI UI:CopilotKit Angular 集成,使用模型生成的 A2UI 动态渲染仪表板内容。
  • 后端与数据:
    • API:Hono,轻量级且高性能的 Web 框架。
    • 数据库:SQLite (LibSQL),通过 Drizzle ORM 进行类型安全的数据访问。
    • 通信:CopilotKit Channels 作为 Slack 传输层,实现双向消息同步。
  • 工程化:
    • Monorepo:Nx 管理多项目结构。
    • 包管理器:pnpm。

核心功能

  1. 智能 Slack 交互
    • 提及触发:代理仅在 @standup-pulse 被提及时响应,避免干扰无关频道对话。
    • 线程上下文:自动跟踪订阅的线程,理解上下文,并在同一线程内回答后续问题。
    • 结构化输入:引导用户提交标准化的站会信息(昨日进展、今日计划、阻碍)。
  2. Angular 管理仪表板
    • 团队脉搏 (Team Pulse):可视化展示团队整体进度和情绪。
    • 阻碍摘要 (Blocker Summary):自动提取并汇总团队成员提到的阻碍项,帮助管理者快速识别风险。
    • 动态 UI:利用 CopilotKit 的 A2UI 能力,仪表板部分内容由 AI 根据数据动态生成和渲染。
  3. 本地优先与隐私保护
    • 数据本地化:所有站会数据、聊天记录和模型推理均在本地机器或私有服务器上完成,不上传至第三方云服务。
    • 本地模型:使用 GGUF 格式的 Gemma 4 模型,无需 API 密钥,无令牌费用。
  4. 可观测性与调试 (Mastra Studio)
    • 内置 Mastra Studio (http://localhost:4111),开发者可以实时查看代理的思维链、工具调用、输入输出及耗时。
    • 统一的 LibSQL 可观测性域,确保仪表板、Slack 和 Studio 看到的追踪数据一致。

快速开始

1. 安装依赖

pnpm install

2. 启动本地模型

在一个终端窗口中运行:

tools/model/start-local-model.sh q4

这将加载 Gemma 4 26B 模型并启动 llama.cpp 服务器。

3. 启动仪表板与 API

在另一个终端窗口中运行:

pnpm nx serve dashboard
  • 仪表板地址:http://localhost:4200
  • API 地址:http://127.0.0.1:3000
  • 状态检查:访问 /api/status 可查看模型、代理、数据库和 Channel 的健康状态。

4. (可选) 启动 Mastra Studio

用于调试代理行为:

pnpm nx run api:studio

访问 http://localhost:4111,选择 “Standup Pulse” 预设即可开始调试。

Slack 集成配置

Standup Pulse 使用 CopilotKit Channels 进行 Slack 集成。配置位于 .copilotkit/channels.json:

  • Channel ID: standup-pulse
  • 测试频道: #standup-bot-testing

检查状态:

npx --yes copilotkit@4.8.1 channels status --json

安全注意:

  • Slack Bot Token 等敏感凭据应存放在 .env 文件中,该文件已被 git 忽略。
  • Mastra Studio 端口 (4111) 默认无身份验证,请勿在生产环境中公开暴露。

架构亮点:Channel 边界设计

Standup Pulse 采用了清晰的职责分离架构来处理 Slack 交互:

  1. Domain Port (standup-channel-domain.ts):定义模型可调用的最小化工具接口(如提交站会、渲染图表)。
  2. Handlers (channel-handlers.ts):处理提及事件、订阅逻辑和错误恢复。
  3. Tools (standup-tools.tsx):实现具体的业务逻辑,如解析站会文本、生成团队脉搏图。
  4. Runtime (channel-runtime.ts):管理 Channel 的生命周期和 Intelligence 配置。

这种设计确保了核心业务逻辑与特定平台(Slack)的解耦,未来可以轻松扩展到其他通讯平台(如 Teams 或 Discord)。

相关导航