agent.astart() from an async app; the crew kickoff runs natively on the event loop without thread offload.
Quick Start
1
FastAPI Route
Native async execution — no worker threads, true cooperative multitasking:
2
Jupyter Notebook
Works directly in async cells without blocking:
How It Works
Non-blocking startup
Config loading, adapter setup, and workflow preparation run in a worker thread viaasyncio.to_thread, so a slow disk read or heavy adapter import never stalls the event loop.
The _aload_config and _aprepare_for_run helpers wrap the blocking open() / yaml.safe_load / adapter setup calls, keeping the loop free to serve other requests while startup work runs off-thread.
Sync/Async Parity: As of PR #1870, sync and async kickoff paths share the same prep logic (AutoGen version selection, AgentOps init, cli_backend validation), so behavior is identical between
generate_crew_and_kickoff() and agenerate_crew_and_kickoff().Extended in PR #2738: Config validation, merge, and dump logic live in a single
_build_yaml_workflow builder shared by both paths, so sync and async behavior can no longer drift apart.PR #3252 (July 2026) extended parity to the
process: workflow path — observability, cli_backend validation, and tool_timeout diagnostics now fire on workflow YAML for both sync and async, matching the sequential / hierarchical treatment.As of PR #3963, an explicit tool_timeout on process: workflow now raises on both paths rather than logging a warning — pick sequential or hierarchical if you need per-tool timeouts. See tool_timeout on workflow YAML.What’s actually async
Workflow mode
YAML files withprocess: workflow also run natively async via YAMLWorkflowParser + workflow.astart() — no extra configuration needed.
Configuration Options
See Advanced CLI options from Python for the full alias table and precedence rules.
Common Patterns
FastAPI Background Task
Concurrent Crew Execution
CLI options from an async handler
arun() (and run()) accept any extra keyword argument the CLI accepts. model=/llm= and session= get friendly Python aliases; everything else is forwarded through the same cli_config bridge the CLI already uses.
cli_config= still wins over loose kwargs — pass either, not both, for the same key.
Best Practices
Cancellation and timeouts propagate
Cancellation and timeouts propagate
Under native async,
asyncio.CancelledError and asyncio.wait_for now actually cancel SDK work instead of being trapped behind a worker thread:Use asyncio.gather for concurrent crews
Use asyncio.gather for concurrent crews
When running multiple crews, use
asyncio.gather for parallel execution:Framework detection works transparently
Framework detection works transparently
All supported frameworks work with async execution — praisonai-native uses true async, others fall back to thread offload automatically:
Handle errors gracefully in async contexts
Handle errors gracefully in async contexts
Wrap async crew execution in try-catch blocks:
Related
YAML Template Variables
Use placeholders safely alongside JSON literals
Framework Adapter Plugins
Custom framework adapters with async support

