langchain 0.4.0.dev0__py3-none-any.whl → 1.0.0a1__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.0a1.dist-info}/METADATA +20 -26
  25. langchain-1.0.0a1.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.0a1.dist-info}/WHEEL +0 -0
  1348. {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a1.dist-info}/entry_points.txt +0 -0
  1349. {langchain-0.4.0.dev0.dist-info → langchain-1.0.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1175 @@
1
+ from __future__ import annotations
2
+
3
+ import inspect
4
+ from collections.abc import Awaitable, Callable, Sequence
5
+ from dataclasses import asdict, is_dataclass
6
+ from typing import (
7
+ TYPE_CHECKING,
8
+ Annotated,
9
+ Any,
10
+ Generic,
11
+ Literal,
12
+ Union,
13
+ cast,
14
+ get_type_hints,
15
+ )
16
+ from warnings import warn
17
+
18
+ from langchain_core.language_models import (
19
+ BaseChatModel,
20
+ LanguageModelInput,
21
+ LanguageModelLike,
22
+ )
23
+ from langchain_core.messages import (
24
+ AIMessage,
25
+ AnyMessage,
26
+ BaseMessage,
27
+ SystemMessage,
28
+ ToolCall,
29
+ ToolMessage,
30
+ )
31
+ from langchain_core.runnables import (
32
+ Runnable,
33
+ RunnableConfig,
34
+ )
35
+ from langgraph._internal._runnable import RunnableCallable, RunnableLike
36
+ from langgraph._internal._typing import MISSING
37
+ from langgraph.errors import ErrorCode, create_error_message
38
+ from langgraph.graph import END, StateGraph
39
+ from langgraph.graph.message import add_messages
40
+ from langgraph.managed import RemainingSteps # noqa: TC002
41
+ from langgraph.types import Checkpointer, Command, Send
42
+ from langgraph.typing import ContextT, StateT
43
+ from pydantic import BaseModel
44
+ from typing_extensions import NotRequired, TypedDict, TypeVar
45
+
46
+ from langchain.agents.structured_output import (
47
+ MultipleStructuredOutputsError,
48
+ OutputToolBinding,
49
+ ProviderStrategy,
50
+ ProviderStrategyBinding,
51
+ ResponseFormat,
52
+ StructuredOutputValidationError,
53
+ ToolStrategy,
54
+ )
55
+ from langchain.agents.tool_node import ToolNode
56
+ from langchain.chat_models import init_chat_model
57
+
58
+ if TYPE_CHECKING:
59
+ from langchain_core.tools import BaseTool
60
+ from langgraph.graph.state import CompiledStateGraph
61
+ from langgraph.runtime import Runtime
62
+ from langgraph.store.base import BaseStore
63
+
64
+ from langchain.agents._internal._typing import (
65
+ SyncOrAsync,
66
+ )
67
+
68
+ StructuredResponseT = TypeVar("StructuredResponseT", default=None)
69
+
70
+ STRUCTURED_OUTPUT_ERROR_TEMPLATE = "Error: {error}\n Please fix your mistakes."
71
+
72
+
73
+ class AgentState(TypedDict):
74
+ """The state of the agent."""
75
+
76
+ messages: Annotated[Sequence[BaseMessage], add_messages]
77
+
78
+ remaining_steps: NotRequired[RemainingSteps]
79
+
80
+
81
+ class AgentStatePydantic(BaseModel):
82
+ """The state of the agent."""
83
+
84
+ messages: Annotated[Sequence[BaseMessage], add_messages]
85
+
86
+ remaining_steps: RemainingSteps = 25
87
+
88
+
89
+ class AgentStateWithStructuredResponse(AgentState, Generic[StructuredResponseT]):
90
+ """The state of the agent with a structured response."""
91
+
92
+ structured_response: StructuredResponseT
93
+
94
+
95
+ class AgentStateWithStructuredResponsePydantic(AgentStatePydantic, Generic[StructuredResponseT]):
96
+ """The state of the agent with a structured response."""
97
+
98
+ structured_response: StructuredResponseT
99
+
100
+
101
+ PROMPT_RUNNABLE_NAME = "Prompt"
102
+
103
+ Prompt = Union[
104
+ SystemMessage,
105
+ str,
106
+ Callable[[StateT], LanguageModelInput],
107
+ Runnable[StateT, LanguageModelInput],
108
+ ]
109
+
110
+
111
+ def _get_state_value(state: StateT, key: str, default: Any = None) -> Any:
112
+ return state.get(key, default) if isinstance(state, dict) else getattr(state, key, default)
113
+
114
+
115
+ def _get_prompt_runnable(prompt: Prompt | None) -> Runnable:
116
+ prompt_runnable: Runnable
117
+ if prompt is None:
118
+ prompt_runnable = RunnableCallable(
119
+ lambda state: _get_state_value(state, "messages"), name=PROMPT_RUNNABLE_NAME
120
+ )
121
+ elif isinstance(prompt, str):
122
+ _system_message: BaseMessage = SystemMessage(content=prompt)
123
+ prompt_runnable = RunnableCallable(
124
+ lambda state: [_system_message, *_get_state_value(state, "messages")],
125
+ name=PROMPT_RUNNABLE_NAME,
126
+ )
127
+ elif isinstance(prompt, SystemMessage):
128
+ prompt_runnable = RunnableCallable(
129
+ lambda state: [prompt, *_get_state_value(state, "messages")],
130
+ name=PROMPT_RUNNABLE_NAME,
131
+ )
132
+ elif inspect.iscoroutinefunction(prompt):
133
+ prompt_runnable = RunnableCallable(
134
+ None,
135
+ prompt,
136
+ name=PROMPT_RUNNABLE_NAME,
137
+ )
138
+ elif callable(prompt):
139
+ prompt_runnable = RunnableCallable(
140
+ prompt,
141
+ name=PROMPT_RUNNABLE_NAME,
142
+ )
143
+ elif isinstance(prompt, Runnable):
144
+ prompt_runnable = prompt
145
+ else:
146
+ msg = f"Got unexpected type for `prompt`: {type(prompt)}"
147
+ raise ValueError(msg)
148
+
149
+ return prompt_runnable
150
+
151
+
152
+ def _validate_chat_history(
153
+ messages: Sequence[BaseMessage],
154
+ ) -> None:
155
+ """Validate that all tool calls in AIMessages have a corresponding ToolMessage."""
156
+ all_tool_calls = [
157
+ tool_call
158
+ for message in messages
159
+ if isinstance(message, AIMessage)
160
+ for tool_call in message.tool_calls
161
+ ]
162
+ tool_call_ids_with_results = {
163
+ message.tool_call_id for message in messages if isinstance(message, ToolMessage)
164
+ }
165
+ tool_calls_without_results = [
166
+ tool_call
167
+ for tool_call in all_tool_calls
168
+ if tool_call["id"] not in tool_call_ids_with_results
169
+ ]
170
+ if not tool_calls_without_results:
171
+ return
172
+
173
+ error_message = create_error_message(
174
+ message="Found AIMessages with tool_calls that do not have a corresponding ToolMessage. "
175
+ f"Here are the first few of those tool calls: {tool_calls_without_results[:3]}.\n\n"
176
+ "Every tool call (LLM requesting to call a tool) in the message history MUST have a corresponding ToolMessage "
177
+ "(result of a tool invocation to return to the LLM) - this is required by most LLM providers.",
178
+ error_code=ErrorCode.INVALID_CHAT_HISTORY,
179
+ )
180
+ raise ValueError(error_message)
181
+
182
+
183
+ class _AgentBuilder(Generic[StateT, ContextT, StructuredResponseT]):
184
+ """Internal builder class for constructing and agent."""
185
+
186
+ def __init__(
187
+ self,
188
+ model: Union[
189
+ str,
190
+ BaseChatModel,
191
+ SyncOrAsync[[StateT, Runtime[ContextT]], BaseChatModel],
192
+ ],
193
+ tools: Union[Sequence[Union[BaseTool, Callable, dict[str, Any]]], ToolNode],
194
+ *,
195
+ prompt: Prompt | None = None,
196
+ response_format: ResponseFormat[StructuredResponseT] | None = None,
197
+ pre_model_hook: RunnableLike | None = None,
198
+ post_model_hook: RunnableLike | None = None,
199
+ state_schema: type[StateT] | None = None,
200
+ context_schema: type[ContextT] | None = None,
201
+ version: Literal["v1", "v2"] = "v2",
202
+ name: str | None = None,
203
+ store: BaseStore | None = None,
204
+ ) -> None:
205
+ self.model = model
206
+ self.tools = tools
207
+ self.prompt = prompt
208
+ self.response_format = response_format
209
+ self.pre_model_hook = pre_model_hook
210
+ self.post_model_hook = post_model_hook
211
+ self.state_schema = state_schema
212
+ self.context_schema = context_schema
213
+ self.version = version
214
+ self.name = name
215
+ self.store = store
216
+
217
+ if isinstance(model, Runnable) and not isinstance(model, BaseChatModel):
218
+ msg = (
219
+ "Expected `model` to be a BaseChatModel or a string, got {type(model)}."
220
+ "The `model` parameter should not have pre-bound tools, simply pass the model and tools separately."
221
+ )
222
+ raise ValueError(msg)
223
+
224
+ self._setup_tools()
225
+ self._setup_state_schema()
226
+ self._setup_structured_output()
227
+ self._setup_model()
228
+
229
+ def _setup_tools(self) -> None:
230
+ """Setup tool-related attributes."""
231
+ if isinstance(self.tools, ToolNode):
232
+ self._tool_classes = list(self.tools.tools_by_name.values())
233
+ self._tool_node = self.tools
234
+ self._llm_builtin_tools = []
235
+ else:
236
+ self._llm_builtin_tools = [t for t in self.tools if isinstance(t, dict)]
237
+ self._tool_node = ToolNode([t for t in self.tools if not isinstance(t, dict)])
238
+ self._tool_classes = list(self._tool_node.tools_by_name.values())
239
+
240
+ self._should_return_direct = {t.name for t in self._tool_classes if t.return_direct}
241
+ self._tool_calling_enabled = len(self._tool_classes) > 0
242
+
243
+ def _setup_structured_output(self) -> None:
244
+ """Set up structured output tracking for "tools" and "native" strategies.
245
+
246
+ "tools" strategy for structured output:
247
+ 1. Converting response format schemas to LangChain tools
248
+ 2. Creating metadata for proper response reconstruction
249
+ 3. Handling both Pydantic models and dict schemas
250
+
251
+ "native" strategy for structured output:
252
+ 1. Capturing the schema reference for later parsing
253
+ 2. Binding provider-native response_format kwargs at model bind time
254
+ 3. Parsing provider-enforced structured output directly into the schema
255
+ """
256
+ self.structured_output_tools: dict[str, OutputToolBinding[StructuredResponseT]] = {}
257
+ self.native_output_binding: ProviderStrategyBinding[StructuredResponseT] | None = None
258
+
259
+ if self.response_format is not None:
260
+ response_format = self.response_format
261
+
262
+ if isinstance(response_format, ToolStrategy):
263
+ # check if response_format.schema is a union
264
+ for response_schema in response_format.schema_specs:
265
+ structured_tool_info = OutputToolBinding.from_schema_spec(response_schema)
266
+ self.structured_output_tools[structured_tool_info.tool.name] = (
267
+ structured_tool_info
268
+ )
269
+ elif isinstance(response_format, ProviderStrategy):
270
+ # Use native strategy - create ProviderStrategyBinding for parsing
271
+ self.native_output_binding = ProviderStrategyBinding.from_schema_spec(
272
+ response_format.schema_spec
273
+ )
274
+ else:
275
+ # This shouldn't happen with the new ResponseFormat type, but keeping for safety
276
+ msg = (
277
+ f"Unsupported response_format type: {type(response_format)}. "
278
+ f"Expected ToolStrategy."
279
+ )
280
+ raise ValueError(msg)
281
+
282
+ def _setup_state_schema(self) -> None:
283
+ """Setup state schema with validation."""
284
+ if self.state_schema is not None:
285
+ required_keys = {"messages", "remaining_steps"}
286
+ if self.response_format is not None:
287
+ required_keys.add("structured_response")
288
+
289
+ schema_keys = set(get_type_hints(self.state_schema))
290
+ if missing_keys := required_keys - schema_keys:
291
+ msg = f"Missing required key(s) {missing_keys} in state_schema"
292
+ raise ValueError(msg)
293
+
294
+ self._final_state_schema = self.state_schema
295
+ else:
296
+ self._final_state_schema = (
297
+ AgentStateWithStructuredResponse # type: ignore[assignment]
298
+ if self.response_format is not None
299
+ else AgentState
300
+ )
301
+
302
+ def _handle_structured_response_tool_calls(self, response: AIMessage) -> Command | None:
303
+ """Handle tool calls that match structured output tools using the tools strategy.
304
+
305
+ Args:
306
+ response: The AI message containing potential tool calls
307
+
308
+ Returns:
309
+ Command with structured response update if found, None otherwise
310
+
311
+ Raises:
312
+ MultipleStructuredOutputsError: If multiple structured responses are returned and error handling is disabled
313
+ StructuredOutputParsingError: If parsing fails and error handling is disabled
314
+ """
315
+ if not isinstance(self.response_format, ToolStrategy) or not response.tool_calls:
316
+ return None
317
+
318
+ structured_tool_calls = [
319
+ tool_call
320
+ for tool_call in response.tool_calls
321
+ if tool_call["name"] in self.structured_output_tools
322
+ ]
323
+
324
+ if not structured_tool_calls:
325
+ return None
326
+
327
+ if len(structured_tool_calls) > 1:
328
+ return self._handle_multiple_structured_outputs(response, structured_tool_calls)
329
+
330
+ return self._handle_single_structured_output(response, structured_tool_calls[0])
331
+
332
+ def _handle_multiple_structured_outputs(
333
+ self,
334
+ response: AIMessage,
335
+ structured_tool_calls: list[ToolCall],
336
+ ) -> Command:
337
+ """Handle multiple structured output tool calls."""
338
+ tool_names = [tool_call["name"] for tool_call in structured_tool_calls]
339
+ exception = MultipleStructuredOutputsError(tool_names)
340
+
341
+ should_retry, error_message = self._handle_structured_output_error(exception)
342
+
343
+ if not should_retry:
344
+ raise exception
345
+
346
+ tool_messages = [
347
+ ToolMessage(
348
+ content=error_message,
349
+ tool_call_id=tool_call["id"],
350
+ name=tool_call["name"],
351
+ )
352
+ for tool_call in structured_tool_calls
353
+ ]
354
+
355
+ return Command(
356
+ update={"messages": [response, *tool_messages]},
357
+ goto="agent",
358
+ )
359
+
360
+ def _handle_single_structured_output(
361
+ self,
362
+ response: AIMessage,
363
+ tool_call: Any,
364
+ ) -> Command:
365
+ """Handle a single structured output tool call."""
366
+ structured_tool_binding = self.structured_output_tools[tool_call["name"]]
367
+
368
+ try:
369
+ structured_response = structured_tool_binding.parse(tool_call["args"])
370
+
371
+ if isinstance(structured_response, BaseModel):
372
+ structured_response_dict = structured_response.model_dump()
373
+ elif is_dataclass(structured_response):
374
+ structured_response_dict = asdict(structured_response) # type: ignore[arg-type]
375
+ else:
376
+ structured_response_dict = cast("dict", structured_response)
377
+
378
+ tool_message_content = (
379
+ self.response_format.tool_message_content
380
+ if isinstance(self.response_format, ToolStrategy)
381
+ and self.response_format.tool_message_content
382
+ else f"Returning structured response: {structured_response_dict}"
383
+ )
384
+
385
+ return Command(
386
+ update={
387
+ "messages": [
388
+ response,
389
+ ToolMessage(
390
+ content=tool_message_content,
391
+ tool_call_id=tool_call["id"],
392
+ name=tool_call["name"],
393
+ ),
394
+ ],
395
+ "structured_response": structured_response,
396
+ }
397
+ )
398
+ except Exception as exc: # noqa: BLE001
399
+ exception = StructuredOutputValidationError(tool_call["name"], exc)
400
+
401
+ should_retry, error_message = self._handle_structured_output_error(exception)
402
+
403
+ if not should_retry:
404
+ raise exception
405
+
406
+ return Command(
407
+ update={
408
+ "messages": [
409
+ response,
410
+ ToolMessage(
411
+ content=error_message,
412
+ tool_call_id=tool_call["id"],
413
+ name=tool_call["name"],
414
+ ),
415
+ ],
416
+ },
417
+ goto="agent",
418
+ )
419
+
420
+ def _handle_structured_output_error(
421
+ self,
422
+ exception: Exception,
423
+ ) -> tuple[bool, str]:
424
+ """Handle structured output error.
425
+
426
+ Returns (should_retry, retry_tool_message).
427
+ """
428
+ handle_errors = cast("ToolStrategy", self.response_format).handle_errors
429
+
430
+ if handle_errors is False:
431
+ return False, ""
432
+ if handle_errors is True:
433
+ return True, STRUCTURED_OUTPUT_ERROR_TEMPLATE.format(error=str(exception))
434
+ if isinstance(handle_errors, str):
435
+ return True, handle_errors
436
+ if isinstance(handle_errors, type) and issubclass(handle_errors, Exception):
437
+ if isinstance(exception, handle_errors):
438
+ return True, STRUCTURED_OUTPUT_ERROR_TEMPLATE.format(error=str(exception))
439
+ return False, ""
440
+ if isinstance(handle_errors, tuple):
441
+ if any(isinstance(exception, exc_type) for exc_type in handle_errors):
442
+ return True, STRUCTURED_OUTPUT_ERROR_TEMPLATE.format(error=str(exception))
443
+ return False, ""
444
+ if callable(handle_errors):
445
+ return True, handle_errors(exception) # type: ignore[call-arg, return-value]
446
+ return False, ""
447
+
448
+ def _apply_native_output_binding(self, model: LanguageModelLike) -> LanguageModelLike:
449
+ """If native output is configured, bind provider-native kwargs onto the model."""
450
+ if not isinstance(self.response_format, ProviderStrategy):
451
+ return model
452
+ kwargs = self.response_format.to_model_kwargs()
453
+ return model.bind(**kwargs)
454
+
455
+ def _handle_structured_response_native(self, response: AIMessage) -> Command | None:
456
+ """If native output is configured and there are no tool calls, parse using ProviderStrategyBinding."""
457
+ if self.native_output_binding is None:
458
+ return None
459
+ if response.tool_calls:
460
+ # if the model chooses to call tools, we let the normal flow handle it
461
+ return None
462
+
463
+ structured_response = self.native_output_binding.parse(response)
464
+
465
+ return Command(update={"messages": [response], "structured_response": structured_response})
466
+
467
+ def _setup_model(self) -> None:
468
+ """Setup model-related attributes."""
469
+ self._is_dynamic_model = not isinstance(self.model, (str, Runnable)) and callable(
470
+ self.model
471
+ )
472
+ self._is_async_dynamic_model = self._is_dynamic_model and inspect.iscoroutinefunction(
473
+ self.model
474
+ )
475
+
476
+ if not self._is_dynamic_model:
477
+ model = self.model
478
+ if isinstance(model, str):
479
+ model = init_chat_model(model)
480
+
481
+ # Collect all tools: regular tools + structured output tools
482
+ structured_output_tools = list(self.structured_output_tools.values())
483
+ all_tools = (
484
+ self._tool_classes
485
+ + self._llm_builtin_tools
486
+ + [info.tool for info in structured_output_tools]
487
+ )
488
+
489
+ if len(all_tools) > 0:
490
+ # Check if we need to force tool use for structured output
491
+ tool_choice = None
492
+ if self.response_format is not None and isinstance(
493
+ self.response_format, ToolStrategy
494
+ ):
495
+ tool_choice = "any"
496
+
497
+ if tool_choice:
498
+ model = cast("BaseChatModel", model).bind_tools( # type: ignore[assignment]
499
+ all_tools, tool_choice=tool_choice
500
+ )
501
+ # If native output is configured, bind tools with strict=True. Required for OpenAI.
502
+ elif isinstance(self.response_format, ProviderStrategy):
503
+ model = cast("BaseChatModel", model).bind_tools( # type: ignore[assignment]
504
+ all_tools, strict=True
505
+ )
506
+ else:
507
+ model = cast("BaseChatModel", model).bind_tools(all_tools) # type: ignore[assignment]
508
+
509
+ # bind native structured-output kwargs
510
+ model = self._apply_native_output_binding(model) # type: ignore[assignment, arg-type]
511
+
512
+ # Extract just the model part for direct invocation
513
+ self._static_model: Runnable | None = model # type: ignore[assignment]
514
+ else:
515
+ self._static_model = None
516
+
517
+ def _resolve_model(self, state: StateT, runtime: Runtime[ContextT]) -> LanguageModelLike:
518
+ """Resolve the model to use, handling both static and dynamic models."""
519
+ if self._is_dynamic_model:
520
+ dynamic_model = self.model(state, runtime) # type: ignore[operator, arg-type]
521
+ return self._apply_native_output_binding(dynamic_model) # type: ignore[arg-type]
522
+ return self._static_model # type: ignore[return-value]
523
+
524
+ async def _aresolve_model(self, state: StateT, runtime: Runtime[ContextT]) -> LanguageModelLike:
525
+ """Async resolve the model to use, handling both static and dynamic models."""
526
+ if self._is_async_dynamic_model:
527
+ dynamic_model = cast(
528
+ "Callable[[StateT, Runtime[ContextT]], Awaitable[BaseChatModel]]",
529
+ self.model,
530
+ )
531
+ return await dynamic_model(state, runtime)
532
+ if self._is_dynamic_model:
533
+ dynamic_model = self.model(state, runtime) # type: ignore[arg-type, assignment, operator]
534
+ return self._apply_native_output_binding(dynamic_model) # type: ignore[arg-type]
535
+ return self._static_model # type: ignore[return-value]
536
+
537
+ def create_model_node(self) -> RunnableCallable:
538
+ """Create the 'agent' node that calls the LLM."""
539
+
540
+ def _get_model_input_state(state: StateT) -> StateT:
541
+ if self.pre_model_hook is not None:
542
+ messages = _get_state_value(state, "llm_input_messages") or _get_state_value(
543
+ state, "messages"
544
+ )
545
+ error_msg = (
546
+ f"Expected input to call_model to have 'llm_input_messages' "
547
+ f"or 'messages' key, but got {state}"
548
+ )
549
+ else:
550
+ messages = _get_state_value(state, "messages")
551
+ error_msg = f"Expected input to call_model to have 'messages' key, but got {state}"
552
+
553
+ if messages is None:
554
+ raise ValueError(error_msg)
555
+
556
+ _validate_chat_history(messages)
557
+
558
+ if isinstance(self._final_state_schema, type) and issubclass(
559
+ self._final_state_schema, BaseModel
560
+ ):
561
+ # we're passing messages under `messages` key, as this
562
+ # is expected by the prompt
563
+ state.messages = messages # type: ignore[union-attr]
564
+ else:
565
+ state["messages"] = messages # type: ignore[index]
566
+ return state
567
+
568
+ def _are_more_steps_needed(state: StateT, response: BaseMessage) -> bool:
569
+ has_tool_calls = isinstance(response, AIMessage) and response.tool_calls
570
+ all_tools_return_direct = (
571
+ all(call["name"] in self._should_return_direct for call in response.tool_calls)
572
+ if isinstance(response, AIMessage)
573
+ else False
574
+ )
575
+ remaining_steps = _get_state_value(state, "remaining_steps", None)
576
+ return (
577
+ remaining_steps is not None # type: ignore[return-value]
578
+ and (
579
+ (remaining_steps < 1 and all_tools_return_direct)
580
+ or (remaining_steps < 2 and has_tool_calls)
581
+ )
582
+ )
583
+
584
+ def call_model(
585
+ state: StateT, runtime: Runtime[ContextT], config: RunnableConfig
586
+ ) -> dict[str, Any] | Command:
587
+ """Call the model with the current state and return the response."""
588
+ if self._is_async_dynamic_model:
589
+ msg = (
590
+ "Async model callable provided but agent invoked synchronously. "
591
+ "Use agent.ainvoke() or agent.astream(), or provide a sync model callable."
592
+ )
593
+ raise RuntimeError(msg)
594
+
595
+ model_input = _get_model_input_state(state)
596
+ model = self._resolve_model(state, runtime)
597
+
598
+ # Get prompt runnable and invoke it first to prepare messages
599
+ prompt_runnable = _get_prompt_runnable(self.prompt)
600
+ prepared_messages = prompt_runnable.invoke(model_input, config)
601
+
602
+ # Then invoke the model with the prepared messages
603
+ response = cast("AIMessage", model.invoke(prepared_messages, config))
604
+ response.name = self.name
605
+
606
+ if _are_more_steps_needed(state, response):
607
+ return {
608
+ "messages": [
609
+ AIMessage(
610
+ id=response.id,
611
+ content="Sorry, need more steps to process this request.",
612
+ )
613
+ ]
614
+ }
615
+
616
+ # Check if any tool calls match structured output tools
617
+ structured_command = self._handle_structured_response_tool_calls(response)
618
+ if structured_command:
619
+ return structured_command
620
+
621
+ # Native structured output
622
+ native_command = self._handle_structured_response_native(response)
623
+ if native_command:
624
+ return native_command
625
+
626
+ return {"messages": [response]}
627
+
628
+ async def acall_model(
629
+ state: StateT, runtime: Runtime[ContextT], config: RunnableConfig
630
+ ) -> dict[str, Any] | Command:
631
+ """Call the model with the current state and return the response."""
632
+ model_input = _get_model_input_state(state)
633
+
634
+ model = await self._aresolve_model(state, runtime)
635
+
636
+ # Get prompt runnable and invoke it first to prepare messages
637
+ prompt_runnable = _get_prompt_runnable(self.prompt)
638
+ prepared_messages = await prompt_runnable.ainvoke(model_input, config)
639
+
640
+ # Then invoke the model with the prepared messages
641
+ response = cast(
642
+ "AIMessage",
643
+ await model.ainvoke(prepared_messages, config),
644
+ )
645
+ response.name = self.name
646
+ if _are_more_steps_needed(state, response):
647
+ return {
648
+ "messages": [
649
+ AIMessage(
650
+ id=response.id,
651
+ content="Sorry, need more steps to process this request.",
652
+ )
653
+ ]
654
+ }
655
+
656
+ # Check if any tool calls match structured output tools
657
+ structured_command = self._handle_structured_response_tool_calls(response)
658
+ if structured_command:
659
+ return structured_command
660
+
661
+ # Native structured output
662
+ native_command = self._handle_structured_response_native(response)
663
+ if native_command:
664
+ return native_command
665
+
666
+ return {"messages": [response]}
667
+
668
+ return RunnableCallable(call_model, acall_model)
669
+
670
+ def _get_input_schema(self) -> type[StateT]:
671
+ """Get input schema for model node."""
672
+ if self.pre_model_hook is not None:
673
+ if isinstance(self._final_state_schema, type) and issubclass(
674
+ self._final_state_schema, BaseModel
675
+ ):
676
+ from pydantic import create_model
677
+
678
+ return create_model(
679
+ "CallModelInputSchema",
680
+ llm_input_messages=(list[AnyMessage], ...),
681
+ __base__=self._final_state_schema,
682
+ )
683
+
684
+ class CallModelInputSchema(self._final_state_schema): # type: ignore[name-defined, misc]
685
+ llm_input_messages: list[AnyMessage]
686
+
687
+ return CallModelInputSchema
688
+ return self._final_state_schema
689
+
690
+ def create_model_router(self) -> Callable[[StateT], Union[str, list[Send]]]:
691
+ """Create routing function for model node conditional edges."""
692
+
693
+ def should_continue(state: StateT) -> Union[str, list[Send]]:
694
+ messages = _get_state_value(state, "messages")
695
+ last_message = messages[-1]
696
+
697
+ # Check if the last message is a ToolMessage from a structured tool.
698
+ # This condition exists to support structured output via tools.
699
+ # Once a tool has been called for structured output, we skip
700
+ # tool execution and go to END (if there is no post_model_hook).
701
+ if (
702
+ isinstance(last_message, ToolMessage)
703
+ and last_message.name in self.structured_output_tools
704
+ ):
705
+ return END
706
+
707
+ if isinstance(last_message, ToolMessage):
708
+ return END
709
+
710
+ if not isinstance(last_message, AIMessage) or not last_message.tool_calls:
711
+ if self.post_model_hook is not None:
712
+ return "post_model_hook"
713
+ return END
714
+ if self.version == "v1":
715
+ return "tools"
716
+ if self.version == "v2":
717
+ if self.post_model_hook is not None:
718
+ return "post_model_hook"
719
+ tool_calls = [
720
+ self._tool_node.inject_tool_args(call, state, self.store) # type: ignore[arg-type]
721
+ for call in last_message.tool_calls
722
+ ]
723
+ return [Send("tools", [tool_call]) for tool_call in tool_calls]
724
+ return None
725
+
726
+ return should_continue
727
+
728
+ def create_post_model_hook_router(
729
+ self,
730
+ ) -> Callable[[StateT], Union[str, list[Send]]]:
731
+ """Create a routing function for post_model_hook node conditional edges."""
732
+
733
+ def post_model_hook_router(state: StateT) -> Union[str, list[Send]]:
734
+ messages = _get_state_value(state, "messages")
735
+
736
+ # Check if the last message is a ToolMessage from a structured tool.
737
+ # This condition exists to support structured output via tools.
738
+ # Once a tool has been called for structured output, we skip
739
+ # tool execution and go to END (if there is no post_model_hook).
740
+ last_message = messages[-1]
741
+ if (
742
+ isinstance(last_message, ToolMessage)
743
+ and last_message.name in self.structured_output_tools
744
+ ):
745
+ return END
746
+
747
+ tool_messages = [m.tool_call_id for m in messages if isinstance(m, ToolMessage)]
748
+ last_ai_message = next(m for m in reversed(messages) if isinstance(m, AIMessage))
749
+ pending_tool_calls = [
750
+ c for c in last_ai_message.tool_calls if c["id"] not in tool_messages
751
+ ]
752
+
753
+ if pending_tool_calls:
754
+ pending_tool_calls = [
755
+ self._tool_node.inject_tool_args(call, state, self.store) # type: ignore[arg-type]
756
+ for call in pending_tool_calls
757
+ ]
758
+ return [Send("tools", [tool_call]) for tool_call in pending_tool_calls]
759
+ if isinstance(messages[-1], ToolMessage):
760
+ return self._get_entry_point()
761
+ return END
762
+
763
+ return post_model_hook_router
764
+
765
+ def create_tools_router(self) -> Callable[[StateT], str] | None:
766
+ """Create a routing function for tools node conditional edges."""
767
+ if not self._should_return_direct:
768
+ return None
769
+
770
+ def route_tool_responses(state: StateT) -> str:
771
+ messages = _get_state_value(state, "messages")
772
+ for m in reversed(messages):
773
+ if not isinstance(m, ToolMessage):
774
+ break
775
+ if m.name in self._should_return_direct:
776
+ return END
777
+
778
+ if (
779
+ isinstance(m, AIMessage)
780
+ and m.tool_calls
781
+ and any(call["name"] in self._should_return_direct for call in m.tool_calls)
782
+ ):
783
+ return END
784
+
785
+ return self._get_entry_point()
786
+
787
+ return route_tool_responses
788
+
789
+ def _get_entry_point(self) -> str:
790
+ """Get the workflow entry point."""
791
+ return "pre_model_hook" if self.pre_model_hook else "agent"
792
+
793
+ def _get_model_paths(self) -> list[str]:
794
+ """Get possible edge destinations from model node."""
795
+ paths = []
796
+ if self._tool_calling_enabled:
797
+ paths.append("tools")
798
+ if self.post_model_hook:
799
+ paths.append("post_model_hook")
800
+ else:
801
+ paths.append(END)
802
+
803
+ return paths
804
+
805
+ def _get_post_model_hook_paths(self) -> list[str]:
806
+ """Get possible edge destinations from post_model_hook node."""
807
+ paths = []
808
+ if self._tool_calling_enabled:
809
+ paths = [self._get_entry_point(), "tools"]
810
+ paths.append(END)
811
+ return paths
812
+
813
+ def build(self) -> StateGraph[StateT, ContextT]:
814
+ """Build the agent workflow graph (uncompiled)."""
815
+ workflow = StateGraph(
816
+ state_schema=self._final_state_schema,
817
+ context_schema=self.context_schema,
818
+ )
819
+
820
+ # Set entry point
821
+ workflow.set_entry_point(self._get_entry_point())
822
+
823
+ # Add nodes
824
+ workflow.add_node("agent", self.create_model_node(), input_schema=self._get_input_schema())
825
+
826
+ if self._tool_calling_enabled:
827
+ workflow.add_node("tools", self._tool_node)
828
+
829
+ if self.pre_model_hook:
830
+ workflow.add_node("pre_model_hook", self.pre_model_hook) # type: ignore[arg-type]
831
+
832
+ if self.post_model_hook:
833
+ workflow.add_node("post_model_hook", self.post_model_hook) # type: ignore[arg-type]
834
+
835
+ # Add edges
836
+ if self.pre_model_hook:
837
+ workflow.add_edge("pre_model_hook", "agent")
838
+
839
+ if self.post_model_hook:
840
+ workflow.add_edge("agent", "post_model_hook")
841
+ post_hook_paths = self._get_post_model_hook_paths()
842
+ if len(post_hook_paths) == 1:
843
+ # No need for a conditional edge if there's only one path
844
+ workflow.add_edge("post_model_hook", post_hook_paths[0])
845
+ else:
846
+ workflow.add_conditional_edges(
847
+ "post_model_hook",
848
+ self.create_post_model_hook_router(),
849
+ path_map=post_hook_paths,
850
+ )
851
+ else:
852
+ model_paths = self._get_model_paths()
853
+ if len(model_paths) == 1:
854
+ # No need for a conditional edge if there's only one path
855
+ workflow.add_edge("agent", model_paths[0])
856
+ else:
857
+ workflow.add_conditional_edges(
858
+ "agent",
859
+ self.create_model_router(),
860
+ path_map=model_paths,
861
+ )
862
+
863
+ if self._tool_calling_enabled:
864
+ # In some cases, tools can return directly. In these cases
865
+ # we add a conditional edge from the tools node to the END node
866
+ # instead of going to the entry point.
867
+ tools_router = self.create_tools_router()
868
+ if tools_router:
869
+ workflow.add_conditional_edges(
870
+ "tools",
871
+ tools_router,
872
+ path_map=[self._get_entry_point(), END],
873
+ )
874
+ else:
875
+ workflow.add_edge("tools", self._get_entry_point())
876
+
877
+ return workflow
878
+
879
+
880
+ def _supports_native_structured_output(
881
+ model: Union[str, BaseChatModel, SyncOrAsync[[StateT, Runtime[ContextT]], BaseChatModel]],
882
+ ) -> bool:
883
+ """Check if a model supports native structured output.
884
+
885
+ TODO: replace with more robust model profiles.
886
+ """
887
+ model_name: str | None = None
888
+ if isinstance(model, str):
889
+ model_name = model
890
+ elif isinstance(model, BaseChatModel):
891
+ model_name = getattr(model, "model_name", None)
892
+
893
+ return (
894
+ "grok" in model_name.lower()
895
+ or any(part in model_name for part in ["gpt-5", "gpt-4.1", "gpt-oss", "o3-pro", "o3-mini"])
896
+ if model_name
897
+ else False
898
+ )
899
+
900
+
901
+ def create_react_agent( # noqa: D417
902
+ model: Union[
903
+ str,
904
+ BaseChatModel,
905
+ SyncOrAsync[[StateT, Runtime[ContextT]], BaseChatModel],
906
+ ],
907
+ tools: Union[Sequence[Union[BaseTool, Callable, dict[str, Any]]], ToolNode],
908
+ *,
909
+ prompt: Prompt | None = None,
910
+ response_format: Union[
911
+ ToolStrategy[StructuredResponseT],
912
+ ProviderStrategy[StructuredResponseT],
913
+ type[StructuredResponseT],
914
+ ]
915
+ | None = None,
916
+ pre_model_hook: RunnableLike | None = None,
917
+ post_model_hook: RunnableLike | None = None,
918
+ state_schema: type[StateT] | None = None,
919
+ context_schema: type[ContextT] | None = None,
920
+ checkpointer: Checkpointer | None = None,
921
+ store: BaseStore | None = None,
922
+ interrupt_before: list[str] | None = None,
923
+ interrupt_after: list[str] | None = None,
924
+ debug: bool = False,
925
+ version: Literal["v1", "v2"] = "v2",
926
+ name: str | None = None,
927
+ **deprecated_kwargs: Any,
928
+ ) -> CompiledStateGraph[StateT, ContextT]:
929
+ """Creates an agent graph that calls tools in a loop until a stopping condition is met.
930
+
931
+ For more details on using `create_react_agent`, visit [Agents](https://langchain-ai.github.io/langgraph/agents/overview/) documentation.
932
+
933
+ Args:
934
+ model: The language model for the agent. Supports static and dynamic
935
+ model selection.
936
+
937
+ - **Static model**: A chat model instance (e.g., `ChatOpenAI()`) or
938
+ string identifier (e.g., `"openai:gpt-4"`)
939
+ - **Dynamic model**: A callable with signature
940
+ `(state, runtime) -> BaseChatModel` that returns different models
941
+ based on runtime context
942
+ If the model has tools bound via `.bind_tools()` or other configurations,
943
+ the return type should be a Runnable[LanguageModelInput, BaseMessage]
944
+ Coroutines are also supported, allowing for asynchronous model selection.
945
+
946
+ Dynamic functions receive graph state and runtime, enabling
947
+ context-dependent model selection. Must return a `BaseChatModel`
948
+ instance. For tool calling, bind tools using `.bind_tools()`.
949
+ Bound tools must be a subset of the `tools` parameter.
950
+
951
+ Dynamic model example:
952
+ ```python
953
+ from dataclasses import dataclass
954
+
955
+ @dataclass
956
+ class ModelContext:
957
+ model_name: str = "gpt-3.5-turbo"
958
+
959
+ # Instantiate models globally
960
+ gpt4_model = ChatOpenAI(model="gpt-4")
961
+ gpt35_model = ChatOpenAI(model="gpt-3.5-turbo")
962
+
963
+ def select_model(state: AgentState, runtime: Runtime[ModelContext]) -> ChatOpenAI:
964
+ model_name = runtime.context.model_name
965
+ model = gpt4_model if model_name == "gpt-4" else gpt35_model
966
+ return model.bind_tools(tools)
967
+ ```
968
+
969
+ !!! note "Dynamic Model Requirements"
970
+ Ensure returned models have appropriate tools bound via
971
+ `.bind_tools()` and support required functionality. Bound tools
972
+ must be a subset of those specified in the `tools` parameter.
973
+
974
+ tools: A list of tools or a ToolNode instance.
975
+ If an empty list is provided, the agent will consist of a single LLM node without tool calling.
976
+ prompt: An optional prompt for the LLM. Can take a few different forms:
977
+
978
+ - str: This is converted to a SystemMessage and added to the beginning of the list of messages in state["messages"].
979
+ - SystemMessage: this is added to the beginning of the list of messages in state["messages"].
980
+ - Callable: This function should take in full graph state and the output is then passed to the language model.
981
+ - Runnable: This runnable should take in full graph state and the output is then passed to the language model.
982
+
983
+ response_format: An optional UsingToolStrategy configuration for structured responses.
984
+
985
+ If provided, the agent will handle structured output via tool calls during the normal conversation flow.
986
+ When the model calls a structured output tool, the response will be captured and returned in the 'structured_response' state key.
987
+ If not provided, `structured_response` will not be present in the output state.
988
+
989
+ The UsingToolStrategy should contain:
990
+ - schemas: A sequence of ResponseSchema objects that define the structured output format
991
+ - tool_choice: Either "required" or "auto" to control when structured output is used
992
+
993
+ Each ResponseSchema contains:
994
+ - schema: A Pydantic model that defines the structure
995
+ - name: Optional custom name for the tool (defaults to model name)
996
+ - description: Optional custom description (defaults to model docstring)
997
+ - strict: Whether to enforce strict validation
998
+
999
+ !!! Important
1000
+ `response_format` requires the model to support tool calling
1001
+
1002
+ !!! Note
1003
+ Structured responses are handled directly in the model call node via tool calls, eliminating the need for separate structured response nodes.
1004
+
1005
+ pre_model_hook: An optional node to add before the `agent` node (i.e., the node that calls the LLM).
1006
+ Useful for managing long message histories (e.g., message trimming, summarization, etc.).
1007
+ Pre-model hook must be a callable or a runnable that takes in current graph state and returns a state update in the form of
1008
+ ```python
1009
+ # At least one of `messages` or `llm_input_messages` MUST be provided
1010
+ {
1011
+ # If provided, will UPDATE the `messages` in the state
1012
+ "messages": [RemoveMessage(id=REMOVE_ALL_MESSAGES), ...],
1013
+ # If provided, will be used as the input to the LLM,
1014
+ # and will NOT UPDATE `messages` in the state
1015
+ "llm_input_messages": [...],
1016
+ # Any other state keys that need to be propagated
1017
+ ...
1018
+ }
1019
+ ```
1020
+
1021
+ !!! Important
1022
+ At least one of `messages` or `llm_input_messages` MUST be provided and will be used as an input to the `agent` node.
1023
+ The rest of the keys will be added to the graph state.
1024
+
1025
+ !!! Warning
1026
+ If you are returning `messages` in the pre-model hook, you should OVERWRITE the `messages` key by doing the following:
1027
+
1028
+ ```python
1029
+ {
1030
+ "messages": [RemoveMessage(id=REMOVE_ALL_MESSAGES), *new_messages]
1031
+ ...
1032
+ }
1033
+ ```
1034
+ post_model_hook: An optional node to add after the `agent` node (i.e., the node that calls the LLM).
1035
+ Useful for implementing human-in-the-loop, guardrails, validation, or other post-processing.
1036
+ Post-model hook must be a callable or a runnable that takes in current graph state and returns a state update.
1037
+
1038
+ !!! Note
1039
+ Only available with `version="v2"`.
1040
+ state_schema: An optional state schema that defines graph state.
1041
+ Must have `messages` and `remaining_steps` keys.
1042
+ Defaults to `AgentState` that defines those two keys.
1043
+ context_schema: An optional schema for runtime context.
1044
+ checkpointer: An optional checkpoint saver object. This is used for persisting
1045
+ the state of the graph (e.g., as chat memory) for a single thread (e.g., a single conversation).
1046
+ store: An optional store object. This is used for persisting data
1047
+ across multiple threads (e.g., multiple conversations / users).
1048
+ interrupt_before: An optional list of node names to interrupt before.
1049
+ Should be one of the following: "agent", "tools".
1050
+ This is useful if you want to add a user confirmation or other interrupt before taking an action.
1051
+ interrupt_after: An optional list of node names to interrupt after.
1052
+ Should be one of the following: "agent", "tools".
1053
+ This is useful if you want to return directly or run additional processing on an output.
1054
+ debug: A flag indicating whether to enable debug mode.
1055
+ version: Determines the version of the graph to create.
1056
+ Can be one of:
1057
+
1058
+ - `"v1"`: The tool node processes a single message. All tool
1059
+ calls in the message are executed in parallel within the tool node.
1060
+ - `"v2"`: The tool node processes a tool call.
1061
+ Tool calls are distributed across multiple instances of the tool
1062
+ node using the [Send](https://langchain-ai.github.io/langgraph/concepts/low_level/#send)
1063
+ API.
1064
+ name: An optional name for the CompiledStateGraph.
1065
+ This name will be automatically used when adding ReAct agent graph to another graph as a subgraph node -
1066
+ particularly useful for building multi-agent systems.
1067
+
1068
+ !!! warning "`config_schema` Deprecated"
1069
+ The `config_schema` parameter is deprecated in v0.6.0 and support will be removed in v2.0.0.
1070
+ Please use `context_schema` instead to specify the schema for run-scoped context.
1071
+
1072
+
1073
+ Returns:
1074
+ A compiled LangChain runnable that can be used for chat interactions.
1075
+
1076
+ The "agent" node calls the language model with the messages list (after applying the prompt).
1077
+ If the resulting AIMessage contains `tool_calls`, the graph will then call the ["tools"][langgraph.prebuilt.tool_node.ToolNode].
1078
+ The "tools" node executes the tools (1 tool per `tool_call`) and adds the responses to the messages list
1079
+ as `ToolMessage` objects. The agent node then calls the language model again.
1080
+ The process repeats until no more `tool_calls` are present in the response.
1081
+ The agent then returns the full list of messages as a dictionary containing the key "messages".
1082
+
1083
+ ``` mermaid
1084
+ sequenceDiagram
1085
+ participant U as User
1086
+ participant A as LLM
1087
+ participant T as Tools
1088
+ U->>A: Initial input
1089
+ Note over A: Prompt + LLM
1090
+ loop while tool_calls present
1091
+ A->>T: Execute tools
1092
+ T-->>A: ToolMessage for each tool_calls
1093
+ end
1094
+ A->>U: Return final state
1095
+ ```
1096
+
1097
+ Example:
1098
+ ```python
1099
+ from langchain.agents import create_react_agent
1100
+
1101
+ def check_weather(location: str) -> str:
1102
+ '''Return the weather forecast for the specified location.'''
1103
+ return f"It's always sunny in {location}"
1104
+
1105
+ graph = create_react_agent(
1106
+ "anthropic:claude-3-7-sonnet-latest",
1107
+ tools=[check_weather],
1108
+ prompt="You are a helpful assistant",
1109
+ )
1110
+ inputs = {"messages": [{"role": "user", "content": "what is the weather in sf"}]}
1111
+ for chunk in graph.stream(inputs, stream_mode="updates"):
1112
+ print(chunk)
1113
+ ```
1114
+ """
1115
+ # Handle deprecated config_schema parameter
1116
+ if (config_schema := deprecated_kwargs.pop("config_schema", MISSING)) is not MISSING:
1117
+ warn(
1118
+ "`config_schema` is deprecated and will be removed. Please use `context_schema` instead.",
1119
+ category=DeprecationWarning,
1120
+ stacklevel=2,
1121
+ )
1122
+ if context_schema is None:
1123
+ context_schema = config_schema
1124
+
1125
+ if len(deprecated_kwargs) > 0:
1126
+ msg = f"create_react_agent() got unexpected keyword arguments: {deprecated_kwargs}"
1127
+ raise TypeError(msg)
1128
+
1129
+ if response_format and not isinstance(response_format, (ToolStrategy, ProviderStrategy)):
1130
+ if _supports_native_structured_output(model):
1131
+ response_format = ProviderStrategy(
1132
+ schema=response_format,
1133
+ )
1134
+ else:
1135
+ response_format = ToolStrategy(
1136
+ schema=response_format,
1137
+ )
1138
+ elif isinstance(response_format, tuple) and len(response_format) == 2:
1139
+ msg = "Passing a 2-tuple as response_format is no longer supported. "
1140
+ raise ValueError(msg)
1141
+
1142
+ # Create and configure the agent builder
1143
+ builder = _AgentBuilder(
1144
+ model=model,
1145
+ tools=tools,
1146
+ prompt=prompt,
1147
+ response_format=cast("Union[ResponseFormat[StructuredResponseT], None]", response_format),
1148
+ pre_model_hook=pre_model_hook,
1149
+ post_model_hook=post_model_hook,
1150
+ state_schema=state_schema,
1151
+ context_schema=context_schema,
1152
+ version=version,
1153
+ name=name,
1154
+ store=store,
1155
+ )
1156
+
1157
+ # Build and compile the workflow
1158
+ workflow = builder.build()
1159
+ return workflow.compile( # type: ignore[return-value]
1160
+ checkpointer=checkpointer,
1161
+ store=store,
1162
+ interrupt_before=interrupt_before,
1163
+ interrupt_after=interrupt_after,
1164
+ debug=debug,
1165
+ name=name,
1166
+ )
1167
+
1168
+
1169
+ __all__ = [
1170
+ "AgentState",
1171
+ "AgentStatePydantic",
1172
+ "AgentStateWithStructuredResponse",
1173
+ "AgentStateWithStructuredResponsePydantic",
1174
+ "create_react_agent",
1175
+ ]