diffcontext
Muestra a un asistente de codificación con IA solo el código que importa para un cambio: llamadores, llamados y funciones relacionadas empaquetados en un presupuesto de tokens, con recuperación autoevaluada que imprime RESULTADO NULO cuando no encaja en tu repositorio.
Documentación
DiffContext
Muéstrale a un asistente de codificación con IA solo el código que importa para el cambio que está haciendo.
DiffContext es un compilador de contexto para agentes de codificación con LLM. Dale un repositorio de Python y un cambio — un diff de git, una rama o un solo nombre de función — y devuelve el pequeño conjunto de funciones que el modelo realmente necesita para hacer ese cambio de forma segura: los llamadores que se romperán, las subclases que lo sobrescriben, las pruebas que lo cubren. Lo ajusta al presupuesto de tokens que tengas y le dice al modelo lo que tuvo que omitir.
Está construido para personas que integran LLMs en bases de código reales — bucles de agentes, bots de revisión de PR, comprobaciones de CI — en cualquier lugar donde tengas que decidir qué va en el prompt y el repositorio es demasiado grande para enviarlo completo.
Y se califica a sí mismo: apúntalo a tu repositorio y extrae tu historial de git, ejecuta recuperación contra pares de co-cambio reales e imprime NULL RESULT cuando no encaja — descubrir eso es la característica.
El problema
Pídele a un asistente que cambie una función en un proyecto de 50,000 líneas y tienes tres malas opciones: pegar todo el repositorio (no cabe, y los modelos empeoran en contextos muy grandes), pegar solo esa función (el modelo rompe tres llamadores que nunca vio), o buscar el nombre con grep (grep no puede encontrar la subclase que lo sobrescribe, ni el manejador que lo recibe a través de functools.partial — medimos que la recuperación de grep se estanca sin importar cuánto presupuesto le des).
DiffContext es la cuarta opción. Analiza el repositorio una vez en un grafo de dependencias real, luego para cualquier cambio selecciona las pocas funciones que realmente importan y las empaqueta en el prompt útil más pequeño.
git change ──► changed functions ──► hybrid retrieval ──► token budget ──► LLM-ready context
graph ∪ BM25 ∪ file top-k + tokens
Instalación
pip install diffcontext
Cero dependencias en tiempo de ejecución, Python 3.9+.
Para integración con MCP (Claude Code / Cursor / Windsurf):
pip install "diffcontext[mcp]"
Consulta docs/MCP.md para la configuración del servidor.
Desde el código fuente para desarrollo:
git clone https://github.com/trakshan-mishra/Diffcontext.git
cd Diffcontext && pip install -e .
Inicio rápido
diffcontext index /path/to/project # cold: seconds; warm: ~0.02s
diffcontext compile --ref HEAD~1 --max-tokens 8000
diffcontext verify --from-history 20 --calibrate
Más comandos: USAGE.md. Recetas de producción: docs/USE_CASES.md.
No confíes en nuestros benchmarks — ejecuta los tuyos (2 minutos)
diffcontext verify --from-history 20 --calibrate extrae casos de prueba del historial de git de tu repositorio y califica la recuperación contra ellos — e imprime NULL RESULT en lugar de un número decorativo cuando la herramienta no encaja con tu repositorio. Descubrir eso es la característica.
¿Hace que el modelo sea mejor?
Sí — medido de extremo a extremo, no por proxy. En 128 tareas de Python de ContextBench evaluadas por el conjunto de pruebas de cada repositorio (sin LLM como juez), el contexto aproximadamente cuadruplica pass@1: 5.5% → 25.8%, McNemar exacto p < 0.0001.
Dos matices, ambos en benchmarks/contextbench/RESULTS.md §6: (a) las funciones semilla dadas a cada brazo son oráculo — extraídas del parche dorado — así que esto mide "dada una localización correcta, ¿importa la calidad del contexto?", no la resolución de problemas de extremo a extremo (la localización se entrega a cada brazo gratis); (b) 121 de las 128 tareas efectivas son de django, así que esto es en gran medida un resultado de django.
El compañero honesto: las tres variantes de contexto (predeterminado / gap / depboost) son estadísticamente indistinguibles entre sí, p = 0.36–0.81. La victoria es contexto versus sin contexto — no este selector versus aquel. Resultados completos: benchmarks/contextbench/RESULTS.md.
Lo que esto no es
- No es un generador de código. Selecciona y empaqueta contexto; el modelo escribe el código.
- No es de precisión primero. Lanza una red amplia — la precisión media es inferior a 0.1 en el top-k predeterminado. Usa
--cutoff gapsi pagas por token. - Aún no es multilenguaje. Python está totalmente soportado. TypeScript/JS (ESM) es un prototipo funcional; CommonJS es un modo de fallo medido.
- No es un reemplazo para leer el código. El análisis estático tiene puntos ciegos, detallados abajo y en docs/BENCHMARKS.md.
Calidad de recuperación (medida, no afirmada)
La verdad fundamental se extrae del historial de git — un desarrollador cambió estas funciones juntas en un commit; mostrada una, ¿encuentra la herramienta las otras? Medido en 701 commits reales en 9 repositorios de Python, y re-ejecutado como puerta de CI en cada push para que la calidad no pueda regresar silenciosamente.
Acierto / recuperación por commit de pares de co-cambio reales, recuperación híbrida:
| django | click | flask | httpx | pydantic | black* | requests* | |
|---|---|---|---|---|---|---|---|
| Acierto | 0.894 | 0.889 | 0.863 | 0.935 | 0.758 | 0.897 | 0.953 |
| Recuperación | 0.774 | 0.750 | 0.694 | 0.772 | 0.536 | 0.712 | 0.762 |
* repositorios de validación, nunca usados para ajuste. Tabla completa en los 9 repositorios: benchmarks/README.md.
Cara a cara contra grep con presupuestos de tokens idénticos, grep se estanca en 0.215 de recuperación más allá de 4k tokens mientras DiffContext alcanza 0.576 a 8k (2.7×). El lado honesto: la precisión media es inferior a 0.1 en el top-k predeterminado — la mayoría de los símbolos recuperados son contexto de apoyo, no el conjunto exacto de co-cambio. --cutoff gap corta en la mayor caída de puntuación para ~4× de precisión a ~30% de costo de recuperación (benchmark de co-cambio; 2.2× / ~14% en ContextBench).
Audité mi propio benchmark y tres de mis afirmaciones perdieron
Una pasada de 2026-07 atacó la evaluación en lugar de la herramienta. Tres números publicados no sobrevivieron:
- Calibración — el único número citable (r=0.274, n≈25) se midió en un índice contaminado. Re-medido limpio en n=1,080 la puntuación heredada obtiene r=0.016 (p=0.60): sin relación en absoluto. Corregido encogiéndose hacia "no sé" → r=0.287 (p=0.0001) — una señal de clasificación, no una probabilidad.
- Pesos de mezcla — el [0.5, 0.35, 0.15] enviado falló dejar-uno-fuera-repositorio; cada pliegue eligió una mezcla menos pesada en grafos. Ahora [0.3, 0.5, 0.2].
- Línea base densa — un sustituto de TF-IDF había sobreestimado la recuperación densa (0.664, superando a BM25 5/5). El codificador real MiniLM puntúa 0.597 y supera a BM25 solo 2/5. Dos conclusiones previas corregidas en el registro.
Escrito completo: docs/auditing-my-own-benchmark.md · pasada cruda: benchmarks/RIGOR_REPORT_2026-07.md.
Uso como biblioteca
from diffcontext.pipeline import index_repository, analyze_impact, compile
idx = index_repository("/path/to/repo")
impact = analyze_impact(idx, ["./src/auth.py:validate_jwt"])
ctx = compile(idx, impact, max_tokens=8000, top_k=20)
print(ctx.text) # paste-ready, meta-header discloses what was dropped
API incremental (idx.update([...])), salida estructurada, tokenizador conectable: docs/ARCHITECTURE.md.
Soporte de lenguajes
| Lenguaje | Estado | Calidad de recuperación |
|---|---|---|
| Python | Completo | Evaluado: 701 commits, 5 repositorios + 4 repositorios de validación |
| TypeScript / JS (ESM) | Prototipo | Recuperación media 0–68% dependiendo del estilo de código |
| JavaScript (CommonJS) | No soportado | Medido 0.0% en express — no usar |
Limitaciones conocidas (medidas, no adivinadas)
El análisis estático tiene un techo: hermanos temáticos sin llamada entre ellos, vínculos conceptuales entre subsistemas (todos los métodos puntúan 0/20), y el despacho dinámico son puntos ciegos medidos — detallados en docs/BENCHMARKS.md. En caso de duda: grep -rn "function_name(" --include="*.py" . antes de confiar plenamente en "no se encontraron llamadores".
Más
- docs/ARCHITECTURE.md — pipeline, mapa de módulos, API de agente
- docs/BENCHMARKS.md — todos los números, pass@1 descendente, limitaciones
- docs/MCP.md — servidor MCP para Claude Code / Cursor / Windsurf
- docs/ROADMAP.md — plan priorizado con motivaciones medidas
- diffcontext-service/ — servicio FastAPI + interfaz web
- observability/ — trazado del pipeline de recuperación
- CONTRIBUTING.md — configuración, puertas de CI, desarrollo de adaptadores
Licencia
MIT