# Quick Start: Dynamic Providers

## Installation

```bash
npm install rag-system-pgvector

# Install your preferred provider(s):
npm install @langchain/openai          # OpenAI
npm install @langchain/anthropic       # Anthropic Claude
npm install @langchain/azure-openai    # Azure OpenAI
npm install @langchain/google-genai    # Google AI
npm install @langchain/community       # HuggingFace, Ollama, etc.
```

## Basic Setup (OpenAI)

```javascript
import { RAGSystem } from 'rag-system-pgvector';
import { OpenAIEmbeddings, ChatOpenAI } from '@langchain/openai';

// 1. Create providers
const embeddings = new OpenAIEmbeddings({
  openAIApiKey: process.env.OPENAI_API_KEY,
  modelName: 'text-embedding-ada-002',
});

const llm = new ChatOpenAI({
  openAIApiKey: process.env.OPENAI_API_KEY,
  modelName: 'gpt-4',
  temperature: 0.7,
});

// 2. Initialize RAG
const rag = new RAGSystem({
  database: {
    host: 'localhost',
    port: 5432,
    database: 'rag_db',
    username: 'postgres',
    password: 'your_password'
  },
  embeddings: embeddings,
  llm: llm,
  embeddingDimensions: 1536, // ada-002 dimensions
});

await rag.initialize();

// 3. Add documents (now saves to database!)
await rag.addDocuments(['./docs/file1.pdf', './docs/file2.txt']);

// 4. Query
const result = await rag.query('What is this about?');
console.log(result.answer);
```

## Mix Providers (Cost Optimization)

```javascript
import { OpenAIEmbeddings } from '@langchain/openai';
import { ChatAnthropic } from '@langchain/anthropic';

// Cheap embeddings + powerful LLM
const embeddings = new OpenAIEmbeddings({
  openAIApiKey: process.env.OPENAI_API_KEY,
  modelName: 'text-embedding-ada-002', // $0.0001 per 1K tokens
});

const llm = new ChatAnthropic({
  anthropicApiKey: process.env.ANTHROPIC_API_KEY,
  modelName: 'claude-3-opus-20240229', // More powerful
});

const rag = new RAGSystem({
  database: { /* config */ },
  embeddings,
  llm,
  embeddingDimensions: 1536,
});
```

## Local/Privacy (No API Calls)

```javascript
import { HuggingFaceTransformersEmbeddings } from '@langchain/community/embeddings/hf_transformers';
import { Ollama } from '@langchain/community/llms/ollama';

// 100% local - no API keys needed
const embeddings = new HuggingFaceTransformersEmbeddings({
  modelName: 'sentence-transformers/all-MiniLM-L6-v2',
});

const llm = new Ollama({
  baseUrl: 'http://localhost:11434',
  model: 'llama2',
});

const rag = new RAGSystem({
  database: { /* config */ },
  embeddings,
  llm,
  embeddingDimensions: 384, // all-MiniLM-L6-v2 dimensions
});
```

## Document Processing

```javascript
// From files
await rag.addDocuments(['./doc.pdf']);
await rag.addDocuments(['./doc1.pdf', './doc2.txt']);

// From buffer
const buffer = fs.readFileSync('document.pdf');
await rag.addDocumentFromBuffer(buffer, 'document.pdf', 'pdf', {
  category: 'research'
});

// From URL
await rag.addDocumentFromUrl('https://example.com/doc.pdf', {
  source: 'web'
});
```

## Querying with Filters

```javascript
// Simple query
const result = await rag.query('What is AI?');

// With filters
const result = await rag.query('What is AI?', {
  userId: 'user123',
  limit: 5,
  threshold: 0.7,
  filter: {
    category: 'research',
    department: 'engineering'
  }
});

console.log(result.answer);
console.log(result.sources);
```

## Embedding Dimensions Reference

| Provider | Model | Dimensions |
|----------|-------|------------|
| OpenAI | text-embedding-ada-002 | 1536 |
| OpenAI | text-embedding-3-small | 1536 |
| OpenAI | text-embedding-3-large | 3072 |
| HuggingFace | all-MiniLM-L6-v2 | 384 |
| Google | embedding-001 | 768 |

## Error Handling

```javascript
try {
  await rag.initialize();
  const result = await rag.addDocuments(['./doc.pdf']);
  console.log(`Saved ${result.chunkCount} chunks`);
} catch (error) {
  console.error('Error:', error.message);
}
```

## Complete Example

See `example-dynamic-providers.js` for comprehensive examples of all provider combinations.

## Migration from v2.1.x

See `DYNAMIC-PROVIDERS-MIGRATION.md` for detailed migration instructions.
