La primera vez que ejecutabas octocode index en una máquina nueva, obtenías un error de configuración. Requerido: una API key de Voyage. Bien para equipos que ya tienen una — molesto para todo el que probaba Octocode por primera vez.
0.15.0 lo soluciona. No se necesita API key para obtener un índice útil y rápido. La búsqueda híbrida y el reranking están activados por defecto. Y el grep estructural ahora se recupera automáticamente de los patrones incorrectos que los LLMs suelen generar — en lugar de devolver cero resultados y nada más.
42 commits desde 0.14.1. Esto es lo que importa.
No se Necesita API Key
La configuración por defecto en 0.15.0 funciona completamente sin conexión. Los modelos se descargan a la caché del sistema en el primer uso. Después: sin llamadas de red, sin límites de uso, sin factura mensual.
[embedding]
code_model = "fastembed:jinaai/jina-embeddings-v2-base-code"
text_model = "fastembed:nomic-ai/nomic-embed-text-v1.5"
[search.reranker]
enabled = true
model = "fastembed:jina-reranker-v2-base-multilingual"
[search.hybrid]
enabled = true
default_vector_weight = 0.6
default_keyword_weight = 0.4
La experiencia por defecto ahora es: clonar repositorio, ejecutar octocode index, obtener resultados. Las opciones de API de Voyage, Cohere y Jina siguen ahí — comentadas en la plantilla — si las quieres.
Un aviso: el primer octocode index tras actualizar descargará los nuevos modelos locales, unos pocos cientos de MB en total. Descarga única, luego queda en caché.
Búsqueda Híbrida Activada por Defecto
Octocode antes elegía entre búsqueda vectorial densa y BM25. 0.15.0 las fusiona en cada consulta mediante Weighted Reciprocal Rank Fusion, ejecutándose dentro de LanceDB.
Los vectores densos pierden en búsquedas con muchos identificadores como "find parse_remote". BM25 pierde con intención parafraseada como "función que gestiona la configuración de pull remoto." Fusionarlos significa que ningún enfoque falla — obtienes lo mejor de ambos en cada consulta.
El balance es configurable:
# Proyecto con mucho código — dominan los identificadores
default_vector_weight = 0.3
default_keyword_weight = 0.7
# Proyecto con mucha documentación — domina la intención semántica
default_vector_weight = 0.8
default_keyword_weight = 0.2
Una nota de limpieza: los campos de configuración antiguos como keyword_path_weight, keyword_content_weight y similares han desaparecido. No tenían efecto de todas formas. Las configuraciones antiguas que los incluyan cargarán bien, pero los valores se ignoran. Usa default_vector_weight / default_keyword_weight en su lugar.
El Grep Estructural Ya No Devuelve Resultados en Blanco
El problema que tenía la búsqueda estructural antes: los LLMs generan los tipos de nodo incorrectos con frecuencia. Python usa function_definition, no function_declaration. Rust usa function_item. El LLM elige lo que le parece natural, obtiene cero resultados, y no hay ninguna pista del porqué.
Ahora cuando un patrón no encuentra nada, Octocode prueba automáticamente interpretaciones progresivamente más flexibles — y conoce el tipo correcto por lenguaje. function_declaration en Python se convierte en function_definition. func, fn, function se resuelven correctamente, independientemente de lo que haya escrito el LLM.
Cuando nada funciona después de todo eso, obtienes un error útil en lugar de silencio:
"En Python usa
function_definition, nofunction_declaration"
Otra corrección: los matches grandes — cuerpos enteros de clases, bloques de funciones grandes — antes volcaban todo y agotaban la ventana de contexto. Ahora muestran las primeras líneas y un resumen:
src/foo.rs:42: pub fn handle_request(req: Request) -> Result<Response> {
let user = authenticate(&req)?;
let payload = req.json()?;
if !validate(&payload) {
... (24 more lines)
Los matches cortos pasan sin cambios.
GraphRAG Ahora Rastrea Quién Extiende Qué
GraphRAG ya mapeaba llamadas e importaciones entre archivos. Desde 0.15.0, también mapea relaciones de herencia e interfaces — en C++, Go, Java, JavaScript, TypeScript, PHP, Python, Ruby y Rust.
Cada entrada de función/clase ahora incluye:
extends— superclases, traits/interfaces padre, embedding de structs en Goimplements— implementaciones de interfaces, satisfacciones de traits,impl Trait for Typeen Rust
octocode graphrag get-relationships --node_id src/auth/middleware.rs
Ahora devuelve también aristas de herencia e implementación junto al grafo existente de importaciones y llamadas. Un agente de IA ahora puede responder "¿quién implementa Validator?" o "¿qué clases extienden BaseHandler?" sin escanear archivos manualmente. Los nombres de tipos se normalizan para que la resolución entre archivos funcione incluso con genéricos y tipos con namespace.
Exportar e Importar tu Índice
Mover un proyecto a una máquina nueva antes significaba volver a ejecutar el embedder completo. Con un repositorio grande y modelos locales, eso lleva tiempo.
# En la máquina A
$ octocode export
Exported 142.30 MB
/Users/dk/Work/myproject/octocode-abc123-20260520-203708.tar.zst
# Transfiere el archivo y luego en la máquina B
$ cd /path/to/same/project
$ octocode import octocode-abc123-20260520-203708.tar.zst
El archivo incluye tanto el índice principal como los overlays de ramas. La importación es atómica — sin estado parcial en caso de fallo. La exportación toma el lock del índice, por lo que las operaciones concurrentes esperan en lugar de competir.
Todo lo Demás
- Coherencia del delta de ramas — los overlays de ramas ya no aplican silenciosamente sobre un índice principal desactualizado. Octocode detecta el desajuste y te avisa claramente en lugar de devolver resultados incoherentes.
- Los métodos ahora llevan el nombre de su clase — buscar
Suppression.mark_setoFoo.barahora encuentra el método directamente. Antes solo funcionaba si la descripción mencionaba casualmente el receptor. - Mejor fragmentación de clases grandes — Python, TypeScript, C++ y Ruby ahora indexan métodos individualmente. No más resultados en un único bloque gigante para una clase de 2.000 líneas.
- Límite de multi-consulta aumentado de 5 a 10 — los agentes que antes necesitaban dos peticiones ahora lo hacen en una.
- Archivos de módulos C++20 reconocidos —
.cppm,.ixx,.mxx,.ccm,.cxxm,.cc,.cxx,.c++,.hxxse indexan como código. - Más formatos de texto indexados —
yaml,toml,dockerfile,makefile,ini,conf,env,xml,html,sql,csv,tsv,logy otros ahora se indexan como bloques de texto. - El mantenimiento de la base de datos es automático — cada ejecución de indexación compacta la base de datos automáticamente. La búsqueda se mantiene rápida a medida que el índice crece.
- Binarios estáticos para Alpine y Linux musl — sin más errores de
libonnxruntime.soen contenedores mínimos. - Binario más pequeño, embeddings más rápidos — el perfil de compilación cambió de
opt-level = 3aopt-level = "z". El binario es notablemente más pequeño — y paradójicamente, las ejecuciones de embedding local también son más rápidas. El código más pequeño encaja mejor en la caché de instrucciones de la CPU, lo que importa más para esta carga de trabajo que el inlining agresivo. - Fusión cross-modal para
--mode all— la antigua división fija en tercios entre código/texto/docs se reemplaza con RRF por modalidad. Cada lista de resultados contribuye por rango dentro de su propia lista — mejor mezcla que se adapta a dónde están realmente las coincidencias, sin problemas de incompatibilidad de escala entre modelos de embedding.
Ruta de Actualización
- Haz una copia de seguridad de tu índice existente:
octocode export - Actualiza:
brew upgrade muvon/tap/octocode # o curl -fsSL https://raw.githubusercontent.com/Muvon/octocode/master/install.sh | sh - Decide sobre los modelos: acepta los nuevos valores locales por defecto (no se necesita ningún cambio de configuración), o pega tu configuración anterior de
[embedding]y[search.reranker]para seguir usando Voyage/Cohere/Jina. - Si quieres un reíndice limpio (recomendado — el nuevo fragmentado no se aplicará a archivos ya indexados):
octocode clear && octocode index - Opcional: ajusta
default_vector_weight/default_keyword_weightsegún el tipo de tu proyecto.
Si necesitas ranking vectorial puro para reproducir resultados de 0.14.x exactamente, usa [search.hybrid] enabled = false. La descarga del modelo de reranking en la primera búsqueda puede omitirse con [search.reranker] enabled = false.
Octocode es open source (Apache 2.0) en github.com/Muvon/octocode. Es lo que impulsa la búsqueda de código dentro de Octomind — el servidor MCP es cómo se comunican.



