npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@cragjs/indexing

v0.1.6

Published

Módulo de indexação e busca semântica para CodeRAG - Suporta embeddings locais (Ollama) e bancos vetoriais

Readme

@cragjs/indexing

⚡ ATENÇÃO PRIMEIRA INSTALAÇÃO: Após instalar, execute npx crag-download-model para baixar o modelo de embedding. Ver instruções completas

Módulo de indexação e busca semântica para CRAGCore.

Recursos

  • 🔍 Busca Semântica: Busque código por significado, não por texto exato
  • 🚀 LlamaCpp por Padrão: Roda 100% local, sem servidor externo, super rápido
  • 🤖 Múltiplos Providers: Ollama, OpenAI, OpenRouter, LlamaCpp
  • 📦 Bancos Vetoriais: Memória, JSON, Pinecone e Chroma
  • 🎯 Múltiplas Estratégias: Chunking por AST, sliding window ou fixed-size
  • 🔗 Grafo de Dependências: Análise automática de dependências entre arquivos
  • Alto Desempenho: Batch processing e cache inteligente

Instalação

npm install @cragjs/indexing

# ⚠️ IMPORTANTE: Após instalar, execute:
npx crag-download-model

✨ Padrão: LlamaCpp (Local, Rápido, Sem Servidor Externo)

A biblioteca usa LlamaCppEmbeddingProvider como padrão, que roda completamente local, sem necessidade de servidor externo (Ollama) ou API keys.

🚨 PRIMEIRO USO? Execute npx crag-download-model para baixar o modelo!

📦 Setup Inicial (Primeira Instalação)

O @cragjs/indexing usa LlamaCpp como padrão (100% local, sem servidor externo). Para funcionar, precisa de um modelo GGUF (~500MB).

Opção 1: Download Automático com Token HF (Recomendado)

# 1. Obtenha um token GRATUITO em: https://huggingface.co/settings/tokens
# 2. Configure a variável de ambiente ANTES de instalar:

# Windows (PowerShell):
$env:HF_TOKEN="hf_seu_token_aqui"

# Windows (CMD):
set HF_TOKEN=hf_seu_token_aqui

# Linux/Mac:
export HF_TOKEN=hf_seu_token_aqui

# 3. Instale (o modelo baixa automaticamente no postinstall):
npm install @cragjs/indexing

Opção 2: Download Manual (Se já instalou sem token)

# No SEU projeto (não dentro do node_modules!):
npx crag-download-model

# Ou adicione ao package.json do seu projeto:
{
  "scripts": {
    "setup": "npx crag-download-model"
  }
}

# E execute:
npm run setup

Opção 3: Arquivo .env (Melhor para projetos)

# Crie um .env na raiz do seu projeto:
echo "HF_TOKEN=hf_seu_token_aqui" > .env

# Instale:
npm install @cragjs/indexing

# E baixe:
npx crag-download-model

Opção 4: Usar Alternativas (Sem download de modelo)

Se não quiser baixar modelo, use Ollama ou OpenAI explicitamente:

// Ollama (servidor local, gratuito)
const rag = new CRAGCore({
  embedding: { type: 'ollama', model: 'embeddinggemma' },
  // ...
});

// OpenAI (API paga)
const rag = new CRAGCore({
  embedding: { type: 'openai', apiKey: process.env.OPENAI_API_KEY },
  // ...
});

📋 Variáveis de Ambiente

Veja o arquivo ENV_SETUP.md incluído no pacote para documentação completa:

cat node_modules/@cragjs/indexing/ENV_SETUP.md

| Variável | Necessário Para | Onde Obter | |----------|----------------|------------| | HF_TOKEN | Download de modelos LlamaCpp | HuggingFace Tokens (gratuito) | | OPENAI_API_KEY | Usar OpenAI embeddings | OpenAI API Keys | | OPENROUTER_API_KEY | Usar OpenRouter | OpenRouter | | OLLAMA_BASE_URL | Personalizar URL do Ollama | Opcional (padrão: http://localhost:11434) |

💡 Dica: Adicione um script ao seu package.json para facilitar o setup:

{
  "scripts": {
    "setup-embeddings": "npx crag-download-model"
  }
}

Uso Básico

API Simplificada (Recomendado)

A forma mais simples de usar o CRAGCore é através da classe CRAGCore, que aceita todas as configurações em um único objeto:

import { CRAGCore } from '@cragjs/indexing';

// Criar instância com todas as configurações
const rag = new CRAGCore({
  projectPath: '/path/to/your/project',
  projectId: 'my-project',
  
  // Configuração do provider de embeddings
  embedding: {
    type: 'ollama',
    model: 'embeddinggemma',
    baseURL: 'http://localhost:11434',
    timeout: 60000,
  },
  
  // Configuração do banco vetorial
  vectorDatabase: {
    type: 'json',
    storagePath: '.crag_cache',
    persist: true,
  },
  
  // Configurações opcionais de indexação
  indexing: {
    excludeDirectories: ['node_modules', '.git', 'dist'],
    buildDependencyGraph: true,
    chunkingStrategy: 'ast',
  },
  
  // Configurações de armazenamento
  storage: {
    path: '.crag_cache',
    persist: true,
  },
});

// Indexar o repositório
const repository = await rag.index();

// Buscar no código
const results = await rag.query({
  text: 'como fazer autenticação de usuário?',
  topK: 5,
  minSimilarity: 0.3,
});

// Exibir resultados
results.forEach(result => {
  console.log(`${result.filePath}:${result.metadata.startLine}`);
  console.log(`Similaridade: ${(result.similarity * 100).toFixed(1)}%`);
  console.log(result.content);
});

API Avançada

Para mais controle, você pode usar as classes individuais:

import { RepositoryIndexer, OllamaEmbeddingProvider, MemoryVectorDatabase } from '@cragjs/indexing';

// Configurar embedding provider (Ollama local)
const embeddingProvider = new OllamaEmbeddingProvider({
  baseURL: 'http://localhost:11434',
  model: 'embeddinggemma',
  timeout: 60000,
});

// Configurar banco vetorial
const vectorDatabase = new MemoryVectorDatabase();

// Criar indexador
const indexer = new RepositoryIndexer({
  projectPath: '/path/to/your/project',
  projectId: 'my-project',
  embeddingProvider,
  vectorDatabase,
  storagePath: '.crag_cache',
});

// Indexar o repositório
const repository = await indexer.index({
  buildDependencyGraph: true,
  persist: true,
  excludeDirectories: ['node_modules', '.git', 'dist'],
});

// Buscar no código
const results = await indexer.query({
  text: 'como fazer autenticação de usuário?',
  topK: 5,
  minSimilarity: 0.3
});

Configuração de Providers

Providers de Embedding

Com a API simplificada, você configura o embedding diretamente no objeto de configuração:

// Ollama (Local, Recomendado)
const rag = new CRAGCore({
  // ...
  embedding: {
    type: 'ollama',
    model: 'embeddinggemma',
    baseURL: 'http://localhost:11434',
    timeout: 60000,
  },
  // ...
});

// Llama.cpp (Mais rápido, sem servidor externo)
// Requer download de modelo GGUF (ex: nomic-embed-text)
const rag = new CRAGCore({
  // ...
  embedding: {
    type: 'llama-cpp',
    modelPath: './models/nomic-embed-text-v1.5.Q4_K_M.gguf', // Caminho para o modelo GGUF
    dimensions: 768, // Opcional, será auto-detectado
  },
  // ...
});

// ⚠️ Ollama Cloud - NÃO RECOMENDADO (não suporta embeddings)
// O Ollama Cloud atualmente NÃO suporta o endpoint /api/embeddings.
// Use Ollama local ou outro provider.
//
// const rag = new CRAGCore({
//   // ...
//   embedding: {
//     type: 'ollama-cloud', // ❌ Não funciona - endpoint não existe
//     model: 'nomic-embed-text',
//     apiKey: process.env.OLLAMA_API_KEY,
//   },
//   // ...
// });

// OpenAI
const rag = new CRAGCore({
  // ...
  embedding: {
    type: 'openai',
    apiKey: process.env.OPENAI_API_KEY!,
    model: 'text-embedding-ada-002',
  },
  // ...
});

// OpenRouter
const rag = new CRAGCore({
  // ...
  embedding: {
    type: 'openrouter',
    apiKey: process.env.OPENROUTER_API_KEY!,
    model: 'text-embedding-3-small',
    baseURL: 'https://openrouter.ai/api/v1',
  },
  // ...
});

Setup Automatizado do Ollama Cloud

O pacote oferece funções para configurar automaticamente a API key do Ollama Cloud:

import { 
  setupOllamaCloudInteractive, 
  setupOllamaCloudAuto,
  validateOllamaCloudApiKey 
} from '@cragjs/indexing';

// Setup interativo (pergunta pela API key e salva no .env)
await setupOllamaCloudInteractive();

// Setup automático (tenta carregar do .env ou variável de ambiente)
const apiKey = await setupOllamaCloudAuto();
if (!apiKey) {
  // Se não encontrou, fazer setup interativo
  await setupOllamaCloudInteractive();
}

// Validar se a API key está funcionando
const isValid = await validateOllamaCloudApiKey();
if (!isValid) {
  console.error('API key inválida ou não configurada');
}

Obter API Key:

  1. Acesse https://ollama.com/settings/keys
  2. Crie uma nova API key
  3. Use setupOllamaCloudInteractive() ou defina OLLAMA_API_KEY no .env

Llama.cpp - Modelos Recomendados

O modelo de embedding é baixado automaticamente quando você executa npm install!

Modelo padrão:

  • nomic-embed-text-v1.5 (768 dimensões) - Baixado automaticamente para ./models/

Download manual (se necessário):

# O modelo é baixado automaticamente no npm install
# Mas você pode baixar manualmente se precisar:
npm run download-model

# Ou usando huggingface-cli:
huggingface-cli download nomic-ai/nomic-embed-text-v1.5 \
  --local-dir models \
  --include "*.gguf"

Outros modelos recomendados:

  • mxbai-embed-large-v1 (1024 dimensões) - Download
  • all-minilm-l6-v2 (384 dimensões) - Download

Uso Avançado com Classes Individuais

import { 
  OllamaEmbeddingProvider, 
  OllamaCloudEmbeddingProvider,
  LlamaCppEmbeddingProvider,
  OpenAIEmbeddingProvider 
} from '@cragjs/indexing';

// Ollama Local
const ollamaProvider = new OllamaEmbeddingProvider({
  baseURL: 'http://localhost:11434',
  model: 'embeddinggemma',
  timeout: 60000,
});

// Llama.cpp (Mais rápido)
const llamaProvider = new LlamaCppEmbeddingProvider({
  modelPath: './models/nomic-embed-text-v1.5.Q4_K_M.gguf',
  dimensions: 768,
});

// Ollama Cloud
const ollamaCloudProvider = new OllamaCloudEmbeddingProvider({
  model: 'nomic-embed-text',
  apiKey: process.env.OLLAMA_API_KEY!,
});

// OpenAI
const openaiProvider = new OpenAIEmbeddingProvider({
  apiKey: process.env.OPENAI_API_KEY!,
  model: 'text-embedding-ada-002',
});

Configuração de Bancos Vetoriais

Com a API simplificada, você configura o banco vetorial diretamente no objeto de configuração:

// Memória (Rápido, para desenvolvimento)
const rag = new CRAGCore({
  // ...
  vectorDatabase: {
    type: 'memory',
  },
  // ...
});

// JSON (Persistente, simples)
const rag = new CRAGCore({
  // ...
  vectorDatabase: {
    type: 'json',
    storagePath: '.crag_cache',
    persist: true,
  },
  // ...
});

// Pinecone (Produção, escalável)
const rag = new CRAGCore({
  // ...
  vectorDatabase: {
    type: 'pinecone',
    apiKey: process.env.PINECONE_API_KEY!,
    collectionName: 'code-index',
  },
  // ...
});

// Chroma (Self-hosted)
const rag = new CRAGCore({
  // ...
  vectorDatabase: {
    type: 'chroma',
    host: 'http://localhost',
    port: 8000,
  },
  // ...
});

Uso Avançado com Classes Individuais

import { MemoryVectorDatabase, JSONVectorDatabase, PineconeVectorDatabase } from '@cragjs/indexing';

// Memória
const memoryDb = new MemoryVectorDatabase();

// JSON
const jsonDb = new JSONVectorDatabase({ storagePath: '.crag_cache' });

// Pinecone
const pineconeDb = new PineconeVectorDatabase({
  apiKey: process.env.PINECONE_API_KEY!,
  indexName: 'code-index',
});

Configuração de Estratégias de Chunking

Com a API simplificada, você configura a estratégia de chunking no objeto de configuração:

const rag = new CRAGCore({
  // ...
  indexing: {
    chunkingStrategy: 'ast', // 'ast', 'sliding-window', ou 'semantic'
    maxChunkSize: 100,       // Tamanho máximo do chunk em tokens
    chunkOverlap: 10,        // Sobreposição entre chunks
  },
  // ...
});

Uso Avançado com Classes Individuais

import { ASTChunkingStrategy, SlidingWindowChunkingStrategy, FixedSizeChunkingStrategy } from '@cragjs/indexing';

// Por AST (recomendado para código)
const astChunking = new ASTChunkingStrategy();

// Janela deslizante
const slidingChunking = new SlidingWindowChunkingStrategy({
  chunkSize: 512,
  overlap: 50,
});

// Tamanho fixo
const fixedChunking = new FixedSizeChunkingStrategy({
  chunkSize: 1000,
});

Licença

MIT