本地部署AutoGPT:构建可审计、可编排的AI智能体平台 1. 项目概述为什么本地部署 AutoGPT 是技术人绕不开的“成人礼”我第一次在终端里敲下docker compose up -d看着 PostgreSQL、FastAPI、WebSocket 服务一个接一个亮起绿灯后台日志开始滚动输出“Agent execution manager initialized”那一刻的感觉和当年第一次成功编译 Linux 内核、或者亲手把树莓派烧录进 SD 卡后点亮 LED 灯时一模一样——不是完成了某个任务而是真正拿到了一把能打开新世界门锁的钥匙。AutoGPT 不是又一个“AI玩具”它是一套可落地、可调试、可审计、可嵌入你现有工作流的自主智能体操作系统。关键词不是“自动”而是“自主”不是“生成”而是“决策-执行-反馈-迭代”的闭环。它解决的不是“怎么写一段文案”而是“当销售线索涌入 CRM、库存预警触发、竞品价格变动同时发生时系统能否在无人干预下按预设策略调用 API、查询数据库、生成报告、发送 Slack 通知并在执行失败时自动降级或告警”。这个平台的价值恰恰藏在它“不那么炫酷”的地方它没有承诺“一句话造出万能 Agent”而是把控制权稳稳交还给使用者。你决定 Agent 的触发条件时间、事件、API 请求、你设计它的决策树哪个 Block 走哪条分支、你审核它的每一次 LLM 调用输入 prompt 是否精准、输出 schema 是否严格、你甚至能用 Python 在底层重写任意一个 Block 的逻辑。这和直接调用 OpenAI API 或使用 ChatGPT Plus 的最大区别在于前者你永远在“猜”模型会怎么想后者你是在“设计”一个有明确行为边界的数字员工。我见过太多团队在云上试用各种 AI 工具最后卡在数据不出域、API 成本不可控、响应延迟无法接受、或是某次关键任务因模型“幻觉”导致错误决策上。而本地部署的 AutoGPT从数据库到 LLM 推理层全链路都在你自己的机器或私有云里跑所有日志、所有中间状态、所有失败堆栈都清晰可见。这不是技术极客的自我满足而是工程化落地前必须完成的“可信度验证”。它适合三类人想把重复性数字工作比如日报生成、周报汇总、竞品监控真正自动化掉的业务分析师需要快速验证 AI Agent 架构可行性、为后续上云或集成做 PoC 的后端/全栈工程师以及所有对“AI 如何真正融入工作流”这个问题不满足于概念演示而渴望亲手拆解、组装、调试的实践者。2. 核心架构与设计思路为什么是这套组合而不是别的方案2.1 分层解耦前端、后端、Block 的三角稳定结构AutoGPT 的架构不是凭空画出来的它是我过去五年踩过无数坑后看到最接近“理想态”的 AI Agent 平台分层设计。核心就三点UI 归 UI逻辑归逻辑能力归能力。前端Next.js TypeScript xyflow只干一件事提供一块无限延展的画布让你像搭乐高一样拖拽、连线、配置 Block。它不碰任何业务逻辑不处理任何 LLM 调用甚至连“保存 Agent”这个动作也只是把你在画布上画的连线关系、每个 Block 的参数配置序列化成一个 JSON 对象发给后端 API 存进 PostgreSQL。这种设计的好处是极致的轻量和灵活——你可以用 React/Vue/Angular 重写整个前端只要它遵循同一套 API 协议后端完全无感。我去年就帮一个客户用 Vue3 重构了前端只用了三天因为所有交互逻辑都封装在 API 层。后端Python FastAPI Prisma ORM是真正的“大脑中枢”。它不负责渲染只负责三件硬核的事一是状态管理每个 Agent 的运行实例Instance都有独立的内存空间、生命周期、错误状态Execution Manager 会精确追踪它是“运行中”、“已暂停”、“失败重试第3次”还是“被手动终止”二是调度编排Scheduler 不是简单地 cron 定时而是支持基于事件的触发比如监听某个 Webhook URL 收到 POST 请求、基于时间的循环每天上午9点执行、甚至基于 Agent 自身输出的条件判断如果上一次分析结果 confidence 0.8则启动备用分析流程三是协议桥接Agent Protocol 这个抽象层太关键了。它让后端不用关心你用的是 OpenAI 还是本地 Ollama 的 Llama3也不用管你的自定义 Block 是调用 REST API 还是执行 shell 命令所有外部服务都通过统一的run()方法契约接入。这直接决定了平台的扩展天花板。而 Block模块化能力单元则是整个系统的“原子能力”。它不是传统意义上的“插件”而是一个有明确定义的输入-处理-输出契约的 Python 类。每一个 Block 都必须声明自己的Input和OutputSchema用 Pydantic v2 的类型提示这意味着当你把一个“HTTP Request Block”的输出连到另一个“JSON Parser Block”的输入时IDE 能实时校验字段名是否匹配、类型是否兼容。这杜绝了大量低级错误。我见过太多用 Node-RED 或 Zapier 做自动化最后因为某个 API 返回的字段名突然从user_id变成userId导致整条流水线静默失败数天。AutoGPT 的 Schema 强约束让这种问题在配置阶段就被拦截。Block 的可测试性也极强——每个 Block 都内置test_input和test_output你改完代码一键运行poetry run pytest tests/blocks/test_sentiment_analyzer.py就能验证逻辑是否正确完全不依赖外部 API。这才是工程化的底气。2.2 技术选型背后的硬核考量为什么是 Docker、FastAPI、Next.js选择 Docker 作为部署基石绝非跟风。我经历过用纯 Python virtualenv 部署的噩梦前端依赖 Node 18后端要求 Python 3.11而客户服务器上只有 Python 3.9 和 Node 14。光是环境冲突就耗掉两天。Docker 的价值在于环境一致性和依赖隔离性。AutoGPT 的docker-compose.yml文件里PostgreSQL、Redis用于任务队列、Backend API、Frontend Server 全部是独立容器。它们之间只通过定义好的网络端口通信如 Backend 监听 8006Frontend 通过http://backend:8006调用。这意味着无论你的 Mac 是 M1 芯片、Linux 服务器是 AMD CPU、还是 Windows 上的 WSL2只要 Docker Engine 能跑整个平台的行为就完全一致。更关键的是升级变得极其安全你想把 PostgreSQL 从 15 升到 16只需改docker-compose.yml里的镜像标签docker compose down docker compose up -d旧容器停止新容器启动数据卷volume里的数据毫发无损。没有“升级失败回滚困难”的焦虑。FastAPI 被选为后端框架核心优势是异步原生支持和自动生成 API 文档。Agent 的执行常常是 I/O 密集型的调用 OpenAI API、查询数据库、发送 HTTP 请求。如果用 Flask 或 Django 的同步模式一个慢请求就会阻塞整个线程池。FastAPI 基于 Starlette 和 Pydantic天然支持async def让 Execution Manager 能并发处理数百个 Agent 实例而不会因某个 LLM 调用超时比如网络抖动拖垮全局。另一个被低估的点是它的 OpenAPI 文档。当你访问http://localhost:8006/docs会自动生成一个交互式 Swagger UI里面清清楚楚列出了所有 API 端点、请求体结构、响应示例、甚至认证方式。这极大降低了团队协作成本——前端同学不需要翻源码找接口直接在这个页面上就能测试POST /api/v1/agents/{agent_id}/execute的效果。我曾用这个文档十分钟内就帮一位非技术的产品经理教会她如何用 curl 命令手动触发一个 Agent这比写文档快十倍。Next.js 14 作为前端框架胜在App Router 的路由即数据获取和Server Components 的服务端渲染SSR能力。AutoGPT 的 UI 有大量动态数据Agent 列表、执行历史、实时日志流。Next.js 的async server component可以在服务端直接调用 Backend API 获取最新数据再渲染成 HTML 发送给浏览器用户看到的就是“秒开”的页面而不是一个空白画布加 Loading 动画。更重要的是xyflow 这个流程图库的性能优化在 Next.js 的 SSR 下能得到充分发挥。当你拖拽上百个 Block 时Canvas 的渲染压力巨大而 Next.js 的服务端预渲染把初始视图的计算负担从用户浏览器转移到了你的本地开发机体验丝滑。Tailwind CSS 的 utility-first 设计也让 UI 定制变得异常简单——想把“Blocks”面板的背景色从灰色改成深蓝改一行bg-gray-800为bg-blue-900就行不用动任何 CSS 文件或 JS 逻辑。2.3 与“老版 AutoGPT”的本质分野从“LLM 驱动的混沌探索”到“人机协同的精密编排”必须直面一个事实2023 年初爆火的原始 AutoGPTSignificant-Gravitas 版本其核心思想是“让 LLM 自己规划、自己调用工具、自己反思”。它像一个充满好奇心但缺乏边界的少年拿到一个目标比如“帮我研究比特币投资”就开始疯狂搜索、打开网页、读取 PDF、总结内容过程中可能陷入死循环也可能产生严重幻觉。这种模式在 Demo 场景很震撼但在生产环境就是灾难。我亲自测试过让它去爬取一个电商网站的实时价格它会先尝试用 Selenium 启动浏览器发现没装 ChromeDriver就转而用 requests但遇到反爬就卡住最后返回一堆无关的 HTML 代码。它没有“失败熔断”机制没有“降级策略”更没有“人工审核点”。2025 年的 AutoGPT 平台彻底放弃了这种“黑盒自治”的幻想转向白盒可控的编排范式。它的哲学是“LLM 是最强大的工具之一但它只是工具不是决策者。” 所以你创建的 Agent本质上是一个由人类定义的、带条件分支的、可中断的、有明确输入输出契约的工作流。比如你要做一个“舆情监控 Agent”老版会试图让 LLM 自己决定搜什么词、去哪些网站、怎么总结。新版则要求你明确设计第一步用“RSS Feed Block”拉取指定媒体源第二步用“Text Filter Block”过滤含关键词的新闻第三步用“OpenAI Text Generator Block”对每条新闻生成摘要第四步用“Condition Block”判断摘要情感倾向如果是负面且置信度0.9则触发“Slack Notification Block”。整个过程LLM 只在第三步扮演“文本生成器”的角色其他所有环节的逻辑、顺序、分支、错误处理都由你用 Block 和连线来定义。这带来了三个质变一是可预测性你知道每一步会发生什么二是可审计性执行日志里会清晰记录“Block A 输入是 X输出是 Y耗时 Z 毫秒”三是可维护性当某家媒体 RSS 失效你只需替换第一个 Block整个工作流无需重写。这不是退步而是从“实验室玩具”走向“工业级软件”的必经之路。3. 本地部署全流程从零开始手把手构建你的 AI Agent 工厂3.1 环境准备避开那些让你抓狂的“小坑”部署的第一步永远是环境。别跳过别心存侥幸我保证你后面会回来重看这一节。重点不是“装什么”而是“怎么装得干净、可复现”。Node.js NPMMac 用户请务必用 Homebrew 安装brew install node。不要用官网下载的.pkg安装包它会把 Node 装到/usr/local/bin而 Homebrew 装在/opt/homebrew/binM1/M2或/usr/local/binIntel路径管理更清晰。验证时node -v必须显示v20.x或更高npm -v显示v10.x或更高。低于这个版本Next.js 14 的 App Router 会报错。Linux/WSL2 用户sudo apt update sudo apt install nodejs npm是标准操作但要注意 Ubuntu 22.04 默认的nodejs包版本可能偏低建议用curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs来安装 LTS 版本。Docker Docker Compose这是最容易出问题的一环。Mac 用户直接去 Docker Desktop 官网 下载最新版安装时勾选“Use the new Virtualization framework”M1/M2或“Enable the WSL 2 based engine”Windows。Linux 用户sudo apt install docker.io docker-compose是基础但必须紧接着执行sudo usermod -aG docker $USER然后完全退出并重新登录终端否则你会一直遇到Permission denied while trying to connect to the Docker daemon socket。验证docker compose version确保输出的是Docker Compose version v2.x而不是古老的docker-composev1因为 AutoGPT 的docker-compose.yml使用了 v2 的语法特性。Git这个最简单brew install gitMac或sudo apt install gitLinux/WSL2即可。但有一个隐藏技巧克隆仓库后立刻执行git config --global core.autocrlf inputMac/Linux或git config --global core.autocrlf trueWindows避免 Windows 换行符\r\n和 Unix 换行符\n混淆导致 Python 脚本执行失败。提示所有命令的输出务必截图保存。特别是docker info的输出里面能看到 Docker Engine 版本、Storage Driver推荐 overlay2、以及是否启用了 BuildKitbuildkit: true。BuildKit 是加速 Docker 构建的关键如果为 false首次docker compose up -d --build可能长达 30 分钟以上。3.2 后端服务启动理解每个容器在做什么进入正题。假设你已经git clone https://github.com/Significant-Gravitas/AutoGPT.git目录结构如下AutoGPT/ ├── autogpt_platform/ # 核心平台代码 │ ├── backend/ # FastAPI 后端 │ └── frontend/ # Next.js 前端 └── ... # 其他文档、脚本第一步进入后端目录并初始化环境cd AutoGPT/autogpt_platform/backend cp .env.example .env这个.env文件是后端的“心脏起搏器”。它里面定义了数据库连接字符串、JWT 密钥、LLM API Key 的默认占位符等。你不需要现在就填满所有字段但必须存在。cp命令后用 VS Code 或 Vim 打开.env重点关注这几行# 数据库配置 - 这些是 Docker Compose 里定义的 service 名不要改 DATABASE_URLpostgresql://postgres:postgrespostgres:5432/autogpt_platform # JWT 认证密钥 - 生成一个强随机字符串 JWT_SECRET_KEYyour_very_strong_jwt_secret_here # LLM 配置 - 这里只是默认值实际创建 Agent 时会在 UI 里覆盖 OPENAI_API_KEYsk-... ANTHROPIC_API_KEY...DATABASE_URL里的postgres是 Docker Compose 中定义的 service 名指向postgres容器端口5432是 PostgreSQL 默认端口。JWT_SECRET_KEY必须是长且随机的字符串可以用openssl rand -base64 32生成。至于OPENAI_API_KEY现在可以留空或填一个无效的因为 UI 里会单独配置。第二步启动 Docker Composecd AutoGPT/autogpt_platform docker compose up -d --build这个命令会做三件事1) 读取根目录下的docker-compose.yml2) 为backend、postgres、redis等 service 构建或拉取镜像3) 后台启动所有容器。首次运行会非常慢因为它要下载 PostgreSQL、Redis 镜像还要构建backend的 Python 镜像包含所有 pip 依赖。耐心等待期间可以docker compose logs -f backend查看后端构建日志。成功后docker compose ps应该显示所有服务状态为running。注意如果你看到postgres容器反复重启大概率是.env里的DATABASE_URL用户名/密码和docker-compose.yml里postgresservice 的POSTGRES_PASSWORD不匹配。检查docker-compose.yml中postgres的environment部分确保.env里的DATABASE_URL用户名postgres和密码postgres与之完全一致。3.3 前端应用启动让画布活起来后端跑起来后前端就是“临门一脚”。cd AutoGPT/autogpt_platform/frontend cp .env.example .env npm install npm run devnpm install会根据package.json安装所有前端依赖Next.js、React、xyflow 等npm run dev启动开发服务器默认监听http://localhost:3000。此时打开浏览器访问该地址你应该看到一个简洁的登录页。这是最关键的验证点。如果页面空白或报 500 错误请立即检查frontend/.env文件是否存在内容是否为空frontend/.env里NEXT_PUBLIC_BACKEND_URLhttp://localhost:8006这行是否正确8006是后端 API 的默认端口必须和docker-compose.yml中backendservice 的ports配置一致。终端里npm run dev的输出是否有ready in X ms字样如果没有可能是npm install失败删掉node_modules和package-lock.json重试。登录页出现后用任意邮箱注册一个账号比如testexample.com密码随意。注册成功后系统会自动跳转到 Marketplace 页面——一个空荡荡的画布左上角有四个按钮“Blocks”、“Undo/Redo”、“Save”、“Run”。恭喜你的本地 AI Agent 工厂已经通电待命。3.4 加密密钥定制不只是安全更是责任AutoGPT 的.env文件里有一行ENCRYPTION_KEY它用于加密存储在数据库中的敏感信息比如你配置的 LLM API Keys。.env.example里给的是一个示例密钥绝对不能用于生产环境。生成一个真正安全的密钥有两种方式方式一Python CLI推荐# 确保你在 AutoGPT/autogpt_platform/backend 目录下 poetry run cli gen-encrypt-key这条命令会输出一串 Base64 编码的密钥例如gAAAAABl...。把它复制下来替换.env文件中ENCRYPTION_KEY后面的内容。注意不要加引号直接粘贴。方式二Python 一行命令from cryptography.fernet import Fernet print(Fernet.generate_key().decode())在 Python 解释器里运行这段代码同样得到密钥。为什么这一步如此重要因为一旦你把 Agent 配置好把 OpenAI Key 填进去这个 Key 就会被这个密钥加密后存进 PostgreSQL 的agents表里。如果密钥丢失所有已加密的 Key 都将无法解密意味着你必须重新配置所有 Agent。所以生成密钥后请务必把它备份在一个安全的地方比如你的密码管理器并记录下你用的是哪种方式生成的CLI 还是 Python以防未来需要迁移。提示Windows 用户请注意Docker Desktop 设置里务必选择 “Use the WSL 2 based engine”。如果之前选了 Hyper-V会导致 SupabaseAutoGPT 的数据库服务无法正常启动表现为postgres容器一直 restarting。切换方法Docker Desktop → Settings → General → “Use the WSL 2 based engine” 勾选 → Apply Restart。4. UI 深度解析与首个 Agent 创建从画布到可执行的数字员工4.1 Blocks 面板你的 AI 能力工具箱点击画布左上角的 “Blocks” 按钮一个侧边栏会展开这就是你的“AI 工具箱”。它被精心组织成几个大类Core核心逻辑、LLM大语言模型、Data数据处理、Integration第三方集成、Utility实用工具。不要被数量吓到我们只关注最常用的几个。Core Input (Long Text)这是你的 Agent 的“入口”。它不是一个简单的文本框而是一个可配置的输入源。双击它弹出配置面板你可以设置Name: 给这个输入块起个有意义的名字比如customer_feedback这将成为它在工作流中的唯一标识。Default Value: 一个默认的文本比如 “请描述您对产品的使用体验”。这个值在你点击 “Run” 时会作为初始输入传给下游 Block。Required: 勾选后如果用户不提供输入Agent 就不会启动。这是强制校验。LLM OpenAI Text Generator: 这是你最常打交道的 Block。双击配置Prompt: 这是核心不是随便写句话。比如你要做客服回复Prompt 应该是“你是一名专业的客服代表。请根据以下用户反馈生成一条礼貌、专业、且包含具体解决方案的回复。用户反馈{customer_feedback}。请只输出回复内容不要有任何额外说明。” 注意{customer_feedback}这个花括号变量它会自动绑定到上游InputBlock 的输出。Model: 下拉菜单里有gpt-3.5-turbo,gpt-4-turbo,claude-3-haiku-20240307等。选择取决于你的需求和预算。gpt-3.5-turbo速度快、成本低适合大部分场景gpt-4-turbo更强大适合复杂推理。API Key: 这里填你的 OpenAI Key。关键点来了这个 Key 不会明文存储在数据库里。它会被你前面设置的ENCRYPTION_KEY加密后存储。而且这个 Key 只在这个 Block 的上下文中有效不会泄露给其他 Block。Utility Agent Output: 这是你的 Agent 的“出口”。它不执行任何逻辑只负责接收上游 Block 的输出并将其展示在 UI 的 “Agent Outputs” 面板里。双击配置只需设置Name比如customer_reply。4.2 连线的艺术构建第一个工作流现在把这三个 Block 拖到画布上。它们之间需要“连线”才能形成数据流。连线不是视觉装饰而是定义数据流向的契约。连接 Input 到 Text Generator把鼠标悬停在InputBlock 的右下角会出现一个小小的圆点output port。按住鼠标左键拖拽到OpenAI Text GeneratorBlock 的左上角input port。松开一条蓝色的线就出现了。这条线的意义是“把InputBlock 的text字段的值作为OpenAI Text GeneratorBlock 的prompt字段的输入。”连接 Text Generator 到 Agent Output同理从OpenAI Text Generator的右下角response字段的 output port拖拽到Agent Output的左上角value字段的 input port。这条线的意义是“把OpenAI Text GeneratorBlock 的response字段的值赋给Agent OutputBlock 的value字段。”此时你的画布上应该有三条 Block两条蓝色连线。这就是一个最简但完整的 Agent输入一段文字 → 交给 LLM 生成回复 → 输出结果。它和 ChatGPT 的区别在于ChatGPT 的 Prompt 是你每次手动输入的而这里的 Prompt 是你预先写好、固化在 Block 里的保证了每次执行的语义一致性。4.3 保存、运行与调试见证你的数字员工第一次呼吸点击画布右上角的 “Save” 按钮。系统会弹出一个对话框让你为这个 Agent 命名比如Customer Feedback Responder并添加一个描述。点击 “Save”它就会出现在你的 “My Agents” 库里。接下来点击 “Run” 按钮。这时一个 “Run Settings” 面板会弹出它正是你配置的InputBlock 的Default Value。你可以直接修改它比如输入“产品发货太慢了等了整整一周而且包装还破损了” 然后点击 “Run Agent”。几秒钟后画布下方的 “Agent Outputs” 面板会刷新显示出customer_reply的值比如“非常抱歉听到您的不愉快体验我们已为您安排加急补发并附赠一张50元优惠券作为补偿。新的包裹预计2个工作日内发出物流单号将通过短信发送给您。感谢您的理解与支持”提示如果输出是乱码或长时间无响应请立即打开浏览器开发者工具F12切换到 “Network” 标签页找到POST /api/v1/agents/{id}/execute这个请求查看它的 Response。90% 的问题都能在这里找到答案是401 UnauthorizedAPI Key 错误400 Bad RequestPrompt 里变量名拼错了还是500 Internal Server Error后端日志里有详细堆栈不要猜要看日志。4.4 模块化威力把你的 Agent 变成别人眼中的“积木”现在你有了一个功能完备的Customer Feedback ResponderAgent。它的真正威力体现在“复用”上。回到 Blocks 面板点击 “My Agents” 标签页你会发现你刚创建的 Agent 已经作为一个新的 Block 出现在列表里你可以把它像其他 Block 一样拖拽到新的画布上。想象一个更复杂的场景你需要一个 “VIP 客户关怀 Agent”。它的流程是1) 从 CRM API 获取 VIP 客户列表2) 对每个客户调用你刚创建的Customer Feedback ResponderAgent 生成个性化关怀消息3) 将消息通过邮件或微信发送。在这个新 Agent 里“步骤2” 就可以直接用你那个已有的 Agent Block而不需要重新写一遍 Prompt、配置一遍 API Key。这带来的好处是爆炸性的开发效率新 Agent 的 70% 工作量被复用掉了。质量保障Customer Feedback Responder的逻辑经过了充分测试复用它就继承了它的稳定性。统一维护如果公司政策变了要求所有客服回复必须加上一句 “祝您生活愉快”你只需要在Customer Feedback Responder的 Prompt 末尾加上这句话所有用到它的 Agent 都会自动更新。这就是 AutoGPT 的“乐高哲学”单个 Block 是螺丝钉单个 Agent 是标准化组件而整个平台就是一座可以无限扩展的工厂。5. 自定义 Python Block 开发解锁无限可能的终极钥匙5.1 Block 开发规范为什么必须遵守这些“条条框框”官方文档告诉你“怎么写”而我来告诉你“为什么必须这么写”。这关乎你的 Block 能否被平台接纳、能否被他人复用、能否在生产环境稳定运行。文件位置与命名autogpt_platform/backend/backend/blocks/是唯一合法的存放目录。文件名必须是snake_case比如sentiment_analyzer.py。这是因为 AutoGPT 的后端启动时会扫描这个目录下的所有.py文件并通过importlib动态导入。如果文件名包含-或大写字母Python 的 import 机制会报错。类继承与 UUIDclass OpenAISentimentBlock(Block)这行代码Block是基类它提供了run()方法的契约、日志记录、错误处理等基础设施。id8f67d394-9f52-4352-a78b-175d5d1d7182这个 UUID 是你的 Block 的全球唯一身份证。绝对不要手写必须用uuidgen命令Mac/Linux或在线 UUID 生成器生成。因为平台内部用这个 ID 来索引 Block、缓存其 Schema、关联执行日志。两个 Block 如果 ID 相同系统会认为它们是同一个东西导致不可预知的错误。Schema 是灵魂class Input(BlockSchema)和class Output(BlockSchema)不是可选项是强制项。它们用 Pydantic 的类型提示str,int,bool,Dict[str, Any]定义了 Block 的“契约”。这个契约会被平台用来在 UI 里自动生成配置表单Input里的字段名就是表单项的 label。在连线时进行静态类型检查如果Input.text是str而上游 Block 的output是intUI 会禁止你连线。在运行时进行数据校验如果传入的text是None平台会直接报错而不是让 Block 的run()方法去处理。5.2 实战开发一个“天气预报 Block”让我们抛弃教程里的 Sentiment Analyzer写一个更接地气的 Blockweather_forecast.py。它的功能是输入一个城市名调用免费的 Open-Meteo API返回未来24小时的最高温和最低温。第一步创建文件与基础结构# autogpt_platform/backend/backend/blocks/weather_forecast.py from backend.data.block import Block, BlockSchema, BlockOutput from typing import Dict, Any import httpx # 更现代、更易用的 HTTP 客户端 import json class WeatherForecastBlock(Block): Get current weather forecast for a city using Open-Meteo API class Input(BlockSchema): city: str # 城市名如 Beijing units: str celsius # 温度单位默认摄氏度 class Output(BlockSchema): temperature_2m_max: float # 24小时最高温 temperature_2m_min: float # 24小时最低温 location: str # 实际返回的城市名API 可能纠错 error: str # 错误信息 def __init__(self): super().__init__( ida1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8, # 用 uuidgen 生成 input_schemaWeatherForecastBlock.Input, output_schemaWeatherForecastBlock.Output, test_input{city: Beijing}, test_output[(temperature_2m_max, float), (temperature_2m_min, float)] )第二步实现核心逻辑async def run(self, input_data: Input, **kwargs) - BlockOutput: try: # 1. 验证输入 if not input_data.city or not isinstance(input_data.city, str): raise ValueError(City must be a non-empty string) # 2. 调用 Open-Meteo API # Open-Meteo 提供免费的地理编码 API先根据城市名获取经纬度 geo_url fhttps://geocoding-api.open-meteo.com/v1/search?name{input_data.city}count1languageenformatjson async with httpx.AsyncClient() as client: geo_response await client.get(geo_url) geo_response.raise_for_status() geo_data geo_response.json() if not geo_data.get(results): raise ValueError(fCity {input_data.city} not found) lat geo_data[results][0][latitude] lon geo_data[results][0][longitude] location_name geo_data[results][0][name] # 3. 用经纬度获取天气预报 weather_url fhttps://api.open-meteo.com/v1/forecast?latitude{lat}longitude{lon}dailytemperature_2m_max,temperature_2m_mintimezoneautoforecast_days1 weather_response await client.get(weather_url) weather_response.raise_for_status() weather_data weather_response.json() # 4. 解析并返回结果 daily weather_data[daily] yield temperature_2m_max, daily[temperature_2m_max][0] yield temperature_2m_min, daily[temperature_2m_min][0] yield location, location_name except httpx.HTTPStatusError as e: raise RuntimeError(fAPI request failed: {e.response.status_code} {e.response.reason_phrase}) except Exception as e: raise RuntimeError(fWeather forecast failed: {str(e)})第三步测试与部署本地测试