NILA:自然在线敏捷-敏捷团队的Slack Bot
NILA是一个Slack机器人,可以帮助开发团队直接从他们的对话中管理敏捷工作流。该项目演示了如何使用Firebase Genkit构建一个强大的AI Agent,利用工具调用将其功能扩展到简单的对话之外。
建筑
NILA遵循一个简单的流程来处理用户请求:
- 💬 他们懈怠了:用户通过在Slack频道中提及机器人与NILA进行交互
- ⚡️ Webhook(云功能):Firebase云函数处理传入的Slack事件
- 🧠 AI代理(Firebase Genkit):请求由LLM驱动的代理处理。使用Genkit,您可以选择自己选择的LLM模型。我们在这个演示中使用了Gemini 2.5 Flash
- ⚒️ 工具:代理使用定制的工具,我们可以定义自己和GitHub MCP服务器来采取行动。在这个演示中,我们构建了一个工具,用于汇总线程中的消息并起草问题。
以这种方式构建它意味着我们可以将AI Flow与您选择的其他Webhook重用。您只需在中创建另一个云功能,即可将NILA扩展到与LINE、WhatsApp或任何其他平台一起使用 src/index.ts 而核心AI代理逻辑保持不变。
先决条件
- Node.js
- pnpm
- Genkit
- Firebase命令行界面
- ngrok
设置
- 安装依赖项
cd functions
pnpm install- 设置Firebase项目
1. 创建新的Firebase项目 1. 启用Blazed计划(按需付费)以使用Firebase功能 1. 更新 .firebaserc 项目根目录中的文件,以包含Firebase项目名称
{
"projects": {
"default": "[your_project_name]"
}
}
- 设置Slack应用程序
1. 首选https://api.slack.com/apps点击“创建新应用” 1. 选择“从应用清单”选项,然后选择您的工作区 1. 用您的应用程序名称更新下面的JSON
{
"display_information": {
"name": "[YOUR_APP_NAME]",
"description": "[YOUR_APP_DESCRIPTION]",
},
"features": {
"bot_user": {
"display_name": "[YOUR_APP_NAME]",
"always_online": true
}
},
"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"chat:write",
"files:read",
"groups:history",
"incoming-webhook",
"mpim:history"
]
}
},
"settings": {
"event_subscriptions": {
"request_url": "https://[YOUR_DOMAIN]/events",
"bot_events": [
"app_mention",
"message.mpim"
]
},
"org_deploy_enabled": true,
"socket_mode_enabled": false,
"token_rotation_enabled": false
}
}4. 转到“基本信息”,在“应用程序凭据”下找到“签名密钥”。这将是一个环境变量 SLACK_SIGNING_SECRET 1. 转到“OAuth和权限”,找到“Bot用户OAuth令牌”。这将是一个环境变量 SLACK_BOT_TOKEN 1. 将您的机器人添加到Slack频道,以便我们在后续步骤中进行测试
/invite @[YOUR_APP_NAME]- 设置GitHub令牌
要允许您的AI代理管理GitHub,您需要 GITHUB_PERSONAL_ACCESS_TOKEN MCP服务器。
1. 首选 .设置令牌的名称和描述 1. 选择资源所有者:这可以是您自己的GitHub或您的组织。如果您不是组织管理员,您可能需要管理员批准您创建令牌的请求 1. 选择仓库访问权限:取决于你想给你的人工智能多少权力。我只会选择我只感兴趣的仓库 1. 选择权限:MCP服务器可以使用许多GitHub API,因此启用您认为授予AI工具的权限是一种很好的做法。对于此AI代理,我们只需要对Issues进行读写访问,这也将自动启用元数据的强制权限 1. 点击“生成令牌”,您应该得到一个以开头的令牌 github_pat_[xyz]请确保其安全,因为您将无法再次访问它。
- 设置环境变量
cp .secret.local.example .secret.local- 将API密钥添加到
.secret.local:
GOOGLEAI_API_KEY=your_api_key
SLACK_BOT_TOKEN=your_bot_token
SLACK_SIGNING_SECRET=your_signing_secret
GITHUB_PERSONAL_ACCESS_TOKEN=your_github_token地方发展
使用Firebase模拟器套件和Firebase Genkit UI进行本地测试。
- 运行本地开发服务器
pnpm run dev- 设置ngrok以公开您的本地服务器(使您的本地模拟器可以在线访问)
ngrok http 5001- 使用ngrok URL更新Slack应用程序的事件订阅URL。它位于“事件订阅”下
https://[your-ngrok-id].ngrok.io/[YOUR_PROJECT_NAME]/us-central1/slack等待请求URL验证确认,然后单击“保存更改”按钮
- 将Slack聊天机器人添加到频道中,并通过提及其名称来发送您的第一条消息。
@NILA Hello, can you help me?您应该已经收到回复消息,首先说“键入…”,然后是AI代理的准确回复。
调试
- 使用Firebase模拟器调试您的webhook功能http://localhost:4001/logs
- 使用Firebase Genkit UI调试您的AI Flowhttp://localhost:4000/
部署
要使用Firebase进行身份验证并访问您的项目,请使用Firebase CLI登录命令:
$ firebase login为了在使用Firebase函数时保护密钥的安全,请将密钥作为秘密值存储在Google Cloud secret Manger中:
$ firebase functions:secrets:set GOOGLEAI_API_KEY
? Enter a value for GOOGLEAI_API_KEY [input is hidden]
$ firebase functions:secrets:set SLACK_BOT_TOKEN
? Enter a value for SLACK_BOT_TOKEN [input is hidden]
$ firebase functions:secrets:set SLACK_SIGNING_SECRET
? Enter a value for SLACK_SIGNING_SECRET [input is hidden]
$ firebase functions:secrets:set GITHUB_PERSONAL_ACCESS_TOKEN
? Enter a value for GITHUB_PERSONAL_ACCESS_TOKEN [input is hidden]要确认您的密钥已正确存储为机密,请使用以下命令:
$ firebase functions:secrets:access OPENAI_API_KEY
your_api_key
$ firebase functions:secrets:access SLACK_BOT_TOKEN
your_bot_token
$ firebase functions:secrets:access SLACK_SIGNING_SECRET
your_signing_secret
$ firebase functions:secrets:set GITHUB_PERSONAL_ACCESS_TOKEN
your_github_personal_access_token保护好密钥后,您就可以将应用程序部署到Firebase Functions了:
$ pnpm run deploy部署后,使用生产URL再次更新Slack应用程序的事件订阅URL。 https://slack-[your_function_id]-uc.a.run.app/events.更换 [your_function_id] 您可以在Firebase控制台的函数仪表板下找到Firebase项目值。
NILA建议提示
@nila Hello! Can you help me track our project tasks?
@nila Create a new bug report for the login page crash on mobile devices
@nila Draft a task for implementing email notifications when tasks are assigned
@nila List all open bugs in our repository
@nila What's the status of the dashboard page?
@nila Create a task to refactor the payment processing module with proper test coverage尝试这些提示或变体,看看NILA如何帮助您的团队直接从Slack对话中管理工作流程。
鸣谢
本项目建立在以下基础之上:
- Yuki Nagae的 Genkit Firebase功能松弛螺栓示例
- Handy的Slack util函数来自 Vercel的人工智能SDK Slackbot
许可证
Apache许可证
