"SQL Quit" - Libérate del código SQL críptico y mal documentado.
Convierte millones de líneas de código legacy en conocimiento accesible mediante IA.
SQUIT transforma código SQL legacy en una base de conocimiento inteligente y buscable. Usando embeddings semánticos, búsqueda híbrida y un agente conversacional con memoria, democratiza el acceso al conocimiento enterrado en décadas de desarrollo.
- 🔍 Búsqueda Semántica: Encuentra código por intención, no por texto exacto
- 🤖 Agente Conversacional: Pregunta en lenguaje natural sobre tu codebase
- 💬 Memoria Multi-Turn: Conversaciones contextuales con historial
- ⚡ Context Caching: Latencia reducida 50%
- 📊 Few-Shot Learning: Aprende de queries anteriores automáticamente
- 🏗️ 100% BigQuery: Escalable a millones de objetos SQL
- 🎯 Clasificación Inteligente: Organiza por dominio de negocio y complejidad
- 📈 Analytics Built-in: Métricas de uso en BigQuery
- 🔄 Retry Logic: Backoff exponencial para fallos transientes
- ⏱️ Rate Limiting: Control de tasa para APIs (Gemini, BigQuery)
- 🔌 Circuit Breaker: Protección contra fallos en cascada
- 📊 Métricas: Collector thread-safe para latencia, throughput
- 📝 Logging Estructurado: JSON con contexto para debugging
- 🔧 Connection Pooling: Reutilización de conexiones BigQuery
- ⚙️ Config por Entorno: Configuraciones dev/staging/prod
- 🧪 Testing Framework: Pytest con >70% coverage target
git clone https://github.com/grupodeacero/squit.git
cd squit# 1. Copiar template de configuración
cp .env.template .env
# 2. Obtener y configurar credenciales de Google Cloud
# a) Descargar service account JSON desde Google Cloud Console
# → IAM & Admin → Service Accounts → Create Key → JSON
cp ~/Downloads/tu-proyecto-xxxxx.json .config/credentials.json
# b) Obtener Gemini API Key
# → https://makersuite.google.com/app/apikey
# 3. Editar .env con tus valores
nano .env
# Configuración mínima requerida:
# GOOGLE_CLOUD_PROJECT=tu-proyecto-id
# GOOGLE_APPLICATION_CREDENTIALS=.config/credentials.json # ← Ruta correcta
# GEMINI_API_KEY=tu-gemini-api-key
# GEMINI_CHAT_MODEL=gemini-2.5-flash # ← Modelo recomendado
# 4. Copiar catálogo de aplicaciones (280+ apps)
# Si tienes el catálogo real, copiarlo a:
# cp tu-catalogo.csv data/catalogo.csvpip install -r requirements.txt# Ver configuración actual del sistema
python3 -c "
import sys
from pathlib import Path
sys.path.insert(0, 'app')
from bigquery_vector.config import BigQueryVectorConfig
from agentic_adk.catalog_enricher import CatalogEnricher
import os
print('✅ CONFIGURACIÓN ACTUAL:')
print(f' BigQuery: {BigQueryVectorConfig().PROJECT_ID}')
print(f' Dataset: {BigQueryVectorConfig().DATASET_ID}')
print(f' Catálogo: {len(CatalogEnricher().catalog_df)} apps')
print(f' Credenciales: {os.getenv(\"GOOGLE_APPLICATION_CREDENTIALS\")}')
"Primera vez (construir imagen):
make squit-rebuildSiguientes veces:
make squitVentajas de Docker:
- ✅ Aislamiento total - No contamina tu Python local
- ✅ Dependencias incluidas - Todo pre-instalado (google-adk 1.15.1, etc.)
- ✅ Reproducible - Funciona igual en cualquier máquina
- ✅ Configuración persistente - Tus archivos se preservan (.config/, data/)
- ✅ Limpieza fácil -
docker rmy no queda nada
Comandos útiles:
make squit # Ejecutar CLI interactivo
make squit-rebuild # Reconstruir imagen completa (si cambió código)
make squit-clean # Limpiar todo (imágenes, contenedores, volúmenes)
make help # Ver todos los comandos disponiblespython3 scripts/squit.pyCuándo usar:
- Desarrollo rápido
- Debugging
- Ya tienes Python 3.12+ y dependencias instaladas
💡 Recomendación: Usa Docker (make squit) para producción y uso diario.
███████╗ ██████╗ ██╗ ██╗██╗████████╗
██╔════╝██╔═══██╗██║ ██║██║╚══██╔══╝
███████╗██║ ██║██║ ██║██║ ██║
╚════██║██║▄▄ ██║██║ ██║██║ ██║
███████║╚██████╔╝╚██████╔╝██║ ██║
╚══════╝ ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝
"SQL Quit" - Democratizando Código Legacy
Búsqueda Inteligente | 2.9M Objetos SQL
Powered by Gemini 2.5 Flash + Google ADK
squit[1]> hablame de kayak
"Kayak" es un sistema de gestión de fechas de embarque...
Los principales stored procedures son:
- AgAsignaFechasKayakProc
- KayAsignaFechasKayakProc
...
squit[2]> explicame el primero que mencionaste
✅ Memoria mantiene contexto
AgAsignaFechasKayakProc asigna fechas estimadas...
squit[3]> exit
Arquitectura del Sistema Dockerizado:
┌─────────────────────────────────────────────────────┐
│ make squit │
│ ↓ │
│ docker compose --profile cli run --rm squit-cli │
│ ↓ │
│ ┌───────────────────────────────────────┐ │
│ │ Container: squit-cli │ │
│ │ ─────────────────────────────────────│ │
│ │ Imagen: squit-squit-cli:latest │ │
│ │ Base: python:3.12-slim-bookworm │ │
│ │ ─────────────────────────────────────│ │
│ │ Dependencias instaladas: │ │
│ │ • google-adk: 1.15.1 │ │
│ │ • google-genai: 1.40.0 │ │
│ │ • google-cloud-bigquery: 3.38.0 │ │
│ │ • deprecated: 1.2.18 │ │
│ │ • + 80 librerías más │ │
│ │ ─────────────────────────────────────│ │
│ │ Volúmenes montados (del host): │ │
│ │ .config/ → /workspace/.config/ ✅│ │
│ │ data/ → /workspace/data/ ✅│ │
│ │ .env → /workspace/.env ✅│ │
│ │ app/ → /workspace/app/ 🔒│ │
│ │ scripts/ → /workspace/scripts/ 🔒│ │
│ │ ─────────────────────────────────────│ │
│ │ Comando ejecutado: │ │
│ │ python3 scripts/squit.py │ │
│ └───────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
✅ = Persistente (lectura/escritura)
🔒 = Protegido (solo lectura)
¿Por qué docker compose run en lugar de up?
docker compose up→ Para servicios daemon (background)docker compose run→ Para comandos interactivos (TTY completo)
El CLI necesita interactividad completa (leer input del usuario), por eso usamos run --rm.
Comandos completos documentados: docs/usage/DOCKER.md
---
## ⚙️ Configuración Actual del Sistema
### 🔧 Configuración de Producción
El sistema está configurado y funcionando con:
#### 1. **Google Cloud Platform**
Proyecto: dfor-prj-dev Dataset: deacero_sql_objects Región: us-central1
**Tablas en BigQuery:**
- `sql_objects_code` → ~3.4M objetos SQL (fuente)
- `intelligent_chunks` → ~5-10M chunks procesados
- `chunk_embeddings` → Vectores 768-dim (Gemini)
- `query_history` → Analytics de queries
#### 2. **Catálogo de Aplicaciones**
Ubicación: data/catalogo.csv Apps documentadas: 280 Tamaño: 101 KB
Dominios de negocio incluidos:
- Ventas, Inventario, Finanzas
- Producción, Compras, Logística
- Recursos Humanos
#### 3. **Modelos de IA**
**Agente Principal:**
Modelo: gemini-2.5-flash Temperature: 0.1 (determinista) Max tokens: 8000
**Embeddings:**
Modelo: gemini-embedding-001 Dimensiones: 768 Task type: CODE_RETRIEVAL_QUERY
#### 4. **Credenciales y Seguridad**
✅ Service Account: .config/credentials.json ✅ API Keys: Configuradas en .env ✅ .gitignore: Protección activa
**Permisos de Service Account:**
- BigQuery Data Viewer
- BigQuery Job User
- BigQuery Data Editor
#### 5. **Arquitectura del Sistema**
┌─────────────────┐ │ Usuario CLI │ (scripts/squit.py) └────────┬────────┘ │ v ┌─────────────────┐ │ MasterAgent │ (Gemini 2.5 Flash) │ + Memoria │ (Multi-turn conversacional) └────────┬────────┘ │ ┌────┴────┐ │ │ v v ┌───────┐ ┌──────────────┐ │Search │ │CatalogEnrich │ │Agent │ │(280 apps) │ └───┬───┘ └──────────────┘ │ v ┌─────────────────┐ │ BigQuery Vector │ │ 3.4M objetos │ │ 768-dim embeds │ └─────────────────┘
---
## 📊 El Problema que Resolvemos
### Código Legacy Sin Documentar
Organizaciones con décadas de desarrollo SQL enfrentan:
- 📚 **Millones de líneas** de código sin documentar
- 🔍 **Conocimiento tribal** en cabezas de desarrolladores veteranos
- 🌀 **Lógica de negocio enterrada** en procedures de 10K+ líneas
- ⏰ **Horas perdidas** buscando "dónde está implementado X"
- 🚫 **Barreras de entrada** para nuevos desarrolladores
- 💸 **Riesgo de cambios** por dependencias invisibles
### La Solución: Democratización con IA
**SQUIT** democratiza el acceso al conocimiento legacy mediante:
1. **🏗️ Estructuración Inteligente**: Clasifica y chunka código automáticamente
2. **🔍 Búsqueda Híbrida**: Encuentra código por significado (70% semántico + 30% keywords)
3. **🤖 Comprensión con IA**: Agente que explica qué hace el código y por qué
4. **🎯 Democratización**: Accesible para todos, no solo expertos
---
## 🏗️ Arquitectura del Sistema
┌─────────────────────────────────────────────────────────────┐ │ SQUIT Architecture │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. Extracción SQL │ │ └─> SQL Server → BigQuery (sql_objects_code) │ │ │ │ 2. Pipeline BigQuery │ │ ├─> Chunking Inteligente (30-45min) │ │ ├─> Embeddings Gemini (2-4 horas) │ │ └─> Vector Index IVF (~10min) │ │ │ │ 3. Agente Conversacional (Google ADK) │ │ ├─> Gemini 2.5 Flash │ │ ├─> Context Caching (-50% latencia) │ │ ├─> LangChain Memory (últimos 10 turnos) │ │ └─> QueryLogger BigQuery (few-shots) │ │ │ │ 4. Búsqueda Híbrida │ │ ├─> Vector Search (70%) │ │ └─> Keyword Search (30%) │ │ │ └─────────────────────────────────────────────────────────────┘
---
## 📖 Documentación
### 📚 **[Índice Completo de Documentación](docs/INDEX.md)** ← Empieza aquí
La documentación está organizada por categorías para fácil navegación:
#### 🚀 [Getting Started](docs/01-getting-started/)
- **[QUICKSTART.md](docs/01-getting-started/QUICKSTART.md)** - Guía de inicio en 5 minutos
- **[DOCKER_SETUP.md](docs/01-getting-started/DOCKER_SETUP.md)** - Setup con Docker
#### 🏗️ [Architecture](docs/02-architecture/)
- **[SYSTEM_OVERVIEW.md](docs/02-architecture/SYSTEM_OVERVIEW.md)** - Arquitectura general
- **[BIGQUERY_VECTOR.md](docs/02-architecture/BIGQUERY_VECTOR.md)** - Sistema vectorial
- **[AGENTIC_SYSTEM.md](docs/02-architecture/AGENTIC_SYSTEM.md)** - Sistema agentic
#### 💻 [Usage](docs/03-usage/)
- **[CLI_GUIDE.md](docs/03-usage/CLI_GUIDE.md)** - Guía del CLI interactivo
- **[API_REFERENCE.md](docs/03-usage/API_REFERENCE.md)** - Referencias de APIs
- **[EXAMPLES.md](docs/03-usage/EXAMPLES.md)** - Ejemplos y casos de uso
#### 🔧 [Development](docs/04-development/)
- **[CONTRIBUTING.md](docs/04-development/CONTRIBUTING.md)** - Guía de contribución
- **[TESTING.md](docs/04-development/TESTING.md)** - Testing y coverage
- **[TECHNICAL.md](docs/04-development/TECHNICAL.md)** - Detalles técnicos
- **[CHANGELOG.md](docs/04-development/CHANGELOG.md)** - Historial de cambios
---
## 🛠️ Tecnologías
### Core Stack
- **Python 3.11+**: Lenguaje principal
- **Google BigQuery**: Data warehouse y vector database
- **Gemini 2.5 Flash**: LLM para agente conversacional
- **Gemini Embedding-001**: Embeddings semánticos (768 dims)
- **Google ADK**: Framework de agentes
- **LangChain**: Memoria estructurada
### Opcional
- **Weaviate**: Vector database alternativo (Fase 2)
- **Docker**: Containerización
---
## 📊 Dataset de Ejemplo
El proyecto incluye ejemplos para trabajar con datasets SQL legacy:
- **3.4M objetos SQL** de 275 servidores
- **Décadas de código** sin documentar
- **7 dominios de negocio**: ventas, inventario, finanzas, producción, compras, logística, RRHH
---
## 🎓 Casos de Uso
### 1. "¿Dónde está implementada la lógica de autenticación?"
**Búsqueda tradicional (grep):**
```bash
# ❌ Solo encuentra texto exacto
grep -r "authentication" *.sql
SQUIT:
squit[1]> donde esta la lógica de autenticación de usuarios
✅ Encuentra código relacionado aunque use términos diferentes
✅ Entiende sinónimos (login, validación, permisos)
✅ Muestra contexto y explicacionessquit[1]> explicame AgAsignaFechasKayakProc
Procedimiento: AgAsignaFechasKayakProc
Dominio: Ventas / Logística
Complejidad: Alta (8.5/10)
Resumen: Asigna fechas estimadas de embarque y entrega
para pedidos del sistema Kayak. Maneja simulaciones,
persistencia de fechas y actualización de múltiples tablas.
Depende de: 12 tablas, 3 procedimientos
Usado por: 8 procesos batch, 2 aplicaciones websquit[1]> si modifico la tabla VentasPedidos, qué se rompe
✅ Analiza dependencias
✅ Identifica procedures/views que la usan
✅ Estima impacto por dominio de negocio| Métrica | Valor |
|---|---|
| Objetos soportados | 3.4M+ |
| Latencia de búsqueda | ~2.5s (con cache) |
| Precisión semántica | ~90% |
| Context retention | 91% |
| Throughput embeddings | 300-500/seg |
squit/
├── .config/
│ └── credentials.json # ← Service account de Google Cloud
├── data/
│ └── catalogo.csv # ← Catálogo de 280+ aplicaciones
├── app/
│ ├── agentic_adk/ # Sistema agentico con Google ADK
│ │ ├── agents/ # Agentes especializados
│ │ │ ├── master_agent.py # Orquestador principal
│ │ │ ├── code_search_agent.py
│ │ │ └── explanation_agent.py
│ │ ├── tools/ # Herramientas para agentes
│ │ │ ├── vector_search.py # Búsqueda en BigQuery
│ │ │ └── dependency_search.py
│ │ ├── catalog_enricher.py # Enriquecimiento con catálogo
│ │ └── query_logger.py # Analytics de queries
│ ├── bigquery_vector/ # Pipeline de datos
│ │ ├── chunking_pipeline.py # Chunking inteligente
│ │ ├── vector_search.py # Búsquedas vectoriales
│ │ └── progress_tracker.py # Tracking de progreso
│ └── squit_client/ # Cliente base BigQuery
├── scripts/
│ ├── squit.py # ← CLI principal (EMPEZAR AQUÍ)
│ ├── run_bigquery_pipeline.py # Pipeline de datos
│ └── demo_*.py # Demos y ejemplos
├── docs/ # Documentación completa
│ ├── INDEX.md # Índice maestro
│ ├── setup/ # Guías de instalación
│ ├── usage/ # Guías de uso
│ └── development/ # Docs técnicos
├── .env # ← Configuración (crear desde template)
├── .env.template # Template de configuración
└── requirements.txt # Dependencias Python
| Archivo | Propósito | Ubicación Correcta | En Git |
|---|---|---|---|
.env |
Variables de entorno | Root | ❌ No |
credentials.json |
Service account GCP | .config/ |
❌ No |
catalogo.csv |
Catálogo de apps | data/ |
❌ No |
.env.template |
Template de config | Root | ✅ Sí |
catalog.example.csv |
Ejemplo de catálogo | data/ |
✅ Sí |
- ✅ Credenciales: Nunca se commitean (
.gitignorerobusto) - ✅ Service Accounts: Permisos mínimos necesarios en GCP
- ✅ API Keys: Gestionadas via
.env(no hardcodeadas) - ✅ Data Privacy: Código SQL permanece en tu BigQuery
- ✅ Gemini API: Solo recibe queries del usuario, no todo el código
- ✅ Rutas seguras: Credenciales en
.config/, catálogo endata/
¡Contribuciones son bienvenidas! Por favor lee CONTRIBUTING.md para detalles.
- Fork el repositorio
- Crea una branch (
git checkout -b feature/amazing-feature) - Commit tus cambios (
git commit -m 'Add amazing feature') - Push a la branch (
git push origin feature/amazing-feature) - Abre un Pull Request
- 🐛 Bug fixes: Reporta o arregla bugs
- 📚 Documentación: Mejora docs o traducciones
- ✨ Features: Nuevas funcionalidades
- 🧪 Tests: Aumenta coverage de tests
- 🎨 UI/UX: Mejoras en CLI o interfaces
Este proyecto está bajo licencia MIT. Ver LICENSE para detalles.
- Karim Touma - Creador y maintainer - ktouma@deacero.com
Proyecto desarrollado en Grupo DeAcero para democratizar el acceso al conocimiento enterrado en décadas de código SQL legacy.
- Google Cloud - BigQuery ML y Gemini API
- Google ADK Team - Framework de agentes
- LangChain - Librería de memoria estructurada
- Comunidad Open Source - Inspiración y herramientas
- Email: ktouma@deacero.com
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Pipeline BigQuery de chunks + embeddings
- Búsqueda híbrida (vector + keywords)
- Agente conversacional con Google ADK
- Context Caching (latencia -50%)
- LangChain Memory estructurada
- QueryLogger BigQuery (few-shots)
- Weaviate Semantic Memory
- Entity tracking estructurado
- Few-shots por dominio de negocio
- Summarization de conversaciones largas
- MCP Server (Model Context Protocol) - Integración con Claude Desktop, Cursor, etc.
- Vertex AI Memory Bank integration
- Multi-tenant support
- Web UI (Streamlit/Gradio)
- API REST para integraciones
- Support para más lenguajes (PL/SQL, T-SQL, etc.)
- MCP Tools extensibles para IDEs
- SQL Objects: 3.4M+
- BigQuery Tables: 5+ (chunks, embeddings, history)
- Search Latency: ~2.5s (with cache)
- Embedding Throughput: 300-500 objects/sec
- Context Retention: 91%
Hecho con ❤️ para democratizar el conocimiento legacy
# Script de diagnóstico completo
python3 -c "
import sys, os
from pathlib import Path
sys.path.insert(0, 'app')
print('🔍 DIAGNÓSTICO RÁPIDO DEL SISTEMA\n')
print('='*50)
# 1. Archivos
print('\n📁 Archivos de Configuración:')
files = {
'.env': Path('.env'),
'credentials.json': Path('.config/credentials.json'),
'catalogo.csv': Path('data/catalogo.csv')
}
for name, path in files.items():
status = '✅' if path.exists() else '❌'
print(f' {status} {name}: {path}')
# 2. Variables
print('\n🔐 Variables de Entorno:')
env_vars = ['GOOGLE_CLOUD_PROJECT', 'GOOGLE_APPLICATION_CREDENTIALS', 'GEMINI_API_KEY']
for var in env_vars:
val = os.getenv(var, '')
status = '✅' if val else '❌'
display = val[:20] + '...' if len(val) > 20 else val
print(f' {status} {var}: {display}')
# 3. Sistema
print('\n⚙️ Sistema:')
try:
from bigquery_vector.config import BigQueryVectorConfig
config = BigQueryVectorConfig()
print(f' ✅ BigQuery: {config.PROJECT_ID}')
print(f' ✅ Dataset: {config.DATASET_ID}')
except Exception as e:
print(f' ❌ Error: {e}')
try:
from agentic_adk.catalog_enricher import CatalogEnricher
enricher = CatalogEnricher()
print(f' ✅ Catálogo: {len(enricher.catalog_df)} aplicaciones')
except Exception as e:
print(f' ❌ Catálogo: {e}')
print('\n' + '='*50)
"- Proyecto GCP:
dfor-prj-dev - Dataset:
deacero_sql_objects(~3.4M objetos) - Credenciales:
.config/credentials.json✅ - Catálogo:
data/catalogo.csv(280 apps, 101 KB) ✅ - Modelo IA:
gemini-2.5-flash - Embeddings: 768-dim vectores
- API Key Gemini: Configurar en
.envsi no está
.config/credentials.json ← Service Account (2.3 KB)
data/catalogo.csv ← 280 aplicaciones (101 KB)
.env ← Variables de entorno
Verificación automática:
- Sistema busca catálogo en
data/automáticamente - Credenciales en
.config/(ruta correcta configurada) - Variables de entorno cargadas desde
.env
- Documentación: docs/INDEX.md - Índice maestro
- Configuración: docs/usage/API_CONFIG.md - Guía detallada
- Setup: docs/setup/BIGQUERY_VECTOR_COMPLETE.md
- Agentes: docs/usage/AGENTIC_ADK_GUIDE.md
- Contributing: CONTRIBUTING.md