Referință API Extensii
API-ul Extensiilor oferă puncte finale pentru gestionarea și interacțiunea cu extensiile Ordinaut. Aceasta include descoperirea extensiilor, monitorizarea sănătății și accesul la funcționalitatea specifică extensiilor.
Puncte Finale Centrale Extensii
Status Extensii
Obține informații despre toate extensiile descoperite.
Punct Final: GET /ext/status
Autentificare: Nu este necesară
Scope-uri: Niciunul
Răspuns:
{
"extensions": {
"observability": {
"state": "încărcat",
"info": {
"id": "observability",
"name": "Observability",
"version": "0.1.0",
"description": "Metrici Prometheus și monitorizare"
},
"capabilities": ["ROUTES"],
"loaded_ms": 45,
"metrics": {
"requests_total": 150.0,
"errors_total": 2.0,
"latency_ms_sum": 1250.5
}
}
},
"discovery_sources": ["builtin", "env_dir"],
"total_extensions": 4,
"loaded_extensions": 3,
"failed_extensions": 0
}
Exemplu:
curl http://localhost:8080/ext/status
Extensii Integrate
Extensia Observability
Oferă metrici compatibile Prometheus pentru monitorizarea sistemului.
Obține Metrici
Punct Final: GET /ext/observability/metrics
Autentificare: Nu este necesară
Content-Type: text/plain; version=0.0.4
Returnează metrici în format Prometheus incluzând:
- Metrici cerere/răspuns HTTP
- Statistici execuție sarcini
- Metrici performanță extensii
- Utilizarea resurselor sistemului
Exemplu:
curl http://localhost:8080/ext/observability/metrics
Răspuns Eșantion:
# HELP http_requests_total Numărul total de cereri HTTP
# TYPE http_requests_total counter
http_requests_total{method="GET",endpoint="/health"} 45.0
# HELP task_executions_total Numărul total de execuții sarcini
# TYPE task_executions_total counter
task_executions_total{status="success"} 123.0
task_executions_total{status="failed"} 5.0
# HELP extension_requests_total Numărul de cereri extensii
# TYPE extension_requests_total counter
extension_requests_total{extension="webui"} 89.0
Extensia Web UI
Oferă o interfață web pentru gestionarea sarcinilor și monitorizarea sistemului.
Obține Interfața Web
Punct Final: GET /ext/webui/
Autentificare: Nu este necesară (configurabilă)
Content-Type: text/html
Returnează pagina HTML principală a interfeței web.
Exemplu:
curl http://localhost:8080/ext/webui/
Puncte Finale API
Obține Sarcini: GET /ext/webui/api/tasks
{
"tasks": [
{
"id": "uuid-1234",
"title": "Briefing Matinal",
"status": "activ",
"next_run": "2025-08-26T08:30:00Z"
}
]
}
Creează Sarcină: POST /ext/webui/api/tasks
{
"title": "Sarcină Nouă",
"schedule_kind": "cron",
"schedule_expr": "0 9 * * *",
"payload": {
"pipeline": []
}
}
Extensia MCP HTTP
Model Context Protocol peste HTTP pentru integrarea asistenților AI.
Metadata MCP
Punct Final: GET /ext/mcp_http/meta
Autentificare: Nu este necesară
{
"server": "ordinaut-mcp-http",
"version": "0.2.0",
"capabilities": ["handshake", "list_tools", "invoke", "schema", "sse"]
}
Handshake MCP
Punct Final: POST /ext/mcp_http/handshake
Content-Type: application/json
Cerere:
{
"client": {
"name": "ChatGPT",
"version": "1.0"
}
}
Răspuns:
{
"server": {
"name": "ordinaut-mcp-http",
"version": "0.2.0"
},
"session_id": "sess-uuid-5678"
}
Listează Instrumentele Disponibile
Punct Final: GET /ext/mcp_http/tools
{
"tools": [
{
"name": "create_task",
"description": "Creează o sarcină programată nouă",
"parameters": {
"type": "object",
"properties": {
"title": {"type": "string"},
"schedule": {"type": "string"}
}
}
}
]
}
Invocă Instrument
Punct Final: POST /ext/mcp_http/invoke
Cerere:
{
"tool": "create_task",
"parameters": {
"title": "Raport Zilnic",
"schedule": "0 18 * * *"
}
}
Răspuns:
{
"success": true,
"result": {
"task_id": "uuid-9876",
"message": "Sarcină creată cu succes"
}
}
Extensia Demo Evenimente
Demonstrează sistemul de evenimente Redis Streams.
Publică Eveniment
Punct Final: POST /ext/events_demo/publish/{stream}
Content-Type: application/json
Exemplu:
curl -X POST http://localhost:8080/ext/events_demo/publish/test \\
-H "Content-Type: application/json" \\
-d '{"mesaj": "Salut Evenimente", "timestamp": "2025-08-26T10:00:00Z"}'
Răspuns:
{
"success": true,
"stream": "test",
"event_id": "1692873600000-0",
"message": "Eveniment publicat cu succes"
}
Abonează-te la Evenimente (Server-Sent Events)
Punct Final: GET /ext/events_demo/subscribe/{stream}
Content-Type: text/event-stream
Stabilește o conexiune SSE pentru a primi evenimente în timp real.
Exemplu:
curl -N http://localhost:8080/ext/events_demo/subscribe/test
Stream Răspuns:
data: {"stream": "test", "id": "1692873600000-0", "data": {"mesaj": "Salut Evenimente"}}
data: {"stream": "test", "id": "1692873600001-0", "data": {"mesaj": "Alt eveniment"}}
API Dezvoltare Extensii
Înregistrarea Extensiilor
Extensiile sunt descoperite și înregistrate automat. Nu este necesară un API de înregistrare manuală.
Surse de Descoperire:
1. Integrate: directorul ordinaut/extensions/
2. Mediu: variabila de mediu ORDINAUT_EXT_PATHS
3. Puncte de intrare: grupul de puncte de intrare Python ordinaut.plugins
Capabilitățile Extensiilor
Extensiile pot solicita următoarele capabilități:
Capabilitate | Descriere | Acces API |
---|---|---|
ROUTES |
Crearea punctelor finale HTTP | Montarea router-ului FastAPI |
TOOLS |
Acces registru instrumente | tool_registry.register_tool() |
EVENTS_PUB |
Publicarea evenimentelor | events.publish() |
EVENTS_SUB |
Abonarea la evenimente | events.subscribe() |
BACKGROUND_TASKS |
Procese de lungă durată | background.start_task() |
STATIC |
Servirea fișierelor statice | Rutare automată fișiere statice |
Obiecte Context
Extensiile primesc obiecte context bazate pe capabilitățile acordate:
Context Registru Instrumente
# Disponibil când capabilitatea TOOLS este acordată
tool_registry.register_tool(name: str, func: Callable, schema: dict)
tool_registry.list_tools() -> List[ToolInfo]
tool_registry.get_tool(name: str) -> ToolInfo
Context Evenimente
# Disponibil când EVENTS_PUB sau EVENTS_SUB sunt acordate
await events.publish(stream: str, data: dict) -> str
await events.subscribe(pattern: str, handler: Callable) -> None
await events.unsubscribe(pattern: str) -> None
Context Sarcini de Fond
# Disponibil când capabilitatea BACKGROUND_TASKS este acordată
await background.start_task(name: str, coro: Coroutine) -> None
await background.stop_task(name: str) -> None
background.list_tasks() -> List[TaskInfo]
Autentificare și Autorizare
Controlul Accesului Bazat pe Scope-uri
Extensiile pot fi protejate cu autorizare bazată pe scope-uri:
Configurație:
export ORDINAUT_REQUIRE_SCOPES=true
Anteturi Cerere:
curl -H "X-Scopes: ext:extensia_mea:routes" \\
http://localhost:8080/ext/extensia_mea/protejat
Șablon Scope Necesar: ext:{extension_id}:routes
Autentificare Token JWT
Când autentificarea JWT este activată, extensiile moștenesc aceleași cerințe de autentificare ca API-ul central.
Anteturi Cerere:
curl -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." \\
http://localhost:8080/ext/extensia_mea/securizat
Răspunsuri de Eroare
Toate punctele finale ale extensiilor urmează formate consistente de răspuns de eroare:
400 Cerere Invalidă
{
"error": "bad_request",
"message": "Parametri de cerere invalizi",
"details": {
"field": "schedule_expr",
"issue": "Expresie cron invalidă"
}
}
401 Neautorizat
{
"error": "unauthorized",
"message": "Autentificare necesară",
"details": {
"required_scopes": ["ext:extensia_mea:routes"]
}
}
403 Interzis
{
"error": "forbidden",
"message": "Permisiuni insuficiente",
"details": {
"required_capability": "TOOLS",
"granted_capabilities": ["ROUTES"]
}
}
404 Nu a fost găsit
{
"error": "not_found",
"message": "Extensia nu a fost găsită",
"details": {
"extension_id": "extensie_inexistenta"
}
}
500 Eroare Internă de Server
{
"error": "internal_error",
"message": "Execuția extensiei a eșuat",
"details": {
"extension_id": "extensia_mea",
"error_type": "ImportError",
"traceback": "..."
}
}
Limitarea Ratei
Punctele finale ale extensiilor respectă aceeași configurație de limitare a ratei ca API-ul central:
Anteturi:
- X-RateLimit-Limit
: Limita de cereri per fereastră
- X-RateLimit-Remaining
: Cererile rămase în fereastra curentă
- X-RateLimit-Reset
: Timestamp resetare fereastră
429 Prea Multe Cereri:
{
"error": "rate_limit_exceeded",
"message": "Limita de rată depășită",
"details": {
"limit": 100,
"window": "60s",
"reset_at": "2025-08-26T10:01:00Z"
}
}
Verificări de Sănătate
Extensiile pot implementa puncte finale de verificare a sănătății pentru monitorizare:
Convenție: GET /ext/{extension_id}/health
Răspuns Standard:
{
"status": "sănătos",
"timestamp": "2025-08-26T10:00:00Z",
"version": "1.0.0",
"checks": {
"database": "sănătos",
"external_api": "sănătos",
"background_tasks": "sănătos"
}
}
Suport WebSocket
Extensiile pot implementa puncte finale WebSocket pentru comunicare în timp real:
Șablon Punct Final: WS /ext/{extension_id}/ws/{path}
Exemplu Implementare:
from fastapi import WebSocket
@router.websocket("/ws/events")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
# Gestionează comunicarea WebSocket
data = await websocket.receive_json()
response = await proceseaza_date_websocket(data)
await websocket.send_json(response)
except WebSocketDisconnect:
# Gestionează deconectarea clientului
pass
Metrici Extensii
Toate extensiile primesc automat colectare de metrici de bază:
Metrici Disponibile:
- extension_requests_total{extension, endpoint, method, status}
- extension_request_duration_seconds{extension, endpoint, method}
- extension_errors_total{extension, endpoint, error_type}
- extension_active_connections{extension, endpoint}
Acces prin Extensia Observability:
curl http://localhost:8080/ext/observability/metrics | grep extension
Această referință API oferă documentația completă pentru interacțiunea cu sistemul de extensii Ordinaut, permițând dezvoltatorilor să construiască extensii puternice și să integreze eficient sisteme externe.