Una publicación de r/LangChain describió los agentes de producción de LangChain como amnésicos. La solución tiene dos partes: estado de giro cruzado (LangGraph) y enrutamiento de herramientas inequívoco (claramente llamado herramientas MCP). Esto camina a ambos.
Requisitos previos
- LangChain 0.3+
- LangGraph
- Clave API de Scavio + langchain-scavio
- Postgres o SQLite para almacenamiento de puntos de control
Guia paso a paso
Paso 1: Instale LangGraph y la herramienta Scavio
Ambos se envían como paquetes PyPI estándar.
pip install langgraph langchain-scavio langchain-anthropicPaso 2: Definir la forma del estado
Realice un seguimiento del historial de conversaciones + decisiones de llamadas de herramientas.
from typing import TypedDict, List
from langgraph.graph import StateGraph, END
class AgentState(TypedDict):
messages: List
last_tool: str
decisions: List[str]Paso 3: Herramientas con nombre de Wire Scavio
Cada herramienta tiene un nombre semántico claro; las rutas LLM por nombre.
from langchain_scavio import ScavioSearchTool, ScavioRedditTool, ScavioYoutubeTool
tools = [
ScavioSearchTool(name='web_search'),
ScavioRedditTool(name='reddit_search'),
ScavioYoutubeTool(name='youtube_search'),
]Paso 4: Agregar un puntero de control para la memoria de giro cruzado
SQLite para desarrollo, Postgres para producción.
from langgraph.checkpoint.sqlite import SqliteSaver
checkpointer = SqliteSaver.from_conn_string(':memory:') # or 'agent.db'
graph = builder.compile(checkpointer=checkpointer)Paso 5: Invocar con un thread_id para memoria persistente
Cada thread_id es una memoria de conversación independiente.
config = {'configurable': {'thread_id': 'user-42'}}
result = graph.invoke({'messages': [HumanMessage('Find top AI agent threads')]}, config=config)Ejemplo en Python
# The state survives across turns; the agent recalls prior tool calls and decisions.Ejemplo en JavaScript
// LangGraph is Python-first. JS-side, use LangChain.js with manual state in a KV store.Salida esperada
Agent that remembers prior turns and routes correctly because tools have semantic names (web_search, reddit_search, youtube_search) instead of generic 'search_v1'.