Define qué necesita tu aplicación
Esta receta guarda un evento local por solicitud al modelo. Asigna un usuario anónimo de la aplicación, una función y un identificador propio de solicitud. Son registros de tu aplicación; el ejemplo no crea análisis de organizaciones ni garantiza que los metadatos aparezcan en el panel de MandAPI.
Utilízalo para saber qué función está activa o investigar una solicitud fallida. En un servicio real, asigna los identificadores anónimos desde el servidor con tu sistema de cuentas. No aceptes directamente desde el navegador una identidad que pueda pertenecer a otro cliente.
Guarda un evento mínimo
Instala el cliente Python de OpenAI y configura MANDAPI_API_KEY y MANDAPI_MODEL_ID. Guarda el ejemplo como tracked_request.py. Utiliza un usuario y mensaje sintéticos. Al ejecutarlo hace una solicitud real y escribe usage-events.jsonl en la carpeta actual.
# tracked_request.py
import json
import os
import time
import uuid
from datetime import datetime, timezone
from openai import OpenAI
request_id = uuid.uuid4().hex
started = time.monotonic()
record = {
"request_id": request_id,
"anonymous_user_id": "demo-user-a",
"feature": "support-demo",
"time": datetime.now(timezone.utc).isoformat(),
}
with OpenAI(
api_key=os.environ["MANDAPI_API_KEY"],
base_url="https://api.mandapi.com/v1",
timeout=30.0,
max_retries=0,
) as client:
try:
result = client.chat.completions.create(
model=os.environ["MANDAPI_MODEL_ID"],
messages=[{"role": "user", "content": "Say hello in Spanish."}],
)
record.update(status="ok", response_id=result.id, model=result.model)
if result.usage:
record.update(
prompt_tokens=result.usage.prompt_tokens,
completion_tokens=result.usage.completion_tokens,
)
except Exception as error:
record.update(status="error", error_type=type(error).__name__)
raise RuntimeError("MandAPI request failed: " + type(error).__name__) from None
finally:
record["duration_ms"] = round((time.monotonic() - started) * 1000)
with open("usage-events.jsonl", "a", encoding="utf-8") as log:
log.write(json.dumps(record, ensure_ascii=False) + "\n")
print("Saved local event:", request_id)El evento guarda estado y duración incluso si la solicitud falla. Los tokens solo se añaden si fueron devueltos. El identificador propio es diferente del ID de respuesta del modelo; ninguno equivale a un cargo monetario.
Utiliza los registros
Abre el archivo JSONL y comprueba que cada ejecución añade un evento. Relaciona los eventos mediante el ID propio, el usuario anónimo y la función. Si calculas un coste, anota la fecha de tarifa y las suposiciones. Concilia los créditos reales con tu panel de MandAPI.
El ejemplo no envía identificadores de clientes a MandAPI. Tampoco guarda prompts, respuestas, correos ni claves. Configura acceso y conservación adecuados antes de recopilar actividad de clientes reales.
Comprueba el resultado
Una llamada correcta debe guardar un evento ok con ID de respuesta y el uso que exista. Un fallo debe guardar un evento error sin inventar tokens. En servicios con varios procesos, sustituye el archivo de demostración por una base de datos o sistema de registros que admita escritura concurrente. Crea informes con tus eventos, sin presuponer una ruta de análisis de plataforma no verificada.