據(jù)機(jī)器人:@mention 出報(bào)告并在同會(huì)話多輪追問(wèn))
如何在 Slack 中接入 Claude Managed Agents 數(shù)據(jù)機(jī)器人mention 出報(bào)告并在同會(huì)話多輪追問(wèn)【免費(fèi)下載鏈接】claude-cookbooksA collection of notebooks/recipes showcasing some fun and effective ways of using Claude.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/an/claude-cookbooks本文基于 claude-cookbooks 倉(cāng)庫(kù)中的 slack_data_bot.ipynb演示如何把一個(gè) Claude Managed Agents 數(shù)據(jù)分析 agent 包裝成 Slack 機(jī)器人在頻道里mention它并附上一個(gè) CSV它會(huì)在線程里回一份敘述式報(bào)告之后在同一線程直接回復(fù)不需要再次 mention即可繼續(xù)追問(wèn)追問(wèn)會(huì)落在同一個(gè) CMA 會(huì)話上容器的文件系統(tǒng)與會(huì)話歷史跨輪次保留。適用的前提一個(gè)可以安裝應(yīng)用的 Slack workspace、一個(gè) Anthropic API key設(shè)為ANTHROPIC_API_KEY、Python 3.11 的 Jupyter 環(huán)境。整個(gè)鏈路使用 Slack Socket Mode事件通過(guò) WebSocket 下發(fā)本地開發(fā)不需要公網(wǎng) URL。準(zhǔn)備依賴與 Slack 應(yīng)用先運(yùn)行 notebook 里的安裝單元格它會(huì)裝齊機(jī)器人側(cè)需要的包%%capture %pip install -q anthropic0.91.0 python-dotenv slack_bolt requests markdown-to-mrkdwn然后創(chuàng)建 Slack 應(yīng)用倉(cāng)庫(kù)已給出可直接使用的 manifest slack_app_manifest.yaml。在 Slack 的 API 控制臺(tái)選擇Create New App → From a manifest粘貼該文件內(nèi)容并安裝到你的 workspace。這份 manifest 已替你配置好bot 顯示名為databotbot scopesapp_mentions:read、chat:write、files:read、files:write、channels:history事件訂閱app_mention與message.channelssocket_mode_enabled: true即事件走 WebSocket無(wú)需公網(wǎng)回調(diào)地址。安裝完成后取兩個(gè) token用途不同不要拿錯(cuò)Token獲取位置用途Bot User OAuth Tokenxoxb-...OAuth Permissions機(jī)器人發(fā)消息、上傳文件對(duì)應(yīng)SLACK_BOT_TOKENApp-Level Tokenxapp-...Basic Information → App-Level Tokens生成時(shí)勾選connections:writeSocket Mode 連接 Slack對(duì)應(yīng)SLACK_APP_TOKEN最后在你想讓機(jī)器人工作的頻道里執(zhí)行/invite databot否則后續(xù)chat.postMessage會(huì)返回not_in_channel。先運(yùn)行 data_analyst_agent.ipynb 拿到三個(gè) ID機(jī)器人不自己創(chuàng)建 agent它復(fù)用 data_analyst_agent.ipynb 里創(chuàng)建好的 agent 和 environment避免每次重啟機(jī)器人重新 provision。先跑通這個(gè) notebook它會(huì)創(chuàng)建 environment預(yù)裝pandas、plotlynetworking 為unrestricted文檔提示生產(chǎn)環(huán)境應(yīng)改用 host allowlist創(chuàng)建名為cookbook-data-analyst的 agent模型claude-sonnet-4-6掛載agent_toolset_20260401工具集其中web_search和web_fetch被顯式禁用上傳示例數(shù)據(jù)sales_data.csv50 行跑一次完整的分析會(huì)話并取回report.html歸檔該會(huì)話并把ANALYST_ENV_ID、ANALYST_AGENT_ID、ANALYST_AGENT_VERSION寫入.env。第 4 步是銜接點(diǎn)slack_data_bot.ipynb 的 setup 單元格啟動(dòng)時(shí)會(huì)檢查這三個(gè)變量缺失則直接拋錯(cuò)不會(huì)靜默繼續(xù)for key in (ANALYST_ENV_ID, ANALYST_AGENT_ID, ANALYST_AGENT_VERSION): if not os.environ.get(key): raise RuntimeError(f{key} not set. Run data_analyst_agent.ipynb first.)注意.env已在.gitignore中不要把 API key 和 Slack token 提交進(jìn)版本庫(kù)。運(yùn)行 Slack 機(jī)器人打開 slack_data_bot.ipynb按順序運(yùn)行。setup 單元格會(huì)在首次運(yùn)行時(shí)交互式提示輸入SLACK_BOT_TOKEN和SLACK_APP_TOKENxoxb-...和xapp-...并用set_key寫進(jìn).env重啟后不用重輸也可以提前手動(dòng)寫入.env跳過(guò)提示。bot 的核心行為由三段代碼構(gòu)成完整代碼在 notebook 內(nèi)這里說(shuō)明各段職責(zé)和關(guān)鍵設(shè)計(jì)1. 收到 mention 時(shí)立即 ack慢活丟到后臺(tái)線程。Slack 會(huì)對(duì) 3 秒內(nèi)未確認(rèn)的事件重試所以on_mention先調(diào)用ack()并回復(fù) On it. Analyzing now.然后在后臺(tái)線程里執(zhí)行真正的分析若 mention 附帶文件用 bot token 從 Slack 下載后重新上傳到 Anthropic Files API掛載到/mnt/session/uploads/data.csv并在問(wèn)題末尾追加掛載路徑隨后client.beta.sessions.create創(chuàng)建會(huì)話metadata 里寫入slack_channel和slack_thread_ts再發(fā)user.message事件觸發(fā) agent。2.relay_stream把會(huì)話事件流轉(zhuǎn)發(fā)回線程。它循環(huán)讀取client.beta.sessions.events.stream(session_id)遇到agent.message保留最新文本作為最終摘要遇到agent.tool_use發(fā)一條 Running analysis... 進(jìn)展消息遇到session.status_idle結(jié)束本輪遇到session.status_terminated則在線程里貼出該會(huì)話的 Console 追溯鏈接。本輪結(jié)束后把摘要超過(guò) 3900 字符會(huì)截?cái)嗖?biāo)注_(truncated)_Slack 文本上限約 4000 字符轉(zhuǎn)成 mrkdwn 發(fā)回線程再用files.list(scope_idsession_id, betas[managed-agents-2026-04-01])列出會(huì)話產(chǎn)出只上傳downloadable True的文件即 agent 生成的報(bào)告等不含用戶自己的輸入文件。3. 線程回復(fù)自動(dòng)續(xù)接同一會(huì)話。這是“多輪追問(wèn)”的關(guān)鍵app.event(message) def on_thread_reply(event, ack): ack() thread_ts event.get(thread_ts) if event.get(subtype): return if not thread_ts or event.get(bot_id) or thread_ts not in thread_sessions: return threading.Thread( targetcontinue_session, args(thread_sessions[thread_ts], event[channel], thread_ts, event[text]), ).start()它只處理已建過(guò)會(huì)話的線程里的人類消息跳過(guò)編輯/刪除等 subtype、跳過(guò) bot 消息把回復(fù)作為新的user.message事件發(fā)給同一個(gè) session。代碼里用內(nèi)存字典thread_sessionsthread_ts - session_id維護(hù)這條映射文檔明確提示生產(chǎn)環(huán)境應(yīng)把它持久化到數(shù)據(jù)庫(kù)并在線程過(guò)期時(shí)歸檔會(huì)話。最后運(yùn)行 notebook 末尾的單元格啟動(dòng)監(jiān)聽SocketModeHandler(app, os.environ[SLACK_APP_TOKEN]).start()該單元格會(huì)阻塞直到機(jī)器人停止用 Jupyter 的 ■ 中斷按鈕結(jié)束。驗(yàn)證mention 出報(bào)告線程內(nèi)繼續(xù)追問(wèn)確認(rèn) notebook 的 setup 單元格沒(méi)有拋RuntimeError三個(gè)ANALYST_*變量都已就位且SocketModeHandler單元格正在運(yùn)行。在已邀請(qǐng)databot的頻道里databot加一句問(wèn)題并附上 CSV例如倉(cāng)庫(kù)自帶的sales_data.csv。預(yù)期線程內(nèi)依次出現(xiàn)On it. Analyzing now. → Running analysis... → 最終摘要文本以及 agent 寫出的report.html附件。文章開頭的截圖就是倉(cāng)庫(kù)記錄的一次運(yùn)行結(jié)果作為示例參考。不 mention直接在該線程里回復(fù)一句追問(wèn)例如要求對(duì)某列再細(xì)分。機(jī)器人應(yīng)在同一會(huì)話上繼續(xù)且能引用上一輪分析過(guò)的數(shù)據(jù)——因?yàn)槿萜魑募到y(tǒng)和會(huì)話歷史跨輪次保留。想核對(duì)完整執(zhí)行過(guò)程時(shí)每個(gè) mention 創(chuàng)建的會(huì)話都能在 Anthropic Console 的Sessions頁(yè)面看到完整事件軌跡。限制與后續(xù)步驟thread_sessions是進(jìn)程內(nèi)字典機(jī)器人重啟后舊線程的追問(wèn)映射丟失文檔建議持久化到數(shù)據(jù)庫(kù)會(huì)話空閑后記得歸檔以釋放容器。摘要文本超 3900 字符會(huì)被截?cái)嚅L(zhǎng)內(nèi)容依賴report.html附件本身。若要改變分析風(fēng)格修改 data_analyst_agent.ipynb 的系統(tǒng)提示并重跑該 notebook 即可——它會(huì)創(chuàng)建新 agent 并把新 ID 寫回.env機(jī)器人下次讀取時(shí)自動(dòng)切換。要脫離 notebook 部署時(shí)把代碼拷成.py文件即可機(jī)器人需要能長(zhǎng)期持有 WebSocket 連接的任何運(yùn)行環(huán)境。另外倉(cāng)庫(kù)里還有一個(gè) TypeScript 實(shí)現(xiàn)的同類橋接 managed_agents/slack/mention→sessions.create→ idle webhook 回貼架構(gòu)是每條 mention 開新會(huì)話、無(wú)跨輪記憶與本文 notebook 的“同會(huì)話多輪追問(wèn)”路徑不同如果你需要多輪上下文按本文的 notebook 路徑走?!久赓M(fèi)下載鏈接】claude-cookbooksA collection of notebooks/recipes showcasing some fun and effective ways of using Claude.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/an/claude-cookbooks創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考