goose Recipes 实战教程用单文件 Prompt 封装、参数化并复用你的 AI Agent 任务【免费下载链接】goosean open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM项目地址: https://gitcode.com/GitHub_Trending/goose3/goose导读本文是一份面向 goose 的 Recipes配方上手教程围绕 官方教程 recipes-tutorial.md 的主线展开从最简单的 Recipe 就是一个 Prompt出发依次讲解如何通过 extensions 为配方接入 MCP 工具、通过 parameters 把配方参数化、通过 settings 控制模型与温度以及如何用内置变量{{ recipe_dir }}引用外部数据文件。读完后你将能够独立编写、运行并分享一个文件封装一件事的可复用 goose Recipe也能顺着本文给出的源码路径深入理解其加载与校验机制。Recipes 是什么用单个文件封装一次任务goose recipes 是一类包含让 goose 完成某个具体任务所需的全部细节的文件。它的核心特征是单文件任务指令、所需工具、模型设置都被收纳进一个文件里因此可以通过 git 等常规方式轻松共享别人 clone 下来就能运行无需再口头解释一堆上下文。这一点看似平平无奇——毕竟 Prompt 也可以直接通过 Slack 或邮件分享——但正如教程指出的关键洞察大多数用户无法让 Agent 按预期工作根本原因往往是 Prompt 写得太短、并且迭代得不够。把 Prompt 放进文件里两件事都会变得更好写作时会更认真地打磨措辞迭代时也有完整的版本历史可以回溯。Recipe 正是这种Prompt 工程 工程化共享的载体。从源码结构看goose 在 crates/goose/src/recipe 下管理 Recipe 的数据模型与生命周期manifest.rs负责把磁盘上的 Recipe 文件加载成内存模型并生成清单validate_recipe.rs负责加载时的字段校验template_recipe.rs负责参数模板替换。后面各节将逐一对应这些实现。从一个最简单的 Recipe 开始最简单的 Recipe 本质上就是一个带标题和描述的 Prompt。下面是教程中用于规划欧洲行程的示例title: Trip planner description: Plan your next trip prompt: | Help the user plan a trip to Europe for 14 days. Create a detailed itinerary that includes: - places to visit - activities to do - local cuisine to try - a rough budget estimate这个文件包含了 Recipe 的三个必备字段title一句话描述该配方的短标题description说明配方做什么的详细描述prompt交给 Agent 执行的任务指令模板可以包含后续要讲的参数替换占位符。在命令行里用--recipe指向该文件即可运行goose run --recipe trip.yaml在完整 schema 中prompt与instructions是二选一的关系参考 Recipe Reference 的 Core Recipe Schema即至少提供其中一个headless非交互模式要求必须提供prompt这也说明了为何 CLI 运行配方普遍以prompt为主。运行背后的加载流程从实现角度CLI 侧goose run的--recipe参数定义在 crates/goose-cli/src/cli.rs 附近long recipe。Recipe 文件被读取后在 manifest.rs 中通过load_recipe_from_path解析成Recipe结构随后由template_recipe与各扩展加载逻辑组合出真正的会话上下文。这也解释了为什么 Recipe 既可以来自本地当前目录也可以来自GOOSE_RECIPE_PATH指定的目录甚至 GitHub 仓库见 环境变量文档。用 Extensions 为 Recipe 接入工具大多数真实任务需要 Agent 调用外部工具。Recipe 提供了extensions区块用来声明执行期间 goose 可以使用的扩展——goose 只会使用你在配方里明确列出的那些其他未列出的扩展不会自动注入。这是 Recipes 一个重要的最小权限设计配方自带了它需要的全部工具上下文可移植性更强。延续欧洲行程的例子如果我们希望整个行程期间天气都靠谱可以给配方添加一个天气 MCP 服务器扩展并微调 Prompt 让 goose 在把某个城市纳入行程之前先查询天气预报title: Trip planner description: Plan your next trip prompt: | Help the user plan a trip to Europe for 14 days. Create a detailed itinerary that includes: - places to visit - activities to do - local cuisine to try - a rough budget estimate Ensure that the user has good weather throughout their trip. Optimize their trip based on the forecast in potential locations. extensions: - type: stdio name: weathermcpserver cmd: /Users/svega/Development/weather-mcp-server/weather-mcp-server args: [] timeout: 300 description: Weather data for trip planning env_keys: - WEATHER_API_KEY扩展字段逐一说明每个扩展条目都遵循同一套字段详见 Extension Schema字段类型说明typeString扩展类型如stdio、builtin、platform、streamable_httpnameString扩展的唯一名称cmdString启动扩展的命令argsArray传给命令的参数列表env_keysArray可选扩展所需的环境变量名列表timeoutNumber超时时间秒bundledBoolean可选该扩展是否随 goose 一起内置分发descriptionString扩展功能的描述available_toolsArray该扩展下允许使用的工具名白名单不填则全部可用常见type的含义stdio标准输入输出型客户端通过cmdargs启动例如各类 MCP serverbuiltingoose 自带 MCP server 中内置的扩展如 developer 扩展文件读写能力platform运行在 Agent 进程内的平台扩展如summon子代理扩展参考 summon-mcp 文档streamable_http通过 URI 端点连接的流式 HTTP 客户端。关于env_keys的解析顺序goose 在扩展启动时解析这些环境变量——先查进程环境变量再查 goose 的 secret 存储系统钥匙串或钥匙串被禁用时的secrets.yaml。需要特别留意Recipe 加载过程不会为缺失的变量弹出交互式询问因此在运行配方前就要配好若必需值缺失扩展会直接报初始化错误。env_keys既可以装 API Key 这类密钥也可以装 API 端点这类非敏感配置。用内置扩展读取本地文件当配方需要读取本地文件时教程使用了一个builtin类型的 developer 扩展在后续外部文件一节配合{{ recipe_dir }}使用extensions: - type: builtin name: developer display_name: Developer timeout: 300 bundled: true需要注意如果 Recipe 显式声明了extensions区块默认的平台扩展如summon不会自动包含。需要子代理委派能力时需要手动把summon加进列表定义了sub_recipes的配方会自动注入无需显式声明。用 Parameters 把 Recipe 参数化固定 Prompt 的 Recipe 复用价值有限。加入parameters后Recipe 就变成了一个可被调用方填充参数的函数模板。教程将欧洲行程配方泛化把目的地与行程天数抽象成参数parameters: - key: destination input_type: string requirement: required description: Destination for the trip. Should be a large region with multiple climates. - key: duration input_type: number requirement: required description: Number of days for the trip.Recipe 使用 Jinja 风格的模板系统{{ destination }}、{{ duration }}这类占位符会在运行时被真实值替换。把 Prompt 里的硬编码值改成占位符后运行命令也相应带上参数goose run --recipe trip.yaml --params destinationAfrica --params duration14这样无需改动文件就能拿到一份 14 天非洲行程规划。参数 schema 细节每个参数条目支持以下字段完整定义见 Parameter Schema字段类型必填说明keyString✅参数唯一标识符input_typeString✅输入类型string默认、number、boolean、date、file、selectrequirementString✅required/optional/user_prompt三者之一descriptionString✅人类可读的参数说明defaultString-可选参数的默认值optionsArray-可选值列表select类型必填requirement的三种取值语义required运行配方时必须提供该参数optional可省略但必须指定default默认值user_prompt若调用时未提供会交互式提示用户输入。input_type的意义不止于类型标注boolean在 Desktop UI 中呈现为 True/False 下拉file类型比较特殊——goose 会读取文件内容并把内容本身而非路径替换进模板select类型渲染为下拉选项并强制要求options字段。校验规则在 validate_recipe.rs 中实现会强制以下几点可选参数必须有默认值必填参数不能有默认值file类型参数无论 requirement 如何都不能设置默认值以防意外导入敏感文件select参数必须有optionsPrompt / instructions / activities 中出现的模板变量都必须有对应的参数定义反之已定义的参数也必须在模板中被使用避免定义了却没用的静默浪费。示例一个同时使用number、select、boolean、file四种类型的参数块parameters: - key: max_files input_type: number requirement: optional default: 10 description: Maximum files to process - key: output_format input_type: select requirement: required description: Choose output format options: - json - markdown - csv - key: enable_debug input_type: boolean requirement: optional default: false description: Enable debug mode - key: source_code input_type: file requirement: required description: Path to the source code file to analyze用 Settings 控制 Provider、模型与温度默认情况下Recipe 会沿用你已经配置好的模型与temperature多数场景下这已经够用。但某些主观性强的任务比如规划旅行需要更高的随机性——temperature好比创意旋钮数值越高输出越多样、越出人意料。如果第一次结果不理想用户只需重新运行一次配方就能得到新答案。Recipe 的settings区块可以按配方指定提供商、模型与温度settings: goose_provider: anthropic goose_model: claude-sonnet-4-20250514 temperature: 0.8三个可用设置的说明goose_provider要使用的 AI 提供商如anthropic、openaigoose_model具体模型名temperature控制创造性与随机性0.0-1.0越高越有创意。这些设置在配方运行时会覆盖你默认的 goose 配置若配方未声明settings则回落到你的默认配置。参考 schema 中还支持max_turns限制该配方及其子任务的最大轮数常用于约束自动化任务或定时任务的执行时长其优先级为子代理工具调用覆盖 配方settings.max_turnsGOOSE_SUBAGENT_MAX_TURNS环境变量 默认值主配方 1000、子代理 25。用{{ recipe_dir }}引用外部数据文件当需要给 Agent 提供大量补充信息时把所有数据硬塞进 Prompt 会迅速撑爆上下文。更优雅的做法是把数据放在 Recipe 旁边的独立文件里然后在 Prompt 中指向它。为此 Recipe 内置了一个开箱即用的变量{{ recipe_dir }}它自动等于 Recipe 文件所在的目录无需在parameters中额外定义。例如教程将 UNESCO 世界遗产清单如从公开数据集下载的unesco.csv与行程配方放在同一目录然后在 Prompt 中这样引用prompt: | You can use the \{\{ recipe_dir \}\}/unesco.csv file to check information on UNESCO world heritage sites to include in your travel plan.为了让 Agent 真正读得到该文件还需要在扩展区挂上提供文件读取能力的 developer 内置扩展extensions: - type: builtin name: developer display_name: Developer timeout: 300 bundled: true更多模板能力除了{{ recipe_dir }}这类内置参数Recipe 模板还支持不少高级语法详见 Recipe Reference 的 Template Support字面量转义若要在模板里输出{{ variable }}字样而不被替换用单引号包裹{{{{API_KEY}}}}模板继承通过{% extends parent.yaml %}继承父配方并用{% block %}定义/覆写片段适合做基础配方 变体indent()过滤器如{{ raw_data | indent(2) }}保证多行参数值缩进正确、可被解析为合法的 JSON/YAML常用于向子配方传递结构化数据。这些模板变量在instructions、prompt、activities字段中均生效。配齐数据与工具后的效果示例教程展示了把UNESCO 数据 天气预报组合进配方后 Agent 实际产出的一份 10 天欧洲行程示例输出节选其结构与要点路线与 UNESCO 覆盖巴黎凡尔赛宫→ 罗马罗马历史中心、梵蒂冈城→ 布拉格布拉格历史中心行程自动把 UNESCO 世界遗产站点纳入每天的参观计划天气感知每天的行程条目都带有预报信息如巴黎约 27-31°C 多云转晴、罗马 35°C 晴热提示随身带水瓶、布拉格第 8 天 22°C 有雷暴概率提示带薄外套——正是根据潜在目的地预报优化行程那行 Prompt 的实际效果结构化预算清单按住宿约 €900/9 晚、交通约 €950-1,250 含欧洲内陆两段航班、景点门票约 €250、餐饮约 €700、杂项约 €400分项汇总人均总预算约€3,200-3,500不含往返欧洲的国际航班出行建议多币种欧元 / 捷克克朗提示、地铁通票省钱建议、热门景点提前预订、各城市语言要点等。这个案例直观展示了 Recipe 的组合威力{{ recipe_dir }}提供领域数据、extensions 提供读取与实时天气工具、参数决定每次运行的输入、一段精心写就的 Prompt 负责把以上要素组织成最终交付物。更进一步配方格式、存放位置与校验教程末尾指向的 Recipes 指南 与 Recipe Reference 还可以帮你继续深入这里先提炼几条与本文实操直接相关的补充事实文件格式Recipe 可写成.yaml推荐或.jsonCLI 加载时按相应扩展名解析注意避开 CLI 不支持的扩展名写法优先使用.yaml。存放位置本地文件可放在当前目录或GOOSE_RECIPE_PATH环境变量指定的任意目录也可以通过GOOSE_RECIPE_GITHUB_REPO配置从 GitHub 仓库加载需安装并登录ghCLI。schema 骨架核心字段在description、instructions/prompt、title之外还支持activitiesDesktop 端点击气泡、response强制最终输出为符合 JSON Schema 的结构化结果适合自动化、retry失败后按成功检查命令自动重试、sub_recipes组合子配方与可选的version默认1.0.0。校验与排错加载期校验覆盖Prompt/instructions 至少其一模板变量与参数一一对应可选参数必须有默认值file 参数禁止默认值等规则常见报错包括缺少必填参数、非法 YAML/JSON、无效扩展配置与无效 retry 配置等goose recipe相关子命令见 CLI 命令文档可辅助定位问题。仓库中现成的大量可运行配方样例例如 PR 代码审查、依赖升级、CI/CD 流水线、子配方等见 documentation/src/pages/recipes/data/recipes是很好的下一步学习素材——你可以在其中找到parameters、extensions、settings、sub_recipes等各类字段在生产风格配方中的真实用法。结语Recipe 让 goose 的使用方式从临时敲一条 Prompt进化为沉淀、版本化并共享一项可复现的能力。本文以 官方教程 为骨架走通了从三字段最小配方到参数化 外部工具 外部数据的完整链路最小配方让你立刻上手extensions 决定了 Agent 的工具边界parameters 让配方可被复用与泛化settings 精细调控每次运行的性格而{{ recipe_dir }}则巧妙地在配方与数据文件之间建立了解耦。结合 manifest.rs 的加载实现与 validate_recipe.rs 的校验规则你不仅能会用还能理解配方在 goose 内部是如何被装载与检查的——这为后续编写复杂、健壮、可共享的配方打下了扎实基础。【免费下载链接】goosean open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM项目地址: https://gitcode.com/GitHub_Trending/goose3/goose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考