Skip to main content
Glama

CallLens

Inteligencia de conversación y evaluación conductual de código abierto impulsada por LangGraph.

Sube una llamada. CallLens la transcribe, reconstruye la conversación, mide métricas de comunicación deterministas, evalúa comportamientos semánticos según rúbricas configurables, verifica la evidencia de apoyo y produce inteligencia de conversación explicable.

CallLens convierte conversaciones en bruto (grabaciones o transcripciones) en inteligencia conductual estructurada y respaldada por evidencia: transcripciones diarizadas, métricas de tiempo de habla y ritmo, sentimiento longitudinal, temas, detección de oportunidades/riesgos y análisis por representante, todo puntuado según rúbricas declarativas y versionadas.

Cada puntuación semántica está respaldada por evidencia. Nunca solo Discovery: 8/10. En su lugar:

Discovery: 8.7/10
Confidence: 0.91

Evidence:
  04:32  Representative asks customer about their current operational bottleneck.
  05:17  Representative asks about business impact.
  07:02  Customer explains delivery delays.

Missing behavior:
  Representative never established urgency or implementation timeframe.

Los usuarios hacen clic en una marca de tiempo y el reproductor de audio salta a ese momento exacto.


Por qué existe

La mayoría de las herramientas de puntuación de llamadas o bien (a) envían la transcripción completa a un LLM y piden un número, o (b) cuentan palabras clave. CallLens no hace ninguna de las dos cosas:

  • Puntuación en varias etapas — extracción de evidencia candidata → verificación determinista → puntuación por rúbrica → comprobación de consistencia → puerta de confianza → re-evaluación acotada. Nunca un único prompt de "puntúa esta transcripción".

  • Determinista cuando es posible, semántico solo cuando es necesario — tiempo de habla, palabras por minuto, interrupciones, turnos y silencios son Python puro. Los LLM se usan para razonamiento: sentimiento, temas, intención, comportamiento, coaching.

  • Aislamiento de proveedores — una abstracción de voz (ElevenLabs hoy) y una abstracción de LLM (OpenAI / Anthropic / cualquier endpoint compatible con OpenAI), de modo que nada está cableado a un solo proveedor.

  • Auditable por diseño — cada análisis registra las versiones del modelo, prompt, rúbrica y pipeline.

Related MCP server: sales-chat-quality

Arquitectura

flowchart TD
    A[Audio / Transcript] --> B[Ingestion]
    B --> C[ElevenLabs STT + Diarization]
    C --> D[Transcript Normalization]
    D --> E[LangGraph]
    E --> F[Deterministic Metrics]
    E --> G[Semantic Analysis]
    G --> H[Sentiment]
    G --> I[Topics]
    G --> J[Intents]
    F --> K[Evidence Verification]
    H --> K
    I --> K
    J --> K
    K --> L[Confidence Gate]
    L -->|sufficient| M[Report]
    L -->|insufficient| N[Bounded Re-score]
    N --> K

Ver docs/ARCHITECTURE.md, docs/LANGGRAPH.md y docs/DATA_MODEL.md.

Inicio rápido

Docker (recomendado)

cp .env.example .env
docker compose up

No se requieren claves API para probarlo: sin ELEVENLABS_API_KEY, el proveedor de voz y el LLM de razonamiento recurren a mocks sin conexión deterministas, por lo que el pipeline completo (transcribir → métricas → puntuación por rúbrica respaldada por evidencia → coaching) se ejecuta de principio a fin.

Local (Python)

python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

# Analyze a transcript (offline, deterministic)
calllens analyze sample.txt

# Start the API server
calllens server

# Run the evaluation harness
calllens eval run

Frontend

cd apps/web
npm install
NEXT_PUBLIC_API_URL=http://localhost:8000 npm run dev

CLI

calllens analyze call.mp3
calllens analyze call.mp3 --rubric consultative_sales --output report.json
calllens rubric list
calllens rubric validate ./my_rubric.yaml
calllens eval run
calllens server

SDK de Python

import asyncio
from calllens import CallLens


async def main():
    async with CallLens(base_url="http://localhost:8000") as client:
        call = await client.calls.upload("sales-call.mp3")
        await call.analyze(rubric="consultative_sales")
        report = await call.report()
        print(report["overall_score"], report["confidence"])


asyncio.run(main())

API REST (subconjunto)

POST   /api/v1/calls                     upload a recording or transcript
GET    /api/v1/calls
GET    /api/v1/calls/{id}
POST   /api/v1/calls/{id}/analyze
GET    /api/v1/calls/{id}/analysis       the evidence-backed CallReport
GET    /api/v1/calls/{id}/transcript
DELETE /api/v1/calls/{id}                privacy/retention deletion
POST   /api/v1/rubrics                   register a declarative rubric
GET    /api/v1/rubrics
POST   /api/v1/rubrics/validate
GET    /api/v1/reps/{id}/analytics
POST   /api/v1/evals/run

Documentación interactiva en /docs.

Rúbricas

Las rúbricas son documentos YAML declarativos y versionados. El motor en sí es genérico: ventas es solo la primera rúbrica incluida. Aporta la tuya: soporte al cliente, reclutamiento, cobros, seguros, bienes raíces, éxito del cliente, entrevistas, agentes de voz con IA.

name: consultative_sales
version: "1.0"
dimensions:
  rapport:
    label: Rapport
    weight: 0.08
  discovery:
    label: Problem Discovery
    weight: 0.16

Los pesos de las dimensiones deben sumar 1.0. Ver rubrics/ y docs/custom-rubrics.

Proveedores

Capa

Proveedor

Configuración

Voz (STT/TTS)

ElevenLabs Scribe v2

ELEVENLABS_API_KEY, ELEVENLABS_STT_MODEL

LLM de razonamiento

OpenAI

LLM_PROVIDER=openai, OPENAI_API_KEY, LLM_MODEL

LLM de razonamiento

Anthropic

LLM_PROVIDER=anthropic, ANTHROPIC_API_KEY, LLM_MODEL

LLM de razonamiento

Cualquier endpoint compatible con OpenAI

LLM_PROVIDER=compatible, COMPATIBLE_BASE_URL, COMPATIBLE_API_KEY

LLM de razonamiento

Mock sin conexión (predeterminado)

LLM_PROVIDER=mock

Todos los tests y CI se ejecutan contra mocks: sin llamadas API de pago.

Ejemplo: análisis en vivo con proveedores reales

Configura ambos proveedores en .env y analiza una grabación real:

# .env — speech + reasoning
ELEVENLABS_API_KEY=sk_...
ELEVENLABS_STT_MODEL=scribe_v2

# Any OpenAI-compatible endpoint, e.g. Melious (https://api.melious.ai/v1)
LLM_PROVIDER=compatible
COMPATIBLE_BASE_URL=https://api.melious.ai/v1
COMPATIBLE_API_KEY=sk-mel-...
LLM_MODEL=gpt-oss-120b

Luego ejecuta el pipeline completo sobre una grabación: debe ser un archivo de llamada pregrabado (MP3/WAV), pero puedes sintetizar uno si no tienes una grabación a mano:

# Option A — you have a recording: transcribe + analyze it live
# (Scribe v2 STT → metrics → evidence-backed scoring → coaching)
calllens analyze call.mp3 --rubric consultative_sales --output report.json

# Option B — no recording? Synthesize a two-speaker sample call with ElevenLabs TTS
python examples/generate_sample_call.py   # → sample_call.mp3
calllens analyze sample_call.mp3 --rubric consultative_sales --output report.json

# Both write the evidence-backed report (scores + timestamped evidence + coaching)
# to report.json; omit --output to print it to stdout.

El endpoint compatible debe soportar salidas estructuradas con JSON-schema de OpenAI (response_format: {type: "json_schema"}) — el structured_completion del pipeline depende de ello. No todos los modelos en todas las pasarelas lo hacen; por ejemplo, gpt-oss-120b en Melious funciona, mientras que varios otros (GLM, Kimi, DeepSeek v4 en Melious) rechazan el modo schema. Prueba con una llamada estructurada pequeña antes de comprometerte con un modelo.

MCP / MCPize

CallLens incluye un servidor MCP que expone analyze_transcript, score_dimension y list_rubrics, desplegable en MCPize:

mcpize analyze && mcpize doctor && mcpize deploy

stdio local:

pip install -r requirements.txt
python mcp-server/server.py

Evaluación

| Dimension | MAE | Correlation |
|-----------|-----|-------------|
| Discovery | .61 | .88         |
| Rapport   | .74 | .81         |

El banco de pruebas (calllens.evals) ejecuta el pipeline completo sobre un conjunto de datos sintético de 13 escenarios (vendedor excelente, vendedor pobre, descubrimiento débil, cliente enfadado, multilingüe, …) e informa MAE, RMSE, correlación y precisión/recall de evidencia frente a etiquetas de calidad humana.

Hoja de ruta

Ver docs/ROADMAP.md. Destacados: autenticación/RLS de Supabase y almacenamiento de objetos, backends de trabajos asíncronos (Redis/SQS), consultas GraphQL para el panel, modo de llamada en vivo, modo de juego de roles con IA, tendencias por representante, monitoreo de deriva.

Seguridad y privacidad

  • Las claves API son solo de entorno; nunca se confirman, registran ni exponen al navegador.

  • Las grabaciones de llamadas se tratan como sensibles: aislamiento de inquilinos, almacenamiento privado/firmado, eliminación y retención configurable.

  • Las transcripciones completas nunca se registran por defecto.

  • Ver SECURITY.md y docs/ARCHITECTURE.md.

Licencia

MIT © Yabloko Labs

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Provides advanced analysis of conversations from Limitless Pendant recordings, including intelligent meeting detection, action item extraction, natural language time queries, and comprehensive conversation analytics with smart pagination support.
    14
    22 npm
    24
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables querying and analyzing Genesys Cloud data such as queues, conversations, voice call quality, sentiment, topics, transcripts, and OAuth client usage through natural language.
    10
    25 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables coding agents to run offline voice-agent call forensics over local stdio, scoring recordings and reading/verifying evidence to isolate failures. It also proposes fixes and regression checks so broken calls can be pinned and prevented from shipping again.
    49 PyPI
    2
    MIT