Ferramentas Customizadas¶
Você pode estender o Aru com suas próprias ferramentas Python. Drop um .py em .aru/tools/ (projeto) ou ~/.aru/tools/ (global) — o Aru auto-descobre e registra todas as funções encontradas.
Exemplo¶
# .aru/tools/deploy.py
from aru.plugins import tool
@tool(description="Deploy the current branch to an environment")
def deploy(environment: str = "staging") -> str:
"""Runs the deploy script and returns the output."""
import subprocess
result = subprocess.run(
["./scripts/deploy.sh", environment],
capture_output=True, text=True,
)
return result.stdout or result.stderr
O LLM vê cada função como uma tool de primeira classe — nome, descrição e parâmetros tipados são inferidos da assinatura.
Regras¶
- Decorator é opcional. Um
def fn(...) -> strcom docstring também funciona. Use@tool(...)quando quiser uma descrição customizada ou quiser sobrescrever uma ferramenta nativa. - Parâmetros são lidos dos type hints; defaults viram parâmetros opcionais.
- Return type deve ser
str(ou algo stringificável) — o resultado é enviado de volta ao LLM como output da tool. - Override de nativas: use
@tool(override=True)se quiser substituir, por exemplo, obashpor uma implementação própria. - Sync e async: funções síncronas e
async defsão ambas suportadas.
Discovery paths¶
Caminhos (os últimos sobrescrevem os primeiros):
~/.aru/tools/.aru/tools/~/.agents/tools/.agents/tools/
Exemplo mínimo sem decorator¶
# .aru/tools/wordcount.py
def word_count(text: str) -> str:
"""Conta palavras em um texto."""
return str(len(text.split()))
Pronto — word_count já aparece para o agente como uma tool disponível, com descrição vinda da docstring.
Exemplo async¶
# .aru/tools/fetch_json.py
import httpx
from aru.plugins import tool
@tool(description="Fetches a JSON URL and returns the first 2000 chars")
async def fetch_json(url: str) -> str:
async with httpx.AsyncClient() as client:
r = await client.get(url, timeout=10)
return r.text[:2000]
Permissões em ferramentas customizadas¶
Ferramentas customizadas passam pelo mesmo sistema de permissões. Você pode configurá-las por nome no aru.json:
Se a ferramenta faz operações sensíveis (deploy, delete, chamada a API paga), comece com ask e só promova para allow depois de testar.
Quando usar ferramentas customizadas vs. plugins¶
| Tool customizada | Plugin | |
|---|---|---|
| Registrar nova tool | ✅ | ✅ |
| Interceptar outras tools | ❌ | ✅ |
| Mudar prompt do sistema | ❌ | ✅ |
| Injetar env vars no bash | ❌ | ✅ |
| Bloquear permissões | ❌ | ✅ |
| Complexidade | Baixa | Média |
Comece com ferramentas customizadas. Promova para plugin quando precisar de hooks do ciclo de vida.