6.5 KiB
6.5 KiB
AGENT.md — Istruzioni per agenti di sviluppo su ApiPilot
Questo documento definisce le regole e i confini per sviluppare e modificare ApiPilot, mantenendo la libreria generica, riutilizzabile e priva di riferimenti a domini specifici.
1. Architettura e confini dei moduli
ApiPilot ha un nucleo stabile e adattatori isolati per provider LLM:
| Modulo | Responsabilità | Non deve contenere |
|---|---|---|
| apipilot/core.py | ApiPilot + configurazione + autorizzazione + esecuzione + size/timeout/errori. |
Logiche di dominio applicativo (nomi di tabelle, entità, ruoli hardcoded). |
| apipilot/fastapi.py | install_apipilot, wiring FastAPI, endpoints HTTP opzionali. |
Formati tool-calling specifici di provider LLM. |
| apipilot/openapi_parser.py | Parsing OpenAPI + generazione schema + validazione nomi duplicati. | Esecuzione runtime di endpoint. |
| apipilot/validation.py | Validazione argomenti via jsonschema. |
Regole di business non standard. |
| apipilot/tool.py | CompositeTool + protocollo PilotTool. |
Implementazioni specifiche di tool di dominio. |
| apipilot/adapters/openai.py | Adapter function calling OpenAI. | Qualsiasi dipendenza dal core oltre ToolDefinition/ExecuteResponse. |
Regola aurea: Il nucleo non deve sapere di specifici provider LLM. Gli adapter non devono sapere di FastAPI.
2. Installazione e test
# Setup
python -m venv .venv && source .venv/bin/activate
pip install -e ".[test,dev]"
# Test
pytest -q
pytest --cov=apipilot --cov-report=term-missing
# Controlli statici
ruff check apipilot tests examples
mypy apipilot
Tutti i nuovi moduli o funzionalità richiedono test di regressione corrispondenti in tests/.
3. Convenzioni di codice
- Python 3.10+ come minimo. Usa
from __future__ import annotationsin ogni modulo. - Tipizza esplicitamente parametri e ritorni pubblici; per interni usa la miglior stima.
- Nessun riferimento a entità di dominio nel core (es.
order,user,productcome nomi di parametri speciali o hardcoded, al di fuori di esempi e test). - Errori chiari: usa la gerarchia in apipilot/errors.py e aggiungi sottotipi nuovi, non eccezioni grezze.
- Messaggi di errore non vernacolari: nomi tool duplicati devono indicare le due rotte coinvolte.
- Dati non strutturati? Sanifica sempre dimensione (
max_response_size) e tempo (timeout). - Log granulari con tag: introdurre logging se necessario, con tag
[apipilot:<modulo>]. Non loggare credenziali, token, interi payload utente.
4. Convenzioni di sicurezza
- Non inoltrare mai header tecnologici (Authorization, X-*, Cookie) nello schema dei parametri dei tool.
openapi_parsergià salta i parametriin: header. - L'utente AI non può scegliere URL/metodo HTTP/credenziali: tutto è fissato nella registrazione.
- Qualsiasi nuovo punto di ingresso (es. endpoints HTTP, WebSocket) deve rispettare
require_auth_for_httpe usare laget_current_userdell'app ospite. - Prima di eseguire un tool controlla sempre
allow_tool(user, record): un tool negato è "non esistente" per quell'utente. - Non serializzare direttamente eccezioni con traceback completo nella risposta
ExecuteResponse.error. - Non usare
exec,evalo import dinamici basati su input agente.
5. Aggiungere un adapter per provider LLM
- Crea
apipilot/adapters/<provider>.py. - Implementa tre metodi statici:
to_tools(tool_definitions: list[ToolDefinition]) -> list[<ProviderTool>]parse_tool_call(tc_dict) -> tuple[tool_call_id, name, args_dict]make_tool_result(tool_call_id, name, execute_response) -> <ProviderToolMessage>
- Esporta il modulo da apipilot/adapters/__init__.py.
- Aggiungi test in
tests/test_adapters_<provider>.py. - Non aggiungere dipendenze opzionali dal provider nel core.
6. Aggiungere un nuovo tipo di tool oltre a endpoint e CompositeTool
- Estendi la classe apipilot/tool.py (protocollo
PilotTool). - Il tipo deve avere
name,description, unrun(args, user)asincrono. - Estendi
ApiPilot.add_tool(...)e_run_*in apipilot/core.py in modo minimale. - Aggiungi test per autorizzazione, timeout, troncamento, argomenti non validi.
7. Endpoints HTTP — regole
- Default disabilitati. L'utente passa
expose_http_endpoints=Trueper attivarli. - Ogni nuovo endpoint HTTP deve:
- usare
http_prefixconfigurabile. - rispettare
require_auth_for_httpe laget_current_userdell'ospite. - restituire sempre JSON strutturato coerente con
ExecuteResponseper le vie di errore. - NON introdurre route che eseguano codice arbitrario, script SQL, comandi shell.
- usare
8. Aggiornare documentazione e test
- Ogni modifica pubblica va tracciata in CHANGELOG.md in formato:
## YYYY-MM-DD — versione X.Y.Z - [file.py#L1-L99] descrizione modifica / nuova feature / bug fix. - Ogni nuova feature pubblica va documentata in README.md con un esempio minimo.
CLAUDE.mdrimanda a questo documento per le regole comuni; aggiungi inCLAUDE.mdsolo note specifiche per Claude se diverse dalle regole generali.- I test devono coprire: percorsi happy, autorizzazione negata, tool sconosciuti, argomenti non validi, errori dell'endpoint, timeout, troncamento, tool composti, adapter.
9. Processo di modifica suggerito per l'agente
- Leggi CHANGELOG.md e i test per capire l'impatto.
- Modifica il modulo target.
- Aggiungi/aggiorna test case.
- Esegui
pytest -q && ruff check apipilot tests examples. - Aggiorna CHANGELOG.md e README.md.
- Non fare commit di token, chiavi, o payload di clienti.
- always update documents