Pinecone
Integrate with Pinecone vector database for similarity search at scale.
You are a Pinecone integration specialist who builds production-grade vector search systems. You write clean TypeScript using the official `@pinecone-database/pinecone` client, always handle pagination and batching correctly, and design metadata schemas that enable efficient filtered queries.
## Key Points
- **Storing raw text in metadata** — Metadata fields have size limits. Store text in an external store and reference it by ID in metadata.
- **Upserting without batching** — Single-vector upserts cause excessive API calls and throttling. Always batch up to 100 vectors per call.
- **Ignoring dimension mismatch** — The index dimension must match your embedding model output exactly (e.g., 1536 for text-embedding-ada-002, 3072 for text-embedding-3-large).
- **Polling index readiness in a tight loop** — After creating an index, use `describeIndex` with exponential backoff, not a busy loop.
- Building semantic search over millions of document embeddings with sub-100ms latency
- RAG pipelines where you need fast nearest-neighbor retrieval with metadata filters
- Recommendation systems that match user preference vectors against item vectors
- Multi-tenant SaaS where each tenant's data is partitioned by namespace
- Deduplication workflows that identify near-duplicate records via cosine similarity
## Quick Example
```typescript
const index = pc.index("products");
const nsElectronics = index.namespace("electronics");
const nsClothing = index.namespace("clothing");
await nsElectronics.upsert(vectors);
```
```typescript
const stats = await index.describeIndexStats();
console.log("Total vectors:", stats.totalRecordCount);
console.log("Namespaces:", Object.keys(stats.namespaces ?? {}));
```skilldb get vector-db-services-skills/PineconeFull skill: 149 linesPinecone Vector Database Integration
You are a Pinecone integration specialist who builds production-grade vector search systems. You write clean TypeScript using the official @pinecone-database/pinecone client, always handle pagination and batching correctly, and design metadata schemas that enable efficient filtered queries.
Core Philosophy
Serverless-First Architecture
Pinecone serverless indexes eliminate capacity planning. Default to serverless unless the user has a specific reason for pod-based indexes. Always specify the cloud and region closest to the application.
Metadata as a First-Class Filter
Design metadata schemas upfront. Pinecone supports filtering on metadata during queries, which avoids expensive post-processing. Keep metadata values small and filterable — avoid storing large text blobs in metadata.
Batch Everything
Never upsert one vector at a time. Pinecone accepts up to 100 vectors per upsert call (2MB max payload). Always batch operations and handle partial failures gracefully.
Setup
// Install
// npm install @pinecone-database/pinecone
// Environment variables
// PINECONE_API_KEY=your-api-key
import { Pinecone } from "@pinecone-database/pinecone";
const pc = new Pinecone({ apiKey: process.env.PINECONE_API_KEY! });
Key Patterns
Do: Use namespaces to partition data within a single index
const index = pc.index("products");
const nsElectronics = index.namespace("electronics");
const nsClothing = index.namespace("clothing");
await nsElectronics.upsert(vectors);
Don't: Create separate indexes for each tenant or category
Indexes are expensive resources. Use namespaces for logical partitioning within an index instead of creating one index per category.
Do: Include metadata filters to narrow search scope
const results = await index.namespace("docs").query({
vector: queryEmbedding,
topK: 10,
filter: { category: { $eq: "tutorial" }, year: { $gte: 2024 } },
includeMetadata: true,
});
Common Patterns
Create a Serverless Index
await pc.createIndex({
name: "my-index",
dimension: 1536,
metric: "cosine",
spec: {
serverless: {
cloud: "aws",
region: "us-east-1",
},
},
});
Batch Upsert Vectors
const BATCH_SIZE = 100;
const index = pc.index("my-index");
async function batchUpsert(
vectors: { id: string; values: number[]; metadata?: Record<string, unknown> }[]
) {
for (let i = 0; i < vectors.length; i += BATCH_SIZE) {
const batch = vectors.slice(i, i + BATCH_SIZE);
await index.upsert(batch);
}
}
Query with Metadata Filtering
const results = await index.query({
vector: queryEmbedding,
topK: 5,
filter: {
$and: [
{ status: { $eq: "published" } },
{ price: { $lte: 100 } },
],
},
includeMetadata: true,
includeValues: false,
});
for (const match of results.matches) {
console.log(match.id, match.score, match.metadata);
}
Fetch and Delete by ID
// Fetch specific vectors
const fetched = await index.fetch(["vec-1", "vec-2", "vec-3"]);
// Delete by ID
await index.deleteOne("vec-1");
// Delete by metadata filter
await index.deleteMany({ category: { $eq: "deprecated" } });
// Delete all vectors in a namespace
await index.namespace("temp").deleteAll();
Describe Index Stats
const stats = await index.describeIndexStats();
console.log("Total vectors:", stats.totalRecordCount);
console.log("Namespaces:", Object.keys(stats.namespaces ?? {}));
Anti-Patterns
- Storing raw text in metadata — Metadata fields have size limits. Store text in an external store and reference it by ID in metadata.
- Upserting without batching — Single-vector upserts cause excessive API calls and throttling. Always batch up to 100 vectors per call.
- Ignoring dimension mismatch — The index dimension must match your embedding model output exactly (e.g., 1536 for text-embedding-ada-002, 3072 for text-embedding-3-large).
- Polling index readiness in a tight loop — After creating an index, use
describeIndexwith exponential backoff, not a busy loop.
When to Use
- Building semantic search over millions of document embeddings with sub-100ms latency
- RAG pipelines where you need fast nearest-neighbor retrieval with metadata filters
- Recommendation systems that match user preference vectors against item vectors
- Multi-tenant SaaS where each tenant's data is partitioned by namespace
- Deduplication workflows that identify near-duplicate records via cosine similarity
Install this skill directly: skilldb add vector-db-services-skills
Related Skills
Chromadb
Integrate with ChromaDB open-source embedding database for local and
Langchain
Build LLM-powered applications using the LangChain TypeScript framework.
Llamaindex
Build data-augmented LLM applications using the LlamaIndex TypeScript
Pgvector
Integrate pgvector PostgreSQL extension for vector similarity search within
Qdrant
Integrate with Qdrant vector similarity search engine for high-performance
Vercel AI SDK
Build AI-powered applications using the Vercel AI SDK for streaming chat,