langchain-architecture
wshobson/agents
Design LLM applications with LangChain 1.x and LangGraph for agents, memory, and tool integration.
What is langchain-architecture?
Build sophisticated LLM applications using LangChain 1.x and LangGraph for autonomous agents, state management, memory persistence, and tool integration. Use this skill when implementing AI agents, managing complex multi-step workflows, or creating production-grade LLM applications with external data sources and APIs.
- Build ReAct agents with tool access using LangGraph's StateGraph
- Implement durable agent execution with checkpointing and human-in-the-loop inspection
- Manage conversation memory with ConversationBufferMemory, ConversationSummaryMemory, and VectorStoreRetrieverMemory
- Process and retrieve documents with loaders, text splitters, and vector stores
- Integrate LLMs (Claude, OpenAI) with external APIs and databases via structured tool schemas
- Monitor applications with LangSmith observability for tracing, token usage, and latency
How to install langchain-architecture
npx skills add https://github.com/wshobson/agents --skill langchain-architecture- Node.js and npm installed
- LangChain 1.2.x and LangGraph packages
- LLM API keys (Anthropic Claude or OpenAI)
- Optional: Redis for caching, Pinecone for vector storage, LangSmith for observability
How to use langchain-architecture
- 1.Install LangChain and LangGraph packages via npm
- 2.Define tools as Pydantic-validated functions with @tool decorator
- 3.Create a StateGraph or use create_react_agent for standard ReAct pattern
- 4.Initialize a checkpointer (MemorySaver) for memory persistence across sessions
- 5.Invoke the agent with messages and a thread_id in config for stateful execution
- 6.Monitor execution with LangSmith by setting LANGSMITH_API_KEY environment variable
Use cases
- Building autonomous AI agents that reason and act on user requests with tool access
- Implementing multi-agent systems with supervisor routing between specialized agents
- Creating document processing pipelines that load, chunk, embed, and retrieve information
- Maintaining conversation context across sessions with persistent memory and checkpointing
- Developing plan-and-execute workflows that separate planning from execution nodes
- Backend engineers building production LLM applications
- AI/ML engineers implementing autonomous agent systems
- Full-stack developers integrating LLMs into existing applications
- Data engineers creating document processing and retrieval pipelines
langchain-architecture FAQ
LangChain provides high-level orchestration and integrations; LangGraph specializes in agent orchestration with explicit state management, checkpointing, and human-in-the-loop capabilities. LangGraph is the standard for building agents in 2026.
Use LangGraph's checkpointer (MemorySaver for in-memory, or custom implementations for databases) and invoke the agent with a consistent thread_id in the config. This allows the agent to retrieve and update state across multiple invocations.
Define tools using the @tool decorator with clear docstrings and Pydantic type hints. Tools should return strings or structured data. The agent uses the docstring and parameter types to decide when and how to call each tool.
Use ConversationSummaryMemory for long conversations (summarizes older messages), ConversationTokenBufferMemory for token-based windowing, or VectorStoreRetrieverMemory for semantic similarity retrieval. For multi-turn agent interactions, LangGraph checkpointing is preferred.
Mock the LLM with AsyncMock, verify tool selection and invocation, and test memory persistence by invoking the agent multiple times with the same thread_id and checking that state is retained.
Full instructions (SKILL.md)
Source of truth, from wshobson/agents.
name: langchain-architecture description: Design LLM applications using LangChain 1.x and LangGraph for agents, memory, and tool integration. Use when building LangChain applications, implementing AI agents, or creating complex LLM workflows.
LangChain & LangGraph Architecture
Master modern LangChain 1.x and LangGraph for building sophisticated LLM applications with agents, state management, memory, and tool integration.
When to Use This Skill
- Building autonomous AI agents with tool access
- Implementing complex multi-step LLM workflows
- Managing conversation memory and state
- Integrating LLMs with external data sources and APIs
- Creating modular, reusable LLM application components
- Implementing document processing pipelines
- Building production-grade LLM applications
Package Structure (LangChain 1.x)
langchain (1.2.x) # High-level orchestration
langchain-core (1.2.x) # Core abstractions (messages, prompts, tools)
langchain-community # Third-party integrations
langgraph # Agent orchestration and state management
langchain-openai # OpenAI integrations
langchain-anthropic # Anthropic/Claude integrations
langchain-voyageai # Voyage AI embeddings
langchain-pinecone # Pinecone vector store
Core Concepts
1. LangGraph Agents
LangGraph is the standard for building agents in 2026. It provides:
Key Features:
- StateGraph: Explicit state management with typed state
- Durable Execution: Agents persist through failures
- Human-in-the-Loop: Inspect and modify state at any point
- Memory: Short-term and long-term memory across sessions
- Checkpointing: Save and resume agent state
Agent Patterns:
- ReAct: Reasoning + Acting with
create_react_agent - Plan-and-Execute: Separate planning and execution nodes
- Multi-Agent: Supervisor routing between specialized agents
- Tool-Calling: Structured tool invocation with Pydantic schemas
2. State Management
LangGraph uses TypedDict for explicit state:
from typing import Annotated, TypedDict
from langgraph.graph import MessagesState
# Simple message-based state
class AgentState(MessagesState):
"""Extends MessagesState with custom fields."""
context: Annotated[list, "retrieved documents"]
# Custom state for complex agents
class CustomState(TypedDict):
messages: Annotated[list, "conversation history"]
context: Annotated[dict, "retrieved context"]
current_step: str
results: list
3. Memory Systems
Modern memory implementations:
- ConversationBufferMemory: Stores all messages (short conversations)
- ConversationSummaryMemory: Summarizes older messages (long conversations)
- ConversationTokenBufferMemory: Token-based windowing
- VectorStoreRetrieverMemory: Semantic similarity retrieval
- LangGraph Checkpointers: Persistent state across sessions
4. Document Processing
Loading, transforming, and storing documents:
Components:
- Document Loaders: Load from various sources
- Text Splitters: Chunk documents intelligently
- Vector Stores: Store and retrieve embeddings
- Retrievers: Fetch relevant documents
5. Callbacks & Tracing
LangSmith is the standard for observability:
- Request/response logging
- Token usage tracking
- Latency monitoring
- Error tracking
- Trace visualization
Quick Start
Modern ReAct Agent with LangGraph
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
from langchain_anthropic import ChatAnthropic
from langchain_core.tools import tool
import ast
import operator
# Initialize LLM (Claude Sonnet 5 recommended)
llm = ChatAnthropic(model="claude-sonnet-5")
# Define tools with Pydantic schemas
@tool
def search_database(query: str) -> str:
"""Search internal database for information."""
# Your database search logic
return f"Results for: {query}"
@tool
def calculate(expression: str) -> str:
"""Safely evaluate a mathematical expression.
Supports: +, -, *, /, **, %, parentheses
Example: '(2 + 3) * 4' returns '20'
"""
# Safe math evaluation using ast
allowed_operators = {
ast.Add: operator.add,
ast.Sub: operator.sub,
ast.Mult: operator.mul,
ast.Div: operator.truediv,
ast.Pow: operator.pow,
ast.Mod: operator.mod,
ast.USub: operator.neg,
}
def _eval(node):
if isinstance(node, ast.Constant):
return node.value
elif isinstance(node, ast.BinOp):
left = _eval(node.left)
right = _eval(node.right)
return allowed_operators[type(node.op)](left, right)
elif isinstance(node, ast.UnaryOp):
operand = _eval(node.operand)
return allowed_operators[type(node.op)](operand)
else:
raise ValueError(f"Unsupported operation: {type(node)}")
try:
tree = ast.parse(expression, mode='eval')
return str(_eval(tree.body))
except Exception as e:
return f"Error: {e}"
tools = [search_database, calculate]
# Create checkpointer for memory persistence
checkpointer = MemorySaver()
# Create ReAct agent
agent = create_react_agent(
llm,
tools,
checkpointer=checkpointer
)
# Run agent with thread ID for memory
config = {"configurable": {"thread_id": "user-123"}}
result = await agent.ainvoke(
{"messages": [("user", "Search for Python tutorials and calculate 25 * 4")]},
config=config
)
Detailed patterns and worked examples
Detailed pattern documentation lives in references/details.md. Read that file when the navigation tier above is insufficient.
Testing Strategies
import pytest
from unittest.mock import AsyncMock, patch
@pytest.mark.asyncio
async def test_agent_tool_selection():
"""Test agent selects correct tool."""
with patch.object(llm, 'ainvoke') as mock_llm:
mock_llm.return_value = AsyncMock(content="Using search_database")
result = await agent.ainvoke({
"messages": [("user", "search for documents")]
})
# Verify tool was called
assert "search_database" in str(result)
@pytest.mark.asyncio
async def test_memory_persistence():
"""Test memory persists across invocations."""
config = {"configurable": {"thread_id": "test-thread"}}
# First message
await agent.ainvoke(
{"messages": [("user", "Remember: the code is 12345")]},
config
)
# Second message should remember
result = await agent.ainvoke(
{"messages": [("user", "What was the code?")]},
config
)
assert "12345" in result["messages"][-1].content
Performance Optimization
1. Caching with Redis
from langchain_community.cache import RedisCache
from langchain_core.globals import set_llm_cache
import redis
redis_client = redis.Redis.from_url("redis://localhost:6379")
set_llm_cache(RedisCache(redis_client))
2. Async Batch Processing
import asyncio
from langchain_core.documents import Document
async def process_documents(documents: list[Document]) -> list:
"""Process documents in parallel."""
tasks = [process_single(doc) for doc in documents]
return await asyncio.gather(*tasks)
async def process_single(doc: Document) -> dict:
"""Process a single document."""
chunks = text_splitter.split_documents([doc])
embeddings = await embeddings_model.aembed_documents(
[c.page_content for c in chunks]
)
return {"doc_id": doc.metadata.get("id"), "embeddings": embeddings}
3. Connection Pooling
from langchain_pinecone import PineconeVectorStore
from pinecone import Pinecone
# Reuse Pinecone client
pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"])
index = pc.Index("my-index")
# Create vector store with existing index
vectorstore = PineconeVectorStore(index=index, embedding=embeddings)
Related skills
More from wshobson/agents and the wider catalog.

linkerd-patterns
Lightweight, security-first service mesh patterns for Kubernetes with automatic mTLS and traffic control.

llm-evaluation
Comprehensive evaluation framework for LLM applications using automated metrics, human feedback, and benchmarking.

lora-qlora-recipes
Configure LoRA and QLoRA fine-tuning with current best-practice hyperparameters and module targeting.

market-sizing-analysis
Calculate TAM/SAM/SOM for market opportunities using top-down, bottom-up, and value theory methodologies.

memory-forensics
Acquire and analyze memory dumps using Volatility to detect malware, extract artifacts, and investigate incidents.

memory-safety-patterns
Cross-language RAII, ownership, and smart pointer patterns for memory-safe Rust, C++, and C code.