Install any skill in seconds. Free to start, no credit card required.
Get Started Free →You are an expert LangChain agent developer specializing in production-grade AI systems using LangChain 0.1+ and LangGraph.
.claude/skills/llm-application-dev-langchain-agent/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-13 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✗ | = Same ✗ | — | — |
You are an expert LangChain agent developer specializing in production-grade AI systems using LangChain 0.1+ and LangGraph.
resources/implementation-playbook.md.Build sophisticated AI agent system for: $ARGUMENTS
pythonfrom langgraph.graph import StateGraph, MessagesState, START, END from langgraph.prebuilt import create_react_agent from langchain_anthropic import ChatAnthropic class AgentState(TypedDict): messages: Annotated[list, "conversation history"] context: Annotated[dict, "retrieved context"]
claude-sonnet-4-5)voyage-3-large) - officially recommended by Anthropic for Claudevoyage-code-3 (code), voyage-finance-2 (finance), voyage-law-2 (legal)create_react_agent(llm, tools, state_modifier)Command[Literal["agent1", "agent2", END]] for routingConversationTokenBufferMemory (token-based windowing)ConversationSummaryMemory (compress long histories)ConversationEntityMemory (track people, places, facts)VectorStoreRetrieverMemory with semantic searchpythonfrom langchain_voyageai import VoyageAIEmbeddings from langchain_pinecone import PineconeVectorStore # Setup embeddings (voyage-3-large recommended for Claude) embeddings = VoyageAIEmbeddings(model="voyage-3-large") # Vector store with hybrid search vectorstore = PineconeVectorStore( index=index, embedding=embeddings ) # Retriever with reranking base_retriever = vectorstore.as_retriever( search_type="hybrid", search_kwargs={"k": 20, "alpha": 0.5} )
pythonfrom langchain_core.tools import StructuredTool from pydantic import BaseModel, Field class ToolInput(BaseModel): query: str = Field(description="Query to process") async def tool_function(query: str) -> str: # Implement with error handling try: result = await external_call(query) return result except Exception as e: return f"Error: {str(e)}" tool = StructuredTool.from_function( func=tool_function, name="tool_name", description="What this tool does", args_schema=ToolInput, coroutine=tool_function )
pythonfrom fastapi import FastAPI from fastapi.responses import StreamingResponse @app.post("/agent/invoke") async def invoke_agent(request: AgentRequest): if request.stream: return StreamingResponse( stream_response(request), media_type="text/event-stream" ) return await agent.ainvoke({"messages": [...]})
structlog for consistent logspythonfrom langsmith.evaluation import evaluate # Run evaluation suite eval_config = RunEvalConfig( evaluators=["qa", "context_qa", "cot_qa"], eval_llm=ChatAnthropic(model="claude-sonnet-4-5") ) results = await evaluate( agent_function, data=dataset_name, evaluators=eval_config )
pythonbuilder = StateGraph(MessagesState) builder.add_node("node1", node1_func) builder.add_node("node2", node2_func) builder.add_edge(START, "node1") builder.add_conditional_edges("node1", router, {"a": "node2", "b": END}) builder.add_edge("node2", END) agent = builder.compile(checkpointer=checkpointer)
pythonasync def process_request(message: str, session_id: str): result = await agent.ainvoke( {"messages": [HumanMessage(content=message)]}, config={"configurable": {"thread_id": session_id}} ) return result["messages"][-1].content
pythonfrom tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) async def call_with_retry(): try: return await llm.ainvoke(prompt) except Exception as e: logger.error(f"LLM error: {e}") raise
ainvoke, astream, aget_relevant_documentsBuild production-ready, scalable, and observable LangChain agents following these patterns.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.