langchain 0.4.0.dev0__py3-none-any.whl → 1.0.0a2__py3-none-any.whl

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.

Potentially problematic release.


This version of langchain might be problematic. Click here for more details.

Files changed (1349) hide show
  1. langchain/__init__.py +7 -434
  2. langchain/_internal/_documents.py +35 -0
  3. langchain/_internal/_lazy_import.py +36 -0
  4. langchain/_internal/_prompts.py +165 -0
  5. langchain/_internal/_typing.py +70 -0
  6. langchain/_internal/_utils.py +7 -0
  7. langchain/agents/__init__.py +5 -179
  8. langchain/agents/_internal/__init__.py +1 -0
  9. langchain/agents/_internal/_typing.py +13 -0
  10. langchain/agents/interrupt.py +92 -0
  11. langchain/agents/react_agent.py +1175 -0
  12. langchain/agents/structured_output.py +403 -0
  13. langchain/agents/tool_node.py +1174 -0
  14. langchain/chat_models/__init__.py +2 -75
  15. langchain/chat_models/base.py +138 -208
  16. langchain/{docstore/document.py → documents/__init__.py} +3 -1
  17. langchain/embeddings/__init__.py +2 -218
  18. langchain/embeddings/base.py +6 -13
  19. langchain/embeddings/cache.py +16 -19
  20. langchain/globals.py +4 -166
  21. langchain/storage/__init__.py +0 -35
  22. langchain/storage/encoder_backed.py +9 -19
  23. langchain/tools/__init__.py +8 -201
  24. {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a2.dist-info}/METADATA +20 -26
  25. langchain-1.0.0a2.dist-info/RECORD +33 -0
  26. langchain/_api/__init__.py +0 -28
  27. langchain/_api/deprecation.py +0 -32
  28. langchain/_api/interactive_env.py +0 -5
  29. langchain/_api/module_import.py +0 -153
  30. langchain/_api/path.py +0 -3
  31. langchain/adapters/openai.py +0 -63
  32. langchain/agents/agent.py +0 -1824
  33. langchain/agents/agent_iterator.py +0 -438
  34. langchain/agents/agent_toolkits/__init__.py +0 -167
  35. langchain/agents/agent_toolkits/ainetwork/__init__.py +0 -1
  36. langchain/agents/agent_toolkits/ainetwork/toolkit.py +0 -25
  37. langchain/agents/agent_toolkits/amadeus/toolkit.py +0 -23
  38. langchain/agents/agent_toolkits/azure_cognitive_services.py +0 -29
  39. langchain/agents/agent_toolkits/base.py +0 -3
  40. langchain/agents/agent_toolkits/clickup/__init__.py +0 -0
  41. langchain/agents/agent_toolkits/clickup/toolkit.py +0 -25
  42. langchain/agents/agent_toolkits/conversational_retrieval/__init__.py +0 -0
  43. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +0 -87
  44. langchain/agents/agent_toolkits/conversational_retrieval/tool.py +0 -3
  45. langchain/agents/agent_toolkits/csv/__init__.py +0 -28
  46. langchain/agents/agent_toolkits/file_management/__init__.py +0 -31
  47. langchain/agents/agent_toolkits/file_management/toolkit.py +0 -29
  48. langchain/agents/agent_toolkits/github/__init__.py +0 -1
  49. langchain/agents/agent_toolkits/github/toolkit.py +0 -69
  50. langchain/agents/agent_toolkits/gitlab/__init__.py +0 -1
  51. langchain/agents/agent_toolkits/gitlab/toolkit.py +0 -25
  52. langchain/agents/agent_toolkits/gmail/__init__.py +0 -1
  53. langchain/agents/agent_toolkits/gmail/toolkit.py +0 -23
  54. langchain/agents/agent_toolkits/jira/__init__.py +0 -1
  55. langchain/agents/agent_toolkits/jira/toolkit.py +0 -23
  56. langchain/agents/agent_toolkits/json/__init__.py +0 -1
  57. langchain/agents/agent_toolkits/json/base.py +0 -25
  58. langchain/agents/agent_toolkits/json/prompt.py +0 -24
  59. langchain/agents/agent_toolkits/json/toolkit.py +0 -23
  60. langchain/agents/agent_toolkits/multion/__init__.py +0 -1
  61. langchain/agents/agent_toolkits/multion/toolkit.py +0 -25
  62. langchain/agents/agent_toolkits/nasa/__init__.py +0 -1
  63. langchain/agents/agent_toolkits/nasa/toolkit.py +0 -23
  64. langchain/agents/agent_toolkits/nla/__init__.py +0 -0
  65. langchain/agents/agent_toolkits/nla/tool.py +0 -23
  66. langchain/agents/agent_toolkits/nla/toolkit.py +0 -23
  67. langchain/agents/agent_toolkits/office365/__init__.py +0 -1
  68. langchain/agents/agent_toolkits/office365/toolkit.py +0 -25
  69. langchain/agents/agent_toolkits/openapi/__init__.py +0 -1
  70. langchain/agents/agent_toolkits/openapi/base.py +0 -25
  71. langchain/agents/agent_toolkits/openapi/planner.py +0 -52
  72. langchain/agents/agent_toolkits/openapi/planner_prompt.py +0 -103
  73. langchain/agents/agent_toolkits/openapi/prompt.py +0 -29
  74. langchain/agents/agent_toolkits/openapi/spec.py +0 -30
  75. langchain/agents/agent_toolkits/openapi/toolkit.py +0 -30
  76. langchain/agents/agent_toolkits/pandas/__init__.py +0 -28
  77. langchain/agents/agent_toolkits/playwright/__init__.py +0 -29
  78. langchain/agents/agent_toolkits/playwright/toolkit.py +0 -27
  79. langchain/agents/agent_toolkits/powerbi/__init__.py +0 -1
  80. langchain/agents/agent_toolkits/powerbi/base.py +0 -25
  81. langchain/agents/agent_toolkits/powerbi/chat_base.py +0 -27
  82. langchain/agents/agent_toolkits/powerbi/prompt.py +0 -36
  83. langchain/agents/agent_toolkits/powerbi/toolkit.py +0 -25
  84. langchain/agents/agent_toolkits/python/__init__.py +0 -28
  85. langchain/agents/agent_toolkits/slack/__init__.py +0 -1
  86. langchain/agents/agent_toolkits/slack/toolkit.py +0 -23
  87. langchain/agents/agent_toolkits/spark/__init__.py +0 -28
  88. langchain/agents/agent_toolkits/spark_sql/__init__.py +0 -1
  89. langchain/agents/agent_toolkits/spark_sql/base.py +0 -25
  90. langchain/agents/agent_toolkits/spark_sql/prompt.py +0 -27
  91. langchain/agents/agent_toolkits/spark_sql/toolkit.py +0 -25
  92. langchain/agents/agent_toolkits/sql/__init__.py +0 -1
  93. langchain/agents/agent_toolkits/sql/base.py +0 -23
  94. langchain/agents/agent_toolkits/sql/prompt.py +0 -29
  95. langchain/agents/agent_toolkits/sql/toolkit.py +0 -25
  96. langchain/agents/agent_toolkits/steam/__init__.py +0 -1
  97. langchain/agents/agent_toolkits/steam/toolkit.py +0 -23
  98. langchain/agents/agent_toolkits/vectorstore/__init__.py +0 -1
  99. langchain/agents/agent_toolkits/vectorstore/base.py +0 -219
  100. langchain/agents/agent_toolkits/vectorstore/prompt.py +0 -11
  101. langchain/agents/agent_toolkits/vectorstore/toolkit.py +0 -97
  102. langchain/agents/agent_toolkits/xorbits/__init__.py +0 -28
  103. langchain/agents/agent_toolkits/zapier/__init__.py +0 -1
  104. langchain/agents/agent_toolkits/zapier/toolkit.py +0 -25
  105. langchain/agents/agent_types.py +0 -57
  106. langchain/agents/chat/__init__.py +0 -0
  107. langchain/agents/chat/base.py +0 -180
  108. langchain/agents/chat/output_parser.py +0 -74
  109. langchain/agents/chat/prompt.py +0 -29
  110. langchain/agents/conversational/__init__.py +0 -1
  111. langchain/agents/conversational/base.py +0 -178
  112. langchain/agents/conversational/output_parser.py +0 -51
  113. langchain/agents/conversational/prompt.py +0 -35
  114. langchain/agents/conversational_chat/__init__.py +0 -1
  115. langchain/agents/conversational_chat/base.py +0 -183
  116. langchain/agents/conversational_chat/output_parser.py +0 -57
  117. langchain/agents/conversational_chat/prompt.py +0 -56
  118. langchain/agents/format_scratchpad/__init__.py +0 -25
  119. langchain/agents/format_scratchpad/log.py +0 -25
  120. langchain/agents/format_scratchpad/log_to_messages.py +0 -26
  121. langchain/agents/format_scratchpad/openai_functions.py +0 -80
  122. langchain/agents/format_scratchpad/openai_tools.py +0 -5
  123. langchain/agents/format_scratchpad/tools.py +0 -65
  124. langchain/agents/format_scratchpad/xml.py +0 -52
  125. langchain/agents/initialize.py +0 -105
  126. langchain/agents/json_chat/__init__.py +0 -0
  127. langchain/agents/json_chat/base.py +0 -196
  128. langchain/agents/json_chat/prompt.py +0 -8
  129. langchain/agents/load_tools.py +0 -13
  130. langchain/agents/loading.py +0 -148
  131. langchain/agents/mrkl/__init__.py +0 -1
  132. langchain/agents/mrkl/base.py +0 -218
  133. langchain/agents/mrkl/output_parser.py +0 -103
  134. langchain/agents/mrkl/prompt.py +0 -15
  135. langchain/agents/openai_assistant/__init__.py +0 -3
  136. langchain/agents/openai_assistant/base.py +0 -818
  137. langchain/agents/openai_functions_agent/__init__.py +0 -0
  138. langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +0 -103
  139. langchain/agents/openai_functions_agent/base.py +0 -382
  140. langchain/agents/openai_functions_multi_agent/__init__.py +0 -0
  141. langchain/agents/openai_functions_multi_agent/base.py +0 -337
  142. langchain/agents/openai_tools/__init__.py +0 -0
  143. langchain/agents/openai_tools/base.py +0 -109
  144. langchain/agents/output_parsers/__init__.py +0 -35
  145. langchain/agents/output_parsers/json.py +0 -64
  146. langchain/agents/output_parsers/openai_functions.py +0 -103
  147. langchain/agents/output_parsers/openai_tools.py +0 -77
  148. langchain/agents/output_parsers/react_json_single_input.py +0 -87
  149. langchain/agents/output_parsers/react_single_input.py +0 -102
  150. langchain/agents/output_parsers/self_ask.py +0 -53
  151. langchain/agents/output_parsers/tools.py +0 -121
  152. langchain/agents/output_parsers/xml.py +0 -126
  153. langchain/agents/react/__init__.py +0 -1
  154. langchain/agents/react/agent.py +0 -145
  155. langchain/agents/react/base.py +0 -189
  156. langchain/agents/react/output_parser.py +0 -35
  157. langchain/agents/react/textworld_prompt.py +0 -51
  158. langchain/agents/react/wiki_prompt.py +0 -70
  159. langchain/agents/schema.py +0 -37
  160. langchain/agents/self_ask_with_search/__init__.py +0 -4
  161. langchain/agents/self_ask_with_search/base.py +0 -219
  162. langchain/agents/self_ask_with_search/output_parser.py +0 -4
  163. langchain/agents/self_ask_with_search/prompt.py +0 -43
  164. langchain/agents/structured_chat/__init__.py +0 -0
  165. langchain/agents/structured_chat/base.py +0 -309
  166. langchain/agents/structured_chat/output_parser.py +0 -112
  167. langchain/agents/structured_chat/prompt.py +0 -34
  168. langchain/agents/tool_calling_agent/__init__.py +0 -0
  169. langchain/agents/tool_calling_agent/base.py +0 -111
  170. langchain/agents/tools.py +0 -50
  171. langchain/agents/types.py +0 -27
  172. langchain/agents/utils.py +0 -19
  173. langchain/agents/xml/__init__.py +0 -0
  174. langchain/agents/xml/base.py +0 -237
  175. langchain/agents/xml/prompt.py +0 -21
  176. langchain/base_language.py +0 -7
  177. langchain/cache.py +0 -72
  178. langchain/callbacks/__init__.py +0 -139
  179. langchain/callbacks/aim_callback.py +0 -33
  180. langchain/callbacks/argilla_callback.py +0 -25
  181. langchain/callbacks/arize_callback.py +0 -25
  182. langchain/callbacks/arthur_callback.py +0 -25
  183. langchain/callbacks/base.py +0 -29
  184. langchain/callbacks/clearml_callback.py +0 -25
  185. langchain/callbacks/comet_ml_callback.py +0 -25
  186. langchain/callbacks/confident_callback.py +0 -25
  187. langchain/callbacks/context_callback.py +0 -25
  188. langchain/callbacks/file.py +0 -3
  189. langchain/callbacks/flyte_callback.py +0 -25
  190. langchain/callbacks/human.py +0 -33
  191. langchain/callbacks/infino_callback.py +0 -25
  192. langchain/callbacks/labelstudio_callback.py +0 -33
  193. langchain/callbacks/llmonitor_callback.py +0 -27
  194. langchain/callbacks/manager.py +0 -89
  195. langchain/callbacks/mlflow_callback.py +0 -38
  196. langchain/callbacks/openai_info.py +0 -25
  197. langchain/callbacks/promptlayer_callback.py +0 -27
  198. langchain/callbacks/sagemaker_callback.py +0 -27
  199. langchain/callbacks/stdout.py +0 -3
  200. langchain/callbacks/streaming_aiter.py +0 -86
  201. langchain/callbacks/streaming_aiter_final_only.py +0 -100
  202. langchain/callbacks/streaming_stdout.py +0 -5
  203. langchain/callbacks/streaming_stdout_final_only.py +0 -96
  204. langchain/callbacks/streamlit/__init__.py +0 -86
  205. langchain/callbacks/streamlit/mutable_expander.py +0 -33
  206. langchain/callbacks/streamlit/streamlit_callback_handler.py +0 -49
  207. langchain/callbacks/tracers/__init__.py +0 -38
  208. langchain/callbacks/tracers/base.py +0 -6
  209. langchain/callbacks/tracers/comet.py +0 -30
  210. langchain/callbacks/tracers/evaluation.py +0 -8
  211. langchain/callbacks/tracers/langchain.py +0 -8
  212. langchain/callbacks/tracers/langchain_v1.py +0 -3
  213. langchain/callbacks/tracers/log_stream.py +0 -9
  214. langchain/callbacks/tracers/logging.py +0 -57
  215. langchain/callbacks/tracers/root_listeners.py +0 -3
  216. langchain/callbacks/tracers/run_collector.py +0 -3
  217. langchain/callbacks/tracers/schemas.py +0 -27
  218. langchain/callbacks/tracers/stdout.py +0 -6
  219. langchain/callbacks/tracers/wandb.py +0 -27
  220. langchain/callbacks/trubrics_callback.py +0 -25
  221. langchain/callbacks/utils.py +0 -48
  222. langchain/callbacks/wandb_callback.py +0 -25
  223. langchain/callbacks/whylabs_callback.py +0 -25
  224. langchain/chains/__init__.py +0 -96
  225. langchain/chains/api/__init__.py +0 -1
  226. langchain/chains/api/base.py +0 -398
  227. langchain/chains/api/news_docs.py +0 -31
  228. langchain/chains/api/open_meteo_docs.py +0 -32
  229. langchain/chains/api/openapi/__init__.py +0 -0
  230. langchain/chains/api/openapi/chain.py +0 -23
  231. langchain/chains/api/openapi/prompts.py +0 -27
  232. langchain/chains/api/openapi/requests_chain.py +0 -29
  233. langchain/chains/api/openapi/response_chain.py +0 -29
  234. langchain/chains/api/podcast_docs.py +0 -27
  235. langchain/chains/api/prompt.py +0 -35
  236. langchain/chains/api/tmdb_docs.py +0 -36
  237. langchain/chains/base.py +0 -806
  238. langchain/chains/chat_vector_db/__init__.py +0 -0
  239. langchain/chains/chat_vector_db/prompts.py +0 -19
  240. langchain/chains/combine_documents/__init__.py +0 -15
  241. langchain/chains/combine_documents/base.py +0 -293
  242. langchain/chains/combine_documents/map_reduce.py +0 -303
  243. langchain/chains/combine_documents/map_rerank.py +0 -249
  244. langchain/chains/combine_documents/reduce.py +0 -382
  245. langchain/chains/combine_documents/refine.py +0 -237
  246. langchain/chains/combine_documents/stuff.py +0 -292
  247. langchain/chains/constitutional_ai/__init__.py +0 -2
  248. langchain/chains/constitutional_ai/base.py +0 -328
  249. langchain/chains/constitutional_ai/models.py +0 -11
  250. langchain/chains/constitutional_ai/principles.py +0 -278
  251. langchain/chains/constitutional_ai/prompts.py +0 -120
  252. langchain/chains/conversation/__init__.py +0 -1
  253. langchain/chains/conversation/base.py +0 -146
  254. langchain/chains/conversation/memory.py +0 -45
  255. langchain/chains/conversation/prompt.py +0 -28
  256. langchain/chains/conversational_retrieval/__init__.py +0 -1
  257. langchain/chains/conversational_retrieval/base.py +0 -576
  258. langchain/chains/conversational_retrieval/prompts.py +0 -19
  259. langchain/chains/elasticsearch_database/__init__.py +0 -3
  260. langchain/chains/elasticsearch_database/base.py +0 -212
  261. langchain/chains/elasticsearch_database/prompts.py +0 -35
  262. langchain/chains/ernie_functions/__init__.py +0 -44
  263. langchain/chains/ernie_functions/base.py +0 -49
  264. langchain/chains/example_generator.py +0 -22
  265. langchain/chains/flare/__init__.py +0 -1
  266. langchain/chains/flare/base.py +0 -284
  267. langchain/chains/flare/prompts.py +0 -46
  268. langchain/chains/graph_qa/__init__.py +0 -0
  269. langchain/chains/graph_qa/arangodb.py +0 -23
  270. langchain/chains/graph_qa/base.py +0 -23
  271. langchain/chains/graph_qa/cypher.py +0 -39
  272. langchain/chains/graph_qa/cypher_utils.py +0 -27
  273. langchain/chains/graph_qa/falkordb.py +0 -29
  274. langchain/chains/graph_qa/gremlin.py +0 -36
  275. langchain/chains/graph_qa/hugegraph.py +0 -23
  276. langchain/chains/graph_qa/kuzu.py +0 -29
  277. langchain/chains/graph_qa/nebulagraph.py +0 -23
  278. langchain/chains/graph_qa/neptune_cypher.py +0 -39
  279. langchain/chains/graph_qa/neptune_sparql.py +0 -36
  280. langchain/chains/graph_qa/ontotext_graphdb.py +0 -25
  281. langchain/chains/graph_qa/prompts.py +0 -96
  282. langchain/chains/graph_qa/sparql.py +0 -23
  283. langchain/chains/history_aware_retriever.py +0 -68
  284. langchain/chains/hyde/__init__.py +0 -4
  285. langchain/chains/hyde/base.py +0 -124
  286. langchain/chains/hyde/prompts.py +0 -46
  287. langchain/chains/llm.py +0 -447
  288. langchain/chains/llm_bash/__init__.py +0 -10
  289. langchain/chains/llm_checker/__init__.py +0 -4
  290. langchain/chains/llm_checker/base.py +0 -205
  291. langchain/chains/llm_checker/prompt.py +0 -30
  292. langchain/chains/llm_math/__init__.py +0 -4
  293. langchain/chains/llm_math/base.py +0 -319
  294. langchain/chains/llm_math/prompt.py +0 -43
  295. langchain/chains/llm_requests.py +0 -23
  296. langchain/chains/llm_summarization_checker/__init__.py +0 -7
  297. langchain/chains/llm_summarization_checker/base.py +0 -217
  298. langchain/chains/llm_summarization_checker/prompts/are_all_true_prompt.txt +0 -38
  299. langchain/chains/llm_summarization_checker/prompts/check_facts.txt +0 -10
  300. langchain/chains/llm_summarization_checker/prompts/create_facts.txt +0 -10
  301. langchain/chains/llm_summarization_checker/prompts/revise_summary.txt +0 -17
  302. langchain/chains/llm_symbolic_math/__init__.py +0 -10
  303. langchain/chains/loading.py +0 -734
  304. langchain/chains/mapreduce.py +0 -121
  305. langchain/chains/moderation.py +0 -135
  306. langchain/chains/natbot/__init__.py +0 -4
  307. langchain/chains/natbot/base.py +0 -165
  308. langchain/chains/natbot/crawler.py +0 -472
  309. langchain/chains/natbot/prompt.py +0 -143
  310. langchain/chains/openai_functions/__init__.py +0 -44
  311. langchain/chains/openai_functions/base.py +0 -237
  312. langchain/chains/openai_functions/citation_fuzzy_match.py +0 -169
  313. langchain/chains/openai_functions/extraction.py +0 -197
  314. langchain/chains/openai_functions/openapi.py +0 -409
  315. langchain/chains/openai_functions/qa_with_structure.py +0 -142
  316. langchain/chains/openai_functions/tagging.py +0 -174
  317. langchain/chains/openai_functions/utils.py +0 -40
  318. langchain/chains/openai_tools/__init__.py +0 -3
  319. langchain/chains/openai_tools/extraction.py +0 -79
  320. langchain/chains/prompt_selector.py +0 -65
  321. langchain/chains/qa_generation/__init__.py +0 -0
  322. langchain/chains/qa_generation/base.py +0 -128
  323. langchain/chains/qa_generation/prompt.py +0 -50
  324. langchain/chains/qa_with_sources/__init__.py +0 -5
  325. langchain/chains/qa_with_sources/base.py +0 -266
  326. langchain/chains/qa_with_sources/loading.py +0 -209
  327. langchain/chains/qa_with_sources/map_reduce_prompt.py +0 -54
  328. langchain/chains/qa_with_sources/refine_prompts.py +0 -37
  329. langchain/chains/qa_with_sources/retrieval.py +0 -75
  330. langchain/chains/qa_with_sources/stuff_prompt.py +0 -43
  331. langchain/chains/qa_with_sources/vector_db.py +0 -88
  332. langchain/chains/query_constructor/__init__.py +0 -3
  333. langchain/chains/query_constructor/base.py +0 -378
  334. langchain/chains/query_constructor/ir.py +0 -23
  335. langchain/chains/query_constructor/parser.py +0 -272
  336. langchain/chains/query_constructor/prompt.py +0 -226
  337. langchain/chains/query_constructor/schema.py +0 -14
  338. langchain/chains/question_answering/__init__.py +0 -6
  339. langchain/chains/question_answering/chain.py +0 -279
  340. langchain/chains/question_answering/map_reduce_prompt.py +0 -80
  341. langchain/chains/question_answering/map_rerank_prompt.py +0 -66
  342. langchain/chains/question_answering/refine_prompts.py +0 -72
  343. langchain/chains/question_answering/stuff_prompt.py +0 -33
  344. langchain/chains/retrieval.py +0 -67
  345. langchain/chains/retrieval_qa/__init__.py +0 -1
  346. langchain/chains/retrieval_qa/base.py +0 -374
  347. langchain/chains/retrieval_qa/prompt.py +0 -11
  348. langchain/chains/router/__init__.py +0 -12
  349. langchain/chains/router/base.py +0 -154
  350. langchain/chains/router/embedding_router.py +0 -96
  351. langchain/chains/router/llm_router.py +0 -198
  352. langchain/chains/router/multi_prompt.py +0 -184
  353. langchain/chains/router/multi_prompt_prompt.py +0 -32
  354. langchain/chains/router/multi_retrieval_prompt.py +0 -30
  355. langchain/chains/router/multi_retrieval_qa.py +0 -127
  356. langchain/chains/sequential.py +0 -220
  357. langchain/chains/sql_database/__init__.py +0 -1
  358. langchain/chains/sql_database/prompt.py +0 -282
  359. langchain/chains/sql_database/query.py +0 -167
  360. langchain/chains/structured_output/__init__.py +0 -6
  361. langchain/chains/structured_output/base.py +0 -584
  362. langchain/chains/summarize/__init__.py +0 -6
  363. langchain/chains/summarize/chain.py +0 -174
  364. langchain/chains/summarize/map_reduce_prompt.py +0 -10
  365. langchain/chains/summarize/refine_prompts.py +0 -23
  366. langchain/chains/summarize/stuff_prompt.py +0 -10
  367. langchain/chains/transform.py +0 -88
  368. langchain/chat_loaders/__init__.py +0 -19
  369. langchain/chat_loaders/base.py +0 -3
  370. langchain/chat_loaders/facebook_messenger.py +0 -32
  371. langchain/chat_loaders/gmail.py +0 -23
  372. langchain/chat_loaders/imessage.py +0 -23
  373. langchain/chat_loaders/langsmith.py +0 -30
  374. langchain/chat_loaders/slack.py +0 -23
  375. langchain/chat_loaders/telegram.py +0 -23
  376. langchain/chat_loaders/utils.py +0 -36
  377. langchain/chat_loaders/whatsapp.py +0 -23
  378. langchain/chat_models/anthropic.py +0 -30
  379. langchain/chat_models/anyscale.py +0 -23
  380. langchain/chat_models/azure_openai.py +0 -23
  381. langchain/chat_models/azureml_endpoint.py +0 -30
  382. langchain/chat_models/baichuan.py +0 -23
  383. langchain/chat_models/baidu_qianfan_endpoint.py +0 -27
  384. langchain/chat_models/bedrock.py +0 -27
  385. langchain/chat_models/cohere.py +0 -23
  386. langchain/chat_models/databricks.py +0 -23
  387. langchain/chat_models/ernie.py +0 -23
  388. langchain/chat_models/everlyai.py +0 -23
  389. langchain/chat_models/fake.py +0 -30
  390. langchain/chat_models/fireworks.py +0 -23
  391. langchain/chat_models/gigachat.py +0 -23
  392. langchain/chat_models/google_palm.py +0 -30
  393. langchain/chat_models/human.py +0 -23
  394. langchain/chat_models/hunyuan.py +0 -23
  395. langchain/chat_models/javelin_ai_gateway.py +0 -30
  396. langchain/chat_models/jinachat.py +0 -23
  397. langchain/chat_models/konko.py +0 -23
  398. langchain/chat_models/litellm.py +0 -30
  399. langchain/chat_models/meta.py +0 -25
  400. langchain/chat_models/minimax.py +0 -23
  401. langchain/chat_models/mlflow.py +0 -23
  402. langchain/chat_models/mlflow_ai_gateway.py +0 -30
  403. langchain/chat_models/ollama.py +0 -23
  404. langchain/chat_models/openai.py +0 -23
  405. langchain/chat_models/pai_eas_endpoint.py +0 -25
  406. langchain/chat_models/promptlayer_openai.py +0 -25
  407. langchain/chat_models/tongyi.py +0 -23
  408. langchain/chat_models/vertexai.py +0 -23
  409. langchain/chat_models/volcengine_maas.py +0 -30
  410. langchain/chat_models/yandex.py +0 -23
  411. langchain/docstore/__init__.py +0 -48
  412. langchain/docstore/arbitrary_fn.py +0 -23
  413. langchain/docstore/base.py +0 -27
  414. langchain/docstore/in_memory.py +0 -23
  415. langchain/docstore/wikipedia.py +0 -23
  416. langchain/document_loaders/__init__.py +0 -553
  417. langchain/document_loaders/acreom.py +0 -23
  418. langchain/document_loaders/airbyte.py +0 -48
  419. langchain/document_loaders/airbyte_json.py +0 -23
  420. langchain/document_loaders/airtable.py +0 -23
  421. langchain/document_loaders/apify_dataset.py +0 -23
  422. langchain/document_loaders/arcgis_loader.py +0 -23
  423. langchain/document_loaders/arxiv.py +0 -23
  424. langchain/document_loaders/assemblyai.py +0 -28
  425. langchain/document_loaders/async_html.py +0 -23
  426. langchain/document_loaders/azlyrics.py +0 -23
  427. langchain/document_loaders/azure_ai_data.py +0 -23
  428. langchain/document_loaders/azure_blob_storage_container.py +0 -25
  429. langchain/document_loaders/azure_blob_storage_file.py +0 -25
  430. langchain/document_loaders/baiducloud_bos_directory.py +0 -29
  431. langchain/document_loaders/baiducloud_bos_file.py +0 -27
  432. langchain/document_loaders/base.py +0 -3
  433. langchain/document_loaders/base_o365.py +0 -23
  434. langchain/document_loaders/bibtex.py +0 -23
  435. langchain/document_loaders/bigquery.py +0 -23
  436. langchain/document_loaders/bilibili.py +0 -23
  437. langchain/document_loaders/blackboard.py +0 -23
  438. langchain/document_loaders/blob_loaders/__init__.py +0 -36
  439. langchain/document_loaders/blob_loaders/file_system.py +0 -23
  440. langchain/document_loaders/blob_loaders/schema.py +0 -26
  441. langchain/document_loaders/blob_loaders/youtube_audio.py +0 -23
  442. langchain/document_loaders/blockchain.py +0 -28
  443. langchain/document_loaders/brave_search.py +0 -23
  444. langchain/document_loaders/browserless.py +0 -23
  445. langchain/document_loaders/chatgpt.py +0 -28
  446. langchain/document_loaders/chromium.py +0 -23
  447. langchain/document_loaders/college_confidential.py +0 -25
  448. langchain/document_loaders/concurrent.py +0 -23
  449. langchain/document_loaders/confluence.py +0 -28
  450. langchain/document_loaders/conllu.py +0 -23
  451. langchain/document_loaders/couchbase.py +0 -23
  452. langchain/document_loaders/csv_loader.py +0 -27
  453. langchain/document_loaders/cube_semantic.py +0 -23
  454. langchain/document_loaders/datadog_logs.py +0 -23
  455. langchain/document_loaders/dataframe.py +0 -28
  456. langchain/document_loaders/diffbot.py +0 -23
  457. langchain/document_loaders/directory.py +0 -23
  458. langchain/document_loaders/discord.py +0 -23
  459. langchain/document_loaders/docugami.py +0 -23
  460. langchain/document_loaders/docusaurus.py +0 -23
  461. langchain/document_loaders/dropbox.py +0 -23
  462. langchain/document_loaders/duckdb_loader.py +0 -23
  463. langchain/document_loaders/email.py +0 -30
  464. langchain/document_loaders/epub.py +0 -23
  465. langchain/document_loaders/etherscan.py +0 -23
  466. langchain/document_loaders/evernote.py +0 -23
  467. langchain/document_loaders/excel.py +0 -23
  468. langchain/document_loaders/facebook_chat.py +0 -28
  469. langchain/document_loaders/fauna.py +0 -23
  470. langchain/document_loaders/figma.py +0 -23
  471. langchain/document_loaders/gcs_directory.py +0 -23
  472. langchain/document_loaders/gcs_file.py +0 -23
  473. langchain/document_loaders/generic.py +0 -23
  474. langchain/document_loaders/geodataframe.py +0 -23
  475. langchain/document_loaders/git.py +0 -23
  476. langchain/document_loaders/gitbook.py +0 -23
  477. langchain/document_loaders/github.py +0 -28
  478. langchain/document_loaders/google_speech_to_text.py +0 -23
  479. langchain/document_loaders/googledrive.py +0 -23
  480. langchain/document_loaders/gutenberg.py +0 -23
  481. langchain/document_loaders/helpers.py +0 -30
  482. langchain/document_loaders/hn.py +0 -23
  483. langchain/document_loaders/html.py +0 -23
  484. langchain/document_loaders/html_bs.py +0 -23
  485. langchain/document_loaders/hugging_face_dataset.py +0 -23
  486. langchain/document_loaders/ifixit.py +0 -23
  487. langchain/document_loaders/image.py +0 -23
  488. langchain/document_loaders/image_captions.py +0 -23
  489. langchain/document_loaders/imsdb.py +0 -23
  490. langchain/document_loaders/iugu.py +0 -23
  491. langchain/document_loaders/joplin.py +0 -23
  492. langchain/document_loaders/json_loader.py +0 -23
  493. langchain/document_loaders/lakefs.py +0 -33
  494. langchain/document_loaders/larksuite.py +0 -23
  495. langchain/document_loaders/markdown.py +0 -25
  496. langchain/document_loaders/mastodon.py +0 -23
  497. langchain/document_loaders/max_compute.py +0 -23
  498. langchain/document_loaders/mediawikidump.py +0 -23
  499. langchain/document_loaders/merge.py +0 -23
  500. langchain/document_loaders/mhtml.py +0 -23
  501. langchain/document_loaders/modern_treasury.py +0 -23
  502. langchain/document_loaders/mongodb.py +0 -23
  503. langchain/document_loaders/news.py +0 -23
  504. langchain/document_loaders/notebook.py +0 -33
  505. langchain/document_loaders/notion.py +0 -23
  506. langchain/document_loaders/notiondb.py +0 -23
  507. langchain/document_loaders/nuclia.py +0 -23
  508. langchain/document_loaders/obs_directory.py +0 -23
  509. langchain/document_loaders/obs_file.py +0 -23
  510. langchain/document_loaders/obsidian.py +0 -23
  511. langchain/document_loaders/odt.py +0 -23
  512. langchain/document_loaders/onedrive.py +0 -23
  513. langchain/document_loaders/onedrive_file.py +0 -23
  514. langchain/document_loaders/onenote.py +0 -23
  515. langchain/document_loaders/open_city_data.py +0 -23
  516. langchain/document_loaders/org_mode.py +0 -25
  517. langchain/document_loaders/parsers/__init__.py +0 -58
  518. langchain/document_loaders/parsers/audio.py +0 -33
  519. langchain/document_loaders/parsers/docai.py +0 -30
  520. langchain/document_loaders/parsers/generic.py +0 -25
  521. langchain/document_loaders/parsers/grobid.py +0 -30
  522. langchain/document_loaders/parsers/html/__init__.py +0 -25
  523. langchain/document_loaders/parsers/html/bs4.py +0 -25
  524. langchain/document_loaders/parsers/language/__init__.py +0 -29
  525. langchain/document_loaders/parsers/language/cobol.py +0 -27
  526. langchain/document_loaders/parsers/language/code_segmenter.py +0 -29
  527. langchain/document_loaders/parsers/language/javascript.py +0 -29
  528. langchain/document_loaders/parsers/language/language_parser.py +0 -29
  529. langchain/document_loaders/parsers/language/python.py +0 -27
  530. langchain/document_loaders/parsers/msword.py +0 -25
  531. langchain/document_loaders/parsers/pdf.py +0 -50
  532. langchain/document_loaders/parsers/registry.py +0 -25
  533. langchain/document_loaders/parsers/txt.py +0 -23
  534. langchain/document_loaders/pdf.py +0 -65
  535. langchain/document_loaders/polars_dataframe.py +0 -23
  536. langchain/document_loaders/powerpoint.py +0 -25
  537. langchain/document_loaders/psychic.py +0 -23
  538. langchain/document_loaders/pubmed.py +0 -23
  539. langchain/document_loaders/pyspark_dataframe.py +0 -26
  540. langchain/document_loaders/python.py +0 -22
  541. langchain/document_loaders/quip.py +0 -23
  542. langchain/document_loaders/readthedocs.py +0 -23
  543. langchain/document_loaders/recursive_url_loader.py +0 -23
  544. langchain/document_loaders/reddit.py +0 -23
  545. langchain/document_loaders/roam.py +0 -23
  546. langchain/document_loaders/rocksetdb.py +0 -23
  547. langchain/document_loaders/rspace.py +0 -23
  548. langchain/document_loaders/rss.py +0 -23
  549. langchain/document_loaders/rst.py +0 -23
  550. langchain/document_loaders/rtf.py +0 -23
  551. langchain/document_loaders/s3_directory.py +0 -23
  552. langchain/document_loaders/s3_file.py +0 -23
  553. langchain/document_loaders/sharepoint.py +0 -23
  554. langchain/document_loaders/sitemap.py +0 -23
  555. langchain/document_loaders/slack_directory.py +0 -23
  556. langchain/document_loaders/snowflake_loader.py +0 -23
  557. langchain/document_loaders/spreedly.py +0 -23
  558. langchain/document_loaders/srt.py +0 -23
  559. langchain/document_loaders/stripe.py +0 -23
  560. langchain/document_loaders/telegram.py +0 -38
  561. langchain/document_loaders/tencent_cos_directory.py +0 -25
  562. langchain/document_loaders/tencent_cos_file.py +0 -23
  563. langchain/document_loaders/tensorflow_datasets.py +0 -23
  564. langchain/document_loaders/text.py +0 -23
  565. langchain/document_loaders/tomarkdown.py +0 -23
  566. langchain/document_loaders/toml.py +0 -23
  567. langchain/document_loaders/trello.py +0 -23
  568. langchain/document_loaders/tsv.py +0 -23
  569. langchain/document_loaders/twitter.py +0 -23
  570. langchain/document_loaders/unstructured.py +0 -54
  571. langchain/document_loaders/url.py +0 -23
  572. langchain/document_loaders/url_playwright.py +0 -33
  573. langchain/document_loaders/url_selenium.py +0 -23
  574. langchain/document_loaders/weather.py +0 -23
  575. langchain/document_loaders/web_base.py +0 -23
  576. langchain/document_loaders/whatsapp_chat.py +0 -28
  577. langchain/document_loaders/wikipedia.py +0 -23
  578. langchain/document_loaders/word_document.py +0 -30
  579. langchain/document_loaders/xml.py +0 -23
  580. langchain/document_loaders/xorbits.py +0 -23
  581. langchain/document_loaders/youtube.py +0 -33
  582. langchain/document_transformers/__init__.py +0 -77
  583. langchain/document_transformers/beautiful_soup_transformer.py +0 -25
  584. langchain/document_transformers/doctran_text_extract.py +0 -25
  585. langchain/document_transformers/doctran_text_qa.py +0 -25
  586. langchain/document_transformers/doctran_text_translate.py +0 -25
  587. langchain/document_transformers/embeddings_redundant_filter.py +0 -50
  588. langchain/document_transformers/google_translate.py +0 -25
  589. langchain/document_transformers/html2text.py +0 -25
  590. langchain/document_transformers/long_context_reorder.py +0 -23
  591. langchain/document_transformers/nuclia_text_transform.py +0 -25
  592. langchain/document_transformers/openai_functions.py +0 -32
  593. langchain/document_transformers/xsl/html_chunks_with_headers.xslt +0 -199
  594. langchain/embeddings/aleph_alpha.py +0 -30
  595. langchain/embeddings/awa.py +0 -23
  596. langchain/embeddings/azure_openai.py +0 -23
  597. langchain/embeddings/baidu_qianfan_endpoint.py +0 -23
  598. langchain/embeddings/bedrock.py +0 -23
  599. langchain/embeddings/bookend.py +0 -23
  600. langchain/embeddings/clarifai.py +0 -23
  601. langchain/embeddings/cloudflare_workersai.py +0 -29
  602. langchain/embeddings/cohere.py +0 -23
  603. langchain/embeddings/dashscope.py +0 -23
  604. langchain/embeddings/databricks.py +0 -23
  605. langchain/embeddings/deepinfra.py +0 -23
  606. langchain/embeddings/edenai.py +0 -23
  607. langchain/embeddings/elasticsearch.py +0 -23
  608. langchain/embeddings/embaas.py +0 -23
  609. langchain/embeddings/ernie.py +0 -23
  610. langchain/embeddings/fake.py +0 -30
  611. langchain/embeddings/fastembed.py +0 -23
  612. langchain/embeddings/google_palm.py +0 -23
  613. langchain/embeddings/gpt4all.py +0 -23
  614. langchain/embeddings/gradient_ai.py +0 -23
  615. langchain/embeddings/huggingface.py +0 -36
  616. langchain/embeddings/huggingface_hub.py +0 -23
  617. langchain/embeddings/infinity.py +0 -30
  618. langchain/embeddings/javelin_ai_gateway.py +0 -23
  619. langchain/embeddings/jina.py +0 -23
  620. langchain/embeddings/johnsnowlabs.py +0 -23
  621. langchain/embeddings/llamacpp.py +0 -23
  622. langchain/embeddings/llm_rails.py +0 -23
  623. langchain/embeddings/localai.py +0 -23
  624. langchain/embeddings/minimax.py +0 -23
  625. langchain/embeddings/mlflow.py +0 -23
  626. langchain/embeddings/mlflow_gateway.py +0 -23
  627. langchain/embeddings/modelscope_hub.py +0 -23
  628. langchain/embeddings/mosaicml.py +0 -23
  629. langchain/embeddings/nlpcloud.py +0 -23
  630. langchain/embeddings/octoai_embeddings.py +0 -23
  631. langchain/embeddings/ollama.py +0 -23
  632. langchain/embeddings/openai.py +0 -23
  633. langchain/embeddings/sagemaker_endpoint.py +0 -30
  634. langchain/embeddings/self_hosted.py +0 -23
  635. langchain/embeddings/self_hosted_hugging_face.py +0 -30
  636. langchain/embeddings/sentence_transformer.py +0 -21
  637. langchain/embeddings/spacy_embeddings.py +0 -23
  638. langchain/embeddings/tensorflow_hub.py +0 -23
  639. langchain/embeddings/vertexai.py +0 -23
  640. langchain/embeddings/voyageai.py +0 -23
  641. langchain/embeddings/xinference.py +0 -23
  642. langchain/env.py +0 -17
  643. langchain/evaluation/__init__.py +0 -128
  644. langchain/evaluation/agents/__init__.py +0 -5
  645. langchain/evaluation/agents/trajectory_eval_chain.py +0 -416
  646. langchain/evaluation/agents/trajectory_eval_prompt.py +0 -146
  647. langchain/evaluation/comparison/__init__.py +0 -36
  648. langchain/evaluation/comparison/eval_chain.py +0 -462
  649. langchain/evaluation/comparison/prompt.py +0 -59
  650. langchain/evaluation/criteria/__init__.py +0 -56
  651. langchain/evaluation/criteria/eval_chain.py +0 -606
  652. langchain/evaluation/criteria/prompt.py +0 -37
  653. langchain/evaluation/embedding_distance/__init__.py +0 -13
  654. langchain/evaluation/embedding_distance/base.py +0 -613
  655. langchain/evaluation/exact_match/__init__.py +0 -0
  656. langchain/evaluation/exact_match/base.py +0 -110
  657. langchain/evaluation/loading.py +0 -207
  658. langchain/evaluation/parsing/__init__.py +0 -0
  659. langchain/evaluation/parsing/base.py +0 -175
  660. langchain/evaluation/parsing/json_distance.py +0 -108
  661. langchain/evaluation/parsing/json_schema.py +0 -97
  662. langchain/evaluation/qa/__init__.py +0 -10
  663. langchain/evaluation/qa/eval_chain.py +0 -372
  664. langchain/evaluation/qa/eval_prompt.py +0 -78
  665. langchain/evaluation/qa/generate_chain.py +0 -36
  666. langchain/evaluation/qa/generate_prompt.py +0 -21
  667. langchain/evaluation/regex_match/__init__.py +0 -0
  668. langchain/evaluation/regex_match/base.py +0 -94
  669. langchain/evaluation/schema.py +0 -491
  670. langchain/evaluation/scoring/__init__.py +0 -31
  671. langchain/evaluation/scoring/eval_chain.py +0 -476
  672. langchain/evaluation/scoring/prompt.py +0 -53
  673. langchain/evaluation/string_distance/__init__.py +0 -13
  674. langchain/evaluation/string_distance/base.py +0 -472
  675. langchain/example_generator.py +0 -5
  676. langchain/formatting.py +0 -5
  677. langchain/graphs/__init__.py +0 -57
  678. langchain/graphs/arangodb_graph.py +0 -28
  679. langchain/graphs/falkordb_graph.py +0 -23
  680. langchain/graphs/graph_document.py +0 -33
  681. langchain/graphs/graph_store.py +0 -23
  682. langchain/graphs/hugegraph.py +0 -23
  683. langchain/graphs/kuzu_graph.py +0 -23
  684. langchain/graphs/memgraph_graph.py +0 -23
  685. langchain/graphs/nebula_graph.py +0 -23
  686. langchain/graphs/neo4j_graph.py +0 -23
  687. langchain/graphs/neptune_graph.py +0 -23
  688. langchain/graphs/networkx_graph.py +0 -36
  689. langchain/graphs/rdf_graph.py +0 -23
  690. langchain/hub.py +0 -131
  691. langchain/indexes/__init__.py +0 -50
  692. langchain/indexes/_api.py +0 -5
  693. langchain/indexes/_sql_record_manager.py +0 -539
  694. langchain/indexes/graph.py +0 -28
  695. langchain/indexes/prompts/__init__.py +0 -13
  696. langchain/indexes/prompts/entity_extraction.py +0 -39
  697. langchain/indexes/prompts/entity_summarization.py +0 -24
  698. langchain/indexes/prompts/knowledge_triplet_extraction.py +0 -36
  699. langchain/indexes/vectorstore.py +0 -269
  700. langchain/input.py +0 -15
  701. langchain/llms/__init__.py +0 -734
  702. langchain/llms/ai21.py +0 -28
  703. langchain/llms/aleph_alpha.py +0 -23
  704. langchain/llms/amazon_api_gateway.py +0 -23
  705. langchain/llms/anthropic.py +0 -23
  706. langchain/llms/anyscale.py +0 -23
  707. langchain/llms/arcee.py +0 -23
  708. langchain/llms/aviary.py +0 -23
  709. langchain/llms/azureml_endpoint.py +0 -48
  710. langchain/llms/baidu_qianfan_endpoint.py +0 -23
  711. langchain/llms/bananadev.py +0 -23
  712. langchain/llms/base.py +0 -20
  713. langchain/llms/baseten.py +0 -23
  714. langchain/llms/beam.py +0 -23
  715. langchain/llms/bedrock.py +0 -28
  716. langchain/llms/bittensor.py +0 -23
  717. langchain/llms/cerebriumai.py +0 -23
  718. langchain/llms/chatglm.py +0 -23
  719. langchain/llms/clarifai.py +0 -23
  720. langchain/llms/cloudflare_workersai.py +0 -25
  721. langchain/llms/cohere.py +0 -23
  722. langchain/llms/ctransformers.py +0 -23
  723. langchain/llms/ctranslate2.py +0 -23
  724. langchain/llms/databricks.py +0 -23
  725. langchain/llms/deepinfra.py +0 -23
  726. langchain/llms/deepsparse.py +0 -23
  727. langchain/llms/edenai.py +0 -23
  728. langchain/llms/fake.py +0 -28
  729. langchain/llms/fireworks.py +0 -23
  730. langchain/llms/forefrontai.py +0 -23
  731. langchain/llms/gigachat.py +0 -23
  732. langchain/llms/google_palm.py +0 -23
  733. langchain/llms/gooseai.py +0 -23
  734. langchain/llms/gpt4all.py +0 -23
  735. langchain/llms/gradient_ai.py +0 -28
  736. langchain/llms/grammars/json.gbnf +0 -29
  737. langchain/llms/grammars/list.gbnf +0 -14
  738. langchain/llms/huggingface_endpoint.py +0 -23
  739. langchain/llms/huggingface_hub.py +0 -23
  740. langchain/llms/huggingface_pipeline.py +0 -23
  741. langchain/llms/huggingface_text_gen_inference.py +0 -23
  742. langchain/llms/human.py +0 -23
  743. langchain/llms/javelin_ai_gateway.py +0 -28
  744. langchain/llms/koboldai.py +0 -23
  745. langchain/llms/llamacpp.py +0 -23
  746. langchain/llms/loading.py +0 -27
  747. langchain/llms/manifest.py +0 -23
  748. langchain/llms/minimax.py +0 -23
  749. langchain/llms/mlflow.py +0 -23
  750. langchain/llms/mlflow_ai_gateway.py +0 -23
  751. langchain/llms/modal.py +0 -23
  752. langchain/llms/mosaicml.py +0 -23
  753. langchain/llms/nlpcloud.py +0 -23
  754. langchain/llms/octoai_endpoint.py +0 -23
  755. langchain/llms/ollama.py +0 -23
  756. langchain/llms/opaqueprompts.py +0 -23
  757. langchain/llms/openai.py +0 -32
  758. langchain/llms/openllm.py +0 -23
  759. langchain/llms/openlm.py +0 -23
  760. langchain/llms/pai_eas_endpoint.py +0 -23
  761. langchain/llms/petals.py +0 -23
  762. langchain/llms/pipelineai.py +0 -23
  763. langchain/llms/predibase.py +0 -23
  764. langchain/llms/predictionguard.py +0 -23
  765. langchain/llms/promptlayer_openai.py +0 -27
  766. langchain/llms/replicate.py +0 -23
  767. langchain/llms/rwkv.py +0 -23
  768. langchain/llms/sagemaker_endpoint.py +0 -28
  769. langchain/llms/self_hosted.py +0 -23
  770. langchain/llms/self_hosted_hugging_face.py +0 -23
  771. langchain/llms/stochasticai.py +0 -23
  772. langchain/llms/symblai_nebula.py +0 -23
  773. langchain/llms/textgen.py +0 -23
  774. langchain/llms/titan_takeoff.py +0 -23
  775. langchain/llms/titan_takeoff_pro.py +0 -23
  776. langchain/llms/together.py +0 -23
  777. langchain/llms/tongyi.py +0 -23
  778. langchain/llms/utils.py +0 -23
  779. langchain/llms/vertexai.py +0 -27
  780. langchain/llms/vllm.py +0 -27
  781. langchain/llms/volcengine_maas.py +0 -28
  782. langchain/llms/watsonxllm.py +0 -23
  783. langchain/llms/writer.py +0 -23
  784. langchain/llms/xinference.py +0 -23
  785. langchain/llms/yandex.py +0 -23
  786. langchain/load/__init__.py +0 -11
  787. langchain/load/dump.py +0 -3
  788. langchain/load/load.py +0 -3
  789. langchain/load/serializable.py +0 -19
  790. langchain/memory/__init__.py +0 -153
  791. langchain/memory/buffer.py +0 -178
  792. langchain/memory/buffer_window.py +0 -62
  793. langchain/memory/chat_memory.py +0 -104
  794. langchain/memory/chat_message_histories/__init__.py +0 -84
  795. langchain/memory/chat_message_histories/astradb.py +0 -25
  796. langchain/memory/chat_message_histories/cassandra.py +0 -25
  797. langchain/memory/chat_message_histories/cosmos_db.py +0 -25
  798. langchain/memory/chat_message_histories/dynamodb.py +0 -25
  799. langchain/memory/chat_message_histories/elasticsearch.py +0 -27
  800. langchain/memory/chat_message_histories/file.py +0 -25
  801. langchain/memory/chat_message_histories/firestore.py +0 -25
  802. langchain/memory/chat_message_histories/in_memory.py +0 -5
  803. langchain/memory/chat_message_histories/momento.py +0 -25
  804. langchain/memory/chat_message_histories/mongodb.py +0 -25
  805. langchain/memory/chat_message_histories/neo4j.py +0 -25
  806. langchain/memory/chat_message_histories/postgres.py +0 -25
  807. langchain/memory/chat_message_histories/redis.py +0 -25
  808. langchain/memory/chat_message_histories/rocksetdb.py +0 -25
  809. langchain/memory/chat_message_histories/singlestoredb.py +0 -27
  810. langchain/memory/chat_message_histories/sql.py +0 -33
  811. langchain/memory/chat_message_histories/streamlit.py +0 -25
  812. langchain/memory/chat_message_histories/upstash_redis.py +0 -27
  813. langchain/memory/chat_message_histories/xata.py +0 -25
  814. langchain/memory/chat_message_histories/zep.py +0 -25
  815. langchain/memory/combined.py +0 -85
  816. langchain/memory/entity.py +0 -611
  817. langchain/memory/kg.py +0 -23
  818. langchain/memory/motorhead_memory.py +0 -23
  819. langchain/memory/prompt.py +0 -164
  820. langchain/memory/readonly.py +0 -24
  821. langchain/memory/simple.py +0 -27
  822. langchain/memory/summary.py +0 -170
  823. langchain/memory/summary_buffer.py +0 -151
  824. langchain/memory/token_buffer.py +0 -74
  825. langchain/memory/utils.py +0 -21
  826. langchain/memory/vectorstore.py +0 -120
  827. langchain/memory/vectorstore_token_buffer_memory.py +0 -184
  828. langchain/memory/zep_memory.py +0 -23
  829. langchain/model_laboratory.py +0 -99
  830. langchain/output_parsers/__init__.py +0 -87
  831. langchain/output_parsers/boolean.py +0 -54
  832. langchain/output_parsers/combining.py +0 -59
  833. langchain/output_parsers/datetime.py +0 -58
  834. langchain/output_parsers/enum.py +0 -45
  835. langchain/output_parsers/ernie_functions.py +0 -45
  836. langchain/output_parsers/fix.py +0 -155
  837. langchain/output_parsers/format_instructions.py +0 -79
  838. langchain/output_parsers/json.py +0 -15
  839. langchain/output_parsers/list.py +0 -13
  840. langchain/output_parsers/loading.py +0 -22
  841. langchain/output_parsers/openai_functions.py +0 -13
  842. langchain/output_parsers/openai_tools.py +0 -7
  843. langchain/output_parsers/pandas_dataframe.py +0 -171
  844. langchain/output_parsers/prompts.py +0 -21
  845. langchain/output_parsers/pydantic.py +0 -3
  846. langchain/output_parsers/rail_parser.py +0 -25
  847. langchain/output_parsers/regex.py +0 -41
  848. langchain/output_parsers/regex_dict.py +0 -43
  849. langchain/output_parsers/retry.py +0 -316
  850. langchain/output_parsers/structured.py +0 -116
  851. langchain/output_parsers/xml.py +0 -3
  852. langchain/output_parsers/yaml.py +0 -77
  853. langchain/prompts/__init__.py +0 -102
  854. langchain/prompts/base.py +0 -21
  855. langchain/prompts/chat.py +0 -37
  856. langchain/prompts/example_selector/__init__.py +0 -42
  857. langchain/prompts/example_selector/base.py +0 -3
  858. langchain/prompts/example_selector/length_based.py +0 -5
  859. langchain/prompts/example_selector/ngram_overlap.py +0 -32
  860. langchain/prompts/example_selector/semantic_similarity.py +0 -11
  861. langchain/prompts/few_shot.py +0 -11
  862. langchain/prompts/few_shot_with_templates.py +0 -3
  863. langchain/prompts/loading.py +0 -23
  864. langchain/prompts/pipeline.py +0 -3
  865. langchain/prompts/prompt.py +0 -6
  866. langchain/pydantic_v1/__init__.py +0 -38
  867. langchain/pydantic_v1/dataclasses.py +0 -20
  868. langchain/pydantic_v1/main.py +0 -20
  869. langchain/python.py +0 -19
  870. langchain/requests.py +0 -35
  871. langchain/retrievers/__init__.py +0 -178
  872. langchain/retrievers/arcee.py +0 -23
  873. langchain/retrievers/arxiv.py +0 -23
  874. langchain/retrievers/azure_ai_search.py +0 -30
  875. langchain/retrievers/bedrock.py +0 -33
  876. langchain/retrievers/bm25.py +0 -28
  877. langchain/retrievers/chaindesk.py +0 -23
  878. langchain/retrievers/chatgpt_plugin_retriever.py +0 -23
  879. langchain/retrievers/cohere_rag_retriever.py +0 -23
  880. langchain/retrievers/contextual_compression.py +0 -81
  881. langchain/retrievers/databerry.py +0 -23
  882. langchain/retrievers/docarray.py +0 -28
  883. langchain/retrievers/document_compressors/__init__.py +0 -44
  884. langchain/retrievers/document_compressors/base.py +0 -82
  885. langchain/retrievers/document_compressors/chain_extract.py +0 -123
  886. langchain/retrievers/document_compressors/chain_extract_prompt.py +0 -10
  887. langchain/retrievers/document_compressors/chain_filter.py +0 -133
  888. langchain/retrievers/document_compressors/chain_filter_prompt.py +0 -8
  889. langchain/retrievers/document_compressors/cohere_rerank.py +0 -126
  890. langchain/retrievers/document_compressors/cross_encoder.py +0 -16
  891. langchain/retrievers/document_compressors/cross_encoder_rerank.py +0 -50
  892. langchain/retrievers/document_compressors/embeddings_filter.py +0 -140
  893. langchain/retrievers/document_compressors/flashrank_rerank.py +0 -27
  894. langchain/retrievers/document_compressors/listwise_rerank.py +0 -145
  895. langchain/retrievers/elastic_search_bm25.py +0 -23
  896. langchain/retrievers/embedchain.py +0 -23
  897. langchain/retrievers/ensemble.py +0 -336
  898. langchain/retrievers/google_cloud_documentai_warehouse.py +0 -25
  899. langchain/retrievers/google_vertex_ai_search.py +0 -33
  900. langchain/retrievers/kay.py +0 -23
  901. langchain/retrievers/kendra.py +0 -66
  902. langchain/retrievers/knn.py +0 -23
  903. langchain/retrievers/llama_index.py +0 -30
  904. langchain/retrievers/merger_retriever.py +0 -123
  905. langchain/retrievers/metal.py +0 -23
  906. langchain/retrievers/milvus.py +0 -28
  907. langchain/retrievers/multi_query.py +0 -233
  908. langchain/retrievers/multi_vector.py +0 -135
  909. langchain/retrievers/outline.py +0 -23
  910. langchain/retrievers/parent_document_retriever.py +0 -172
  911. langchain/retrievers/pinecone_hybrid_search.py +0 -23
  912. langchain/retrievers/pubmed.py +0 -23
  913. langchain/retrievers/pupmed.py +0 -23
  914. langchain/retrievers/re_phraser.py +0 -89
  915. langchain/retrievers/remote_retriever.py +0 -23
  916. langchain/retrievers/self_query/__init__.py +0 -0
  917. langchain/retrievers/self_query/astradb.py +0 -23
  918. langchain/retrievers/self_query/base.py +0 -416
  919. langchain/retrievers/self_query/chroma.py +0 -23
  920. langchain/retrievers/self_query/dashvector.py +0 -23
  921. langchain/retrievers/self_query/databricks_vector_search.py +0 -27
  922. langchain/retrievers/self_query/deeplake.py +0 -27
  923. langchain/retrievers/self_query/dingo.py +0 -23
  924. langchain/retrievers/self_query/elasticsearch.py +0 -25
  925. langchain/retrievers/self_query/milvus.py +0 -27
  926. langchain/retrievers/self_query/mongodb_atlas.py +0 -25
  927. langchain/retrievers/self_query/myscale.py +0 -23
  928. langchain/retrievers/self_query/opensearch.py +0 -23
  929. langchain/retrievers/self_query/pgvector.py +0 -23
  930. langchain/retrievers/self_query/pinecone.py +0 -23
  931. langchain/retrievers/self_query/qdrant.py +0 -23
  932. langchain/retrievers/self_query/redis.py +0 -23
  933. langchain/retrievers/self_query/supabase.py +0 -23
  934. langchain/retrievers/self_query/tencentvectordb.py +0 -27
  935. langchain/retrievers/self_query/timescalevector.py +0 -27
  936. langchain/retrievers/self_query/vectara.py +0 -27
  937. langchain/retrievers/self_query/weaviate.py +0 -23
  938. langchain/retrievers/svm.py +0 -23
  939. langchain/retrievers/tavily_search_api.py +0 -28
  940. langchain/retrievers/tfidf.py +0 -23
  941. langchain/retrievers/time_weighted_retriever.py +0 -196
  942. langchain/retrievers/vespa_retriever.py +0 -23
  943. langchain/retrievers/weaviate_hybrid_search.py +0 -23
  944. langchain/retrievers/web_research.py +0 -29
  945. langchain/retrievers/wikipedia.py +0 -23
  946. langchain/retrievers/you.py +0 -23
  947. langchain/retrievers/zep.py +0 -30
  948. langchain/retrievers/zilliz.py +0 -28
  949. langchain/runnables/__init__.py +0 -18
  950. langchain/runnables/hub.py +0 -44
  951. langchain/runnables/openai_functions.py +0 -57
  952. langchain/schema/__init__.py +0 -82
  953. langchain/schema/agent.py +0 -3
  954. langchain/schema/cache.py +0 -3
  955. langchain/schema/callbacks/__init__.py +0 -0
  956. langchain/schema/callbacks/base.py +0 -23
  957. langchain/schema/callbacks/manager.py +0 -55
  958. langchain/schema/callbacks/stdout.py +0 -3
  959. langchain/schema/callbacks/streaming_stdout.py +0 -3
  960. langchain/schema/callbacks/tracers/__init__.py +0 -0
  961. langchain/schema/callbacks/tracers/base.py +0 -4
  962. langchain/schema/callbacks/tracers/evaluation.py +0 -6
  963. langchain/schema/callbacks/tracers/langchain.py +0 -8
  964. langchain/schema/callbacks/tracers/langchain_v1.py +0 -3
  965. langchain/schema/callbacks/tracers/log_stream.py +0 -9
  966. langchain/schema/callbacks/tracers/root_listeners.py +0 -3
  967. langchain/schema/callbacks/tracers/run_collector.py +0 -3
  968. langchain/schema/callbacks/tracers/schemas.py +0 -27
  969. langchain/schema/callbacks/tracers/stdout.py +0 -13
  970. langchain/schema/chat.py +0 -3
  971. langchain/schema/chat_history.py +0 -3
  972. langchain/schema/document.py +0 -3
  973. langchain/schema/embeddings.py +0 -3
  974. langchain/schema/exceptions.py +0 -3
  975. langchain/schema/language_model.py +0 -15
  976. langchain/schema/memory.py +0 -3
  977. langchain/schema/messages.py +0 -51
  978. langchain/schema/output.py +0 -19
  979. langchain/schema/output_parser.py +0 -25
  980. langchain/schema/prompt.py +0 -3
  981. langchain/schema/prompt_template.py +0 -3
  982. langchain/schema/retriever.py +0 -3
  983. langchain/schema/runnable/__init__.py +0 -58
  984. langchain/schema/runnable/base.py +0 -38
  985. langchain/schema/runnable/branch.py +0 -3
  986. langchain/schema/runnable/config.py +0 -27
  987. langchain/schema/runnable/configurable.py +0 -15
  988. langchain/schema/runnable/fallbacks.py +0 -3
  989. langchain/schema/runnable/history.py +0 -11
  990. langchain/schema/runnable/passthrough.py +0 -8
  991. langchain/schema/runnable/retry.py +0 -3
  992. langchain/schema/runnable/router.py +0 -3
  993. langchain/schema/runnable/utils.py +0 -51
  994. langchain/schema/storage.py +0 -3
  995. langchain/schema/vectorstore.py +0 -3
  996. langchain/serpapi.py +0 -25
  997. langchain/smith/__init__.py +0 -103
  998. langchain/smith/evaluation/__init__.py +0 -68
  999. langchain/smith/evaluation/config.py +0 -365
  1000. langchain/smith/evaluation/name_generation.py +0 -727
  1001. langchain/smith/evaluation/progress.py +0 -146
  1002. langchain/smith/evaluation/runner_utils.py +0 -1689
  1003. langchain/smith/evaluation/string_run_evaluator.py +0 -467
  1004. langchain/sql_database.py +0 -25
  1005. langchain/storage/_lc_store.py +0 -91
  1006. langchain/storage/file_system.py +0 -176
  1007. langchain/storage/redis.py +0 -23
  1008. langchain/storage/upstash_redis.py +0 -27
  1009. langchain/tools/ainetwork/__init__.py +0 -0
  1010. langchain/tools/ainetwork/app.py +0 -30
  1011. langchain/tools/ainetwork/base.py +0 -27
  1012. langchain/tools/ainetwork/owner.py +0 -28
  1013. langchain/tools/ainetwork/rule.py +0 -28
  1014. langchain/tools/ainetwork/transfer.py +0 -28
  1015. langchain/tools/ainetwork/value.py +0 -28
  1016. langchain/tools/amadeus/__init__.py +0 -30
  1017. langchain/tools/amadeus/base.py +0 -23
  1018. langchain/tools/amadeus/closest_airport.py +0 -30
  1019. langchain/tools/amadeus/flight_search.py +0 -30
  1020. langchain/tools/arxiv/__init__.py +0 -1
  1021. langchain/tools/arxiv/tool.py +0 -28
  1022. langchain/tools/azure_cognitive_services/__init__.py +0 -41
  1023. langchain/tools/azure_cognitive_services/form_recognizer.py +0 -23
  1024. langchain/tools/azure_cognitive_services/image_analysis.py +0 -23
  1025. langchain/tools/azure_cognitive_services/speech2text.py +0 -23
  1026. langchain/tools/azure_cognitive_services/text2speech.py +0 -23
  1027. langchain/tools/azure_cognitive_services/text_analytics_health.py +0 -23
  1028. langchain/tools/base.py +0 -19
  1029. langchain/tools/bearly/__init__.py +0 -0
  1030. langchain/tools/bearly/tool.py +0 -33
  1031. langchain/tools/bing_search/__init__.py +0 -29
  1032. langchain/tools/bing_search/tool.py +0 -27
  1033. langchain/tools/brave_search/__init__.py +0 -0
  1034. langchain/tools/brave_search/tool.py +0 -23
  1035. langchain/tools/clickup/__init__.py +0 -0
  1036. langchain/tools/clickup/tool.py +0 -23
  1037. langchain/tools/convert_to_openai.py +0 -4
  1038. langchain/tools/dataforseo_api_search/__init__.py +0 -34
  1039. langchain/tools/dataforseo_api_search/tool.py +0 -32
  1040. langchain/tools/ddg_search/__init__.py +0 -25
  1041. langchain/tools/ddg_search/tool.py +0 -32
  1042. langchain/tools/e2b_data_analysis/__init__.py +0 -0
  1043. langchain/tools/e2b_data_analysis/tool.py +0 -33
  1044. langchain/tools/edenai/__init__.py +0 -50
  1045. langchain/tools/edenai/audio_speech_to_text.py +0 -23
  1046. langchain/tools/edenai/audio_text_to_speech.py +0 -23
  1047. langchain/tools/edenai/edenai_base_tool.py +0 -23
  1048. langchain/tools/edenai/image_explicitcontent.py +0 -23
  1049. langchain/tools/edenai/image_objectdetection.py +0 -23
  1050. langchain/tools/edenai/ocr_identityparser.py +0 -23
  1051. langchain/tools/edenai/ocr_invoiceparser.py +0 -23
  1052. langchain/tools/edenai/text_moderation.py +0 -23
  1053. langchain/tools/eleven_labs/__init__.py +0 -25
  1054. langchain/tools/eleven_labs/models.py +0 -23
  1055. langchain/tools/eleven_labs/text2speech.py +0 -23
  1056. langchain/tools/file_management/__init__.py +0 -47
  1057. langchain/tools/file_management/copy.py +0 -28
  1058. langchain/tools/file_management/delete.py +0 -28
  1059. langchain/tools/file_management/file_search.py +0 -28
  1060. langchain/tools/file_management/list_dir.py +0 -28
  1061. langchain/tools/file_management/move.py +0 -28
  1062. langchain/tools/file_management/read.py +0 -28
  1063. langchain/tools/file_management/write.py +0 -28
  1064. langchain/tools/github/__init__.py +0 -1
  1065. langchain/tools/github/tool.py +0 -23
  1066. langchain/tools/gitlab/__init__.py +0 -1
  1067. langchain/tools/gitlab/tool.py +0 -23
  1068. langchain/tools/gmail/__init__.py +0 -41
  1069. langchain/tools/gmail/base.py +0 -23
  1070. langchain/tools/gmail/create_draft.py +0 -28
  1071. langchain/tools/gmail/get_message.py +0 -28
  1072. langchain/tools/gmail/get_thread.py +0 -28
  1073. langchain/tools/gmail/search.py +0 -30
  1074. langchain/tools/gmail/send_message.py +0 -28
  1075. langchain/tools/golden_query/__init__.py +0 -25
  1076. langchain/tools/golden_query/tool.py +0 -23
  1077. langchain/tools/google_cloud/__init__.py +0 -25
  1078. langchain/tools/google_cloud/texttospeech.py +0 -23
  1079. langchain/tools/google_finance/__init__.py +0 -27
  1080. langchain/tools/google_finance/tool.py +0 -25
  1081. langchain/tools/google_jobs/__init__.py +0 -25
  1082. langchain/tools/google_jobs/tool.py +0 -23
  1083. langchain/tools/google_lens/__init__.py +0 -25
  1084. langchain/tools/google_lens/tool.py +0 -23
  1085. langchain/tools/google_places/__init__.py +0 -25
  1086. langchain/tools/google_places/tool.py +0 -28
  1087. langchain/tools/google_scholar/__init__.py +0 -27
  1088. langchain/tools/google_scholar/tool.py +0 -25
  1089. langchain/tools/google_search/__init__.py +0 -29
  1090. langchain/tools/google_search/tool.py +0 -27
  1091. langchain/tools/google_serper/__init__.py +0 -30
  1092. langchain/tools/google_serper/tool.py +0 -27
  1093. langchain/tools/google_trends/__init__.py +0 -27
  1094. langchain/tools/google_trends/tool.py +0 -25
  1095. langchain/tools/graphql/__init__.py +0 -1
  1096. langchain/tools/graphql/tool.py +0 -23
  1097. langchain/tools/human/__init__.py +0 -25
  1098. langchain/tools/human/tool.py +0 -23
  1099. langchain/tools/ifttt.py +0 -23
  1100. langchain/tools/interaction/__init__.py +0 -1
  1101. langchain/tools/interaction/tool.py +0 -23
  1102. langchain/tools/jira/__init__.py +0 -1
  1103. langchain/tools/jira/tool.py +0 -42
  1104. langchain/tools/json/__init__.py +0 -1
  1105. langchain/tools/json/tool.py +0 -52
  1106. langchain/tools/memorize/__init__.py +0 -25
  1107. langchain/tools/memorize/tool.py +0 -27
  1108. langchain/tools/merriam_webster/__init__.py +0 -1
  1109. langchain/tools/merriam_webster/tool.py +0 -23
  1110. langchain/tools/metaphor_search/__init__.py +0 -25
  1111. langchain/tools/metaphor_search/tool.py +0 -23
  1112. langchain/tools/multion/__init__.py +0 -33
  1113. langchain/tools/multion/close_session.py +0 -30
  1114. langchain/tools/multion/create_session.py +0 -30
  1115. langchain/tools/multion/update_session.py +0 -30
  1116. langchain/tools/nasa/__init__.py +0 -0
  1117. langchain/tools/nasa/tool.py +0 -23
  1118. langchain/tools/nuclia/__init__.py +0 -23
  1119. langchain/tools/nuclia/tool.py +0 -27
  1120. langchain/tools/office365/__init__.py +0 -41
  1121. langchain/tools/office365/base.py +0 -23
  1122. langchain/tools/office365/create_draft_message.py +0 -32
  1123. langchain/tools/office365/events_search.py +0 -28
  1124. langchain/tools/office365/messages_search.py +0 -28
  1125. langchain/tools/office365/send_event.py +0 -28
  1126. langchain/tools/office365/send_message.py +0 -28
  1127. langchain/tools/openapi/__init__.py +0 -0
  1128. langchain/tools/openapi/utils/__init__.py +0 -0
  1129. langchain/tools/openapi/utils/api_models.py +0 -54
  1130. langchain/tools/openapi/utils/openapi_utils.py +0 -30
  1131. langchain/tools/openweathermap/__init__.py +0 -25
  1132. langchain/tools/openweathermap/tool.py +0 -23
  1133. langchain/tools/playwright/__init__.py +0 -47
  1134. langchain/tools/playwright/base.py +0 -23
  1135. langchain/tools/playwright/click.py +0 -28
  1136. langchain/tools/playwright/current_page.py +0 -23
  1137. langchain/tools/playwright/extract_hyperlinks.py +0 -32
  1138. langchain/tools/playwright/extract_text.py +0 -23
  1139. langchain/tools/playwright/get_elements.py +0 -28
  1140. langchain/tools/playwright/navigate.py +0 -28
  1141. langchain/tools/playwright/navigate_back.py +0 -23
  1142. langchain/tools/plugin.py +0 -32
  1143. langchain/tools/powerbi/__init__.py +0 -1
  1144. langchain/tools/powerbi/tool.py +0 -33
  1145. langchain/tools/pubmed/__init__.py +0 -1
  1146. langchain/tools/pubmed/tool.py +0 -23
  1147. langchain/tools/python/__init__.py +0 -13
  1148. langchain/tools/reddit_search/__init__.py +0 -0
  1149. langchain/tools/reddit_search/tool.py +0 -27
  1150. langchain/tools/render.py +0 -23
  1151. langchain/tools/requests/__init__.py +0 -1
  1152. langchain/tools/requests/tool.py +0 -42
  1153. langchain/tools/retriever.py +0 -11
  1154. langchain/tools/scenexplain/__init__.py +0 -1
  1155. langchain/tools/scenexplain/tool.py +0 -28
  1156. langchain/tools/searchapi/__init__.py +0 -30
  1157. langchain/tools/searchapi/tool.py +0 -27
  1158. langchain/tools/searx_search/__init__.py +0 -0
  1159. langchain/tools/searx_search/tool.py +0 -27
  1160. langchain/tools/shell/__init__.py +0 -25
  1161. langchain/tools/shell/tool.py +0 -28
  1162. langchain/tools/slack/__init__.py +0 -38
  1163. langchain/tools/slack/base.py +0 -23
  1164. langchain/tools/slack/get_channel.py +0 -23
  1165. langchain/tools/slack/get_message.py +0 -28
  1166. langchain/tools/slack/schedule_message.py +0 -28
  1167. langchain/tools/slack/send_message.py +0 -28
  1168. langchain/tools/sleep/__init__.py +0 -1
  1169. langchain/tools/sleep/tool.py +0 -28
  1170. langchain/tools/spark_sql/__init__.py +0 -1
  1171. langchain/tools/spark_sql/tool.py +0 -39
  1172. langchain/tools/sql_database/__init__.py +0 -1
  1173. langchain/tools/sql_database/prompt.py +0 -24
  1174. langchain/tools/sql_database/tool.py +0 -39
  1175. langchain/tools/stackexchange/__init__.py +0 -1
  1176. langchain/tools/stackexchange/tool.py +0 -23
  1177. langchain/tools/steam/__init__.py +0 -1
  1178. langchain/tools/steam/tool.py +0 -23
  1179. langchain/tools/steamship_image_generation/__init__.py +0 -25
  1180. langchain/tools/steamship_image_generation/tool.py +0 -28
  1181. langchain/tools/tavily_search/__init__.py +0 -32
  1182. langchain/tools/tavily_search/tool.py +0 -33
  1183. langchain/tools/vectorstore/__init__.py +0 -1
  1184. langchain/tools/vectorstore/tool.py +0 -30
  1185. langchain/tools/wikipedia/__init__.py +0 -1
  1186. langchain/tools/wikipedia/tool.py +0 -23
  1187. langchain/tools/wolfram_alpha/__init__.py +0 -25
  1188. langchain/tools/wolfram_alpha/tool.py +0 -23
  1189. langchain/tools/yahoo_finance_news.py +0 -23
  1190. langchain/tools/youtube/__init__.py +0 -0
  1191. langchain/tools/youtube/search.py +0 -23
  1192. langchain/tools/zapier/__init__.py +0 -29
  1193. langchain/tools/zapier/tool.py +0 -49
  1194. langchain/utilities/__init__.py +0 -168
  1195. langchain/utilities/alpha_vantage.py +0 -23
  1196. langchain/utilities/anthropic.py +0 -30
  1197. langchain/utilities/apify.py +0 -23
  1198. langchain/utilities/arcee.py +0 -45
  1199. langchain/utilities/arxiv.py +0 -23
  1200. langchain/utilities/asyncio.py +0 -11
  1201. langchain/utilities/awslambda.py +0 -23
  1202. langchain/utilities/bibtex.py +0 -23
  1203. langchain/utilities/bing_search.py +0 -23
  1204. langchain/utilities/brave_search.py +0 -23
  1205. langchain/utilities/clickup.py +0 -45
  1206. langchain/utilities/dalle_image_generator.py +0 -25
  1207. langchain/utilities/dataforseo_api_search.py +0 -25
  1208. langchain/utilities/duckduckgo_search.py +0 -23
  1209. langchain/utilities/github.py +0 -23
  1210. langchain/utilities/gitlab.py +0 -23
  1211. langchain/utilities/golden_query.py +0 -23
  1212. langchain/utilities/google_finance.py +0 -23
  1213. langchain/utilities/google_jobs.py +0 -23
  1214. langchain/utilities/google_lens.py +0 -23
  1215. langchain/utilities/google_places_api.py +0 -23
  1216. langchain/utilities/google_scholar.py +0 -23
  1217. langchain/utilities/google_search.py +0 -23
  1218. langchain/utilities/google_serper.py +0 -23
  1219. langchain/utilities/google_trends.py +0 -23
  1220. langchain/utilities/graphql.py +0 -23
  1221. langchain/utilities/jira.py +0 -23
  1222. langchain/utilities/loading.py +0 -4
  1223. langchain/utilities/max_compute.py +0 -23
  1224. langchain/utilities/merriam_webster.py +0 -23
  1225. langchain/utilities/metaphor_search.py +0 -23
  1226. langchain/utilities/nasa.py +0 -23
  1227. langchain/utilities/opaqueprompts.py +0 -27
  1228. langchain/utilities/openapi.py +0 -28
  1229. langchain/utilities/openweathermap.py +0 -23
  1230. langchain/utilities/outline.py +0 -23
  1231. langchain/utilities/portkey.py +0 -23
  1232. langchain/utilities/powerbi.py +0 -23
  1233. langchain/utilities/pubmed.py +0 -23
  1234. langchain/utilities/python.py +0 -19
  1235. langchain/utilities/reddit_search.py +0 -25
  1236. langchain/utilities/redis.py +0 -33
  1237. langchain/utilities/requests.py +0 -27
  1238. langchain/utilities/scenexplain.py +0 -23
  1239. langchain/utilities/searchapi.py +0 -23
  1240. langchain/utilities/searx_search.py +0 -28
  1241. langchain/utilities/serpapi.py +0 -28
  1242. langchain/utilities/spark_sql.py +0 -23
  1243. langchain/utilities/sql_database.py +0 -28
  1244. langchain/utilities/stackexchange.py +0 -23
  1245. langchain/utilities/steam.py +0 -23
  1246. langchain/utilities/tavily_search.py +0 -25
  1247. langchain/utilities/tensorflow_datasets.py +0 -23
  1248. langchain/utilities/twilio.py +0 -23
  1249. langchain/utilities/vertexai.py +0 -36
  1250. langchain/utilities/wikipedia.py +0 -23
  1251. langchain/utilities/wolfram_alpha.py +0 -23
  1252. langchain/utilities/zapier.py +0 -23
  1253. langchain/utils/__init__.py +0 -77
  1254. langchain/utils/aiter.py +0 -3
  1255. langchain/utils/env.py +0 -3
  1256. langchain/utils/ernie_functions.py +0 -36
  1257. langchain/utils/formatting.py +0 -3
  1258. langchain/utils/html.py +0 -19
  1259. langchain/utils/input.py +0 -8
  1260. langchain/utils/iter.py +0 -3
  1261. langchain/utils/json_schema.py +0 -11
  1262. langchain/utils/loading.py +0 -3
  1263. langchain/utils/math.py +0 -32
  1264. langchain/utils/openai.py +0 -23
  1265. langchain/utils/openai_functions.py +0 -13
  1266. langchain/utils/pydantic.py +0 -3
  1267. langchain/utils/strings.py +0 -3
  1268. langchain/utils/utils.py +0 -21
  1269. langchain/vectorstores/__init__.py +0 -262
  1270. langchain/vectorstores/alibabacloud_opensearch.py +0 -30
  1271. langchain/vectorstores/analyticdb.py +0 -23
  1272. langchain/vectorstores/annoy.py +0 -23
  1273. langchain/vectorstores/astradb.py +0 -23
  1274. langchain/vectorstores/atlas.py +0 -23
  1275. langchain/vectorstores/awadb.py +0 -23
  1276. langchain/vectorstores/azure_cosmos_db.py +0 -28
  1277. langchain/vectorstores/azuresearch.py +0 -30
  1278. langchain/vectorstores/bageldb.py +0 -23
  1279. langchain/vectorstores/baiducloud_vector_search.py +0 -23
  1280. langchain/vectorstores/base.py +0 -3
  1281. langchain/vectorstores/cassandra.py +0 -23
  1282. langchain/vectorstores/chroma.py +0 -23
  1283. langchain/vectorstores/clarifai.py +0 -23
  1284. langchain/vectorstores/clickhouse.py +0 -27
  1285. langchain/vectorstores/dashvector.py +0 -23
  1286. langchain/vectorstores/databricks_vector_search.py +0 -23
  1287. langchain/vectorstores/deeplake.py +0 -23
  1288. langchain/vectorstores/dingo.py +0 -23
  1289. langchain/vectorstores/docarray/__init__.py +0 -30
  1290. langchain/vectorstores/docarray/base.py +0 -23
  1291. langchain/vectorstores/docarray/hnsw.py +0 -23
  1292. langchain/vectorstores/docarray/in_memory.py +0 -23
  1293. langchain/vectorstores/elastic_vector_search.py +0 -27
  1294. langchain/vectorstores/elasticsearch.py +0 -39
  1295. langchain/vectorstores/epsilla.py +0 -23
  1296. langchain/vectorstores/faiss.py +0 -23
  1297. langchain/vectorstores/hippo.py +0 -23
  1298. langchain/vectorstores/hologres.py +0 -23
  1299. langchain/vectorstores/lancedb.py +0 -23
  1300. langchain/vectorstores/llm_rails.py +0 -28
  1301. langchain/vectorstores/marqo.py +0 -23
  1302. langchain/vectorstores/matching_engine.py +0 -23
  1303. langchain/vectorstores/meilisearch.py +0 -23
  1304. langchain/vectorstores/milvus.py +0 -23
  1305. langchain/vectorstores/momento_vector_index.py +0 -23
  1306. langchain/vectorstores/mongodb_atlas.py +0 -23
  1307. langchain/vectorstores/myscale.py +0 -30
  1308. langchain/vectorstores/neo4j_vector.py +0 -28
  1309. langchain/vectorstores/nucliadb.py +0 -23
  1310. langchain/vectorstores/opensearch_vector_search.py +0 -23
  1311. langchain/vectorstores/pgembedding.py +0 -36
  1312. langchain/vectorstores/pgvecto_rs.py +0 -23
  1313. langchain/vectorstores/pgvector.py +0 -28
  1314. langchain/vectorstores/pinecone.py +0 -23
  1315. langchain/vectorstores/qdrant.py +0 -28
  1316. langchain/vectorstores/redis/__init__.py +0 -42
  1317. langchain/vectorstores/redis/base.py +0 -33
  1318. langchain/vectorstores/redis/filters.py +0 -48
  1319. langchain/vectorstores/redis/schema.py +0 -54
  1320. langchain/vectorstores/rocksetdb.py +0 -23
  1321. langchain/vectorstores/scann.py +0 -23
  1322. langchain/vectorstores/semadb.py +0 -23
  1323. langchain/vectorstores/singlestoredb.py +0 -23
  1324. langchain/vectorstores/sklearn.py +0 -42
  1325. langchain/vectorstores/sqlitevss.py +0 -23
  1326. langchain/vectorstores/starrocks.py +0 -28
  1327. langchain/vectorstores/supabase.py +0 -23
  1328. langchain/vectorstores/tair.py +0 -23
  1329. langchain/vectorstores/tencentvectordb.py +0 -33
  1330. langchain/vectorstores/tigris.py +0 -23
  1331. langchain/vectorstores/tiledb.py +0 -23
  1332. langchain/vectorstores/timescalevector.py +0 -23
  1333. langchain/vectorstores/typesense.py +0 -23
  1334. langchain/vectorstores/usearch.py +0 -23
  1335. langchain/vectorstores/utils.py +0 -33
  1336. langchain/vectorstores/vald.py +0 -23
  1337. langchain/vectorstores/vearch.py +0 -23
  1338. langchain/vectorstores/vectara.py +0 -28
  1339. langchain/vectorstores/vespa.py +0 -23
  1340. langchain/vectorstores/weaviate.py +0 -23
  1341. langchain/vectorstores/xata.py +0 -23
  1342. langchain/vectorstores/yellowbrick.py +0 -23
  1343. langchain/vectorstores/zep.py +0 -28
  1344. langchain/vectorstores/zilliz.py +0 -23
  1345. langchain-0.4.0.dev0.dist-info/RECORD +0 -1341
  1346. /langchain/{adapters → _internal}/__init__.py +0 -0
  1347. {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a2.dist-info}/WHEEL +0 -0
  1348. {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a2.dist-info}/entry_points.txt +0 -0
  1349. {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1174 @@
1
+ """Tool execution node for LangGraph workflows.
2
+
3
+ This module provides prebuilt functionality for executing tools in LangGraph.
4
+
5
+ Tools are functions that models can call to interact with external systems,
6
+ APIs, databases, or perform computations.
7
+
8
+ The module implements several key design patterns:
9
+ - Parallel execution of multiple tool calls for efficiency
10
+ - Robust error handling with customizable error messages
11
+ - State injection for tools that need access to graph state
12
+ - Store injection for tools that need persistent storage
13
+ - Command-based state updates for advanced control flow
14
+
15
+ Key Components:
16
+ ToolNode: Main class for executing tools in LangGraph workflows
17
+ InjectedState: Annotation for injecting graph state into tools
18
+ InjectedStore: Annotation for injecting persistent store into tools
19
+ tools_condition: Utility function for conditional routing based on tool calls
20
+
21
+ Typical Usage:
22
+ ```python
23
+ from langchain_core.tools import tool
24
+ from langchain.agents import ToolNode
25
+
26
+ @tool
27
+ def my_tool(x: int) -> str:
28
+ return f"Result: {x}"
29
+
30
+ tool_node = ToolNode([my_tool])
31
+ ```
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ import asyncio
37
+ import inspect
38
+ import json
39
+ from copy import copy, deepcopy
40
+ from dataclasses import replace
41
+ from typing import (
42
+ TYPE_CHECKING,
43
+ Annotated,
44
+ Any,
45
+ Literal,
46
+ Optional,
47
+ Union,
48
+ cast,
49
+ get_args,
50
+ get_origin,
51
+ get_type_hints,
52
+ )
53
+
54
+ from langchain_core.messages import (
55
+ AIMessage,
56
+ AnyMessage,
57
+ RemoveMessage,
58
+ ToolCall,
59
+ ToolMessage,
60
+ convert_to_messages,
61
+ )
62
+ from langchain_core.runnables.config import (
63
+ get_config_list,
64
+ get_executor_for_config,
65
+ )
66
+ from langchain_core.tools import BaseTool, InjectedToolArg
67
+ from langchain_core.tools import tool as create_tool
68
+ from langchain_core.tools.base import (
69
+ TOOL_MESSAGE_BLOCK_TYPES,
70
+ get_all_basemodel_annotations,
71
+ )
72
+ from langgraph._internal._runnable import RunnableCallable
73
+ from langgraph.errors import GraphBubbleUp
74
+ from langgraph.graph.message import REMOVE_ALL_MESSAGES
75
+ from langgraph.types import Command, Send
76
+ from pydantic import BaseModel, ValidationError
77
+
78
+ if TYPE_CHECKING:
79
+ from collections.abc import Callable, Sequence
80
+
81
+ from langchain_core.runnables import RunnableConfig
82
+ from langgraph.store.base import BaseStore
83
+
84
+ INVALID_TOOL_NAME_ERROR_TEMPLATE = (
85
+ "Error: {requested_tool} is not a valid tool, try one of [{available_tools}]."
86
+ )
87
+ TOOL_CALL_ERROR_TEMPLATE = "Error: {error}\n Please fix your mistakes."
88
+ TOOL_EXECUTION_ERROR_TEMPLATE = "Error executing tool '{tool_name}' with kwargs {tool_kwargs} with error:\n {error}\n Please fix the error and try again."
89
+ TOOL_INVOCATION_ERROR_TEMPLATE = "Error invoking tool '{tool_name}' with kwargs {tool_kwargs} with error:\n {error}\n Please fix the error and try again."
90
+
91
+
92
+ def msg_content_output(output: Any) -> Union[str, list[dict]]:
93
+ """Convert tool output to valid message content format.
94
+
95
+ LangChain ToolMessages accept either string content or a list of content blocks.
96
+ This function ensures tool outputs are properly formatted for message consumption
97
+ by attempting to preserve structured data when possible, falling back to JSON
98
+ serialization or string conversion.
99
+
100
+ Args:
101
+ output: The raw output from a tool execution. Can be any type.
102
+
103
+ Returns:
104
+ Either a string representation of the output or a list of content blocks
105
+ if the output is already in the correct format for structured content.
106
+
107
+ Note:
108
+ This function prioritizes backward compatibility by defaulting to JSON
109
+ serialization rather than supporting all possible message content formats.
110
+ """
111
+ if isinstance(output, str) or (
112
+ isinstance(output, list)
113
+ and all(isinstance(x, dict) and x.get("type") in TOOL_MESSAGE_BLOCK_TYPES for x in output)
114
+ ):
115
+ return output
116
+ # Technically a list of strings is also valid message content, but it's
117
+ # not currently well tested that all chat models support this.
118
+ # And for backwards compatibility we want to make sure we don't break
119
+ # any existing ToolNode usage.
120
+ try:
121
+ return json.dumps(output, ensure_ascii=False)
122
+ except Exception: # noqa: BLE001
123
+ return str(output)
124
+
125
+
126
+ class ToolInvocationError(Exception):
127
+ """Exception raised when a tool invocation fails due to invalid arguments."""
128
+
129
+ def __init__(
130
+ self, tool_name: str, source: ValidationError, tool_kwargs: dict[str, Any]
131
+ ) -> None:
132
+ """Initialize the ToolInvocationError.
133
+
134
+ Args:
135
+ tool_name: The name of the tool that failed.
136
+ source: The exception that occurred.
137
+ tool_kwargs: The keyword arguments that were passed to the tool.
138
+ """
139
+ self.message = TOOL_INVOCATION_ERROR_TEMPLATE.format(
140
+ tool_name=tool_name, tool_kwargs=tool_kwargs, error=source
141
+ )
142
+ self.tool_name = tool_name
143
+ self.tool_kwargs = tool_kwargs
144
+ self.source = source
145
+ super().__init__(self.message)
146
+
147
+
148
+ def _default_handle_tool_errors(e: Exception) -> str:
149
+ """Default error handler for tool errors.
150
+
151
+ If the tool is a tool invocation error, return its message.
152
+ Otherwise, raise the error.
153
+ """
154
+ if isinstance(e, ToolInvocationError):
155
+ return e.message
156
+ raise e
157
+
158
+
159
+ def _handle_tool_error(
160
+ e: Exception,
161
+ *,
162
+ flag: Union[
163
+ bool,
164
+ str,
165
+ Callable[..., str],
166
+ type[Exception],
167
+ tuple[type[Exception], ...],
168
+ ],
169
+ ) -> str:
170
+ """Generate error message content based on exception handling configuration.
171
+
172
+ This function centralizes error message generation logic, supporting different
173
+ error handling strategies configured via the ToolNode's handle_tool_errors
174
+ parameter.
175
+
176
+ Args:
177
+ e: The exception that occurred during tool execution.
178
+ flag: Configuration for how to handle the error. Can be:
179
+ - bool: If True, use default error template
180
+ - str: Use this string as the error message
181
+ - Callable: Call this function with the exception to get error message
182
+ - tuple: Not used in this context (handled by caller)
183
+
184
+ Returns:
185
+ A string containing the error message to include in the ToolMessage.
186
+
187
+ Raises:
188
+ ValueError: If flag is not one of the supported types.
189
+
190
+ Note:
191
+ The tuple case is handled by the caller through exception type checking,
192
+ not by this function directly.
193
+ """
194
+ if isinstance(flag, (bool, tuple)) or (isinstance(flag, type) and issubclass(flag, Exception)):
195
+ content = TOOL_CALL_ERROR_TEMPLATE.format(error=repr(e))
196
+ elif isinstance(flag, str):
197
+ content = flag
198
+ elif callable(flag):
199
+ content = flag(e) # type: ignore [assignment, call-arg]
200
+ else:
201
+ msg = (
202
+ f"Got unexpected type of `handle_tool_error`. Expected bool, str "
203
+ f"or callable. Received: {flag}"
204
+ )
205
+ raise ValueError(msg)
206
+ return content
207
+
208
+
209
+ def _infer_handled_types(handler: Callable[..., str]) -> tuple[type[Exception], ...]:
210
+ """Infer exception types handled by a custom error handler function.
211
+
212
+ This function analyzes the type annotations of a custom error handler to determine
213
+ which exception types it's designed to handle. This enables type-safe error handling
214
+ where only specific exceptions are caught and processed by the handler.
215
+
216
+ Args:
217
+ handler: A callable that takes an exception and returns an error message string.
218
+ The first parameter (after self/cls if present) should be type-annotated
219
+ with the exception type(s) to handle.
220
+
221
+ Returns:
222
+ A tuple of exception types that the handler can process. Returns (Exception,)
223
+ if no specific type information is available for backward compatibility.
224
+
225
+ Raises:
226
+ ValueError: If the handler's annotation contains non-Exception types or
227
+ if Union types contain non-Exception types.
228
+
229
+ Note:
230
+ This function supports both single exception types and Union types for
231
+ handlers that need to handle multiple exception types differently.
232
+ """
233
+ sig = inspect.signature(handler)
234
+ params = list(sig.parameters.values())
235
+ if params:
236
+ # If it's a method, the first argument is typically 'self' or 'cls'
237
+ if params[0].name in ["self", "cls"] and len(params) == 2:
238
+ first_param = params[1]
239
+ else:
240
+ first_param = params[0]
241
+
242
+ type_hints = get_type_hints(handler)
243
+ if first_param.name in type_hints:
244
+ origin = get_origin(first_param.annotation)
245
+ if origin is Union:
246
+ args = get_args(first_param.annotation)
247
+ if all(issubclass(arg, Exception) for arg in args):
248
+ return tuple(args)
249
+ msg = (
250
+ "All types in the error handler error annotation must be "
251
+ "Exception types. For example, "
252
+ "`def custom_handler(e: Union[ValueError, TypeError])`. "
253
+ f"Got '{first_param.annotation}' instead."
254
+ )
255
+ raise ValueError(msg)
256
+
257
+ exception_type = type_hints[first_param.name]
258
+ if Exception in exception_type.__mro__:
259
+ return (exception_type,)
260
+ msg = (
261
+ f"Arbitrary types are not supported in the error handler "
262
+ f"signature. Please annotate the error with either a "
263
+ f"specific Exception type or a union of Exception types. "
264
+ "For example, `def custom_handler(e: ValueError)` or "
265
+ "`def custom_handler(e: Union[ValueError, TypeError])`. "
266
+ f"Got '{exception_type}' instead."
267
+ )
268
+ raise ValueError(msg)
269
+
270
+ # If no type information is available, return (Exception,)
271
+ # for backwards compatibility.
272
+ return (Exception,)
273
+
274
+
275
+ class ToolNode(RunnableCallable):
276
+ """A node for executing tools in LangGraph workflows.
277
+
278
+ Handles tool execution patterns including function calls, state injection,
279
+ persistent storage, and control flow. Manages parallel execution,
280
+ error handling.
281
+
282
+ Input Formats:
283
+ 1. Graph state with `messages` key that has a list of messages:
284
+ - Common representation for agentic workflows
285
+ - Supports custom messages key via ``messages_key`` parameter
286
+
287
+ 2. **Message List**: ``[AIMessage(..., tool_calls=[...])]``
288
+ - List of messages with tool calls in the last AIMessage
289
+
290
+ 3. **Direct Tool Calls**: ``[{"name": "tool", "args": {...}, "id": "1", "type": "tool_call"}]``
291
+ - Bypasses message parsing for direct tool execution
292
+ - For programmatic tool invocation and testing
293
+
294
+ Output Formats:
295
+ Output format depends on input type and tool behavior:
296
+
297
+ **For Regular tools**:
298
+ - Dict input → ``{"messages": [ToolMessage(...)]}``
299
+ - List input → ``[ToolMessage(...)]``
300
+
301
+ **For Command tools**:
302
+ - Returns ``[Command(...)]`` or mixed list with regular tool outputs
303
+ - Commands can update state, trigger navigation, or send messages
304
+
305
+ Args:
306
+ tools: A sequence of tools that can be invoked by this node. Supports:
307
+ - **BaseTool instances**: Tools with schemas and metadata
308
+ - **Plain functions**: Automatically converted to tools with inferred schemas
309
+ name: The name identifier for this node in the graph. Used for debugging
310
+ and visualization. Defaults to "tools".
311
+ tags: Optional metadata tags to associate with the node for filtering
312
+ and organization. Defaults to None.
313
+ handle_tool_errors: Configuration for error handling during tool execution.
314
+ Supports multiple strategies:
315
+
316
+ - **True**: Catch all errors and return a ToolMessage with the default
317
+ error template containing the exception details.
318
+ - **str**: Catch all errors and return a ToolMessage with this custom
319
+ error message string.
320
+ - **type[Exception]**: Only catch exceptions with the specified type and return the default error message for it.
321
+ - **tuple[type[Exception], ...]**: Only catch exceptions with the specified
322
+ types and return default error messages for them.
323
+ - **Callable[..., str]**: Catch exceptions matching the callable's signature
324
+ and return the string result of calling it with the exception.
325
+ - **False**: Disable error handling entirely, allowing exceptions to
326
+ propagate.
327
+
328
+ Defaults to a callable that:
329
+ - catches tool invocation errors (due to invalid arguments provided by the model) and returns a descriptive error message
330
+ - ignores tool execution errors (they will be re-raised)
331
+
332
+ messages_key: The key in the state dictionary that contains the message list.
333
+ This same key will be used for the output ToolMessages.
334
+ Defaults to "messages".
335
+ Allows custom state schemas with different message field names.
336
+
337
+ Examples:
338
+ Basic usage:
339
+
340
+ ```python
341
+ from langchain.agents import ToolNode
342
+ from langchain_core.tools import tool
343
+
344
+ @tool
345
+ def calculator(a: int, b: int) -> int:
346
+ \"\"\"Add two numbers.\"\"\"
347
+ return a + b
348
+
349
+ tool_node = ToolNode([calculator])
350
+ ```
351
+
352
+ State injection:
353
+
354
+ ```python
355
+ from typing_extensions import Annotated
356
+ from langgraph.agents.tool_node import InjectedState
357
+
358
+ @tool
359
+ def context_tool(query: str, state: Annotated[dict, InjectedState]) -> str:
360
+ \"\"\"Some tool that uses state.\"\"\"
361
+ return f"Query: {query}, Messages: {len(state['messages'])}"
362
+
363
+ tool_node = ToolNode([context_tool])
364
+ ```
365
+
366
+ Error handling:
367
+
368
+ ```python
369
+ def handle_errors(e: ValueError) -> str:
370
+ return "Invalid input provided"
371
+
372
+ tool_node = ToolNode([my_tool], handle_tool_errors=handle_errors)
373
+ ```
374
+ """
375
+
376
+ name: str = "tools"
377
+
378
+ def __init__(
379
+ self,
380
+ tools: Sequence[Union[BaseTool, Callable]],
381
+ *,
382
+ name: str = "tools",
383
+ tags: list[str] | None = None,
384
+ handle_tool_errors: Union[
385
+ bool, str, Callable[..., str], type[Exception], tuple[type[Exception], ...]
386
+ ] = _default_handle_tool_errors,
387
+ messages_key: str = "messages",
388
+ ) -> None:
389
+ """Initialize the ToolNode with the provided tools and configuration.
390
+
391
+ Args:
392
+ tools: Sequence of tools to make available for execution.
393
+ name: Node name for graph identification.
394
+ tags: Optional metadata tags.
395
+ handle_tool_errors: Error handling configuration.
396
+ messages_key: State key containing messages.
397
+ """
398
+ super().__init__(self._func, self._afunc, name=name, tags=tags, trace=False)
399
+ self._tools_by_name: dict[str, BaseTool] = {}
400
+ self._tool_to_state_args: dict[str, dict[str, str | None]] = {}
401
+ self._tool_to_store_arg: dict[str, str | None] = {}
402
+ self._handle_tool_errors = handle_tool_errors
403
+ self._messages_key = messages_key
404
+ for tool in tools:
405
+ if not isinstance(tool, BaseTool):
406
+ tool_ = create_tool(cast("type[BaseTool]", tool))
407
+ else:
408
+ tool_ = tool
409
+ self._tools_by_name[tool_.name] = tool_
410
+ self._tool_to_state_args[tool_.name] = _get_state_args(tool_)
411
+ self._tool_to_store_arg[tool_.name] = _get_store_arg(tool_)
412
+
413
+ @property
414
+ def tools_by_name(self) -> dict[str, BaseTool]:
415
+ """Mapping from tool name to BaseTool instance."""
416
+ return self._tools_by_name
417
+
418
+ def _func(
419
+ self,
420
+ input: Union[
421
+ list[AnyMessage],
422
+ dict[str, Any],
423
+ BaseModel,
424
+ ],
425
+ config: RunnableConfig,
426
+ *,
427
+ store: Optional[BaseStore], # noqa: UP045
428
+ ) -> Any:
429
+ tool_calls, input_type = self._parse_input(input, store)
430
+ config_list = get_config_list(config, len(tool_calls))
431
+ input_types = [input_type] * len(tool_calls)
432
+ with get_executor_for_config(config) as executor:
433
+ outputs = [*executor.map(self._run_one, tool_calls, input_types, config_list)]
434
+
435
+ return self._combine_tool_outputs(outputs, input_type)
436
+
437
+ async def _afunc(
438
+ self,
439
+ input: Union[
440
+ list[AnyMessage],
441
+ dict[str, Any],
442
+ BaseModel,
443
+ ],
444
+ config: RunnableConfig,
445
+ *,
446
+ store: Optional[BaseStore], # noqa: UP045
447
+ ) -> Any:
448
+ tool_calls, input_type = self._parse_input(input, store)
449
+ outputs = await asyncio.gather(
450
+ *(self._arun_one(call, input_type, config) for call in tool_calls)
451
+ )
452
+
453
+ return self._combine_tool_outputs(outputs, input_type)
454
+
455
+ def _combine_tool_outputs(
456
+ self,
457
+ outputs: list[Union[ToolMessage, Command]],
458
+ input_type: Literal["list", "dict", "tool_calls"],
459
+ ) -> list[Union[Command, list[ToolMessage], dict[str, list[ToolMessage]]]]:
460
+ # preserve existing behavior for non-command tool outputs for backwards
461
+ # compatibility
462
+ if not any(isinstance(output, Command) for output in outputs):
463
+ # TypedDict, pydantic, dataclass, etc. should all be able to load from dict
464
+ return outputs if input_type == "list" else {self._messages_key: outputs} # type: ignore[return-value, return-value]
465
+
466
+ # LangGraph will automatically handle list of Command and non-command node
467
+ # updates
468
+ combined_outputs: list[Command | list[ToolMessage] | dict[str, list[ToolMessage]]] = []
469
+
470
+ # combine all parent commands with goto into a single parent command
471
+ parent_command: Command | None = None
472
+ for output in outputs:
473
+ if isinstance(output, Command):
474
+ if (
475
+ output.graph is Command.PARENT
476
+ and isinstance(output.goto, list)
477
+ and all(isinstance(send, Send) for send in output.goto)
478
+ ):
479
+ if parent_command:
480
+ parent_command = replace(
481
+ parent_command,
482
+ goto=cast("list[Send]", parent_command.goto) + output.goto,
483
+ )
484
+ else:
485
+ parent_command = Command(graph=Command.PARENT, goto=output.goto)
486
+ else:
487
+ combined_outputs.append(output)
488
+ else:
489
+ combined_outputs.append(
490
+ [output] if input_type == "list" else {self._messages_key: [output]}
491
+ )
492
+
493
+ if parent_command:
494
+ combined_outputs.append(parent_command)
495
+ return combined_outputs
496
+
497
+ def _run_one(
498
+ self,
499
+ call: ToolCall,
500
+ input_type: Literal["list", "dict", "tool_calls"],
501
+ config: RunnableConfig,
502
+ ) -> Union[ToolMessage, Command]:
503
+ """Run a single tool call synchronously."""
504
+ if invalid_tool_message := self._validate_tool_call(call):
505
+ return invalid_tool_message
506
+
507
+ try:
508
+ call_args = {**call, "type": "tool_call"}
509
+ tool = self.tools_by_name[call["name"]]
510
+
511
+ try:
512
+ response = tool.invoke(call_args, config)
513
+ except ValidationError as exc:
514
+ raise ToolInvocationError(call["name"], exc, call["args"]) from exc
515
+
516
+ # GraphInterrupt is a special exception that will always be raised.
517
+ # It can be triggered in the following scenarios,
518
+ # Where GraphInterrupt(GraphBubbleUp) is raised from an `interrupt` invocation most commonly:
519
+ # (1) a GraphInterrupt is raised inside a tool
520
+ # (2) a GraphInterrupt is raised inside a graph node for a graph called as a tool
521
+ # (3) a GraphInterrupt is raised when a subgraph is interrupted inside a graph called as a tool
522
+ # (2 and 3 can happen in a "supervisor w/ tools" multi-agent architecture)
523
+ except GraphBubbleUp:
524
+ raise
525
+ except Exception as e:
526
+ handled_types: tuple[type[Exception], ...]
527
+ if isinstance(self._handle_tool_errors, type) and issubclass(
528
+ self._handle_tool_errors, Exception
529
+ ):
530
+ handled_types = (self._handle_tool_errors,)
531
+ elif isinstance(self._handle_tool_errors, tuple):
532
+ handled_types = self._handle_tool_errors
533
+ elif callable(self._handle_tool_errors) and not isinstance(
534
+ self._handle_tool_errors, type
535
+ ):
536
+ handled_types = _infer_handled_types(self._handle_tool_errors)
537
+ else:
538
+ # default behavior is catching all exceptions
539
+ handled_types = (Exception,)
540
+
541
+ # Unhandled
542
+ if not self._handle_tool_errors or not isinstance(e, handled_types):
543
+ raise
544
+ # Handled
545
+ content = _handle_tool_error(e, flag=self._handle_tool_errors)
546
+ return ToolMessage(
547
+ content=content,
548
+ name=call["name"],
549
+ tool_call_id=call["id"],
550
+ status="error",
551
+ )
552
+
553
+ if isinstance(response, Command):
554
+ return self._validate_tool_command(response, call, input_type)
555
+ if isinstance(response, ToolMessage):
556
+ response.content = cast("Union[str, list]", msg_content_output(response.content))
557
+ return response
558
+ msg = f"Tool {call['name']} returned unexpected type: {type(response)}"
559
+ raise TypeError(msg)
560
+
561
+ async def _arun_one(
562
+ self,
563
+ call: ToolCall,
564
+ input_type: Literal["list", "dict", "tool_calls"],
565
+ config: RunnableConfig,
566
+ ) -> Union[ToolMessage, Command]:
567
+ """Run a single tool call asynchronously."""
568
+ if invalid_tool_message := self._validate_tool_call(call):
569
+ return invalid_tool_message
570
+
571
+ try:
572
+ call_args = {**call, "type": "tool_call"}
573
+ tool = self.tools_by_name[call["name"]]
574
+
575
+ try:
576
+ response = await tool.ainvoke(call_args, config)
577
+ except ValidationError as exc:
578
+ raise ToolInvocationError(call["name"], exc, call["args"]) from exc
579
+
580
+ # GraphInterrupt is a special exception that will always be raised.
581
+ # It can be triggered in the following scenarios,
582
+ # Where GraphInterrupt(GraphBubbleUp) is raised from an `interrupt` invocation most commonly:
583
+ # (1) a GraphInterrupt is raised inside a tool
584
+ # (2) a GraphInterrupt is raised inside a graph node for a graph called as a tool
585
+ # (3) a GraphInterrupt is raised when a subgraph is interrupted inside a graph called as a tool
586
+ # (2 and 3 can happen in a "supervisor w/ tools" multi-agent architecture)
587
+ except GraphBubbleUp:
588
+ raise
589
+ except Exception as e:
590
+ handled_types: tuple[type[Exception], ...]
591
+ if isinstance(self._handle_tool_errors, type) and issubclass(
592
+ self._handle_tool_errors, Exception
593
+ ):
594
+ handled_types = (self._handle_tool_errors,)
595
+ elif isinstance(self._handle_tool_errors, tuple):
596
+ handled_types = self._handle_tool_errors
597
+ elif callable(self._handle_tool_errors) and not isinstance(
598
+ self._handle_tool_errors, type
599
+ ):
600
+ handled_types = _infer_handled_types(self._handle_tool_errors)
601
+ else:
602
+ # default behavior is catching all exceptions
603
+ handled_types = (Exception,)
604
+
605
+ # Unhandled
606
+ if not self._handle_tool_errors or not isinstance(e, handled_types):
607
+ raise
608
+ # Handled
609
+ content = _handle_tool_error(e, flag=self._handle_tool_errors)
610
+
611
+ return ToolMessage(
612
+ content=content,
613
+ name=call["name"],
614
+ tool_call_id=call["id"],
615
+ status="error",
616
+ )
617
+
618
+ if isinstance(response, Command):
619
+ return self._validate_tool_command(response, call, input_type)
620
+ if isinstance(response, ToolMessage):
621
+ response.content = cast("Union[str, list]", msg_content_output(response.content))
622
+ return response
623
+ msg = f"Tool {call['name']} returned unexpected type: {type(response)}"
624
+ raise TypeError(msg)
625
+
626
+ def _parse_input(
627
+ self,
628
+ input: Union[
629
+ list[AnyMessage],
630
+ dict[str, Any],
631
+ BaseModel,
632
+ ],
633
+ store: BaseStore | None,
634
+ ) -> tuple[list[ToolCall], Literal["list", "dict", "tool_calls"]]:
635
+ input_type: Literal["list", "dict", "tool_calls"]
636
+ if isinstance(input, list):
637
+ if isinstance(input[-1], dict) and input[-1].get("type") == "tool_call":
638
+ input_type = "tool_calls"
639
+ tool_calls = cast("list[ToolCall]", input)
640
+ return tool_calls, input_type
641
+ input_type = "list"
642
+ messages = input
643
+ elif isinstance(input, dict) and (messages := input.get(self._messages_key, [])):
644
+ input_type = "dict"
645
+ elif messages := getattr(input, self._messages_key, []):
646
+ # Assume dataclass-like state that can coerce from dict
647
+ input_type = "dict"
648
+ else:
649
+ msg = "No message found in input"
650
+ raise ValueError(msg)
651
+
652
+ try:
653
+ latest_ai_message = next(m for m in reversed(messages) if isinstance(m, AIMessage))
654
+ except StopIteration:
655
+ msg = "No AIMessage found in input"
656
+ raise ValueError(msg)
657
+
658
+ tool_calls = [
659
+ self.inject_tool_args(call, input, store) for call in latest_ai_message.tool_calls
660
+ ]
661
+ return tool_calls, input_type
662
+
663
+ def _validate_tool_call(self, call: ToolCall) -> ToolMessage | None:
664
+ requested_tool = call["name"]
665
+ if requested_tool not in self.tools_by_name:
666
+ all_tool_names = list(self.tools_by_name.keys())
667
+ content = INVALID_TOOL_NAME_ERROR_TEMPLATE.format(
668
+ requested_tool=requested_tool,
669
+ available_tools=", ".join(all_tool_names),
670
+ )
671
+ return ToolMessage(
672
+ content, name=requested_tool, tool_call_id=call["id"], status="error"
673
+ )
674
+ return None
675
+
676
+ def _inject_state(
677
+ self,
678
+ tool_call: ToolCall,
679
+ input: Union[
680
+ list[AnyMessage],
681
+ dict[str, Any],
682
+ BaseModel,
683
+ ],
684
+ ) -> ToolCall:
685
+ state_args = self._tool_to_state_args[tool_call["name"]]
686
+ if state_args and isinstance(input, list):
687
+ required_fields = list(state_args.values())
688
+ if (
689
+ len(required_fields) == 1 and required_fields[0] == self._messages_key
690
+ ) or required_fields[0] is None:
691
+ input = {self._messages_key: input}
692
+ else:
693
+ err_msg = (
694
+ f"Invalid input to ToolNode. Tool {tool_call['name']} requires "
695
+ f"graph state dict as input."
696
+ )
697
+ if any(state_field for state_field in state_args.values()):
698
+ required_fields_str = ", ".join(f for f in required_fields if f)
699
+ err_msg += f" State should contain fields {required_fields_str}."
700
+ raise ValueError(err_msg)
701
+
702
+ if isinstance(input, dict):
703
+ tool_state_args = {
704
+ tool_arg: input[state_field] if state_field else input
705
+ for tool_arg, state_field in state_args.items()
706
+ }
707
+ else:
708
+ tool_state_args = {
709
+ tool_arg: getattr(input, state_field) if state_field else input
710
+ for tool_arg, state_field in state_args.items()
711
+ }
712
+
713
+ tool_call["args"] = {
714
+ **tool_call["args"],
715
+ **tool_state_args,
716
+ }
717
+ return tool_call
718
+
719
+ def _inject_store(self, tool_call: ToolCall, store: BaseStore | None) -> ToolCall:
720
+ store_arg = self._tool_to_store_arg[tool_call["name"]]
721
+ if not store_arg:
722
+ return tool_call
723
+
724
+ if store is None:
725
+ msg = (
726
+ "Cannot inject store into tools with InjectedStore annotations - "
727
+ "please compile your graph with a store."
728
+ )
729
+ raise ValueError(msg)
730
+
731
+ tool_call["args"] = {
732
+ **tool_call["args"],
733
+ store_arg: store,
734
+ }
735
+ return tool_call
736
+
737
+ def inject_tool_args(
738
+ self,
739
+ tool_call: ToolCall,
740
+ input: Union[
741
+ list[AnyMessage],
742
+ dict[str, Any],
743
+ BaseModel,
744
+ ],
745
+ store: BaseStore | None,
746
+ ) -> ToolCall:
747
+ """Inject graph state and store into tool call arguments.
748
+
749
+ This method enables tools to access graph context that should not be controlled
750
+ by the model. Tools can declare dependencies on graph state or persistent storage
751
+ using InjectedState and InjectedStore annotations. This method automatically
752
+ identifies these dependencies and injects the appropriate values.
753
+
754
+ The injection process preserves the original tool call structure while adding
755
+ the necessary context arguments. This allows tools to be both model-callable
756
+ and context-aware without exposing internal state management to the model.
757
+
758
+ Args:
759
+ tool_call: The tool call dictionary to augment with injected arguments.
760
+ Must contain 'name', 'args', 'id', and 'type' fields.
761
+ input: The current graph state to inject into tools requiring state access.
762
+ Can be a message list, state dictionary, or BaseModel instance.
763
+ store: The persistent store instance to inject into tools requiring storage.
764
+ Will be None if no store is configured for the graph.
765
+
766
+ Returns:
767
+ A new ToolCall dictionary with the same structure as the input but with
768
+ additional arguments injected based on the tool's annotation requirements.
769
+
770
+ Raises:
771
+ ValueError: If a tool requires store injection but no store is provided,
772
+ or if state injection requirements cannot be satisfied.
773
+
774
+ Note:
775
+ This method is automatically called during tool execution but can also
776
+ be used manually when working with the Send API or custom routing logic.
777
+ The injection is performed on a copy of the tool call to avoid mutating
778
+ the original.
779
+ """
780
+ if tool_call["name"] not in self.tools_by_name:
781
+ return tool_call
782
+
783
+ tool_call_copy: ToolCall = copy(tool_call)
784
+ tool_call_with_state = self._inject_state(tool_call_copy, input)
785
+ return self._inject_store(tool_call_with_state, store)
786
+
787
+ def _validate_tool_command(
788
+ self,
789
+ command: Command,
790
+ call: ToolCall,
791
+ input_type: Literal["list", "dict", "tool_calls"],
792
+ ) -> Command:
793
+ if isinstance(command.update, dict):
794
+ # input type is dict when ToolNode is invoked with a dict input (e.g. {"messages": [AIMessage(..., tool_calls=[...])]})
795
+ if input_type not in ("dict", "tool_calls"):
796
+ msg = (
797
+ f"Tools can provide a dict in Command.update only when using dict with '{self._messages_key}' key as ToolNode input, "
798
+ f"got: {command.update} for tool '{call['name']}'"
799
+ )
800
+ raise ValueError(msg)
801
+
802
+ updated_command = deepcopy(command)
803
+ state_update = cast("dict[str, Any]", updated_command.update) or {}
804
+ messages_update = state_update.get(self._messages_key, [])
805
+ elif isinstance(command.update, list):
806
+ # Input type is list when ToolNode is invoked with a list input (e.g. [AIMessage(..., tool_calls=[...])])
807
+ if input_type != "list":
808
+ msg = (
809
+ f"Tools can provide a list of messages in Command.update only when using list of messages as ToolNode input, "
810
+ f"got: {command.update} for tool '{call['name']}'"
811
+ )
812
+ raise ValueError(msg)
813
+
814
+ updated_command = deepcopy(command)
815
+ messages_update = updated_command.update
816
+ else:
817
+ return command
818
+
819
+ # convert to message objects if updates are in a dict format
820
+ messages_update = convert_to_messages(messages_update)
821
+
822
+ # no validation needed if all messages are being removed
823
+ if messages_update == [RemoveMessage(id=REMOVE_ALL_MESSAGES)]:
824
+ return updated_command
825
+
826
+ has_matching_tool_message = False
827
+ for message in messages_update:
828
+ if not isinstance(message, ToolMessage):
829
+ continue
830
+
831
+ if message.tool_call_id == call["id"]:
832
+ message.name = call["name"]
833
+ has_matching_tool_message = True
834
+
835
+ # validate that we always have a ToolMessage matching the tool call in
836
+ # Command.update if command is sent to the CURRENT graph
837
+ if updated_command.graph is None and not has_matching_tool_message:
838
+ example_update = (
839
+ '`Command(update={"messages": [ToolMessage("Success", tool_call_id=tool_call_id), ...]}, ...)`'
840
+ if input_type == "dict"
841
+ else '`Command(update=[ToolMessage("Success", tool_call_id=tool_call_id), ...], ...)`'
842
+ )
843
+ msg = (
844
+ f"Expected to have a matching ToolMessage in Command.update for tool '{call['name']}', got: {messages_update}. "
845
+ "Every tool call (LLM requesting to call a tool) in the message history MUST have a corresponding ToolMessage. "
846
+ f"You can fix it by modifying the tool to return {example_update}."
847
+ )
848
+ raise ValueError(msg)
849
+ return updated_command
850
+
851
+
852
+ def tools_condition(
853
+ state: Union[list[AnyMessage], dict[str, Any], BaseModel],
854
+ messages_key: str = "messages",
855
+ ) -> Literal["tools", "__end__"]:
856
+ """Conditional routing function for tool-calling workflows.
857
+
858
+ This utility function implements the standard conditional logic for ReAct-style
859
+ agents: if the last AI message contains tool calls, route to the tool execution
860
+ node; otherwise, end the workflow. This pattern is fundamental to most tool-calling
861
+ agent architectures.
862
+
863
+ The function handles multiple state formats commonly used in LangGraph applications,
864
+ making it flexible for different graph designs while maintaining consistent behavior.
865
+
866
+ Args:
867
+ state: The current graph state to examine for tool calls. Supported formats:
868
+ - Dictionary containing a messages key (for StateGraph)
869
+ - BaseModel instance with a messages attribute
870
+ messages_key: The key or attribute name containing the message list in the state.
871
+ This allows customization for graphs using different state schemas.
872
+ Defaults to "messages".
873
+
874
+ Returns:
875
+ Either "tools" if tool calls are present in the last AI message, or "__end__"
876
+ to terminate the workflow. These are the standard routing destinations for
877
+ tool-calling conditional edges.
878
+
879
+ Raises:
880
+ ValueError: If no messages can be found in the provided state format.
881
+
882
+ Example:
883
+ Basic usage in a ReAct agent:
884
+
885
+ ```python
886
+ from langgraph.graph import StateGraph
887
+ from langgraph.agents.tool_node import ToolNode, tools_condition
888
+ from typing_extensions import TypedDict
889
+
890
+ class State(TypedDict):
891
+ messages: list
892
+
893
+ graph = StateGraph(State)
894
+ graph.add_node("llm", call_model)
895
+ graph.add_node("tools", ToolNode([my_tool]))
896
+ graph.add_conditional_edges(
897
+ "llm",
898
+ tools_condition, # Routes to "tools" or "__end__"
899
+ {"tools": "tools", "__end__": "__end__"}
900
+ )
901
+ ```
902
+
903
+ Custom messages key:
904
+
905
+ ```python
906
+ def custom_condition(state):
907
+ return tools_condition(state, messages_key="chat_history")
908
+ ```
909
+
910
+ Note:
911
+ This function is designed to work seamlessly with ToolNode and standard
912
+ LangGraph patterns. It expects the last message to be an AIMessage when
913
+ tool calls are present, which is the standard output format for tool-calling
914
+ language models.
915
+ """
916
+ if isinstance(state, list):
917
+ ai_message = state[-1]
918
+ elif (isinstance(state, dict) and (messages := state.get(messages_key, []))) or (
919
+ messages := getattr(state, messages_key, [])
920
+ ):
921
+ ai_message = messages[-1]
922
+ else:
923
+ msg = f"No messages found in input state to tool_edge: {state}"
924
+ raise ValueError(msg)
925
+ if hasattr(ai_message, "tool_calls") and len(ai_message.tool_calls) > 0:
926
+ return "tools"
927
+ return "__end__"
928
+
929
+
930
+ class InjectedState(InjectedToolArg):
931
+ """Annotation for injecting graph state into tool arguments.
932
+
933
+ This annotation enables tools to access graph state without exposing state
934
+ management details to the language model. Tools annotated with InjectedState
935
+ receive state data automatically during execution while remaining invisible
936
+ to the model's tool-calling interface.
937
+
938
+ Args:
939
+ field: Optional key to extract from the state dictionary. If None, the entire
940
+ state is injected. If specified, only that field's value is injected.
941
+ This allows tools to request specific state components rather than
942
+ processing the full state structure.
943
+
944
+ Example:
945
+ ```python
946
+ from typing import List
947
+ from typing_extensions import Annotated, TypedDict
948
+
949
+ from langchain_core.messages import BaseMessage, AIMessage
950
+ from langchain_core.tools import tool
951
+
952
+ from langgraph.agents.tool_node import InjectedState, ToolNode
953
+
954
+
955
+ class AgentState(TypedDict):
956
+ messages: List[BaseMessage]
957
+ foo: str
958
+
959
+ @tool
960
+ def state_tool(x: int, state: Annotated[dict, InjectedState]) -> str:
961
+ '''Do something with state.'''
962
+ if len(state["messages"]) > 2:
963
+ return state["foo"] + str(x)
964
+ else:
965
+ return "not enough messages"
966
+
967
+ @tool
968
+ def foo_tool(x: int, foo: Annotated[str, InjectedState("foo")]) -> str:
969
+ '''Do something else with state.'''
970
+ return foo + str(x + 1)
971
+
972
+ node = ToolNode([state_tool, foo_tool])
973
+
974
+ tool_call1 = {"name": "state_tool", "args": {"x": 1}, "id": "1", "type": "tool_call"}
975
+ tool_call2 = {"name": "foo_tool", "args": {"x": 1}, "id": "2", "type": "tool_call"}
976
+ state = {
977
+ "messages": [AIMessage("", tool_calls=[tool_call1, tool_call2])],
978
+ "foo": "bar",
979
+ }
980
+ node.invoke(state)
981
+ ```
982
+
983
+ ```pycon
984
+ [
985
+ ToolMessage(content='not enough messages', name='state_tool', tool_call_id='1'),
986
+ ToolMessage(content='bar2', name='foo_tool', tool_call_id='2')
987
+ ]
988
+ ```
989
+
990
+ Note:
991
+ - InjectedState arguments are automatically excluded from tool schemas
992
+ presented to language models
993
+ - ToolNode handles the injection process during execution
994
+ - Tools can mix regular arguments (controlled by the model) with injected
995
+ arguments (controlled by the system)
996
+ - State injection occurs after the model generates tool calls but before
997
+ tool execution
998
+ """
999
+
1000
+ def __init__(self, field: str | None = None) -> None:
1001
+ """Initialize the InjectedState annotation."""
1002
+ self.field = field
1003
+
1004
+
1005
+ class InjectedStore(InjectedToolArg):
1006
+ """Annotation for injecting persistent store into tool arguments.
1007
+
1008
+ This annotation enables tools to access LangGraph's persistent storage system
1009
+ without exposing storage details to the language model. Tools annotated with
1010
+ InjectedStore receive the store instance automatically during execution while
1011
+ remaining invisible to the model's tool-calling interface.
1012
+
1013
+ The store provides persistent, cross-session data storage that tools can use
1014
+ for maintaining context, user preferences, or any other data that needs to
1015
+ persist beyond individual workflow executions.
1016
+
1017
+ !!! Warning
1018
+ `InjectedStore` annotation requires `langchain-core >= 0.3.8`
1019
+
1020
+ Example:
1021
+ ```python
1022
+ from typing_extensions import Annotated
1023
+ from langchain_core.tools import tool
1024
+ from langgraph.store.memory import InMemoryStore
1025
+ from langgraph.agents.tool_node import InjectedStore, ToolNode
1026
+
1027
+ @tool
1028
+ def save_preference(
1029
+ key: str,
1030
+ value: str,
1031
+ store: Annotated[Any, InjectedStore()]
1032
+ ) -> str:
1033
+ \"\"\"Save user preference to persistent storage.\"\"\"
1034
+ store.put(("preferences",), key, value)
1035
+ return f"Saved {key} = {value}"
1036
+
1037
+ @tool
1038
+ def get_preference(
1039
+ key: str,
1040
+ store: Annotated[Any, InjectedStore()]
1041
+ ) -> str:
1042
+ \"\"\"Retrieve user preference from persistent storage.\"\"\"
1043
+ result = store.get(("preferences",), key)
1044
+ return result.value if result else "Not found"
1045
+ ```
1046
+
1047
+ Usage with ToolNode and graph compilation:
1048
+
1049
+ ```python
1050
+ from langgraph.graph import StateGraph
1051
+ from langgraph.store.memory import InMemoryStore
1052
+
1053
+ store = InMemoryStore()
1054
+ tool_node = ToolNode([save_preference, get_preference])
1055
+
1056
+ graph = StateGraph(State)
1057
+ graph.add_node("tools", tool_node)
1058
+ compiled_graph = graph.compile(store=store) # Store is injected automatically
1059
+ ```
1060
+
1061
+ Cross-session persistence:
1062
+
1063
+ ```python
1064
+ # First session
1065
+ result1 = graph.invoke({"messages": [HumanMessage("Save my favorite color as blue")]})
1066
+
1067
+ # Later session - data persists
1068
+ result2 = graph.invoke({"messages": [HumanMessage("What's my favorite color?")]})
1069
+ ```
1070
+
1071
+ Note:
1072
+ - InjectedStore arguments are automatically excluded from tool schemas
1073
+ presented to language models
1074
+ - The store instance is automatically injected by ToolNode during execution
1075
+ - Tools can access namespaced storage using the store's get/put methods
1076
+ - Store injection requires the graph to be compiled with a store instance
1077
+ - Multiple tools can share the same store instance for data consistency
1078
+ """
1079
+
1080
+
1081
+ def _is_injection(type_arg: Any, injection_type: type[Union[InjectedState, InjectedStore]]) -> bool:
1082
+ """Check if a type argument represents an injection annotation.
1083
+
1084
+ This utility function determines whether a type annotation indicates that
1085
+ an argument should be injected with state or store data. It handles both
1086
+ direct annotations and nested annotations within Union or Annotated types.
1087
+
1088
+ Args:
1089
+ type_arg: The type argument to check for injection annotations.
1090
+ injection_type: The injection type to look for (InjectedState or InjectedStore).
1091
+
1092
+ Returns:
1093
+ True if the type argument contains the specified injection annotation.
1094
+ """
1095
+ if isinstance(type_arg, injection_type) or (
1096
+ isinstance(type_arg, type) and issubclass(type_arg, injection_type)
1097
+ ):
1098
+ return True
1099
+ origin_ = get_origin(type_arg)
1100
+ if origin_ is Union or origin_ is Annotated:
1101
+ return any(_is_injection(ta, injection_type) for ta in get_args(type_arg))
1102
+ return False
1103
+
1104
+
1105
+ def _get_state_args(tool: BaseTool) -> dict[str, str | None]:
1106
+ """Extract state injection mappings from tool annotations.
1107
+
1108
+ This function analyzes a tool's input schema to identify arguments that should
1109
+ be injected with graph state. It processes InjectedState annotations to build
1110
+ a mapping of tool argument names to state field names.
1111
+
1112
+ Args:
1113
+ tool: The tool to analyze for state injection requirements.
1114
+
1115
+ Returns:
1116
+ A dictionary mapping tool argument names to state field names. If a field
1117
+ name is None, the entire state should be injected for that argument.
1118
+ """
1119
+ full_schema = tool.get_input_schema()
1120
+ tool_args_to_state_fields: dict = {}
1121
+
1122
+ for name, type_ in get_all_basemodel_annotations(full_schema).items():
1123
+ injections = [
1124
+ type_arg for type_arg in get_args(type_) if _is_injection(type_arg, InjectedState)
1125
+ ]
1126
+ if len(injections) > 1:
1127
+ msg = (
1128
+ "A tool argument should not be annotated with InjectedState more than "
1129
+ f"once. Received arg {name} with annotations {injections}."
1130
+ )
1131
+ raise ValueError(msg)
1132
+ if len(injections) == 1:
1133
+ injection = injections[0]
1134
+ if isinstance(injection, InjectedState) and injection.field:
1135
+ tool_args_to_state_fields[name] = injection.field
1136
+ else:
1137
+ tool_args_to_state_fields[name] = None
1138
+ else:
1139
+ pass
1140
+ return tool_args_to_state_fields
1141
+
1142
+
1143
+ def _get_store_arg(tool: BaseTool) -> str | None:
1144
+ """Extract store injection argument from tool annotations.
1145
+
1146
+ This function analyzes a tool's input schema to identify the argument that
1147
+ should be injected with the graph store. Only one store argument is supported
1148
+ per tool.
1149
+
1150
+ Args:
1151
+ tool: The tool to analyze for store injection requirements.
1152
+
1153
+ Returns:
1154
+ The name of the argument that should receive the store injection, or None
1155
+ if no store injection is required.
1156
+
1157
+ Raises:
1158
+ ValueError: If a tool argument has multiple InjectedStore annotations.
1159
+ """
1160
+ full_schema = tool.get_input_schema()
1161
+ for name, type_ in get_all_basemodel_annotations(full_schema).items():
1162
+ injections = [
1163
+ type_arg for type_arg in get_args(type_) if _is_injection(type_arg, InjectedStore)
1164
+ ]
1165
+ if len(injections) > 1:
1166
+ msg = (
1167
+ "A tool argument should not be annotated with InjectedStore more than "
1168
+ f"once. Received arg {name} with annotations {injections}."
1169
+ )
1170
+ raise ValueError(msg)
1171
+ if len(injections) == 1:
1172
+ return name
1173
+
1174
+ return None