Skip to main content
Technology & EngineeringVector Db Services148 lines

Pinecone

Integrate with Pinecone vector database for similarity search at scale. Guide index creation, vector upsert/query operations, metadata filtering, and namespace partitioning using the official Pinecone TypeScript client.

Quick Summary30 lines
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: 148 lines
Paste into your CLAUDE.md or agent config

Pinecone 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 describeIndex with 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

Get CLI access →

Related Skills

Qdrant

Integrate with Qdrant vector similarity search engine for high-performance nearest-neighbor retrieval. Guide collection setup, point operations, payload filtering, snapshot management, and advanced indexing via the Qdrant JS client.

Vector Db Services174L

Vercel AI SDK

Build AI-powered applications using the Vercel AI SDK for streaming chat, text completion, and tool calling. Guide useChat/useCompletion hook usage, server-side streaming, structured output, provider configuration, and multi-step tool execution in Next.js and Node.js applications.

Vector Db Services199L

Weaviate

Integrate with Weaviate vector search engine for semantic and hybrid search. Guide collection schema design, vectorizer configuration, hybrid search queries, and generative module usage via the official Weaviate TypeScript client v3.

Vector Db Services164L

Chromadb

Integrate with ChromaDB open-source embedding database for local and persistent vector storage. Guide collection management, document add/query operations, metadata filtering, and embedding function configuration using the ChromaDB TypeScript client.

Vector Db Services178L

Langchain

Build LLM-powered applications using the LangChain TypeScript framework. Guide chain composition, agent creation, tool integration, memory management, retriever configuration, and callback instrumentation using LangChain.js.

Vector Db Services196L

Llamaindex

Build data-augmented LLM applications using the LlamaIndex TypeScript framework. Guide index construction, query engine configuration, retriever customization, chat engine setup, and data connector usage via LlamaIndex.TS.

Vector Db Services169L