Use this file to discover all available pages before exploring further.
Recipes are YAML files that package complete Goose experiences—instructions, extensions, parameters, and prompts—into reusable, shareable configurations. They enable you to create standardized workflows without writing code.
Instructions: The agent’s system prompt and behavior
Extensions: Which tools the agent can use
Parameters: User-configurable inputs
Settings: Model, temperature, and other configuration
Activities: Quick-start suggestions shown in the UI
Sub-recipes: Reusable workflow components
Prompt: Initial message to start the conversation
# example-recipe.yamlversion: 1.0.0title: Code Review Assistantdescription: AI assistant for thorough code reviewsinstructions: | You are a code review assistant. Review code for: - Security vulnerabilities - Performance issues - Code style and best practices - Potential bugs Always provide specific examples and suggestions.extensions: - type: builtin name: developersettings: goose_provider: anthropic goose_model: claude-sonnet-4-20250514 temperature: 0.2 max_turns: 30activities: - "Review the changes in my last commit" - "Check for security issues in auth.rs" - "Analyze performance of database queries"prompt: | I need you to review some code. What would you like to review?
version: 1.0.0 # Semantic version (currently 1.0.0)title: Recipe Name # Short, descriptive titledescription: What this recipe does # Longer explanation
instructions: | You are a specialized assistant for data analysis. Your capabilities: - Load and analyze CSV/JSON data files - Generate statistical summaries - Create visualizations using the autovisualiser extension - Write analysis reports Always: - Explain your analysis methodology - Cite data sources - Visualize key findings - Save reports to ./reports/ directory
prompt: | Please review the code in {{ directory }} and provide a summary of: 1. Overall code quality 2. Security issues found 3. Performance concerns 4. Recommendations for improvement
Sub-recipes are reusable workflow components that can be invoked by the main recipe:
# main-recipe.yamltitle: Full Stack Analysissub_recipes: # Define available sub-recipes - name: "analyze_frontend" path: "./sub-recipes/frontend-analyzer.yaml" description: "Analyze React components and state" - name: "analyze_backend" path: "./sub-recipes/backend-analyzer.yaml" description: "Analyze API endpoints and database" - name: "security_scan" path: "./sub-recipes/security-scanner.yaml" sequential_when_repeated: true # Don't run in parallel values: # Pre-fill parameters severity: "high" include_deps: "true"instructions: | You have access to specialized sub-recipes for analyzing different parts of the application. Use them to break down the analysis.prompt: | Analyze this full-stack application: 1. Use analyze_frontend sub-recipe for the React app 2. Use analyze_backend sub-recipe for the API 3. Run security_scan on both 4. Synthesize findings into a unified report
Sub-recipes are invoked using the subagent tool:
# The AI calls:subagent( subrecipe: "analyze_frontend", parameters: {"directory": "./src/components"})
sub_recipes: - name: "task_name" path: "./path/to/recipe.yaml" # Relative to main recipe description: "What this sub-recipe does" # Shown to AI values: # Pre-filled parameter values param1: "value1" param2: "value2" sequential_when_repeated: true # Run sequentially, not in parallel
// From crates/goose/src/recipe/validate_recipe.rspub fn validate_recipe(recipe: &Recipe) -> Result<()> { // 1. Check required fields if recipe.title.is_empty() { return Err(anyhow!("Recipe must have a title")); } // 2. Validate at least one of instructions or prompt if recipe.instructions.is_none() && recipe.prompt.is_none() { return Err(anyhow!("Recipe must have instructions or prompt")); } // 3. Validate parameters for param in recipe.parameters.iter().flatten() { validate_parameter(param)?; } // 4. Validate extensions for ext in recipe.extensions.iter().flatten() { ext.validate()?; } // 5. Validate sub-recipes exist for sub_recipe in recipe.sub_recipes.iter().flatten() { validate_sub_recipe_path(&sub_recipe.path)?; } // 6. Validate response schema (if present) if let Some(response) = &recipe.response { validate_json_schema(&response.json_schema)?; } Ok(())}
Validation errors are shown with clear messages:
Error: Recipe validation failed - Parameter 'github_repo' has invalid type 'invalid' - Sub-recipe 'missing.yaml' not found at path ./sub-recipes/missing.yaml - Response schema is not valid JSON Schema
parameters: - key: project_name input_type: string requirement: required - key: language input_type: select options: ["python", "rust", "javascript"] requirement: requiredinstructions: | You are setting up a {{ language }} project named {{ project_name }}. {% if language == "python" %} Use Poetry for dependency management. Set up pytest for testing. {% elif language == "rust" %} Use Cargo for builds. Set up cargo test. {% else %} Use npm for packages. Set up Jest for testing. {% endif %}
# Good: Specific behavior and expectationsinstructions: | You are a database migration assistant. When creating migrations: 1. Always add both 'up' and 'down' migrations 2. Include transaction handling 3. Add comments explaining complex changes 4. Test migrations before committing Never: - Drop tables without explicit confirmation - Modify production data - Create migrations that can't be rolled back# Bad: Vague instructionsinstructions: "Help with database tasks"
Use parameters for reusability
# Make recipes reusable across different contextsparameters: - key: environment input_type: select options: ["development", "staging", "production"] - key: target_service input_type: stringinstructions: | You are deploying {{ target_service }} to {{ environment }}. {% if environment == "production" %} CRITICAL: This is production. Require manual approval for all changes. {% endif %}
Break complex workflows into sub-recipes
# Main orchestrator recipesub_recipes: - name: "gather_data" path: "./steps/01-gather.yaml" - name: "process_data" path: "./steps/02-process.yaml" - name: "generate_report" path: "./steps/03-report.yaml"# Each sub-recipe is focused and testable
Choose appropriate models
# Use powerful models for complex reasoningsettings: goose_model: claude-sonnet-4-20250514 temperature: 0.1 # Low temperature for consistency# Use cheaper models for simple tasks in sub-recipessub_recipes: - name: "count_files" path: "./simple-task.yaml" values: model: "gpt-4o-mini" # Cheaper for simple tasks
Provide helpful activities
# Activities are shown as quick-start buttons in UIactivities: - "Review the latest PR" # Clear, actionable - "Find security vulnerabilities in auth/" # Specific - "Generate test coverage report" # Common task# Not: "Do stuff", "Help me" # Too vague
Use response schemas for structured output
# When you need structured data (not conversational output)response: json_schema: type: object properties: findings: {type: array} severity: {type: string} recommendation: {type: string} required: ["findings"]# Agent will use final_output tool to return valid JSON