Plugins¶
Plugins give agents tools. Load one by name:
from maki import MakiLLama
from maki.agents import Agent
agent = Agent(name="ToolUser", maki_instance=MakiLLama(model="llama3.2"), role="assistant")
agent.load_plugin("file_reader")
result = agent.execute_task(
"Read the first lines of README.md and summarize them.",
use_plugins=True,
)
print(result)
When use_plugins=True (or the backend supports native tool calling), the plugin's methods are advertised to the model and executed automatically. You can also load your own plugin by passing plugin_path.
Built-in plugins¶
| Plugin | Description | Extra |
|---|---|---|
directory_reader |
List and inspect directory contents | none |
file_reader |
Read files from disk | none |
file_writer |
Write files to disk | none |
json_reader |
Parse and query JSON files | none |
image_classifier |
Classify images via a local model | none |
ocr |
Extract text from images (not in the default registry; load via plugin_path) |
none |
web_search |
RSS, HackerNews, Reddit, GitHub Trending, Lobste.rs | web |
web_to_md |
Fetch a URL and convert to Markdown | web |
provider_updates |
Fetch LLM provider release notes | web |
trend_search |
Google Trends queries | trends |
ftp_client |
FTP/SFTP file transfers | ftp |
alpaca_data |
Crypto, equity and forex bars and quotes | alpaca |
alpaca_news |
Financial news from Alpaca and RSS | alpaca |
alpaca_trading |
Submit and manage Alpaca trades | alpaca |
alpaca_stream |
Live crypto data stream | alpaca |
obsidian_memory |
Persistent note-based memory (Obsidian vault) | none |
rag_memory |
Retrieval-augmented memory with pluggable vector backends | none |
Safety model¶
Tool calls are fail-closed:
- A plugin exposes only the methods listed in its class-level
ALLOWED_METHODS. No list means nothing is exposed. - Destructive methods (file writes, FTP transfers and deletes, trades) are listed in
DANGEROUS_METHODSand additionally requireAgent(allow_dangerous_tools=True). - The trading plugin runs in paper mode unless you opt in to live trading.
- Web plugins fetch through Maki's hardened connector, which blocks private and reserved address ranges for content-derived URLs.
# Needed before the model may write files:
agent = Agent(name="Writer", maki_instance=llm, role="writer", allow_dangerous_tools=True)
agent.load_plugin("file_writer")