Execution & Extension Systems

Complete comparison of PraisonAI's 9 systems: Job Workflows, Agent Workflows, Hybrid Workflows, Recipes, Slash Commands, Tools, Skills, Plugins, and Hooks

PraisonAI has 9 distinct systems across two categories: Execution Systems (things that run) and Extension Systems (things that extend agent capabilities).

python
from praisonaiagents import Agent

# Simplest path — Agent Workflow
agent = Agent(name="researcher", instructions="Research AI trends")
agent.start("Summarise the latest LLM papers")

The user picks a workflow or extension; each system attaches jobs, recipes, tools, or hooks to the same agent core.

Diagram

Execution vs Extension

Job Workflow

Agent

Agent Workflow

Recipe

Tools

Skills

Plugins

Hooks

How It Works

Diagram
Execution & ExtensionAgentUserExecution & ExtensionAgentUserRequestProcess requestResult Agent–>>User: Response

Quick Start

  1. Run an agent workflow

    The default execution path — one agent, one prompt:

    python
    from praisonaiagents import Agent
    
    agent = Agent(name="researcher", instructions="Research AI trends")
    agent.start("Summarise the latest LLM papers")
  2. Run a job workflow from YAML

    Mix shell steps and agent steps in a deterministic pipeline:

    yaml
    type: job
    name: release
    steps:
      - name: Build
        run: uv build
      - name: Changelog
        agent:
          role: Technical Writer
          prompt: Generate changelog
          model: gpt-4o-mini
    bash
    praisonai workflow run release.yaml

At a Glance

Execution Systems

SystemCLIWhat RunsDeterministicNeeds API Key
Job Workflowspraisonai workflow runShell, Python, actions, agent stepsMostly ✅Only for agent steps
Agent Workflowspraisonai workflow runLLM agents collaborating❌✅
Hybrid Workflowspraisonai workflow runJob + multi-agent stepsMixed✅
Recipespraisonai recipe runLLM agents + lifecycle❌✅
Slash Commands/cmd in REPLHandler functions✅❌

Extension Systems

SystemScopeWhat It Provides
ToolsPer-agentCallable functions (@tool, BaseTool)
SkillsPer-agentDeclarative expertise (SKILL.md + prompts)
PluginsSystem-wideBundled tools + hooks + skills + recipes
Hooks & CallbacksSystem-wideLifecycle interception and notification

Execution Systems

1. Job Workflows

Ordered step execution mixing deterministic automation and AI agent steps.

Discriminator: type: job in YAML | Engine: JobWorkflowExecutor

Routing: Honored by both the CLI (praisonai workflow run ...) and the programmatic wrapper (AgentsGenerator.generate_crew_and_kickoff() / .agenerate_crew_and_kickoff()). The sync path is now scope-isolated for every process: value — generate_crew_and_kickoff() wraps adapter.run(...) in scoped_bridge() for sequential and hierarchical; _run_yaml_workflow wraps workflow.start(...) in scoped_bridge() for workflow. A stuck coroutine in any one run cannot park the shared default loop for other tenants. See Async Bridge → Per-run auto-scoping.

Deterministic steps: run: (shell), python: (script), script: (inline Python), action: (custom/built-in)

Agent-centric steps: agent: (AI agent), judge: (quality gate), approve: (approval gate)

yaml
type: job
name: smart-release
steps:
  - name: Build
    run: uv build
  - name: Generate changelog
    agent:
      role: Technical Writer
      prompt: Generate changelog
      model: gpt-4o-mini
    output_file: CHANGELOG.md
  - name: Quality check
    judge:
      input_file: CHANGELOG.md
      threshold: 8.0
      on_fail: warn

Key features: 3-tier action resolution, custom CLI flags, conditional steps, --dry-run, agent/judge/approve steps


2. Agent Workflows

LLM-powered agent pipelines — AI agents collaborate on tasks.

Discriminator: No type field (default) | Engine: Agent Workflow Engine

yaml
topic: Research AI Trends
roles:
  researcher:
    role: AI Researcher
    goal: Find latest papers
    tools:
      - internet_search
bash
praisonai workflow run research.yaml

Key features: Agents with roles/goals/backstories, tool integration, multi-agent collaboration, non-deterministic

Agent Workflows

Agent definitions, tasks, process types


2.5. Hybrid Workflows

Combines job workflow steps (deterministic + agent) with multi-agent collaboration steps.

Discriminator: type: hybrid in YAML | Engine: HybridWorkflowExecutor

Routing: Honored by both the CLI (praisonai workflow run ...) and the programmatic wrapper (AgentsGenerator.generate_crew_and_kickoff() / .agenerate_crew_and_kickoff()). The sync path is now scope-isolated for every process: value — generate_crew_and_kickoff() wraps adapter.run(...) in scoped_bridge() for sequential and hierarchical; _run_yaml_workflow wraps workflow.start(...) in scoped_bridge() for workflow. A stuck coroutine in any one run cannot park the shared default loop for other tenants. See Async Bridge → Per-run auto-scoping.

Supports all job workflow step types plus:

  • workflow: — execute a named agent from the agents: block
  • parallel: — run multiple sub-steps concurrently
yaml
type: hybrid
agents:
  researcher:
    role: Research Analyst
    instructions: Provide concise findings
steps:
  - name: Setup
    run: echo "Starting..."
  - name: Research
    workflow:
      agent: researcher
      action: Research best practices
  - name: Parallel checks
    parallel:
      - run: echo "Lint passed"
      - run: echo "Tests passed"
Hybrid Workflows

Multi-agent + deterministic steps in one pipeline

3. Recipes

Packaged, distributable agent workflows with full lifecycle management.

CLI: praisonai recipe (separate command group) | Engine: recipe.run()

Discovery (5-tier): $PRAISONAI_RECIPE_PATH → ./recipes/ → ~/.praison/recipes/ → agent_recipes pip package → built-in

bash
praisonai recipe run support-reply --input '{"ticket_id": "T-123"}'
praisonai recipe judge run-abc123 --yaml agents.yaml
praisonai recipe optimize my-recipe --iterations 5
praisonai recipe pack my-recipe
praisonai recipe publish my-recipe.praison
praisonai recipe serve my-recipe

Key features: pack/publish/pull/install, judge/optimize/apply lifecycle, policy packs, SBOM/audit, HTTP serving, trace replay

Recipes

Recipe structure, lifecycle, governance


4. Slash Commands

Interactive commands in the PraisonAI REPL. User types /cmd — no YAML, no CLI invocation outside REPL.


Extension Systems

5. Tools

Functional actions that agents call to interact with the outside world.

Scope: Per-agent | Discovery: Lazy-loaded via praisonaiagents.tools.registry.py entry points

Implementation options:

  • Function-based: @tool decorated functions
  • Class-based: BaseTool or Pydantic classes for stateful operations
  • External packages: Pip packages discovered via entry_points under the canonical praisonai.tools group. praisonaiagents.tools and praisonai.tool_sources are kept as deprecated one-cycle aliases (they still resolve, with a DeprecationWarning on first discovery).
python
from praisonaiagents import Agent
from praisonaiagents.tools import internet_search

agent = Agent(tools=[internet_search])

Key distinction: Tools are procedural — Python code that does something.

Tools Guide

Built-in tools, custom tools, tool classes


6. Skills

Declarative expertise modules — reusable prompts and knowledge.

Scope: Per-agent | Standard: Agent Skills (agentskills.io) | CLI: praisonai skill list/install/validate

.praison/skills/
├── code-review/
│   └── SKILL.md
├── seo-expert/
│   └── SKILL.md

Key distinction: Skills are declarative — SKILL.md + prompt templates, not code.

Skills can be generated autonomously using the Identify-Scrape-Synthesize (ISS) pattern.


7. Plugins

System-wide extension bundles — the marketplace unit.

Scope: System-wide | Manager: PluginManager (global registry + discovery) | Location: .praison/plugins/, pip packages

A plugin can bundle:

  • Tools — adds new agent actions
  • Skills — adds agent expertise templates
  • Recipes — adds pre-defined agent teams
  • Hooks — adds logging, security, monitoring
  • Integrations — connects to Slack, Telegram, APIs
python
from praisonai import plugins
plugins.enable("slack")
# or via env: PRAISONAI_PLUGINS=slack,logging

Key distinction: Plugins are containers — they deliver tools, skills, hooks, and recipes as a single installable unit.


8. Hooks & Callbacks

Lifecycle interception (hooks) and notification (callbacks).

Hooks — middleware functions that can modify agent requests/responses:

CategoryHooks
LifecycleON_INIT, ON_SHUTDOWN
AgentBEFORE_AGENT, AFTER_AGENT
LLMBEFORE_LLM, AFTER_LLM
ToolsBEFORE_TOOL, AFTER_TOOL
MessagesBEFORE_MESSAGE, AFTER_MESSAGE

Use for: Retries, caching, request modification, guardrails.

Callbacks — simple functions called after a Task completes. Cannot modify execution flow.

Use for: Logging, database updates, alerting.


How They Relate

Diagram

bundles

bundles

bundles

bundles

contain

add lifecycle

use

use

same CLI, different engine

REPL only

Plugin

Tools

Skills

Recipes

Hooks

Agent Workflows

judge / optimize / serve

Job Workflows

Slash Commands


Master Comparison

Identity & Scope

Job WorkflowsHybridAgent WorkflowsRecipesToolsSkillsPluginsHooks
TypeExecutionExecutionExecutionExecutionExtensionExtensionExtensionExtension
AI-poweredOptional✅✅✅N/AN/AN/AN/A
ScopeProject-localProject-localProject-localExternalPer-agentPer-agentSystem-wideSystem-wide
DeterministicMostly ✅Mixed❌❌✅N/A✅✅

Distribution & Lifecycle

Job WorkflowsAgent WorkflowsRecipesToolsSkillsPlugins
Registry❌❌✅✅ (entry_points) †❌✅ (pip) †
pack/publish❌❌✅❌❌✅ (pip)
judge/optimize❌❌✅❌❌❌
HTTP serve❌❌✅❌❌❌
SBOM/audit❌❌✅❌❌❌
Versioned❌❌✅✅ (pip)❌✅ (pip)

Execution Model

Job WorkflowsHybridAgent WorkflowsRecipes
Dry-run✅✅❌✅
Agent steps✅ agent, judge, approve✅✅ (native)✅ (native)
Multi-agent❌✅ workflow:, parallel:✅✅
Streaming❌❌❌✅ --stream
Background❌❌❌✅ --background
Replay❌❌❌✅ export/replay

Extensibility

Job WorkflowsHybridAgent WorkflowsRecipes
Custom actions✅ YAML, file, built-in✅ (via job engine)❌❌
Custom tools✅ (agent steps)✅✅ Tool plugins✅ tools.py
Conditionals✅ if: expressions✅ if:❌ (LLM decides)❌ (LLM decides)
CLI flags✅ Custom flags:✅❌❌
Env vars✅ ${{ env.X }}✅❌✅ via config
Variables✅ vars: + --var✅✅ --var✅ --var, --input

Decision Guide

Diagram

No

Yes

No

Yes

Execute

Single agent + shell

Multi-agent + shell

Agents only

No

Yes

Extend

New action

Expertise / knowledge

System behavior

Bundle everything

What do you need?

Needs AI / LLM?

Interactive?

Slash Command

Job Workflow

Extend or Execute?

Multi-agent?

Job Workflow (agent steps)

Hybrid Workflow

Share externally?

Agent Workflow

Recipe

What kind?

Tool

Skill

Hook

Plugin

If you want to…Use
Automate shell commands / CI/CDJob Workflow
Create reusable build actionsJob Workflow + Custom Actions
Mix shell + single AI agent in a pipelineJob Workflow (agent steps)
Add a quality gate to a pipelineJob Workflow (judge: step)
Mix shell + multi-agent collaborationHybrid Workflow
Run checks in parallelHybrid Workflow (parallel: step)
Orchestrate AI agents on a taskAgent Workflow
Share an AI workflow as a packageRecipe
Improve AI output iterativelyRecipe (judge/optimize)
Serve an AI workflow as an APIRecipe (serve)
Generate a job workflow from a promptpraisonai workflow auto --type job
Give an agent a new capabilityTool
Give an agent expertise / personalitySkill
Add logging / security / guardrailsHook
Bundle tools + skills + hooks for distributionPlugin
Quick interactive commandsSlash Command

Best Practices

Start with Agent Workflows

For a single AI task, use an Agent in Python or a YAML agent workflow — no job steps required.

Use Job Workflows for CI/CD

When you need shell commands, conditionals, or quality gates, choose a job workflow with run:, agent:, or judge: steps.

Package with Recipes for distribution

Share workflows externally with praisonai recipe pack — includes lifecycle tools like judge and optimize.

Extend agents, not workflows

Add capabilities via Tools and Skills on the agent; use Plugins when bundling tools, hooks, and recipes for install.


Agent Execution Configuration

Control per-agent execution limits with ExecutionConfig:

ExecutionConfig SDK Reference

Full parameter reference for ExecutionConfig

Precedence ladder:

python
# Level 1: String preset
agent = Agent(execution="thorough")   # "fast" | "balanced" | "thorough" | "unlimited"

# Level 2: ExecutionConfig (full control)
agent = Agent(execution=ExecutionConfig(
    max_iter=50,
    max_rpm=100,
    context_compaction=True,
    max_budget=1.00,
))

# Preferred modern form — max_steps is the unified budget honoured by both loops
agent = Agent(execution=ExecutionConfig(max_steps=50))

max_steps is the unified outer-loop step budget honoured identically by both tool-execution loops. Detect truncation with agent.last_stop_reason == "max_steps". See Step Budget.

OptionTypeDefaultDescription
max_steps`int \None`NoneUnified tool-use budget honoured by both loops. None falls back to max_iter. Must be >= 1.
max_iterint20Legacy per-loop iteration cap, used when max_steps is unset
max_rpm`int \None`NoneMax requests per minute. When set to a positive int with no explicit rate_limiter, the Agent auto-builds RateLimiter(requests_per_minute=max_rpm). Explicit rate_limiter takes precedence. max_rpm <= 0 raises ValueError at construction (validated before precedence, so max_rpm=0 still raises even with a rate_limiter). See Rate Limiter.
max_execution_time`int \None`NoneMax wall-clock seconds per run
max_retry_limitint2Max LLM retries on error
max_tool_calls_per_turnint10Max tool calls per single turn
code_executionboolFalseAppends an execute_code tool to the agent
code_modestr"safe""safe" (subprocess, timeout enforced) or "unsafe" (in-process, tool-capable, no hard timeout). Unknown values raise ValueError
code_toolsboolFalseAllow code to call agent tools directly (needs code_mode="unsafe"). Model-generated code calls the agent’s tools through the same policy / guardrail / approval gate as the normal tool-call loop (agent-wide guardrails=, per-tool @tool(input_guardrails=/output_guardrails=), PolicyEngine, PermissionManager deny-rules, require_approval).
code_tools_allow`list \None`NonePer-run allow-list of tool names callable from code; the tool must also be in Agent(tools=[...])
context_compactionboolFalseAuto-compact context when approaching token limit
max_context_tokens`int \None`None (auto-detect from model window)Token limit before compaction triggers. Unset → auto-derived from the active model’s context window; explicit int always wins. See Context Compaction → Auto-sized trigger.
max_budget`float \None`NoneHard USD budget limit per run
on_budget_exceededstr"stop""stop" / "warn" / callable
parallel_tool_callsboolFalseExecute batched tool calls in parallel. Single source of truth for this setting; ToolConfig.parallel is a deprecated alias for it.

Source Files

SystemCore ImplementationCLI
Job Workflowscli/features/job_workflow.pycli/commands/workflow.py
Hybrid Workflowscli/features/hybrid_workflow.pycli/commands/workflow.py
Agent Workflowscli/features/workflow.pycli/commands/workflow.py
Workflow Generationauto.py (JobWorkflowAutoGenerator)workflow auto --type job
Recipesrecipe/core.py + cli/features/recipe.pycli/commands/recipe.py
Toolspraisonaiagents/tools/Via agent config
Skillspraisonaiagents/skills/praisonai skill
Pluginspraisonaiagents/plugins/praisonai plugin
Hookspraisonaiagents/hooks/Programmatic
Slash CommandsIn-memory registry/cmd in REPL

Related