skills/langchain-postgres/SKILL.md
LangChain PostgreSQL integration — PGVectorStore (v2, recommended) and PGVector (v1 legacy) for pgvector RAG, PostgresChatMessageHistory for persistent chat, HNSW/IVFFlat index management, hybrid search, async-first engine via PGEngine, and custom metadata columns.
npx skillsauth add enuno/claude-command-and-control langchain-postgresInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert assistance for langchain-postgres: pgvector-backed vector store and PostgreSQL chat history for LangChain. Use v2 API (PGVectorStore + PGEngine) for new projects; v1 (PGVector) is legacy.
Install:
pip install -U langchain-postgres psycopg[binary] psycopg-pool
# Start PostgreSQL with pgvector:
docker run -p 5432:5432 -e POSTGRES_PASSWORD=password pgvector/pgvector:pg16
Reference: references/api.md (500 KB — full API reference).
Activate when:
PGEngine + PGVectorStore.create() or create_sync()PGVector with connection_string directlyengine.init_vectorstore_table() before first useapply_vector_index() with HNSWIndex or IVFFlatIndexHybridSearchConfig with weighted_sum_ranking or reciprocal_rank_fusionColumn / ColumnDict in table initializationPostgresChatMessageHistory with sync or async psycopg connectionsAsyncPGVectorStore or the async methods on PGVectorStoredrop_vector_index(), reindex(), is_valid_index()from langchain_postgres.v2.engine import PGEngine
from langchain_postgres.v2.vectorstores import PGVectorStore
from langchain_openai import OpenAIEmbeddings
# Step 1: create engine (manages async connection pool)
engine = PGEngine.from_connection_string(
url="postgresql+asyncpg://user:password@localhost:5432/mydb"
)
# Step 2: initialize the table (run once)
engine.init_vectorstore_table(
table_name="my_vectors",
vector_size=1536, # must match embedding dimension
# overwrite_existing=False # set True to recreate
)
# Step 3: create the vector store (use factory, NOT constructor)
vector_store = PGVectorStore.create_sync(
engine=engine,
embedding_service=OpenAIEmbeddings(),
table_name="my_vectors",
)
# Add documents
from langchain_core.documents import Document
docs = [Document(page_content="LangChain is a framework.", metadata={"source": "docs"})]
vector_store.add_documents(docs)
# Search
results = vector_store.similarity_search("What is LangChain?", k=3)
# Cleanup
engine.close()
import asyncio
from langchain_postgres.v2.engine import PGEngine
from langchain_postgres.v2.vectorstores import PGVectorStore
from langchain_openai import OpenAIEmbeddings
async def main():
engine = PGEngine.from_connection_string(
url="postgresql+asyncpg://user:password@localhost:5432/mydb"
)
await engine.ainit_vectorstore_table("my_vectors", vector_size=1536)
store = await PGVectorStore.create(
engine=engine,
embedding_service=OpenAIEmbeddings(),
table_name="my_vectors",
)
await store.aadd_documents(docs)
results = await store.asimilarity_search("LangChain", k=3)
await engine.close()
asyncio.run(main())
from langchain_postgres.v2.indexes import HNSWIndex, HNSWQueryOptions, DistanceStrategy
# Apply HNSW index after loading data
vector_store.apply_vector_index(
HNSWIndex(
name="hnsw_idx",
distance_strategy=DistanceStrategy.COSINE,
m=16, # max connections per node (default 16)
ef_construction=64, # build-time search width (default 64)
)
)
# Use optimized query options at search time
results = vector_store.similarity_search(
"my query",
k=5,
query_options=HNSWQueryOptions(ef_search=40),
)
# IVFFlat for larger datasets
from langchain_postgres.v2.indexes import IVFFlatIndex, IVFFlatQueryOptions
vector_store.apply_vector_index(
IVFFlatIndex(name="ivfflat_idx", lists=100)
)
results = vector_store.similarity_search(
"my query", k=5, query_options=IVFFlatQueryOptions(probes=10)
)
from langchain_postgres.v2.hybrid_search_config import (
HybridSearchConfig,
reciprocal_rank_fusion,
weighted_sum_ranking,
)
# Configure hybrid search on the store
vector_store.apply_hybrid_search_index(
HybridSearchConfig(
ranking_function=reciprocal_rank_fusion, # or weighted_sum_ranking
# For weighted_sum_ranking:
# ranking_function=weighted_sum_ranking,
# alpha=0.7, # weight for vector score (0=full-text only, 1=vector only)
)
)
results = vector_store.similarity_search("my query", k=5, search_type="hybrid")
from langchain_postgres.v2.engine import PGEngine, Column
engine.init_vectorstore_table(
table_name="my_vectors",
vector_size=1536,
metadata_columns=[
Column(name="source", data_type="TEXT"),
Column(name="created_at", data_type="TIMESTAMP"),
Column(name="score", data_type="FLOAT"),
],
)
from langchain_postgres import PGVector
from langchain_openai import OpenAIEmbeddings
# Direct constructor (v1 only)
vector_store = PGVector(
embeddings=OpenAIEmbeddings(),
collection_name="my_collection",
connection="postgresql+psycopg://user:password@localhost:5432/mydb",
# distance_strategy=DistanceStrategy.COSINE,
# use_jsonb=True,
)
vector_store.add_documents(docs)
results = vector_store.similarity_search("LangChain", k=3)
import psycopg
from langchain_postgres import PostgresChatMessageHistory
from langchain_core.messages import HumanMessage, AIMessage
# Create table (run once)
conn_info = "postgresql://user:password@localhost:5432/mydb"
sync_conn = psycopg.connect(conn_info)
PostgresChatMessageHistory.create_tables(sync_conn, "chat_history")
# Use in a session
history = PostgresChatMessageHistory(
table_name="chat_history",
session_id="user-session-xyz",
sync_connection=sync_conn,
)
history.add_messages([
HumanMessage(content="Hello!"),
AIMessage(content="Hi! How can I help?"),
])
print(history.messages)
history.clear()
# Async version
async def async_history():
async_conn = await psycopg.AsyncConnection.connect(conn_info)
await PostgresChatMessageHistory.acreate_tables(async_conn, "chat_history")
history = PostgresChatMessageHistory(
table_name="chat_history",
session_id="user-abc",
async_connection=async_conn,
)
await history.aadd_messages([HumanMessage(content="Hi")])
msgs = await history.aget_messages()
| Aspect | v1 PGVector | v2 PGVectorStore |
|--------|--------------|-------------------|
| Construction | Direct constructor | Factory: create() / create_sync() |
| Connection | connection_string param | PGEngine.from_connection_string() |
| Async | Limited | First-class async throughout |
| Indexes | Manual SQL | apply_vector_index(HNSWIndex(...)) |
| Hybrid search | No | Yes (HybridSearchConfig) |
| Custom columns | Limited | Column / ColumnDict |
| Table management | Auto | init_vectorstore_table() required |
| Use for | Legacy/simple | New projects |
PGEngine (v2)| Method | Description |
|--------|-------------|
| PGEngine.from_connection_string(url) | Create engine from connection string |
| PGEngine.from_engine(engine) | Wrap existing SQLAlchemy AsyncEngine |
| engine.init_vectorstore_table(table, vector_size, ...) | Create vector table |
| engine.drop_table(table_name) | Drop a table |
| engine.close() | Close connection pool |
PGVectorStore (v2) key methods| Method | Description |
|--------|-------------|
| PGVectorStore.create_sync(engine, embedding, table_name) | Sync factory |
| PGVectorStore.create(engine, embedding, table_name) | Async factory (awaitable) |
| add_documents(docs) / aadd_documents(docs) | Add documents |
| similarity_search(query, k) / asimilarity_search(...) | Vector search |
| similarity_search_with_score(query, k) | Search with distance scores |
| max_marginal_relevance_search(query, k, fetch_k) | MMR diversity search |
| apply_vector_index(index) | Apply HNSW or IVFFlat index |
| apply_hybrid_search_index(config) | Enable hybrid search |
| drop_vector_index(name) | Remove an index |
| reindex(name) | Rebuild an index |
| is_valid_index(name) | Check index health |
| File | Size | Contents |
|------|------|----------|
| references/api.md | 500 KB | Full API reference (all classes, methods) |
| references/llms.md | 28 KB | Doc index |
| references/llms-full.md | 500 KB | Complete page content |
Requires: PostgreSQL with pgvector extension (pgvector/pgvector:pg16 Docker image).
Source: https://reference.langchain.com/python/langchain-postgres
GitHub: https://github.com/langchain-ai/langchain-postgres
tools
MemPalace local-first AI memory system. Use when setting up persistent memory for Claude Code sessions, mining project files or conversation transcripts, querying past context, configuring MCP tools, managing the knowledge graph, or troubleshooting palace operations.
tools
LangSmith Python SDK — trace, evaluate, and monitor LLM applications. Covers @traceable decorator, trace context manager, Client API, evaluate() / aevaluate(), comparative evaluation, custom evaluators, dataset management, prompt caching, ASGI middleware, and pytest plugin.
development
LangGraph (Python) — build stateful, controllable agent graphs with checkpointing, streaming, persistence, interrupts, fault tolerance, and durable execution. Covers both Graph API (StateGraph) and Functional API (@entrypoint/@task).
development
LangGraph Graph API (Python) — build explicit DAG agent workflows with StateGraph, typed state, nodes, edges, Command routing, Send fan-out, checkpointers, interrupts, and streaming. Use when you need explicit control flow and graph topology.