
Claude Managed Agents 如何把 CSV 变成叙事式 HTML 分析报告沙箱环境与文件挂载【免费下载链接】claude-cookbooksA collection of notebooks/recipes showcasing some fun and effective ways of using Claude.项目地址: https://gitcode.com/GitHub_Trending/an/claude-cookbooks这份教程解决一个常见任务拿到一份 CSV比如电商订单数据希望 agent 自动分析并产出一份带交互式图表的叙事式 HTML 报告。项目 claude-cookbooks 的 data_analyst_agent.ipynb 演示了如何用 Claude Managed AgentsAnthropic 托管的有状态 agent 运行时完成这件事定义一个预装 pandas、plotly 的沙箱环境和一个分析师 agent把 CSV 挂载进会话容器流式观察 agent 工作最后把生成的report.html取回本地。前置条件来自 notebook 的 Prerequisites 部分Python 3.11在 Anthropic Console 申请的 API key设置为环境变量ANTHROPIC_API_KEYManaged Agents 的四个核心概念Agent模型 系统提示 工具、Environment容器模板含预装包和网络策略、Session绑定 agent 与环境、挂载文件后的运行实例、Events应用与 agent 之间的消息流。沙箱、工具执行和上下文管理都由 Anthropic 托管。准备依赖与示例数据在 notebook 中先安装依赖%pip install -q anthropic0.91.0 python-dotenv然后初始化客户端并选定模型from pathlib import Path from anthropic import Anthropic from dotenv import load_dotenv, set_key load_dotenv() client Anthropic() MODEL claude-sonnet-4-6仓库自带一份 50 行的示例数据集 sales_data.csv列为order_id, customer_id, product, category, price, quantity, order_date, region。行数少所以分析只需几分钟按文档说明这里也可以换成任意 CSV或 CSV 的 zip 包后续流程完全一样。创建沙箱环境预装 pandas 和 plotlyEnvironment 是可复用的容器规格。在这里声明pandas和plotly意味着每个会话启动时就已预装这两个包agent 可以立即开始分析而不必先跑pip installenv client.beta.environments.create( namecookbook-data-analyst-env, config{ type: cloud, networking: {type: unrestricted}, packages: { type: packages, pip: [pandas, plotly], }, }, )这里的networking设为unrestricted是为了让 agent 能从 CDN 加载 plotly文档明确提醒这表示容器可以访问任意外网地址生产环境应改用 host allowlist。定义分析师 agent工具集与系统提示Agent 把模型、系统提示和工具组合在一起。这里使用agent_toolset_20260401工具集它提供 8 个工具bash、read、write、edit、glob、grep、web_fetch、web_search。本场景的分析完全离线所以整体设为always_allow同时单独禁用两个联网工具agent client.beta.agents.create( namecookbook-data-analyst, modelMODEL, systemANALYST_SYSTEM_PROMPT, tools[ { type: agent_toolset_20260401, # default_config applies to every tool in the set; # entries in configs override specific tools. default_config: { enabled: True, permission_policy: {type: always_allow}, }, configs: [ {name: web_search, enabled: False}, {name: web_fetch, enabled: False}, ], } ], )系统提示ANALYST_SYSTEM_PROMPT决定了报告的形态完整版在 notebook 中关键约束包括写.py脚本并用python3 script.py执行大表用nrows/.sample()抽样而非全量加载每张图独立构建go.Figure()用fig.to_html(include_plotlyjsFalse, full_htmlFalse)嵌入plotly 只在head中通过 CDN 加载一次图表必须设置marker_color和templatesimple_white最终输出写入/mnt/session/outputs/的单文件自包含report.html内联 CSS、至少 3 张 plotly 图、结尾给出可执行的建议完成后以 Saved: report.html 确认最后两条就是本教程的验证依据输出路径和完成信号都来自系统提示中的约定而不是运行后自行判断。上传 CSV 并挂载到会话先用 Files API 上传数据集DATA_PATH Path(example_data/data_analyst_agent/sales_data.csv) with DATA_PATH.open(rb) as f: dataset client.beta.files.upload(file(DATA_PATH.name, f, text/csv)) print(fUploaded {DATA_PATH.name} ({dataset.size_bytes} bytes) as {dataset.id})notebook 的示例输出为Uploaded sales_data.csv (2833 bytes) as file_011CZqKKomgL45BLo2J8K5X9这是文档示例你的文件 ID 会不同。创建会话时resources参数把上传的文件挂载到容器内的指定绝对路径agent参数传入{type: agent, id: ..., version: ...}表示复用上面创建的带版本 agent。挂载路径用文件名拼出任务提示词中也引用同一路径MOUNT_PATH f/mnt/session/uploads/{DATA_PATH.name} session client.beta.sessions.create( environment_idenv.id, agent{type: agent, id: agent.id, version: agent.version}, resources[{type: file, file_id: dataset.id, mount_path: MOUNT_PATH}], titleSales analysis, ) ANALYSIS_PROMPT f\ Analyze the e-commerce orders in {MOUNT_PATH}. Columns: order_id, customer_id, product, category, price, quantity, order_date, region. Focus on revenue by category and region, repeat-customer behavior, and one surprising pattern. Produce report.html per your system instructions. client.beta.sessions.events.send( session.id, events[ {type: user.message, content: [{type: text, text: ANALYSIS_PROMPT}]}, ], ) print(fSession {session.id} running)发送user.message事件后 agent 立即开始工作。流式观察运行过程除了上面这个事件流也可以打开 Anthropic Console 的Sessions页面实时查看每个事件、工具调用和 token 计数程序侧用下面的 helper 尾随同一事件流打印agent.message文本截取前 300 字符和agent.tool_use调用名收到session.status_idle时返回收到session.status_terminated时抛错def wait_for_idle(session_id: str) - None: for ev in client.beta.sessions.events.stream(session_id): t ev.type if t agent.message: for block in ev.content: if block.type text: text block.text print(text[:300] (... if len(text) 300 else )) elif t in (agent.tool_use, agent.mcp_tool_use): print(f [{ev.name}]) elif t session.status_idle: return elif t session.status_terminated: raise RuntimeError( Session terminated before going idle. fTrace: https://platform.claude.com/sessions/{session_id} ) wait_for_idle(session.id)运行成功的信号流中能看到 agent 逐步执行脚本、生成图表最后按系统提示输出 Saved: report.html且函数在session.status_idle处正常返回。取回 report.html只有 /mnt/session/outputs/ 会被持久化注意一条明确的持久化规则agent 写到/mnt/session/outputs/的文件会被持久化并可通过 Files API 以scope_idsession_id列出写在容器内其他位置的文件不会保留。Files API 本身是另一个独立的 beta 功能所以这里调用files.list时还需要传 Managed Agents 的 beta 头outputs client.beta.files.list(scope_idsession.id, betas[managed-agents-2026-04-01]) for f in outputs.data: print(f.filename, f.size_bytes) # The list also includes the mounted input CSV; pick out the report. report next((f for f in outputs.data if f.filename report.html), None) if report is None: raise RuntimeError(freport.html not found. Files: {[f.filename for f in outputs.data]}) content client.beta.files.download(report.id) Path(report.html).write_bytes(content.read()) print(Downloaded report.html)验证方式有两层列表会同时包含挂载进来的输入 CSV 和 agent 产物notebook 的文档示例输出为report.html 53728和sales_data.csv 2833字节数随你的数据不同看到report.html存在即说明产物已生成。report is None时抛出的RuntimeError会列出当前实际存在的文件名便于判断 agent 是否写错了路径。下载完成后在浏览器打开本地report.html即可看到叙述段落和嵌入的 plotly 图表。清理会话与复用模式agent 和 environment 一次创建、跨运行复用每个对话创建新 session。拿到报告后归档当前会话以释放容器client.beta.sessions.archive(session.id)notebook 还会把 agent 与 environment 的 ID 版本写入.env供 slack_data_bot.ipynb 直接复用这两个对象来开启新会话set_key(.env, ANALYST_ENV_ID, env.id) set_key(.env, ANALYST_AGENT_ID, agent.id) set_key(.env, ANALYST_AGENT_VERSION, str(agent.version))注意set_key会修改本地的.env文件文档在运行该 cell 前明确要求先确认.env已在.gitignore中避免把 ID 提交进仓库。限制与后续本教程的边界均来自 notebook 的原文说明只有写入/mnt/session/outputs/的文件会被持久化其余路径的产物取不回来。networking: unrestricted让容器可访问任意外网仅适合演示生产应改用 host allowlist。files.list的scope_id用法依赖 Files API 这一独立 beta 功能需要随请求传managed-agents-2026-04-01beta 头。会话若在变 idle 前被terminatedhelper 会抛错并在消息中给出该会话的 Console 追踪地址可据此检查完整事件日志。下一步可以打开 slack_data_bot.ipynb把同一个 agent 包成 Slack bot在 Slack 里 它并附 CSV就能在线程里收到报告且回复继续在同一会话中进行。更多 Managed Agents 教程见 managed_agents/README.md。【免费下载链接】claude-cookbooksA collection of notebooks/recipes showcasing some fun and effective ways of using Claude.项目地址: https://gitcode.com/GitHub_Trending/an/claude-cookbooks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考