llmprobe

Sondea los endpoints de la API de LLM y reporta métricas de salud, incluyendo tiempo hasta el primer token, latencia y rendimiento. Verifica modelos individuales o ejecuta verificaciones de salud completas basadas en configuración.

Documentación

llmprobe

llmprobe

Monitoreo sintético y pruebas de humo de CI para endpoints de inferencia de LLM. Mide TTFT, latencia, rendimiento y errores. Binario único, cero SDKs.

CI Go License: MIT llmprobe MCP server

llmprobe es una herramienta CLI para la fiabilidad del servicio de LLM. Sondea APIs alojadas o servidores de inferencia compatibles con OpenAI, y luego informa las métricas que importan para la experiencia del usuario en producción: tiempo hasta el primer token (TTFT), latencia total, rendimiento de generación (tokens/seg) y tasas de error.

Úsalo como una verificación de salud puntual, un monitor continuo o una puerta de CI que bloquea despliegues cuando tu proveedor de LLM está degradado.

demo

Benchmark público

llm-bench usa llmprobe para ejecutar un benchmark público continuo de las principales APIs de LLM. Publica un panel en vivo en bench.jonathanwrede.de y datos JSONL crudos en Jwrede/llm-bench-data.

Este es el caso de uso previsto: sondas sintéticas repetidas que hacen visibles la latencia de LLM, las regresiones de TTFT, las caídas de rendimiento y la degradación del proveedor antes de que los usuarios las reporten.

Instalación

Descarga un binario precompilado desde la última versión (Linux, macOS, Windows; amd64 y arm64).

O instala desde el código fuente:

go install github.com/Jwrede/llmprobe@latest
llmprobe version

Plugin de Claude Code

Instala como plugin de Claude Code para la habilidad /llmprobe y las herramientas MCP:

claude plugin install Jwrede/llmprobe

O registra el servidor MCP directamente:

claude mcp add --transport stdio llmprobe -- llmprobe mcp

llmprobe se ejecuta localmente y solo contacta los endpoints de LLM que configures. Consulta PRIVACY.md para más detalles.

Inicio rápido

llmprobe funciona con OpenAI, Anthropic, Google, Azure OpenAI, AWS Bedrock y endpoints compatibles con OpenAI como vLLM, Ollama, OpenRouter, Groq, Together AI, Fireworks, DeepSeek y Mistral.

Crea un probes.yml (o copia el ejemplo incluido):

providers:
  - name: openai
    api_key: ${OPENAI_API_KEY}
    models:
      - name: gpt-4o
        thresholds:
          max_ttft: 2s
      - name: gpt-4o-mini
        thresholds:
          max_ttft: 500ms

  - name: anthropic
    api_key: ${ANTHROPIC_API_KEY}
    models:
      - name: claude-sonnet-4-20250514
        thresholds:
          max_ttft: 1s

Ejecuta una sonda:

$ llmprobe probe

Provider   Model                    Status    TTFT    Latency  Tok/s  Tokens  Error
--------   -----                    ------    ----    -------  -----  ------  -----
openai     gpt-4o                   healthy   312ms   2100ms   68.4   42
openai     gpt-4o-mini              healthy   98ms    814ms    112.3  56
anthropic  claude-sonnet-4-20250514 healthy   420ms   2831ms   52.1   38
azure      gpt-4o                   healthy   289ms   1950ms   71.2   44
bedrock    anthropic.claude-3-5...  degraded  1820ms  4510ms   28.1   38

4 healthy, 1 degraded, 0 errors

Qué mide

MétricaQué significa
TTFTTiempo desde el envío de la solicitud hasta el primer token de contenido. Esto es lo que los usuarios sienten como "retraso" antes de que la respuesta comience a transmitirse.
LatenciaTiempo total desde la solicitud hasta el cierre del flujo.
Tok/sRendimiento de generación: tokens producidos por segundo después del primer token. Calculado como token_count / (latency - ttft).
TokensTotal de tokens de salida. Prefiere los metadatos de uso del proveedor cuando están disponibles; si no, recurre al conteo de eventos SSE.
Estadohealthy si todos los umbrales pasan, degraded si se excede algún umbral, error si la solicitud falló.

Comandos

llmprobe probe

Verificación de salud puntual. Sondea todos los endpoints configurados e imprime los resultados.

llmprobe probe                        # table output
llmprobe probe -f json                # JSON output
llmprobe probe --fail-on degraded     # exit 1 if any endpoint is degraded
llmprobe probe -c custom-config.yml   # custom config path

Códigos de salida para CI:

--fail-onSalida 0Salida 1
error (predeterminado)saludable o degradadocualquier error
degradedsolo saludabledegradado o error
nonesiemprenunca

llmprobe watch

Monitoreo continuo. Sondea todos los endpoints en un intervalo e imprime una línea de resumen por iteración.

llmprobe watch                          # default 60s interval
llmprobe watch --interval 30s           # custom interval
llmprobe watch --tui                    # live terminal dashboard with TTFT chart
llmprobe watch --tui --load data.jsonl  # load historical data into the dashboard
llmprobe watch -f json                  # JSONL output (one line per result)
llmprobe watch --prometheus :9090       # expose Prometheus metrics
llmprobe watch --otel localhost:4317     # export OpenTelemetry metrics via OTLP/gRPC

La bandera --tui lanza un panel de terminal en vivo con un gráfico de TTFT, leyenda de colores y tabla de estadísticas. Usa --load para importar datos JSONL históricos (de llmprobe watch -f json > data.jsonl).

llmprobe

$ llmprobe watch --interval 30s

Watching 4 endpoints every 30s (Ctrl+C to stop)

[14:01:02] All 4 endpoints healthy.
[14:01:32] All 4 endpoints healthy.
[14:02:02] 3 healthy, 1 degraded, 0 errors. DEGRADED: openai/gpt-4o (TTFT 1820ms)
[14:02:32] All 4 endpoints healthy.

llmprobe report

Genera un resumen en Markdown a partir de datos de sonda JSONL con percentiles p50/p95/p99 para TTFT, latencia y rendimiento por endpoint.

llmprobe report data.jsonl

Salida:

| Provider | Model | Probes | Errors | TTFT p50 | TTFT p95 | ... | Tok/s p50 | ...
|----------|-------|--------|--------|----------|----------|-----|-----------|----
| openai   | gpt-4o | 100  | 2      | 115ms    | 188ms    | ... | 46.9      | ...

llmprobe baseline

Crea un archivo de línea base a partir de datos JSONL históricos para la detección de regresiones.

llmprobe baseline data.jsonl -o baseline.json

Referencia la línea base en tu configuración para usar umbrales basados en multiplicadores:

baseline: baseline.json

providers:
  - name: openai
    api_key: ${OPENAI_API_KEY}
    models:
      - name: gpt-4o
        thresholds:
          max_ttft_multiplier: 2.0       # fail if TTFT > 2x baseline p50
          max_latency_multiplier: 2.5    # fail if latency > 2.5x baseline p50

Esto te permite detectar regresiones en relación con tus propios datos históricos en lugar de establecer umbrales absolutos.

llmprobe version

Imprime la versión del binario instalado.

llmprobe version

Integración con CI

Usa llmprobe probe como puerta previa al despliegue:

# .github/workflows/deploy.yml
- name: Check LLM providers
  env:
    OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
    ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
  run: |
    go install github.com/Jwrede/llmprobe@latest
    llmprobe probe --fail-on degraded

Esto bloquea el despliegue si algún proveedor de LLM está experimentando rendimiento degradado en este momento.

Cuando una sonda falla, la salida muestra solo los endpoints que fallan:

Failed endpoints (1/4):
  openai/gpt-4o  DEGRADED  TTFT=280ms  Latency=950ms  Tok/s=32.1

Servidor MCP

llmprobe MCP server

llmprobe incluye un servidor Model Context Protocol integrado, que permite a Claude Code y otros hosts de MCP verificar la salud de la API de LLM directamente desde un flujo de trabajo de agente.

Ejecutar el servidor

llmprobe mcp

Esto inicia el servidor MCP sobre stdio.

Registro con Claude Code

claude mcp add --transport stdio llmprobe -- llmprobe mcp

Una vez registrado, Claude Code puede llamar a las herramientas de llmprobe durante cualquier conversación.

Herramientas disponibles

HerramientaDescripción
probe_allSondea todos los endpoints configurados desde probes.yml. Devuelve TTFT, latencia, rendimiento y estado de salud para cada modelo. Acepta un parámetro opcional config para una ruta de configuración personalizada.
probe_modelSondea un solo modelo sin archivo de configuración. Requiere provider, model y api_key_env. Admite base_url opcional para endpoints compatibles con OpenAI y label opcional para visualización.
list_providersLista todos los proveedores y modelos en el archivo de configuración con sus umbrales. Úsalo para descubrir modelos disponibles antes de sondear.
get_configDevuelve la configuración completa analizada, incluidos valores predeterminados, proveedores, modelos y umbrales.

Caso de uso de ejemplo: Un agente llama a list_providers para ver qué modelos están configurados, luego a probe_all para verificar que estén saludables antes de desplegar cambios.

Configuración

defaults:
  prompt: "Hello"                                # probe prompt
  max_tokens: 20                                 # max output tokens
  timeout: 30s                                   # per-probe timeout
  concurrency: 5                                 # max parallel probes

providers:
  - name: openai                    # openai, anthropic, google, azure, bedrock
    label: openai-prod              # optional display name; useful for multiple OpenAI-compatible endpoints
    api_key: ${OPENAI_API_KEY}      # env var expansion
    base_url: https://custom.api    # optional, override endpoint
    models:
      - name: gpt-4o
        prompt: "Say hello."        # override default prompt
        max_tokens: 10              # override default max_tokens
        response_format: json       # optional; OpenAI-compatible JSON mode
        validate_json: true         # optional; mark degraded if returned content is not valid JSON
        thresholds:
          max_ttft: 2s              # alert if TTFT exceeds this
          max_latency: 10s          # alert if total latency exceeds this
          min_tokens_per_sec: 20    # alert if throughput drops below this
          max_ttft_multiplier: 2.0  # optional; compare against baseline p50
          max_latency_multiplier: 2.5

  - name: azure
    api_key: ${AZURE_OPENAI_API_KEY}
    base_url: https://your-resource.openai.azure.com
    api_version: "2024-10-21"       # optional, defaults to 2024-10-21
    models:
      - name: gpt-4o               # deployment name

  - name: bedrock
    access_key: ${AWS_ACCESS_KEY_ID}
    secret_key: ${AWS_SECRET_ACCESS_KEY}
    region: us-east-1
    models:
      - name: anthropic.claude-3-5-sonnet-20241022-v2:0

Las claves de API y las credenciales de AWS admiten la sintaxis ${ENV_VAR}. Solo se expanden los campos de credenciales, por lo que las referencias a variables de entorno en prompts o nombres de modelos se dejan tal cual.

Proveedores compatibles con OpenAI

Muchos proveedores (Groq, Together AI, Fireworks, DeepSeek, Mistral, OpenRouter, Ollama, vLLM) exponen una API compatible con OpenAI. Estos funcionan de inmediato configurando base_url. Usa el campo label para distinguir múltiples bloques compatibles con OpenAI:

providers:
  # Groq
  - name: openai
    label: groq
    api_key: ${GROQ_API_KEY}
    base_url: https://api.groq.com/openai
    models:
      - name: llama-3.3-70b-versatile

  # DeepSeek
  - name: openai
    label: deepseek
    api_key: ${DEEPSEEK_API_KEY}
    base_url: https://api.deepseek.com
    models:
      - name: deepseek-chat

  # Together AI
  - name: openai
    label: together
    api_key: ${TOGETHER_API_KEY}
    base_url: https://api.together.xyz
    models:
      - name: meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo

  # Local Ollama
  - name: openai
    label: ollama
    api_key: unused
    base_url: http://localhost:11434
    models:
      - name: llama3.2

Consulta examples/ para configuraciones listas para usar de vLLM, SGLang y Ollama.

Validación de respuesta JSON

Para endpoints compatibles con OpenAI, configura response_format: json para solicitar modo JSON y validate_json: true para marcar la sonda como degraded si el contenido transmitido no es JSON válido.

providers:
  - name: openai
    label: vllm-json
    api_key: unused
    base_url: http://localhost:8000
    models:
      - name: meta-llama/Llama-3.1-8B-Instruct
        prompt: 'Return {"ok": true} as JSON.'
        response_format: json
        validate_json: true

Métricas de Prometheus

Ejecuta con --prometheus para exponer métricas para scraping:

llmprobe watch --interval 30s --prometheus :9090

Métricas disponibles en /metrics:

MétricaTipoEtiquetas
llmprobe_ttft_secondsgaugeprovider, model
llmprobe_latency_secondsgaugeprovider, model
llmprobe_tokens_per_secondgaugeprovider, model
llmprobe_token_countgaugeprovider, model
llmprobe_statusgaugeprovider, model
llmprobe_probes_totalcounterprovider, model
llmprobe_errors_totalcounterprovider, model
llmprobe_ttft_seconds_histhistogramprovider, model
llmprobe_latency_seconds_histhistogramprovider, model
llmprobe_tokens_per_second_histhistogramprovider, model

El gauge llmprobe_status codifica la salud como: 1 = saludable, 0.5 = degradado, 0 = error. Úsalo para alertas en Grafana o Alertmanager.

Métricas de OpenTelemetry

Ejecuta con --otel para exportar métricas de sonda a un colector OTLP/gRPC.

llmprobe watch --interval 30s --otel localhost:4317

Nombres de métricas exportadas:

MétricaDescripción
llmprobe.ttft.secondsTiempo hasta el primer token en segundos
llmprobe.latency.secondsLatencia total de la solicitud en segundos
llmprobe.tokens_per_secondRendimiento de generación
llmprobe.token_countConteo de tokens de salida de la última sonda
llmprobe.status1 = saludable, 0.5 = degradado, 0 = error
llmprobe.probes.totalTotal de sondas ejecutadas
llmprobe.errors.totalTotal de errores de sonda

Todas las métricas incluyen los atributos provider y model.

Arquitectura

probes.yml
  -> Config loader (YAML + env var expansion)
    -> Probe engine (concurrent goroutines per provider/model)
      -> Provider clients (raw HTTP + SSE parsing, no SDKs)
        -> Results (TTFT, latency, tokens/sec, status)
          -> Output (table, JSON, JSONL)

Cada cliente de proveedor es un envoltorio HTTP delgado que envía una solicitud de transmisión y analiza la respuesta. No se importan SDKs de LLM. El analizador SSE maneja tanto eventos solo de datos (OpenAI, Google) como eventos nombrados (Anthropic). El cliente de Bedrock implementa la firma SigV4 y el análisis del flujo de eventos binarios de AWS desde cero.

El TTFT se mide desde el momento en que se envía la solicitud HTTP hasta el primer evento que contiene texto de contenido real (no asignaciones de roles ni metadatos).

Proveedores

ProveedorEndpointAutenticaciónFormato de transmisión
OpenAI/v1/chat/completionsAuthorization: BearerSSE, centinela [DONE]
Anthropic/v1/messagescabecera x-api-keySSE de eventos nombrados
Google/v1beta/models/{model}:streamGenerateContent?alt=sseparámetro de consulta keySSE
Azure OpenAI/openai/deployments/{model}/chat/completionscabecera api-keySSE, centinela [DONE]
AWS Bedrock/model/{model}/converse-streamSigV4flujo de eventos binarios de AWS
OpenAI-compat/v1/chat/completions (base_url personalizado)Authorization: BearerSSE

La compatibilidad con OpenAI cubre: Groq, Together AI, Fireworks, DeepSeek, Mistral, OpenRouter, Ollama, vLLM y cualquier endpoint que hable la API de chat completions de OpenAI.

Hoja de ruta

  • Más ejemplos específicos de proveedores para endpoints compatibles con OpenAI autoalojados
  • Más formatos de informe para ventanas de monitoreo de larga duración
  • Plantillas opcionales de runbook para fallos comunes de endpoints de LLM

Licencia

MIT