# Registra el uso por usuario anónimo en tu aplicación

Añade identificadores propios y eventos mínimos sin depender de una API de análisis de MandAPI no verificada.

## 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.

```python
# 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](https://app.mandapi.com/console).

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.

## Referencias

- [https://mandapi.com/en/docs/quickstart](https://mandapi.com/en/docs/quickstart)
- [https://mandapi.com/es/docs/quickstart](https://mandapi.com/es/docs/quickstart)
- [https://github.com/openai/openai-python](https://github.com/openai/openai-python)
