recipe.yaml file in the Goose recipe format. Instead of writing TypeScript, you describe the agent’s instructions, parameters, and response schema in YAML. Guild validates the recipe at build time and runs it as a headless agent.
Use this agent type when you already have a Goose recipe or want to define agent behavior in a portable, declarative YAML format without writing code.
Create a Goose agent
- CLI
- Web
recipe.yaml file with your Goose recipe, then save and run the agent like you would any other Guild agent.Recipe file
Placerecipe.yaml at the root of the agent’s version files. It must be valid YAML with a mapping at the document root.
Recipe fields
Guild honors a subset of Goose recipe fields. Fields that Guild cannot honor are rejected at build time with an explicit error rather than silently ignored — a recipe author who declares an extension expects the agent to have it, and running without it would produce confusing behavior.
At least one of
instructions or prompt must be present.
Parameters
parameters is a list of mappings. Each entry defines one input variable available in the template.
user_prompt parameters
Parameters with requirement: user_prompt are treated as required on Guild. In Goose, these prompt the user interactively when missing. On Guild, the input form serves the same role — callers must supply them.
Default coercion
Recipe defaults may be written typed (default: 10) or as strings (default: "10"). Guild coerces the value to the declared type:
number— integer, float, or numeric stringboolean— YAML boolean or"true"/"false"(case-insensitive)date— ISOYYYY-MM-DDstringselect— must be one ofoptionsstring— any scalar
Template variables
instructions and prompt are Jinja-style templates. Parameters are available as template variables.
Validation rules:
- Templates must be syntactically valid.
- Every variable referenced in a template must be a declared parameter.
- Every declared parameter must appear in at least one template.
{{ recipe_dir }}is not available — Guild’s execution model has no recipe directory.
Input schema
Guild derives the agent’s input schema from the recipe’s parameters. The schema is JSON Schema Draft 2020-12. The top-level shape is:text
text is always a string property in the schema.
- Required when the recipe has no
prompt— callers must provide a message. - Optional when the recipe has a
prompt. Description:"Optional message appended after the recipe's default prompt."
parameters object
parameters is included when the recipe declares at least one parameter. Parameters with requirement: required or requirement: user_prompt appear in the required array. The parameters object itself is required at the top level when its required array is non-empty.
Type mapping
Each property carries the parameter’s
description. Optional parameters carry their coerced default.
Example
The recipe above produces:prompt field, text would also appear in the top-level required array.
Test an agent with parameters
The Test view in the online editor runs your agent against input you supply. When an agent defines parameters, the Test box expects a{ text, parameters } JSON payload instead of a plain message — a shape that is easy to miss. To make it discoverable, the editor shows a This agent takes parameters callout in the Test view whenever the agent’s input schema declares parameters.
The callout holds a ready-to-copy JSON starting point built from the agent’s real parameter keys. Each key is prefilled with its default value when it has one, the first option for a select parameter, or a typed placeholder otherwise ("" for strings, 0 for numbers, false for booleans). Copy the template, fill in your values, and send it to start the test session.
For the recipe above, the callout shows:
Output schema
Whenresponse.json_schema is present, it is persisted verbatim as the agent’s output schema.
When absent, the output schema defaults to the canonical text shape, so the agent’s final answer behaves like a prompt-driven agent’s text output:
Runtime behavior
At task start, the recipe is re-read from the version’s files and the input is applied as follows:- Parameter values — declared defaults, overridden by values in
input.parameters. - Template rendering —
instructionsandpromptare rendered with the resolved parameter values. - System prompt — the rendered
instructions, when present. - Initial message:
- Recipe has no
prompt→textis the initial message (the schema makes it required). - Recipe has a
prompt, notextgiven → the rendered prompt. - Both present → the rendered prompt, then
text, joined by a blank line.
- Recipe has no
- Workspace context — when present, prepended to the recipe’s
promptat task start, wrapped in a{% raw %}block so it is not treated as a template. The resultingpromptorders workspace context first, then the rendered recipe prompt, thentext. Prepending the context inside thepromptcarries it on every--resumeturn, matching the native Goose runtime behavior.
Chat input
Chat-originated input arrives as{"type": "text", "text": "..."}. When the agent’s schema includes a top-level text string property, that input maps to {"text": "<text>"}. A bare chat message can only start a Goose agent whose schema does not require parameters.
Structured input from a parent agent is validated against the Goose agent’s input schema before any wrapping. When the input already conforms to the schema, it passes through unchanged, so a parent agent can send structured parameters directly. Only input that does not conform to the schema is wrapped as canonical text {"type": "text", "text": "<serialized input>"}.
Integrations and sub-agents (guild.yaml)
A Goose agent often needs to act on external systems, delegate work to other agents, or call built-in platform tools. Declare these dependencies in an optional guild.yaml file placed at the root of the agent’s version files, alongside recipe.yaml. Each integration operation, sub-agent, and built-in tool you declare becomes a tool the agent can call. Omit guild.yaml when the agent needs no external integrations, sub-agents, or built-in tools.
Environment field
environment is an optional top-level field that pins the agent to a runtime environment, written as "<owner>~<name>" (for example, acme~python-3.12). When omitted, the agent runs in the standard goosebox image.
Models field
models is an optional top-level field that declares the fallback runtime models the agent runs on, as an ordered list of LLM providers and models. Guild loads these declared models when it resolves the LLM for a task, tries each entry in order, and uses the first one the account’s model policies allow. When the agent’s code passes its own LLM preferences for a call, those preferences win and Guild does not read models; the declared models apply only as the fallback for agents that pass no preferences of their own. When omitted, the agent uses the account’s default LLM configuration.
model for an entry to accept any model from that provider and let the server choose one:
models accepts the following fields.
Integration fields
Each entry underintegrations declares one integration dependency.
Selecting integration tools in the editor
The web agent editor lets you pick which of an integration’s tools to expose, rather than importing every operation. Keeping the list short helps an agent stay under the tool limits models impose, which a full integration can exceed on its own. The Integrations section opens one dialog, Integrations and tools, for both browsing and configuration:- Active integrations appear as tabs on the left.
- The selected integration’s tools appear as a checklist on the right. Check a tool to expose it, uncheck it to remove it.
- The Add integration tab turns the panel into a browsable catalog.
guild.yaml as {service}_{operation} in snake case — for example, github_repos_get.
Sub-agent fields
Each entry undersub_agents declares one sub-agent dependency.
Builtin fields
Each entry underbuiltins exposes a platform service’s curated tools to the agent.
The supported services and their tools are:
Omitting
tools for a service — for example, - name: guild — imports all of that service’s permitted built-in tools.
Validation rules
Guild validatesguild.yaml at build time, alongside recipe.yaml.
- Version resolution — the
versionrange for each integration and sub-agent must resolve to a published version. A range that resolves to no published version is a build error. - Tool verification — when
toolsis specified for an integration, each listed tool must carry the integration’s service prefix (for example,github_) and map to a real operation on the resolved integration version. A tool that does not match an available operation is a build error. Whentoolsis omitted, all operations of the resolved integration version are available. - Built-in tools — each
nameunderbuiltinsmust be a supported service (console,ui, orguild), and each tool listed undertoolsmust be a permitted tool for that service. An unsupported service or tool is a build error. Whentoolsis omitted, all of the service’s curated tools are included. - Access and permissions — a public agent cannot depend on a private integration or a private sub-agent, and a sub-agent cannot be archived. See Versions for the full dependency visibility rules.
- Runtime environment — when
environmentis set, the referenced runtime environment must exist and must be public or owned by the agent’s owner. A public agent cannot depend on a private environment. - Supported sections — each top-level section must be one the agent type supports. Goose agents support
environment, but Native, OpenClaw, and LangChain agents do not. Declaring a section the agent type does not support is a build error rather than being silently ignored. - Unique tool names — the resolved tool names must not collide. A duplicate name across integrations, sub-agents, and builtins is a build error.
- Models — when
modelsis set, each entry must name a supported provider (anthropic,openai,gemini,meta, orfake). An unsupported provider is a build error.
Build-time validation
Guild validates the full recipe when you publish a version. All validation errors are reported together — not fail-fast. On success, three values are persisted on the agent version:description, input_schema, and output_schema.
instructions, prompt, and parameters are not persisted on the version — the recipe file is their single source of truth. Because versions are immutable, a recipe that validated at build time parses identically at task start.