NadooPlugin Base Class
All plugins must inherit fromNadooPlugin:
Lifecycle Hooks
on_initialize()
Called once when plugin is first loaded. Use for setup, loading config, connecting to services:- DO NOT override
initialize()- useon_initialize()instead - Raised exceptions will prevent plugin from loading
- Use
self.context.info()for logging
on_finalize()
Called when plugin is being shut down. Use for cleanup:- DO NOT override
finalize()- useon_finalize()instead - Should not raise exceptions
- API connections are automatically closed
Defining Tools
Tools are methods decorated with@tool:
- MUST return a
dict - Common keys:
success(bool),result,error - Example:
{"success": True, "result": "data"}
Context Access
Every plugin has access toself.context (PluginContext):
API Access
Every plugin has access toself.api (InternalAPIClient):
Convenience Methods
Environment Variables
Logging
Variable Watching
Complete Example
Tool Discovery
Tools are automatically discovered at initialization:- Framework scans for methods with
@tooldecorator - Metadata is extracted (name, description, parameters)
- Tools are registered and made available
Error Handling
Return errors instead of raising
Use validators for input validation
Best Practices
Initialize in on_initialize()
Initialize in on_initialize()
Load configuration, setup connections in
on_initialize(), not in __init__()Always Return Dicts
Always Return Dicts
All tool methods must return
dict, typically with success keyUse Environment Variables
Use Environment Variables
Never hardcode secrets - use
self.require_env("KEY")Log Important Events
Log Important Events
Use
self.context.info() for important events to aid debuggingHandle Errors Gracefully
Handle Errors Gracefully
Return error dicts instead of raising exceptions for better UX
Document Your Tools
Document Your Tools
Provide clear descriptions in decorators and docstrings