feat: Add Streamlit dashboard with Blueprint compliance (v2.1.0)
Dashboard Features: - 8 navigation sections: Overview, Outcomes, Poor CX, FCR, Churn, Agent, Call Explorer, Export - Beyond Brand Identity styling (colors #6D84E3, Outfit font) - RCA Sankey diagram (Driver → Outcome → Churn Risk flow) - Correlation heatmaps (driver co-occurrence, driver-outcome) - Outcome Deep Dive (root causes, correlation, duration analysis) - Export functionality (Excel, HTML, JSON) Blueprint Compliance: - FCR: 4 categories (Primera Llamada/Rellamada × Sin/Con Riesgo de Fuga) - Churn: Binary view (Sin Riesgo de Fuga / En Riesgo de Fuga) - Agent: Talento Para Replicar / Oportunidades de Mejora - Fixed FCR rate calculation (only FIRST_CALL counts as success) Technical: - Streamlit + Plotly for interactive visualizations - Light theme configuration (.streamlit/config.toml) - Fixed Plotly colorbar titlefont deprecation Documentation: - Updated PROJECT_CONTEXT.md, TODO.md, CHANGELOG.md - Added 4 new technical decisions (TD-014 to TD-017) - Created TROUBLESHOOTING.md with 10 common issues Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
203
docs/TROUBLESHOOTING.md
Normal file
203
docs/TROUBLESHOOTING.md
Normal file
@@ -0,0 +1,203 @@
|
||||
# TROUBLESHOOTING.md
|
||||
|
||||
> Guía de problemas comunes y sus soluciones
|
||||
|
||||
---
|
||||
|
||||
## Dashboard Streamlit
|
||||
|
||||
### TS-001: Dashboard muestra fondo negro / tema oscuro
|
||||
|
||||
**Síntomas:**
|
||||
- Texto no visible sobre fondo negro
|
||||
- Elementos UI con colores incorrectos
|
||||
|
||||
**Causa:**
|
||||
Streamlit usa tema oscuro por defecto basado en preferencias del sistema.
|
||||
|
||||
**Solución:**
|
||||
Crear `.streamlit/config.toml`:
|
||||
```toml
|
||||
[theme]
|
||||
base = "light"
|
||||
primaryColor = "#6D84E3"
|
||||
backgroundColor = "#FFFFFF"
|
||||
secondaryBackgroundColor = "#F8F8F8"
|
||||
textColor = "#000000"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### TS-002: Puerto en uso al lanzar Streamlit
|
||||
|
||||
**Síntomas:**
|
||||
```
|
||||
Error: Address already in use
|
||||
Port 8501 is in use by another program
|
||||
```
|
||||
|
||||
**Causa:**
|
||||
Otra instancia de Streamlit o aplicación usando el puerto.
|
||||
|
||||
**Solución:**
|
||||
1. Usar puerto alternativo en `.streamlit/config.toml`:
|
||||
```toml
|
||||
[server]
|
||||
port = 8510
|
||||
```
|
||||
|
||||
2. O especificar en línea de comandos:
|
||||
```bash
|
||||
python -m streamlit run dashboard/app.py --server.port 8510
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### TS-003: Plotly ValueError: Invalid property 'titlefont'
|
||||
|
||||
**Síntomas:**
|
||||
```
|
||||
ValueError: Invalid property specified for object of type plotly.graph_objs.heatmap.ColorBar: 'titlefont'
|
||||
```
|
||||
|
||||
**Causa:**
|
||||
Plotly deprecó `titlefont` en versiones recientes. Ahora debe usarse estructura anidada.
|
||||
|
||||
**Solución:**
|
||||
```python
|
||||
# Antes (deprecated)
|
||||
colorbar=dict(
|
||||
title="Label",
|
||||
titlefont=dict(size=12),
|
||||
)
|
||||
|
||||
# Ahora (correcto)
|
||||
colorbar=dict(
|
||||
title=dict(text="Label", font=dict(size=12)),
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### TS-004: Streamlit 'use_container_width' deprecation warning
|
||||
|
||||
**Síntomas:**
|
||||
```
|
||||
Please replace `use_container_width` with `width`.
|
||||
`use_container_width` will be removed after 2025-12-31.
|
||||
```
|
||||
|
||||
**Causa:**
|
||||
Streamlit cambió la API de `st.dataframe()` y `st.plotly_chart()`.
|
||||
|
||||
**Solución:**
|
||||
```python
|
||||
# Antes
|
||||
st.dataframe(df, use_container_width=True)
|
||||
|
||||
# Después
|
||||
st.dataframe(df, width='stretch')
|
||||
```
|
||||
|
||||
**Nota:** Este warning no rompe funcionalidad actualmente.
|
||||
|
||||
---
|
||||
|
||||
### TS-005: No batch data found
|
||||
|
||||
**Síntomas:**
|
||||
Dashboard muestra "No batch data found" y no carga.
|
||||
|
||||
**Causa:**
|
||||
No hay datos de análisis en `data/output/`.
|
||||
|
||||
**Solución:**
|
||||
1. Ejecutar pipeline primero:
|
||||
```bash
|
||||
python cli.py run my_batch -i data/audio -o data/output
|
||||
```
|
||||
|
||||
2. Verificar que existe `data/output/<batch_id>/summary.json`
|
||||
|
||||
---
|
||||
|
||||
## Pipeline de Análisis
|
||||
|
||||
### TS-006: AssemblyAI transcription falla
|
||||
|
||||
**Síntomas:**
|
||||
```
|
||||
Error: AssemblyAI API error: ...
|
||||
```
|
||||
|
||||
**Soluciones:**
|
||||
1. Verificar `ASSEMBLYAI_API_KEY` en `.env`
|
||||
2. Verificar formato de audio (soporta: mp3, wav, m4a, flac)
|
||||
3. Verificar conectividad a internet
|
||||
|
||||
---
|
||||
|
||||
### TS-007: OpenAI JSON parsing error
|
||||
|
||||
**Síntomas:**
|
||||
```
|
||||
Error: Failed to parse JSON response
|
||||
```
|
||||
|
||||
**Causa:**
|
||||
LLM generó JSON malformado.
|
||||
|
||||
**Solución:**
|
||||
1. El sistema tiene auto-repair built-in
|
||||
2. Si persiste, usar `--model gpt-4o` (más robusto)
|
||||
3. Verificar que transcript no está vacío
|
||||
|
||||
---
|
||||
|
||||
### TS-008: Pipeline resume no funciona
|
||||
|
||||
**Síntomas:**
|
||||
Pipeline reprocesa llamadas ya completadas.
|
||||
|
||||
**Causa:**
|
||||
Manifest corrupto o eliminado.
|
||||
|
||||
**Solución:**
|
||||
1. Verificar `data/output/<batch>/manifests/*.json`
|
||||
2. Si corrupto, usar `--no-resume` para empezar de cero
|
||||
3. No eliminar archivos de manifest manualmente
|
||||
|
||||
---
|
||||
|
||||
## Problemas de Datos
|
||||
|
||||
### TS-009: FCR rate muestra 0% cuando hay llamadas
|
||||
|
||||
**Causa:**
|
||||
El campo `fcr_status` no está siendo llenado por el LLM.
|
||||
|
||||
**Solución:**
|
||||
1. Usar `--no-compression` para dar más contexto al LLM
|
||||
2. Verificar que prompt v2.0 está activo
|
||||
3. Revisar que transcripts tienen suficiente información
|
||||
|
||||
---
|
||||
|
||||
### TS-010: Drivers vacíos en análisis
|
||||
|
||||
**Síntomas:**
|
||||
`poor_cx_drivers: []` en todos los análisis.
|
||||
|
||||
**Causa:**
|
||||
- Transcripts muy cortos
|
||||
- Compresión eliminó información clave
|
||||
- LLM no encontró evidencia
|
||||
|
||||
**Solución:**
|
||||
1. Usar `--no-compression`
|
||||
2. Verificar calidad de transcripts
|
||||
3. Revisar logs para errores de LLM
|
||||
|
||||
---
|
||||
|
||||
**Última actualización**: 2026-01-19
|
||||
Reference in New Issue
Block a user