SDK Bulletproof para integrar aplicaciones Django Ninja con el GGR AI Gateway vía MCP.
Project description
GGR AI SDK
SDK bulletproof para integrar aplicaciones Django Ninja (Spokes) con el GGR AI Gateway vía MCP (Vertex AI Function Calling).
Establece una comunicación bidireccional tolerante a fallos y previene alucinaciones de argumentos del LLM generando automáticamente esquemas JSON a partir de las firmas de tus funciones Python.
Características
- Registro por decorador (
@mcp_tool): inspecciona la firma de la función, genera el esquema Pydantic→Vertex y oculta el contexto estático al LLM. - Inyección de contexto Zero-Trust (
MCPContext): las variables sensibles (user_id,tenant_id, …) nunca las decide el LLM; fluyen por el contexto estático. - Cliente HTTP resiliente: reintentos con backoff exponencial + jitter.
- Manejo de errores estructurado: las herramientas devuelven
{"error": ...}en lugar de provocar un 500, habilitando el reintento cognitivo del LLM. - Runs agénticos durables: cliente
start_run/resume_run/approve_run/get_run- SSE
stream_run, con webhook de resultado terminal y señalesai_run_completed/failed.
- SSE
- Multimodal y memoria:
attachments(Base64) ysession_iden el dispatch. - Idempotencia: deduplica reintentos de Cloud Tasks en
/execute(caché de Django). - Módulo
contrib(opcional): seguimiento persistente del ciclo de vida del chat en la BD del Spoke y actualizaciones en tiempo real al frontend vía Server-Sent Events (SSE).
Instalación
pip install ggr-ai-sdk
Uso mínimo
from ggr_ai_sdk import mcp_tool, MCPContext
@mcp_tool(name="cerrar_ticket", description="Cierra un ticket de soporte.")
async def cerrar_ticket(context: MCPContext, ticket_id: int, resolucion: str) -> str:
user_id = context.user_id # proviene del contexto estático, no del LLM
if not user_id:
return '{"error": "Usuario no identificado en el contexto estático."}'
# ... lógica de negocio ...
return f"Ticket {ticket_id} cerrado."
Registra el router del SDK en tu API de Django Ninja:
from ninja import NinjaAPI
from ggr_ai_sdk.routers import mcp_router
api = NinjaAPI()
# Verificados por firma HMAC del Gateway:
# /execute ejecución de herramientas MCP
# /webhook resultado de un dispatch
# /webhook/run resultado terminal de un run durable
api.add_router("/sdk", mcp_router)
Runs agénticos durables
from ggr_ai_sdk import AIGatewayClient, ai_run_completed
client = AIGatewayClient(base_url=settings.AI_GATEWAY_URL, api_key=settings.GGR_AI_SPOKE_API_KEY)
# Inicia un run; el resultado terminal llega por webhook a /sdk/webhook/run.
run = await client.start_run(
goal="Reagenda todas las citas del cliente 42 a la próxima semana",
callback_url="https://tu-spoke/api/sdk/webhook/run",
session_id="conversacion-uuid", # opcional: memoria entre runs
)
# Reacciona al resultado vía señal de Django.
def on_run_done(sender, payload, **kwargs):
print(payload.run_id, payload.status, payload.result_text)
ai_run_completed.connect(on_run_done)
El Gateway envía el webhook de run a la
callback_urltal cual: debe apuntar a/sdk/webhook/run(distinto del/sdk/webhookdel dispatch, cuyo payload es diferente).
Configuración (settings.py del Spoke)
| Variable | Descripción |
|---|---|
AI_GATEWAY_URL |
URL del GGR AI Gateway (local: http://localhost:8001). |
AI_CALLBACK_URL |
URL del webhook del Spoke al que responde el Gateway. |
GGR_AI_SPOKE_API_KEY |
API Key compartida con el Gateway (UUID de la ClientApp), usada saliente (X-API-Key al despachar). Obligatoria en producción. |
GGR_AI_WEBHOOK_SECRET |
Secreto HMAC compartido (ClientApp.webhook_secret del Gateway). El SDK lo usa para verificar la firma (X-Timestamp + X-Signature) de las llamadas entrantes del Gateway a /execute y /webhook. Obligatoria en producción. |
GGR_AI_IDEMPOTENCY_TTL_SECONDS |
(opcional, def. 86400) TTL del resultado deduplicado por idempotency_key. La deduplicación usa el framework de caché de Django: en producción configura un backend compartido (Redis) para que funcione entre procesos/instancias. |
Seguridad entrante (HMAC): el Gateway firma cada llamada al Spoke con
hmac_sha256(webhook_secret, f"{timestamp}." + raw_body)y la envía enX-Signature(sha256=…) junto conX-Timestamp. El SDK la verifica en tiempo constante y rechaza firmas inválidas o fuera de la ventana anti-replay (300 s). EnDEBUGsin secreto configurado, la verificación se omite con un warning (solo para desarrollo local).
El contrato de payloads (
AIRequestPayload/WebhookResponsePayload) y los estados (COMPLETED/FAILED) deben mantenerse en sincronía con el GGR AI Gateway.
Para la integración completa con persistencia y SSE, consulta el manual paso a paso en
CLAUDE.md.
Desarrollo
.venv\Scripts\pytest.exe # pruebas
.venv\Scripts\ruff.exe check src/ tests/ --fix # lint + formato
.venv\Scripts\mypy.exe src/ tests/ # tipos (modo estricto)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ggr_ai_sdk-0.4.3.tar.gz.
File metadata
- Download URL: ggr_ai_sdk-0.4.3.tar.gz
- Upload date:
- Size: 19.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65475a576af75971a6e0eddb81117a2ce6f5a169c75299912c840d2b6bf7231e
|
|
| MD5 |
3d434434d3c8bbabc2c2d1ef598b9e69
|
|
| BLAKE2b-256 |
2e00cffdc086b0410c755921aed40009c9c0ff52ee71d37c0e770641ad1abe46
|
File details
Details for the file ggr_ai_sdk-0.4.3-py3-none-any.whl.
File metadata
- Download URL: ggr_ai_sdk-0.4.3-py3-none-any.whl
- Upload date:
- Size: 25.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d3871f0cc3127d2c29cc1ea8de4e68bdbb45233f26afe167c95e44bf49def21
|
|
| MD5 |
ab23cbdd4d223907e5cab342252437f0
|
|
| BLAKE2b-256 |
51a2bec9f6213d8be42004ac96344cf1e5b68fe16031368cd24e6483633b620c
|