@sylix/coworker 2.0.10 → 2.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/commands/slash/config.d.ts.map +1 -1
  2. package/dist/commands/slash/config.js +23 -5
  3. package/dist/commands/slash/config.js.map +1 -1
  4. package/dist/commands/slash/todo.js +1 -1
  5. package/dist/commands/slash/todo.js.map +1 -1
  6. package/dist/core/CoWorkerAgent.d.ts.map +1 -1
  7. package/dist/core/CoWorkerAgent.js +6 -3
  8. package/dist/core/CoWorkerAgent.js.map +1 -1
  9. package/dist/permissions/PermissionInterceptor.js +1 -1
  10. package/dist/permissions/PermissionInterceptor.js.map +1 -1
  11. package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
  12. package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
  13. package/dist/skills/defaults/ai-ml/rag.md +276 -0
  14. package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
  15. package/dist/skills/defaults/backend-development/api-design.md +285 -0
  16. package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
  17. package/dist/skills/defaults/backend-development/async-python.md +237 -0
  18. package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
  19. package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
  20. package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
  21. package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
  22. package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
  23. package/dist/skills/defaults/backend-development/database-design.md +305 -0
  24. package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
  25. package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
  26. package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
  27. package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
  28. package/dist/skills/defaults/backend-development/fastapi.md +309 -0
  29. package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
  30. package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
  31. package/dist/skills/defaults/backend-development/microservices.md +284 -0
  32. package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
  33. package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
  34. package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
  35. package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
  36. package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
  37. package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
  38. package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
  39. package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
  40. package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
  41. package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
  42. package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
  43. package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
  44. package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
  45. package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
  46. package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
  47. package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
  48. package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
  49. package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
  50. package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
  51. package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
  52. package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
  53. package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
  54. package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
  55. package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
  56. package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
  57. package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
  58. package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
  59. package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
  60. package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
  61. package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
  62. package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
  63. package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
  64. package/dist/skills/defaults/data-engineering/airflow.md +519 -0
  65. package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
  66. package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
  67. package/dist/skills/defaults/data-engineering/dbt.md +556 -0
  68. package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
  69. package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
  70. package/dist/skills/defaults/data-engineering/spark.md +411 -0
  71. package/dist/skills/defaults/database/postgresql.md +202 -0
  72. package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
  73. package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
  74. package/dist/skills/defaults/devops/changelog-automation.md +580 -0
  75. package/dist/skills/defaults/devops/cicd.md +314 -0
  76. package/dist/skills/defaults/devops/cloud.md +263 -0
  77. package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
  78. package/dist/skills/defaults/devops/cost-optimization.md +295 -0
  79. package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
  80. package/dist/skills/defaults/devops/docker.md +281 -0
  81. package/dist/skills/defaults/devops/git-workflows.md +205 -0
  82. package/dist/skills/defaults/devops/github-actions.md +311 -0
  83. package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
  84. package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
  85. package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
  86. package/dist/skills/defaults/devops/kubernetes.md +339 -0
  87. package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
  88. package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
  89. package/dist/skills/defaults/devops/observability.md +243 -0
  90. package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
  91. package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
  92. package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
  93. package/dist/skills/defaults/devops/secrets-management.md +341 -0
  94. package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
  95. package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
  96. package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
  97. package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
  98. package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
  99. package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
  100. package/dist/skills/defaults/frontend/interaction-design.md +327 -0
  101. package/dist/skills/defaults/frontend/javascript.md +311 -0
  102. package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
  103. package/dist/skills/defaults/frontend/react-native-design.md +440 -0
  104. package/dist/skills/defaults/frontend/react.md +345 -0
  105. package/dist/skills/defaults/frontend/responsive-design.md +472 -0
  106. package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
  107. package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
  108. package/dist/skills/defaults/frontend/typescript.md +334 -0
  109. package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
  110. package/dist/skills/defaults/frontend/web-component-design.md +279 -0
  111. package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
  112. package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
  113. package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
  114. package/dist/skills/defaults/kubernetes/gitops.md +280 -0
  115. package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
  116. package/dist/skills/defaults/kubernetes/helm.md +343 -0
  117. package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
  118. package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
  119. package/dist/skills/defaults/kubernetes/manifests.md +330 -0
  120. package/dist/skills/defaults/kubernetes/security.md +337 -0
  121. package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
  122. package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
  123. package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
  124. package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
  125. package/dist/skills/defaults/llm-application/langchain.md +259 -0
  126. package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
  127. package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
  128. package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
  129. package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
  130. package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
  131. package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
  132. package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
  133. package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
  134. package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
  135. package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
  136. package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
  137. package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
  138. package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
  139. package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
  140. package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
  141. package/dist/skills/defaults/security/auditor.md +168 -0
  142. package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
  143. package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
  144. package/dist/skills/defaults/security/mtls-configuration.md +349 -0
  145. package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
  146. package/dist/skills/defaults/security/sast-configuration.md +182 -0
  147. package/dist/skills/defaults/security/security.md +313 -0
  148. package/dist/skills/defaults/security/stride-analysis.md +273 -0
  149. package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
  150. package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
  151. package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
  152. package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
  153. package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
  154. package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
  155. package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
  156. package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
  157. package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
  158. package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
  159. package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
  160. package/dist/skills/defaults/testing/testing.md +332 -0
  161. package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
  162. package/dist/skills/defaults/workflows/track-management.md +592 -0
  163. package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
  164. package/dist/skills/index.d.ts +11 -0
  165. package/dist/skills/index.d.ts.map +1 -0
  166. package/dist/skills/index.js +129 -0
  167. package/dist/skills/index.js.map +1 -0
  168. package/dist/utils/character.js +6 -9
  169. package/dist/utils/character.js.map +1 -1
  170. package/dist/utils/contextManager.js +3 -7
  171. package/dist/utils/contextManager.js.map +1 -1
  172. package/dist/utils/inputbar.d.ts.map +1 -1
  173. package/dist/utils/inputbar.js +8 -1
  174. package/dist/utils/inputbar.js.map +1 -1
  175. package/dist/utils/output.d.ts.map +1 -1
  176. package/dist/utils/output.js +3 -35
  177. package/dist/utils/output.js.map +1 -1
  178. package/package.json +1 -1
@@ -0,0 +1,666 @@
1
+ ---
2
+ name: langchain-architecture
3
+ 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.
4
+ ---
5
+
6
+ # LangChain & LangGraph Architecture
7
+
8
+ Master modern LangChain 1.x and LangGraph for building sophisticated LLM applications with agents, state management, memory, and tool integration.
9
+
10
+ ## When to Use This Skill
11
+
12
+ - Building autonomous AI agents with tool access
13
+ - Implementing complex multi-step LLM workflows
14
+ - Managing conversation memory and state
15
+ - Integrating LLMs with external data sources and APIs
16
+ - Creating modular, reusable LLM application components
17
+ - Implementing document processing pipelines
18
+ - Building production-grade LLM applications
19
+
20
+ ## Package Structure (LangChain 1.x)
21
+
22
+ ```
23
+ langchain (1.2.x) # High-level orchestration
24
+ langchain-core (1.2.x) # Core abstractions (messages, prompts, tools)
25
+ langchain-community # Third-party integrations
26
+ langgraph # Agent orchestration and state management
27
+ langchain-openai # OpenAI integrations
28
+ langchain-anthropic # Anthropic/Claude integrations
29
+ langchain-voyageai # Voyage AI embeddings
30
+ langchain-pinecone # Pinecone vector store
31
+ ```
32
+
33
+ ## Core Concepts
34
+
35
+ ### 1. LangGraph Agents
36
+
37
+ LangGraph is the standard for building agents in 2026. It provides:
38
+
39
+ **Key Features:**
40
+
41
+ - **StateGraph**: Explicit state management with typed state
42
+ - **Durable Execution**: Agents persist through failures
43
+ - **Human-in-the-Loop**: Inspect and modify state at any point
44
+ - **Memory**: Short-term and long-term memory across sessions
45
+ - **Checkpointing**: Save and resume agent state
46
+
47
+ **Agent Patterns:**
48
+
49
+ - **ReAct**: Reasoning + Acting with `create_react_agent`
50
+ - **Plan-and-Execute**: Separate planning and execution nodes
51
+ - **Multi-Agent**: Supervisor routing between specialized agents
52
+ - **Tool-Calling**: Structured tool invocation with Pydantic schemas
53
+
54
+ ### 2. State Management
55
+
56
+ LangGraph uses TypedDict for explicit state:
57
+
58
+ ```python
59
+ from typing import Annotated, TypedDict
60
+ from langgraph.graph import MessagesState
61
+
62
+ # Simple message-based state
63
+ class AgentState(MessagesState):
64
+ """Extends MessagesState with custom fields."""
65
+ context: Annotated[list, "retrieved documents"]
66
+
67
+ # Custom state for complex agents
68
+ class CustomState(TypedDict):
69
+ messages: Annotated[list, "conversation history"]
70
+ context: Annotated[dict, "retrieved context"]
71
+ current_step: str
72
+ results: list
73
+ ```
74
+
75
+ ### 3. Memory Systems
76
+
77
+ Modern memory implementations:
78
+
79
+ - **ConversationBufferMemory**: Stores all messages (short conversations)
80
+ - **ConversationSummaryMemory**: Summarizes older messages (long conversations)
81
+ - **ConversationTokenBufferMemory**: Token-based windowing
82
+ - **VectorStoreRetrieverMemory**: Semantic similarity retrieval
83
+ - **LangGraph Checkpointers**: Persistent state across sessions
84
+
85
+ ### 4. Document Processing
86
+
87
+ Loading, transforming, and storing documents:
88
+
89
+ **Components:**
90
+
91
+ - **Document Loaders**: Load from various sources
92
+ - **Text Splitters**: Chunk documents intelligently
93
+ - **Vector Stores**: Store and retrieve embeddings
94
+ - **Retrievers**: Fetch relevant documents
95
+
96
+ ### 5. Callbacks & Tracing
97
+
98
+ LangSmith is the standard for observability:
99
+
100
+ - Request/response logging
101
+ - Token usage tracking
102
+ - Latency monitoring
103
+ - Error tracking
104
+ - Trace visualization
105
+
106
+ ## Quick Start
107
+
108
+ ### Modern ReAct Agent with LangGraph
109
+
110
+ ```python
111
+ from langgraph.prebuilt import create_react_agent
112
+ from langgraph.checkpoint.memory import MemorySaver
113
+ from langchain_anthropic import ChatAnthropic
114
+ from langchain_core.tools import tool
115
+ import ast
116
+ import operator
117
+
118
+ # Initialize LLM (Claude Sonnet 4.6 recommended)
119
+ llm = ChatAnthropic(model="claude-sonnet-4-6", temperature=0)
120
+
121
+ # Define tools with Pydantic schemas
122
+ @tool
123
+ def search_database(query: str) -> str:
124
+ """Search internal database for information."""
125
+ # Your database search logic
126
+ return f"Results for: {query}"
127
+
128
+ @tool
129
+ def calculate(expression: str) -> str:
130
+ """Safely evaluate a mathematical expression.
131
+
132
+ Supports: +, -, *, /, **, %, parentheses
133
+ Example: '(2 + 3) * 4' returns '20'
134
+ """
135
+ # Safe math evaluation using ast
136
+ allowed_operators = {
137
+ ast.Add: operator.add,
138
+ ast.Sub: operator.sub,
139
+ ast.Mult: operator.mul,
140
+ ast.Div: operator.truediv,
141
+ ast.Pow: operator.pow,
142
+ ast.Mod: operator.mod,
143
+ ast.USub: operator.neg,
144
+ }
145
+
146
+ def _eval(node):
147
+ if isinstance(node, ast.Constant):
148
+ return node.value
149
+ elif isinstance(node, ast.BinOp):
150
+ left = _eval(node.left)
151
+ right = _eval(node.right)
152
+ return allowed_operators[type(node.op)](left, right)
153
+ elif isinstance(node, ast.UnaryOp):
154
+ operand = _eval(node.operand)
155
+ return allowed_operators[type(node.op)](operand)
156
+ else:
157
+ raise ValueError(f"Unsupported operation: {type(node)}")
158
+
159
+ try:
160
+ tree = ast.parse(expression, mode='eval')
161
+ return str(_eval(tree.body))
162
+ except Exception as e:
163
+ return f"Error: {e}"
164
+
165
+ tools = [search_database, calculate]
166
+
167
+ # Create checkpointer for memory persistence
168
+ checkpointer = MemorySaver()
169
+
170
+ # Create ReAct agent
171
+ agent = create_react_agent(
172
+ llm,
173
+ tools,
174
+ checkpointer=checkpointer
175
+ )
176
+
177
+ # Run agent with thread ID for memory
178
+ config = {"configurable": {"thread_id": "user-123"}}
179
+ result = await agent.ainvoke(
180
+ {"messages": [("user", "Search for Python tutorials and calculate 25 * 4")]},
181
+ config=config
182
+ )
183
+ ```
184
+
185
+ ## Architecture Patterns
186
+
187
+ ### Pattern 1: RAG with LangGraph
188
+
189
+ ```python
190
+ from langgraph.graph import StateGraph, START, END
191
+ from langchain_anthropic import ChatAnthropic
192
+ from langchain_voyageai import VoyageAIEmbeddings
193
+ from langchain_pinecone import PineconeVectorStore
194
+ from langchain_core.documents import Document
195
+ from langchain_core.prompts import ChatPromptTemplate
196
+ from typing import TypedDict, Annotated
197
+
198
+ class RAGState(TypedDict):
199
+ question: str
200
+ context: Annotated[list[Document], "retrieved documents"]
201
+ answer: str
202
+
203
+ # Initialize components
204
+ llm = ChatAnthropic(model="claude-sonnet-4-6")
205
+ embeddings = VoyageAIEmbeddings(model="voyage-3-large")
206
+ vectorstore = PineconeVectorStore(index_name="docs", embedding=embeddings)
207
+ retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
208
+
209
+ # Define nodes
210
+ async def retrieve(state: RAGState) -> RAGState:
211
+ """Retrieve relevant documents."""
212
+ docs = await retriever.ainvoke(state["question"])
213
+ return {"context": docs}
214
+
215
+ async def generate(state: RAGState) -> RAGState:
216
+ """Generate answer from context."""
217
+ prompt = ChatPromptTemplate.from_template(
218
+ """Answer based on the context below. If you cannot answer, say so.
219
+
220
+ Context: {context}
221
+
222
+ Question: {question}
223
+
224
+ Answer:"""
225
+ )
226
+ context_text = "\n\n".join(doc.page_content for doc in state["context"])
227
+ response = await llm.ainvoke(
228
+ prompt.format(context=context_text, question=state["question"])
229
+ )
230
+ return {"answer": response.content}
231
+
232
+ # Build graph
233
+ builder = StateGraph(RAGState)
234
+ builder.add_node("retrieve", retrieve)
235
+ builder.add_node("generate", generate)
236
+ builder.add_edge(START, "retrieve")
237
+ builder.add_edge("retrieve", "generate")
238
+ builder.add_edge("generate", END)
239
+
240
+ rag_chain = builder.compile()
241
+
242
+ # Use the chain
243
+ result = await rag_chain.ainvoke({"question": "What is the main topic?"})
244
+ ```
245
+
246
+ ### Pattern 2: Custom Agent with Structured Tools
247
+
248
+ ```python
249
+ from langchain_core.tools import StructuredTool
250
+ from pydantic import BaseModel, Field
251
+
252
+ class SearchInput(BaseModel):
253
+ """Input for database search."""
254
+ query: str = Field(description="Search query")
255
+ filters: dict = Field(default={}, description="Optional filters")
256
+
257
+ class EmailInput(BaseModel):
258
+ """Input for sending email."""
259
+ recipient: str = Field(description="Email recipient")
260
+ subject: str = Field(description="Email subject")
261
+ content: str = Field(description="Email body")
262
+
263
+ async def search_database(query: str, filters: dict = {}) -> str:
264
+ """Search internal database for information."""
265
+ # Your database search logic
266
+ return f"Results for '{query}' with filters {filters}"
267
+
268
+ async def send_email(recipient: str, subject: str, content: str) -> str:
269
+ """Send an email to specified recipient."""
270
+ # Email sending logic
271
+ return f"Email sent to {recipient}"
272
+
273
+ tools = [
274
+ StructuredTool.from_function(
275
+ coroutine=search_database,
276
+ name="search_database",
277
+ description="Search internal database",
278
+ args_schema=SearchInput
279
+ ),
280
+ StructuredTool.from_function(
281
+ coroutine=send_email,
282
+ name="send_email",
283
+ description="Send an email",
284
+ args_schema=EmailInput
285
+ )
286
+ ]
287
+
288
+ agent = create_react_agent(llm, tools)
289
+ ```
290
+
291
+ ### Pattern 3: Multi-Step Workflow with StateGraph
292
+
293
+ ```python
294
+ from langgraph.graph import StateGraph, START, END
295
+ from typing import TypedDict, Literal
296
+
297
+ class WorkflowState(TypedDict):
298
+ text: str
299
+ entities: list
300
+ analysis: str
301
+ summary: str
302
+ current_step: str
303
+
304
+ async def extract_entities(state: WorkflowState) -> WorkflowState:
305
+ """Extract key entities from text."""
306
+ prompt = f"Extract key entities from: {state['text']}\n\nReturn as JSON list."
307
+ response = await llm.ainvoke(prompt)
308
+ return {"entities": response.content, "current_step": "analyze"}
309
+
310
+ async def analyze_entities(state: WorkflowState) -> WorkflowState:
311
+ """Analyze extracted entities."""
312
+ prompt = f"Analyze these entities: {state['entities']}\n\nProvide insights."
313
+ response = await llm.ainvoke(prompt)
314
+ return {"analysis": response.content, "current_step": "summarize"}
315
+
316
+ async def generate_summary(state: WorkflowState) -> WorkflowState:
317
+ """Generate final summary."""
318
+ prompt = f"""Summarize:
319
+ Entities: {state['entities']}
320
+ Analysis: {state['analysis']}
321
+
322
+ Provide a concise summary."""
323
+ response = await llm.ainvoke(prompt)
324
+ return {"summary": response.content, "current_step": "complete"}
325
+
326
+ def route_step(state: WorkflowState) -> Literal["analyze", "summarize", "end"]:
327
+ """Route to next step based on current state."""
328
+ step = state.get("current_step", "extract")
329
+ if step == "analyze":
330
+ return "analyze"
331
+ elif step == "summarize":
332
+ return "summarize"
333
+ return "end"
334
+
335
+ # Build workflow
336
+ builder = StateGraph(WorkflowState)
337
+ builder.add_node("extract", extract_entities)
338
+ builder.add_node("analyze", analyze_entities)
339
+ builder.add_node("summarize", generate_summary)
340
+
341
+ builder.add_edge(START, "extract")
342
+ builder.add_conditional_edges("extract", route_step, {
343
+ "analyze": "analyze",
344
+ "summarize": "summarize",
345
+ "end": END
346
+ })
347
+ builder.add_conditional_edges("analyze", route_step, {
348
+ "summarize": "summarize",
349
+ "end": END
350
+ })
351
+ builder.add_edge("summarize", END)
352
+
353
+ workflow = builder.compile()
354
+ ```
355
+
356
+ ### Pattern 4: Multi-Agent Orchestration
357
+
358
+ ```python
359
+ from langgraph.graph import StateGraph, START, END
360
+ from langgraph.prebuilt import create_react_agent
361
+ from langchain_core.messages import HumanMessage
362
+ from typing import Literal
363
+
364
+ class MultiAgentState(TypedDict):
365
+ messages: list
366
+ next_agent: str
367
+
368
+ # Create specialized agents
369
+ researcher = create_react_agent(llm, research_tools)
370
+ writer = create_react_agent(llm, writing_tools)
371
+ reviewer = create_react_agent(llm, review_tools)
372
+
373
+ async def supervisor(state: MultiAgentState) -> MultiAgentState:
374
+ """Route to appropriate agent based on task."""
375
+ prompt = f"""Based on the conversation, which agent should handle this?
376
+
377
+ Options:
378
+ - researcher: For finding information
379
+ - writer: For creating content
380
+ - reviewer: For reviewing and editing
381
+ - FINISH: Task is complete
382
+
383
+ Messages: {state['messages']}
384
+
385
+ Respond with just the agent name."""
386
+
387
+ response = await llm.ainvoke(prompt)
388
+ return {"next_agent": response.content.strip().lower()}
389
+
390
+ def route_to_agent(state: MultiAgentState) -> Literal["researcher", "writer", "reviewer", "end"]:
391
+ """Route based on supervisor decision."""
392
+ next_agent = state.get("next_agent", "").lower()
393
+ if next_agent == "finish":
394
+ return "end"
395
+ return next_agent if next_agent in ["researcher", "writer", "reviewer"] else "end"
396
+
397
+ # Build multi-agent graph
398
+ builder = StateGraph(MultiAgentState)
399
+ builder.add_node("supervisor", supervisor)
400
+ builder.add_node("researcher", researcher)
401
+ builder.add_node("writer", writer)
402
+ builder.add_node("reviewer", reviewer)
403
+
404
+ builder.add_edge(START, "supervisor")
405
+ builder.add_conditional_edges("supervisor", route_to_agent, {
406
+ "researcher": "researcher",
407
+ "writer": "writer",
408
+ "reviewer": "reviewer",
409
+ "end": END
410
+ })
411
+
412
+ # Each agent returns to supervisor
413
+ for agent in ["researcher", "writer", "reviewer"]:
414
+ builder.add_edge(agent, "supervisor")
415
+
416
+ multi_agent = builder.compile()
417
+ ```
418
+
419
+ ## Memory Management
420
+
421
+ ### Token-Based Memory with LangGraph
422
+
423
+ ```python
424
+ from langgraph.checkpoint.memory import MemorySaver
425
+ from langgraph.prebuilt import create_react_agent
426
+
427
+ # In-memory checkpointer (development)
428
+ checkpointer = MemorySaver()
429
+
430
+ # Create agent with persistent memory
431
+ agent = create_react_agent(llm, tools, checkpointer=checkpointer)
432
+
433
+ # Each thread_id maintains separate conversation
434
+ config = {"configurable": {"thread_id": "session-abc123"}}
435
+
436
+ # Messages persist across invocations with same thread_id
437
+ result1 = await agent.ainvoke({"messages": [("user", "My name is Alice")]}, config)
438
+ result2 = await agent.ainvoke({"messages": [("user", "What's my name?")]}, config)
439
+ # Agent remembers: "Your name is Alice"
440
+ ```
441
+
442
+ ### Production Memory with PostgreSQL
443
+
444
+ ```python
445
+ from langgraph.checkpoint.postgres import PostgresSaver
446
+
447
+ # Production checkpointer
448
+ checkpointer = PostgresSaver.from_conn_string(
449
+ "postgresql://user:pass@localhost/langgraph"
450
+ )
451
+
452
+ agent = create_react_agent(llm, tools, checkpointer=checkpointer)
453
+ ```
454
+
455
+ ### Vector Store Memory for Long-Term Context
456
+
457
+ ```python
458
+ from langchain_community.vectorstores import Chroma
459
+ from langchain_voyageai import VoyageAIEmbeddings
460
+
461
+ embeddings = VoyageAIEmbeddings(model="voyage-3-large")
462
+ memory_store = Chroma(
463
+ collection_name="conversation_memory",
464
+ embedding_function=embeddings,
465
+ persist_directory="./memory_db"
466
+ )
467
+
468
+ async def retrieve_relevant_memory(query: str, k: int = 5) -> list:
469
+ """Retrieve relevant past conversations."""
470
+ docs = await memory_store.asimilarity_search(query, k=k)
471
+ return [doc.page_content for doc in docs]
472
+
473
+ async def store_memory(content: str, metadata: dict = {}):
474
+ """Store conversation in long-term memory."""
475
+ await memory_store.aadd_texts([content], metadatas=[metadata])
476
+ ```
477
+
478
+ ## Callback System & LangSmith
479
+
480
+ ### LangSmith Tracing
481
+
482
+ ```python
483
+ import os
484
+ from langchain_anthropic import ChatAnthropic
485
+
486
+ # Enable LangSmith tracing
487
+ os.environ["LANGCHAIN_TRACING_V2"] = "true"
488
+ os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
489
+ os.environ["LANGCHAIN_PROJECT"] = "my-project"
490
+
491
+ # All LangChain/LangGraph operations are automatically traced
492
+ llm = ChatAnthropic(model="claude-sonnet-4-6")
493
+ ```
494
+
495
+ ### Custom Callback Handler
496
+
497
+ ```python
498
+ from langchain_core.callbacks import BaseCallbackHandler
499
+ from typing import Any, Dict, List
500
+
501
+ class CustomCallbackHandler(BaseCallbackHandler):
502
+ def on_llm_start(
503
+ self, serialized: Dict[str, Any], prompts: List[str], **kwargs
504
+ ) -> None:
505
+ print(f"LLM started with {len(prompts)} prompts")
506
+
507
+ def on_llm_end(self, response, **kwargs) -> None:
508
+ print(f"LLM completed: {len(response.generations)} generations")
509
+
510
+ def on_llm_error(self, error: Exception, **kwargs) -> None:
511
+ print(f"LLM error: {error}")
512
+
513
+ def on_tool_start(
514
+ self, serialized: Dict[str, Any], input_str: str, **kwargs
515
+ ) -> None:
516
+ print(f"Tool started: {serialized.get('name')}")
517
+
518
+ def on_tool_end(self, output: str, **kwargs) -> None:
519
+ print(f"Tool completed: {output[:100]}...")
520
+
521
+ # Use callbacks
522
+ result = await agent.ainvoke(
523
+ {"messages": [("user", "query")]},
524
+ config={"callbacks": [CustomCallbackHandler()]}
525
+ )
526
+ ```
527
+
528
+ ## Streaming Responses
529
+
530
+ ```python
531
+ from langchain_anthropic import ChatAnthropic
532
+
533
+ llm = ChatAnthropic(model="claude-sonnet-4-6", streaming=True)
534
+
535
+ # Stream tokens
536
+ async for chunk in llm.astream("Tell me a story"):
537
+ print(chunk.content, end="", flush=True)
538
+
539
+ # Stream agent events
540
+ async for event in agent.astream_events(
541
+ {"messages": [("user", "Search and summarize")]},
542
+ version="v2"
543
+ ):
544
+ if event["event"] == "on_chat_model_stream":
545
+ print(event["data"]["chunk"].content, end="")
546
+ elif event["event"] == "on_tool_start":
547
+ print(f"\n[Using tool: {event['name']}]")
548
+ ```
549
+
550
+ ## Testing Strategies
551
+
552
+ ```python
553
+ import pytest
554
+ from unittest.mock import AsyncMock, patch
555
+
556
+ @pytest.mark.asyncio
557
+ async def test_agent_tool_selection():
558
+ """Test agent selects correct tool."""
559
+ with patch.object(llm, 'ainvoke') as mock_llm:
560
+ mock_llm.return_value = AsyncMock(content="Using search_database")
561
+
562
+ result = await agent.ainvoke({
563
+ "messages": [("user", "search for documents")]
564
+ })
565
+
566
+ # Verify tool was called
567
+ assert "search_database" in str(result)
568
+
569
+ @pytest.mark.asyncio
570
+ async def test_memory_persistence():
571
+ """Test memory persists across invocations."""
572
+ config = {"configurable": {"thread_id": "test-thread"}}
573
+
574
+ # First message
575
+ await agent.ainvoke(
576
+ {"messages": [("user", "Remember: the code is 12345")]},
577
+ config
578
+ )
579
+
580
+ # Second message should remember
581
+ result = await agent.ainvoke(
582
+ {"messages": [("user", "What was the code?")]},
583
+ config
584
+ )
585
+
586
+ assert "12345" in result["messages"][-1].content
587
+ ```
588
+
589
+ ## Performance Optimization
590
+
591
+ ### 1. Caching with Redis
592
+
593
+ ```python
594
+ from langchain_community.cache import RedisCache
595
+ from langchain_core.globals import set_llm_cache
596
+ import redis
597
+
598
+ redis_client = redis.Redis.from_url("redis://localhost:6379")
599
+ set_llm_cache(RedisCache(redis_client))
600
+ ```
601
+
602
+ ### 2. Async Batch Processing
603
+
604
+ ```python
605
+ import asyncio
606
+ from langchain_core.documents import Document
607
+
608
+ async def process_documents(documents: list[Document]) -> list:
609
+ """Process documents in parallel."""
610
+ tasks = [process_single(doc) for doc in documents]
611
+ return await asyncio.gather(*tasks)
612
+
613
+ async def process_single(doc: Document) -> dict:
614
+ """Process a single document."""
615
+ chunks = text_splitter.split_documents([doc])
616
+ embeddings = await embeddings_model.aembed_documents(
617
+ [c.page_content for c in chunks]
618
+ )
619
+ return {"doc_id": doc.metadata.get("id"), "embeddings": embeddings}
620
+ ```
621
+
622
+ ### 3. Connection Pooling
623
+
624
+ ```python
625
+ from langchain_pinecone import PineconeVectorStore
626
+ from pinecone import Pinecone
627
+
628
+ # Reuse Pinecone client
629
+ pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"])
630
+ index = pc.Index("my-index")
631
+
632
+ # Create vector store with existing index
633
+ vectorstore = PineconeVectorStore(index=index, embedding=embeddings)
634
+ ```
635
+
636
+ ## Resources
637
+
638
+ - [LangChain Documentation](https://python.langchain.com/docs/)
639
+ - [LangGraph Documentation](https://langchain-ai.github.io/langgraph/)
640
+ - [LangSmith Platform](https://smith.langchain.com/)
641
+ - [LangChain GitHub](https://github.com/langchain-ai/langchain)
642
+ - [LangGraph GitHub](https://github.com/langchain-ai/langgraph)
643
+
644
+ ## Common Pitfalls
645
+
646
+ 1. **Using Deprecated APIs**: Use LangGraph for agents, not `initialize_agent`
647
+ 2. **Memory Overflow**: Use checkpointers with TTL for long-running agents
648
+ 3. **Poor Tool Descriptions**: Clear descriptions help LLM select correct tools
649
+ 4. **Context Window Exceeded**: Use summarization or sliding window memory
650
+ 5. **No Error Handling**: Wrap tool functions with try/except
651
+ 6. **Blocking Operations**: Use async methods (`ainvoke`, `astream`)
652
+ 7. **Missing Observability**: Always enable LangSmith tracing in production
653
+
654
+ ## Production Checklist
655
+
656
+ - [ ] Use LangGraph StateGraph for agent orchestration
657
+ - [ ] Implement async patterns throughout (`ainvoke`, `astream`)
658
+ - [ ] Add production checkpointer (PostgreSQL, Redis)
659
+ - [ ] Enable LangSmith tracing
660
+ - [ ] Implement structured tools with Pydantic schemas
661
+ - [ ] Add timeout limits for agent execution
662
+ - [ ] Implement rate limiting
663
+ - [ ] Add comprehensive error handling
664
+ - [ ] Set up health checks
665
+ - [ ] Version control prompts and configurations
666
+ - [ ] Write integration tests for agent workflows