langchain 0.3.26__py3-none-any.whl → 0.4.0.dev0__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.
Files changed (591) hide show
  1. langchain/__init__.py +110 -96
  2. langchain/_api/__init__.py +2 -2
  3. langchain/_api/deprecation.py +3 -3
  4. langchain/_api/module_import.py +51 -46
  5. langchain/_api/path.py +1 -1
  6. langchain/adapters/openai.py +8 -8
  7. langchain/agents/__init__.py +15 -12
  8. langchain/agents/agent.py +174 -151
  9. langchain/agents/agent_iterator.py +50 -26
  10. langchain/agents/agent_toolkits/__init__.py +7 -6
  11. langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
  12. langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
  13. langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
  14. langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
  15. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
  16. langchain/agents/agent_toolkits/csv/__init__.py +4 -2
  17. langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
  18. langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
  19. langchain/agents/agent_toolkits/github/toolkit.py +9 -9
  20. langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
  21. langchain/agents/agent_toolkits/json/base.py +1 -1
  22. langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
  23. langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
  24. langchain/agents/agent_toolkits/openapi/base.py +1 -1
  25. langchain/agents/agent_toolkits/openapi/planner.py +2 -2
  26. langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
  27. langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
  28. langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
  29. langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
  30. langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
  31. langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
  32. langchain/agents/agent_toolkits/powerbi/base.py +1 -1
  33. langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
  34. langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
  35. langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
  36. langchain/agents/agent_toolkits/python/__init__.py +4 -2
  37. langchain/agents/agent_toolkits/spark/__init__.py +4 -2
  38. langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
  39. langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
  40. langchain/agents/agent_toolkits/sql/prompt.py +1 -1
  41. langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
  42. langchain/agents/agent_toolkits/vectorstore/base.py +4 -2
  43. langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
  44. langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
  45. langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
  46. langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
  47. langchain/agents/agent_types.py +6 -6
  48. langchain/agents/chat/base.py +8 -12
  49. langchain/agents/chat/output_parser.py +9 -6
  50. langchain/agents/chat/prompt.py +3 -4
  51. langchain/agents/conversational/base.py +11 -5
  52. langchain/agents/conversational/output_parser.py +4 -2
  53. langchain/agents/conversational/prompt.py +2 -3
  54. langchain/agents/conversational_chat/base.py +9 -5
  55. langchain/agents/conversational_chat/output_parser.py +9 -11
  56. langchain/agents/conversational_chat/prompt.py +5 -6
  57. langchain/agents/format_scratchpad/__init__.py +3 -3
  58. langchain/agents/format_scratchpad/log_to_messages.py +1 -1
  59. langchain/agents/format_scratchpad/openai_functions.py +8 -6
  60. langchain/agents/format_scratchpad/tools.py +5 -3
  61. langchain/agents/format_scratchpad/xml.py +33 -2
  62. langchain/agents/initialize.py +17 -9
  63. langchain/agents/json_chat/base.py +19 -18
  64. langchain/agents/json_chat/prompt.py +2 -3
  65. langchain/agents/load_tools.py +2 -1
  66. langchain/agents/loading.py +28 -18
  67. langchain/agents/mrkl/base.py +11 -4
  68. langchain/agents/mrkl/output_parser.py +17 -13
  69. langchain/agents/mrkl/prompt.py +1 -2
  70. langchain/agents/openai_assistant/base.py +81 -71
  71. langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +2 -0
  72. langchain/agents/openai_functions_agent/base.py +47 -37
  73. langchain/agents/openai_functions_multi_agent/base.py +40 -27
  74. langchain/agents/openai_tools/base.py +9 -8
  75. langchain/agents/output_parsers/__init__.py +3 -3
  76. langchain/agents/output_parsers/json.py +8 -6
  77. langchain/agents/output_parsers/openai_functions.py +24 -9
  78. langchain/agents/output_parsers/openai_tools.py +16 -4
  79. langchain/agents/output_parsers/react_json_single_input.py +13 -5
  80. langchain/agents/output_parsers/react_single_input.py +18 -11
  81. langchain/agents/output_parsers/self_ask.py +5 -2
  82. langchain/agents/output_parsers/tools.py +32 -13
  83. langchain/agents/output_parsers/xml.py +102 -28
  84. langchain/agents/react/agent.py +5 -4
  85. langchain/agents/react/base.py +26 -17
  86. langchain/agents/react/output_parser.py +7 -6
  87. langchain/agents/react/textworld_prompt.py +0 -1
  88. langchain/agents/react/wiki_prompt.py +14 -15
  89. langchain/agents/schema.py +5 -2
  90. langchain/agents/self_ask_with_search/base.py +23 -15
  91. langchain/agents/self_ask_with_search/prompt.py +0 -1
  92. langchain/agents/structured_chat/base.py +19 -11
  93. langchain/agents/structured_chat/output_parser.py +29 -18
  94. langchain/agents/structured_chat/prompt.py +3 -4
  95. langchain/agents/tool_calling_agent/base.py +8 -6
  96. langchain/agents/tools.py +5 -2
  97. langchain/agents/utils.py +2 -3
  98. langchain/agents/xml/base.py +12 -6
  99. langchain/agents/xml/prompt.py +1 -2
  100. langchain/cache.py +12 -12
  101. langchain/callbacks/__init__.py +11 -11
  102. langchain/callbacks/aim_callback.py +2 -2
  103. langchain/callbacks/argilla_callback.py +1 -1
  104. langchain/callbacks/arize_callback.py +1 -1
  105. langchain/callbacks/arthur_callback.py +1 -1
  106. langchain/callbacks/base.py +7 -7
  107. langchain/callbacks/clearml_callback.py +1 -1
  108. langchain/callbacks/comet_ml_callback.py +1 -1
  109. langchain/callbacks/confident_callback.py +1 -1
  110. langchain/callbacks/context_callback.py +1 -1
  111. langchain/callbacks/flyte_callback.py +1 -1
  112. langchain/callbacks/human.py +2 -2
  113. langchain/callbacks/infino_callback.py +1 -1
  114. langchain/callbacks/labelstudio_callback.py +1 -1
  115. langchain/callbacks/llmonitor_callback.py +1 -1
  116. langchain/callbacks/manager.py +5 -5
  117. langchain/callbacks/mlflow_callback.py +2 -2
  118. langchain/callbacks/openai_info.py +1 -1
  119. langchain/callbacks/promptlayer_callback.py +1 -1
  120. langchain/callbacks/sagemaker_callback.py +1 -1
  121. langchain/callbacks/streaming_aiter.py +17 -3
  122. langchain/callbacks/streaming_aiter_final_only.py +16 -5
  123. langchain/callbacks/streaming_stdout_final_only.py +10 -3
  124. langchain/callbacks/streamlit/__init__.py +3 -2
  125. langchain/callbacks/streamlit/mutable_expander.py +1 -1
  126. langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
  127. langchain/callbacks/tracers/__init__.py +1 -1
  128. langchain/callbacks/tracers/comet.py +1 -1
  129. langchain/callbacks/tracers/evaluation.py +1 -1
  130. langchain/callbacks/tracers/log_stream.py +1 -1
  131. langchain/callbacks/tracers/logging.py +12 -1
  132. langchain/callbacks/tracers/stdout.py +1 -1
  133. langchain/callbacks/trubrics_callback.py +1 -1
  134. langchain/callbacks/utils.py +4 -4
  135. langchain/callbacks/wandb_callback.py +1 -1
  136. langchain/callbacks/whylabs_callback.py +1 -1
  137. langchain/chains/api/base.py +41 -23
  138. langchain/chains/api/news_docs.py +1 -2
  139. langchain/chains/api/open_meteo_docs.py +1 -2
  140. langchain/chains/api/openapi/requests_chain.py +1 -1
  141. langchain/chains/api/openapi/response_chain.py +1 -1
  142. langchain/chains/api/podcast_docs.py +1 -2
  143. langchain/chains/api/prompt.py +1 -2
  144. langchain/chains/api/tmdb_docs.py +1 -2
  145. langchain/chains/base.py +96 -56
  146. langchain/chains/chat_vector_db/prompts.py +2 -3
  147. langchain/chains/combine_documents/__init__.py +1 -1
  148. langchain/chains/combine_documents/base.py +30 -11
  149. langchain/chains/combine_documents/map_reduce.py +41 -30
  150. langchain/chains/combine_documents/map_rerank.py +39 -24
  151. langchain/chains/combine_documents/reduce.py +48 -26
  152. langchain/chains/combine_documents/refine.py +27 -17
  153. langchain/chains/combine_documents/stuff.py +24 -13
  154. langchain/chains/constitutional_ai/base.py +11 -4
  155. langchain/chains/constitutional_ai/principles.py +22 -25
  156. langchain/chains/constitutional_ai/prompts.py +25 -28
  157. langchain/chains/conversation/base.py +9 -4
  158. langchain/chains/conversation/memory.py +5 -5
  159. langchain/chains/conversation/prompt.py +5 -5
  160. langchain/chains/conversational_retrieval/base.py +108 -79
  161. langchain/chains/conversational_retrieval/prompts.py +2 -3
  162. langchain/chains/elasticsearch_database/base.py +10 -10
  163. langchain/chains/elasticsearch_database/prompts.py +2 -3
  164. langchain/chains/ernie_functions/__init__.py +2 -2
  165. langchain/chains/example_generator.py +3 -1
  166. langchain/chains/flare/base.py +28 -12
  167. langchain/chains/flare/prompts.py +2 -0
  168. langchain/chains/graph_qa/cypher.py +2 -2
  169. langchain/chains/graph_qa/falkordb.py +1 -1
  170. langchain/chains/graph_qa/gremlin.py +1 -1
  171. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  172. langchain/chains/graph_qa/prompts.py +2 -2
  173. langchain/chains/history_aware_retriever.py +2 -1
  174. langchain/chains/hyde/base.py +6 -5
  175. langchain/chains/hyde/prompts.py +5 -6
  176. langchain/chains/llm.py +82 -61
  177. langchain/chains/llm_bash/__init__.py +3 -2
  178. langchain/chains/llm_checker/base.py +19 -6
  179. langchain/chains/llm_checker/prompt.py +3 -4
  180. langchain/chains/llm_math/base.py +25 -10
  181. langchain/chains/llm_math/prompt.py +1 -2
  182. langchain/chains/llm_summarization_checker/base.py +22 -7
  183. langchain/chains/llm_symbolic_math/__init__.py +3 -2
  184. langchain/chains/loading.py +155 -97
  185. langchain/chains/mapreduce.py +4 -3
  186. langchain/chains/moderation.py +11 -9
  187. langchain/chains/natbot/base.py +11 -9
  188. langchain/chains/natbot/crawler.py +102 -76
  189. langchain/chains/natbot/prompt.py +2 -3
  190. langchain/chains/openai_functions/__init__.py +7 -7
  191. langchain/chains/openai_functions/base.py +15 -10
  192. langchain/chains/openai_functions/citation_fuzzy_match.py +21 -11
  193. langchain/chains/openai_functions/extraction.py +19 -19
  194. langchain/chains/openai_functions/openapi.py +39 -35
  195. langchain/chains/openai_functions/qa_with_structure.py +22 -15
  196. langchain/chains/openai_functions/tagging.py +4 -4
  197. langchain/chains/openai_tools/extraction.py +7 -8
  198. langchain/chains/qa_generation/base.py +8 -3
  199. langchain/chains/qa_generation/prompt.py +5 -5
  200. langchain/chains/qa_with_sources/base.py +17 -6
  201. langchain/chains/qa_with_sources/loading.py +16 -8
  202. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  203. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  204. langchain/chains/qa_with_sources/retrieval.py +15 -6
  205. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  206. langchain/chains/qa_with_sources/vector_db.py +21 -8
  207. langchain/chains/query_constructor/base.py +37 -34
  208. langchain/chains/query_constructor/ir.py +4 -4
  209. langchain/chains/query_constructor/parser.py +101 -34
  210. langchain/chains/query_constructor/prompt.py +5 -6
  211. langchain/chains/question_answering/chain.py +21 -10
  212. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  213. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  214. langchain/chains/question_answering/refine_prompts.py +2 -5
  215. langchain/chains/question_answering/stuff_prompt.py +5 -5
  216. langchain/chains/retrieval.py +1 -3
  217. langchain/chains/retrieval_qa/base.py +38 -27
  218. langchain/chains/retrieval_qa/prompt.py +1 -2
  219. langchain/chains/router/__init__.py +3 -3
  220. langchain/chains/router/base.py +38 -22
  221. langchain/chains/router/embedding_router.py +15 -8
  222. langchain/chains/router/llm_router.py +23 -20
  223. langchain/chains/router/multi_prompt.py +5 -2
  224. langchain/chains/router/multi_retrieval_qa.py +28 -5
  225. langchain/chains/sequential.py +30 -18
  226. langchain/chains/sql_database/prompt.py +14 -16
  227. langchain/chains/sql_database/query.py +7 -5
  228. langchain/chains/structured_output/__init__.py +1 -1
  229. langchain/chains/structured_output/base.py +77 -67
  230. langchain/chains/summarize/chain.py +11 -5
  231. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  232. langchain/chains/summarize/stuff_prompt.py +0 -1
  233. langchain/chains/transform.py +9 -6
  234. langchain/chat_loaders/facebook_messenger.py +1 -1
  235. langchain/chat_loaders/langsmith.py +1 -1
  236. langchain/chat_loaders/utils.py +3 -3
  237. langchain/chat_models/__init__.py +20 -19
  238. langchain/chat_models/anthropic.py +1 -1
  239. langchain/chat_models/azureml_endpoint.py +1 -1
  240. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  241. langchain/chat_models/base.py +213 -139
  242. langchain/chat_models/bedrock.py +1 -1
  243. langchain/chat_models/fake.py +1 -1
  244. langchain/chat_models/meta.py +1 -1
  245. langchain/chat_models/pai_eas_endpoint.py +1 -1
  246. langchain/chat_models/promptlayer_openai.py +1 -1
  247. langchain/chat_models/volcengine_maas.py +1 -1
  248. langchain/docstore/base.py +1 -1
  249. langchain/document_loaders/__init__.py +9 -9
  250. langchain/document_loaders/airbyte.py +3 -3
  251. langchain/document_loaders/assemblyai.py +1 -1
  252. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  253. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  254. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  255. langchain/document_loaders/base.py +1 -1
  256. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  257. langchain/document_loaders/blob_loaders/schema.py +1 -4
  258. langchain/document_loaders/blockchain.py +1 -1
  259. langchain/document_loaders/chatgpt.py +1 -1
  260. langchain/document_loaders/college_confidential.py +1 -1
  261. langchain/document_loaders/confluence.py +1 -1
  262. langchain/document_loaders/email.py +1 -1
  263. langchain/document_loaders/facebook_chat.py +1 -1
  264. langchain/document_loaders/markdown.py +1 -1
  265. langchain/document_loaders/notebook.py +1 -1
  266. langchain/document_loaders/org_mode.py +1 -1
  267. langchain/document_loaders/parsers/__init__.py +1 -1
  268. langchain/document_loaders/parsers/docai.py +1 -1
  269. langchain/document_loaders/parsers/generic.py +1 -1
  270. langchain/document_loaders/parsers/html/__init__.py +1 -1
  271. langchain/document_loaders/parsers/html/bs4.py +1 -1
  272. langchain/document_loaders/parsers/language/cobol.py +1 -1
  273. langchain/document_loaders/parsers/language/python.py +1 -1
  274. langchain/document_loaders/parsers/msword.py +1 -1
  275. langchain/document_loaders/parsers/pdf.py +5 -5
  276. langchain/document_loaders/parsers/registry.py +1 -1
  277. langchain/document_loaders/pdf.py +8 -8
  278. langchain/document_loaders/powerpoint.py +1 -1
  279. langchain/document_loaders/pyspark_dataframe.py +1 -1
  280. langchain/document_loaders/telegram.py +2 -2
  281. langchain/document_loaders/tencent_cos_directory.py +1 -1
  282. langchain/document_loaders/unstructured.py +5 -5
  283. langchain/document_loaders/url_playwright.py +1 -1
  284. langchain/document_loaders/whatsapp_chat.py +1 -1
  285. langchain/document_loaders/youtube.py +2 -2
  286. langchain/document_transformers/__init__.py +3 -3
  287. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  288. langchain/document_transformers/doctran_text_extract.py +1 -1
  289. langchain/document_transformers/doctran_text_qa.py +1 -1
  290. langchain/document_transformers/doctran_text_translate.py +1 -1
  291. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  292. langchain/document_transformers/google_translate.py +1 -1
  293. langchain/document_transformers/html2text.py +1 -1
  294. langchain/document_transformers/nuclia_text_transform.py +1 -1
  295. langchain/embeddings/__init__.py +5 -5
  296. langchain/embeddings/base.py +35 -24
  297. langchain/embeddings/cache.py +37 -32
  298. langchain/embeddings/fake.py +1 -1
  299. langchain/embeddings/huggingface.py +2 -2
  300. langchain/evaluation/__init__.py +22 -22
  301. langchain/evaluation/agents/trajectory_eval_chain.py +26 -25
  302. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  303. langchain/evaluation/comparison/__init__.py +1 -1
  304. langchain/evaluation/comparison/eval_chain.py +21 -13
  305. langchain/evaluation/comparison/prompt.py +1 -2
  306. langchain/evaluation/criteria/__init__.py +1 -1
  307. langchain/evaluation/criteria/eval_chain.py +23 -11
  308. langchain/evaluation/criteria/prompt.py +2 -3
  309. langchain/evaluation/embedding_distance/base.py +34 -20
  310. langchain/evaluation/exact_match/base.py +14 -1
  311. langchain/evaluation/loading.py +16 -11
  312. langchain/evaluation/parsing/base.py +20 -4
  313. langchain/evaluation/parsing/json_distance.py +24 -10
  314. langchain/evaluation/parsing/json_schema.py +13 -12
  315. langchain/evaluation/qa/__init__.py +1 -1
  316. langchain/evaluation/qa/eval_chain.py +20 -5
  317. langchain/evaluation/qa/eval_prompt.py +7 -8
  318. langchain/evaluation/qa/generate_chain.py +4 -1
  319. langchain/evaluation/qa/generate_prompt.py +2 -4
  320. langchain/evaluation/regex_match/base.py +9 -1
  321. langchain/evaluation/schema.py +38 -30
  322. langchain/evaluation/scoring/__init__.py +1 -1
  323. langchain/evaluation/scoring/eval_chain.py +23 -15
  324. langchain/evaluation/scoring/prompt.py +0 -1
  325. langchain/evaluation/string_distance/base.py +20 -9
  326. langchain/globals.py +12 -11
  327. langchain/graphs/__init__.py +6 -6
  328. langchain/graphs/graph_document.py +1 -1
  329. langchain/graphs/networkx_graph.py +2 -2
  330. langchain/hub.py +9 -11
  331. langchain/indexes/__init__.py +3 -3
  332. langchain/indexes/_sql_record_manager.py +63 -46
  333. langchain/indexes/prompts/entity_extraction.py +1 -2
  334. langchain/indexes/prompts/entity_summarization.py +1 -2
  335. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  336. langchain/indexes/vectorstore.py +35 -19
  337. langchain/llms/__init__.py +13 -13
  338. langchain/llms/ai21.py +1 -1
  339. langchain/llms/azureml_endpoint.py +4 -4
  340. langchain/llms/base.py +15 -7
  341. langchain/llms/bedrock.py +1 -1
  342. langchain/llms/cloudflare_workersai.py +1 -1
  343. langchain/llms/gradient_ai.py +1 -1
  344. langchain/llms/loading.py +1 -1
  345. langchain/llms/openai.py +1 -1
  346. langchain/llms/sagemaker_endpoint.py +1 -1
  347. langchain/load/dump.py +1 -1
  348. langchain/load/load.py +1 -1
  349. langchain/load/serializable.py +3 -3
  350. langchain/memory/__init__.py +3 -3
  351. langchain/memory/buffer.py +14 -7
  352. langchain/memory/buffer_window.py +2 -0
  353. langchain/memory/chat_memory.py +14 -8
  354. langchain/memory/chat_message_histories/__init__.py +1 -1
  355. langchain/memory/chat_message_histories/astradb.py +1 -1
  356. langchain/memory/chat_message_histories/cassandra.py +1 -1
  357. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  358. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  359. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  360. langchain/memory/chat_message_histories/file.py +1 -1
  361. langchain/memory/chat_message_histories/firestore.py +1 -1
  362. langchain/memory/chat_message_histories/momento.py +1 -1
  363. langchain/memory/chat_message_histories/mongodb.py +1 -1
  364. langchain/memory/chat_message_histories/neo4j.py +1 -1
  365. langchain/memory/chat_message_histories/postgres.py +1 -1
  366. langchain/memory/chat_message_histories/redis.py +1 -1
  367. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  368. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  369. langchain/memory/chat_message_histories/streamlit.py +1 -1
  370. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  371. langchain/memory/chat_message_histories/xata.py +1 -1
  372. langchain/memory/chat_message_histories/zep.py +1 -1
  373. langchain/memory/combined.py +14 -13
  374. langchain/memory/entity.py +131 -61
  375. langchain/memory/prompt.py +10 -11
  376. langchain/memory/readonly.py +0 -2
  377. langchain/memory/simple.py +4 -3
  378. langchain/memory/summary.py +43 -11
  379. langchain/memory/summary_buffer.py +20 -8
  380. langchain/memory/token_buffer.py +2 -0
  381. langchain/memory/utils.py +3 -2
  382. langchain/memory/vectorstore.py +12 -5
  383. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  384. langchain/model_laboratory.py +12 -11
  385. langchain/output_parsers/__init__.py +4 -4
  386. langchain/output_parsers/boolean.py +7 -4
  387. langchain/output_parsers/combining.py +14 -7
  388. langchain/output_parsers/datetime.py +32 -31
  389. langchain/output_parsers/enum.py +10 -4
  390. langchain/output_parsers/fix.py +60 -53
  391. langchain/output_parsers/format_instructions.py +6 -8
  392. langchain/output_parsers/json.py +2 -2
  393. langchain/output_parsers/list.py +2 -2
  394. langchain/output_parsers/loading.py +9 -9
  395. langchain/output_parsers/openai_functions.py +3 -3
  396. langchain/output_parsers/openai_tools.py +1 -1
  397. langchain/output_parsers/pandas_dataframe.py +59 -48
  398. langchain/output_parsers/prompts.py +1 -2
  399. langchain/output_parsers/rail_parser.py +1 -1
  400. langchain/output_parsers/regex.py +9 -8
  401. langchain/output_parsers/regex_dict.py +7 -10
  402. langchain/output_parsers/retry.py +99 -80
  403. langchain/output_parsers/structured.py +21 -6
  404. langchain/output_parsers/yaml.py +19 -11
  405. langchain/prompts/__init__.py +5 -3
  406. langchain/prompts/base.py +5 -5
  407. langchain/prompts/chat.py +8 -8
  408. langchain/prompts/example_selector/__init__.py +3 -1
  409. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  410. langchain/prompts/few_shot.py +1 -1
  411. langchain/prompts/loading.py +3 -3
  412. langchain/prompts/prompt.py +1 -1
  413. langchain/pydantic_v1/__init__.py +1 -1
  414. langchain/retrievers/__init__.py +5 -5
  415. langchain/retrievers/bedrock.py +2 -2
  416. langchain/retrievers/bm25.py +1 -1
  417. langchain/retrievers/contextual_compression.py +14 -8
  418. langchain/retrievers/docarray.py +1 -1
  419. langchain/retrievers/document_compressors/__init__.py +5 -4
  420. langchain/retrievers/document_compressors/base.py +12 -6
  421. langchain/retrievers/document_compressors/chain_extract.py +5 -3
  422. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  423. langchain/retrievers/document_compressors/chain_filter.py +9 -9
  424. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  425. langchain/retrievers/document_compressors/cohere_rerank.py +17 -15
  426. langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -0
  427. langchain/retrievers/document_compressors/embeddings_filter.py +24 -17
  428. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  429. langchain/retrievers/document_compressors/listwise_rerank.py +8 -5
  430. langchain/retrievers/ensemble.py +30 -27
  431. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  432. langchain/retrievers/google_vertex_ai_search.py +2 -2
  433. langchain/retrievers/kendra.py +10 -10
  434. langchain/retrievers/llama_index.py +1 -1
  435. langchain/retrievers/merger_retriever.py +11 -11
  436. langchain/retrievers/milvus.py +1 -1
  437. langchain/retrievers/multi_query.py +35 -27
  438. langchain/retrievers/multi_vector.py +24 -9
  439. langchain/retrievers/parent_document_retriever.py +33 -9
  440. langchain/retrievers/re_phraser.py +6 -5
  441. langchain/retrievers/self_query/base.py +157 -127
  442. langchain/retrievers/time_weighted_retriever.py +21 -7
  443. langchain/retrievers/zilliz.py +1 -1
  444. langchain/runnables/hub.py +12 -0
  445. langchain/runnables/openai_functions.py +12 -2
  446. langchain/schema/__init__.py +23 -23
  447. langchain/schema/cache.py +1 -1
  448. langchain/schema/callbacks/base.py +7 -7
  449. langchain/schema/callbacks/manager.py +19 -19
  450. langchain/schema/callbacks/tracers/base.py +1 -1
  451. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  452. langchain/schema/callbacks/tracers/langchain.py +1 -1
  453. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  454. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  455. langchain/schema/callbacks/tracers/schemas.py +8 -8
  456. langchain/schema/callbacks/tracers/stdout.py +3 -3
  457. langchain/schema/document.py +1 -1
  458. langchain/schema/language_model.py +2 -2
  459. langchain/schema/messages.py +12 -12
  460. langchain/schema/output.py +3 -3
  461. langchain/schema/output_parser.py +3 -3
  462. langchain/schema/runnable/__init__.py +3 -3
  463. langchain/schema/runnable/base.py +9 -9
  464. langchain/schema/runnable/config.py +5 -5
  465. langchain/schema/runnable/configurable.py +1 -1
  466. langchain/schema/runnable/history.py +1 -1
  467. langchain/schema/runnable/passthrough.py +1 -1
  468. langchain/schema/runnable/utils.py +16 -16
  469. langchain/schema/vectorstore.py +1 -1
  470. langchain/smith/__init__.py +2 -1
  471. langchain/smith/evaluation/__init__.py +2 -2
  472. langchain/smith/evaluation/config.py +9 -23
  473. langchain/smith/evaluation/name_generation.py +3 -3
  474. langchain/smith/evaluation/progress.py +22 -4
  475. langchain/smith/evaluation/runner_utils.py +416 -247
  476. langchain/smith/evaluation/string_run_evaluator.py +102 -68
  477. langchain/storage/__init__.py +2 -2
  478. langchain/storage/_lc_store.py +4 -2
  479. langchain/storage/encoder_backed.py +7 -2
  480. langchain/storage/file_system.py +19 -16
  481. langchain/storage/in_memory.py +1 -1
  482. langchain/storage/upstash_redis.py +1 -1
  483. langchain/text_splitter.py +15 -15
  484. langchain/tools/__init__.py +28 -26
  485. langchain/tools/ainetwork/app.py +1 -1
  486. langchain/tools/ainetwork/base.py +1 -1
  487. langchain/tools/ainetwork/owner.py +1 -1
  488. langchain/tools/ainetwork/rule.py +1 -1
  489. langchain/tools/ainetwork/transfer.py +1 -1
  490. langchain/tools/ainetwork/value.py +1 -1
  491. langchain/tools/amadeus/closest_airport.py +1 -1
  492. langchain/tools/amadeus/flight_search.py +1 -1
  493. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  494. langchain/tools/base.py +4 -4
  495. langchain/tools/bearly/tool.py +1 -1
  496. langchain/tools/bing_search/__init__.py +1 -1
  497. langchain/tools/bing_search/tool.py +1 -1
  498. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  499. langchain/tools/dataforseo_api_search/tool.py +1 -1
  500. langchain/tools/ddg_search/tool.py +1 -1
  501. langchain/tools/e2b_data_analysis/tool.py +2 -2
  502. langchain/tools/edenai/__init__.py +1 -1
  503. langchain/tools/file_management/__init__.py +1 -1
  504. langchain/tools/file_management/copy.py +1 -1
  505. langchain/tools/file_management/delete.py +1 -1
  506. langchain/tools/gmail/__init__.py +2 -2
  507. langchain/tools/gmail/get_message.py +1 -1
  508. langchain/tools/gmail/search.py +1 -1
  509. langchain/tools/gmail/send_message.py +1 -1
  510. langchain/tools/google_finance/__init__.py +1 -1
  511. langchain/tools/google_finance/tool.py +1 -1
  512. langchain/tools/google_scholar/__init__.py +1 -1
  513. langchain/tools/google_scholar/tool.py +1 -1
  514. langchain/tools/google_search/__init__.py +1 -1
  515. langchain/tools/google_search/tool.py +1 -1
  516. langchain/tools/google_serper/__init__.py +1 -1
  517. langchain/tools/google_serper/tool.py +1 -1
  518. langchain/tools/google_trends/__init__.py +1 -1
  519. langchain/tools/google_trends/tool.py +1 -1
  520. langchain/tools/jira/tool.py +20 -1
  521. langchain/tools/json/tool.py +25 -3
  522. langchain/tools/memorize/tool.py +1 -1
  523. langchain/tools/multion/__init__.py +1 -1
  524. langchain/tools/multion/update_session.py +1 -1
  525. langchain/tools/office365/__init__.py +2 -2
  526. langchain/tools/office365/events_search.py +1 -1
  527. langchain/tools/office365/messages_search.py +1 -1
  528. langchain/tools/office365/send_event.py +1 -1
  529. langchain/tools/office365/send_message.py +1 -1
  530. langchain/tools/openapi/utils/api_models.py +6 -6
  531. langchain/tools/playwright/__init__.py +5 -5
  532. langchain/tools/playwright/click.py +1 -1
  533. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  534. langchain/tools/playwright/get_elements.py +1 -1
  535. langchain/tools/playwright/navigate.py +1 -1
  536. langchain/tools/plugin.py +2 -2
  537. langchain/tools/powerbi/tool.py +1 -1
  538. langchain/tools/python/__init__.py +3 -2
  539. langchain/tools/reddit_search/tool.py +1 -1
  540. langchain/tools/render.py +2 -2
  541. langchain/tools/requests/tool.py +2 -2
  542. langchain/tools/searchapi/tool.py +1 -1
  543. langchain/tools/searx_search/tool.py +1 -1
  544. langchain/tools/slack/get_message.py +1 -1
  545. langchain/tools/spark_sql/tool.py +1 -1
  546. langchain/tools/sql_database/tool.py +1 -1
  547. langchain/tools/tavily_search/__init__.py +1 -1
  548. langchain/tools/tavily_search/tool.py +1 -1
  549. langchain/tools/zapier/__init__.py +1 -1
  550. langchain/tools/zapier/tool.py +24 -2
  551. langchain/utilities/__init__.py +4 -4
  552. langchain/utilities/arcee.py +4 -4
  553. langchain/utilities/clickup.py +4 -4
  554. langchain/utilities/dalle_image_generator.py +1 -1
  555. langchain/utilities/dataforseo_api_search.py +1 -1
  556. langchain/utilities/opaqueprompts.py +1 -1
  557. langchain/utilities/reddit_search.py +1 -1
  558. langchain/utilities/sql_database.py +1 -1
  559. langchain/utilities/tavily_search.py +1 -1
  560. langchain/utilities/vertexai.py +2 -2
  561. langchain/utils/__init__.py +1 -1
  562. langchain/utils/aiter.py +1 -1
  563. langchain/utils/html.py +3 -3
  564. langchain/utils/input.py +1 -1
  565. langchain/utils/iter.py +1 -1
  566. langchain/utils/json_schema.py +1 -3
  567. langchain/utils/strings.py +1 -1
  568. langchain/utils/utils.py +6 -6
  569. langchain/vectorstores/__init__.py +5 -5
  570. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  571. langchain/vectorstores/azure_cosmos_db.py +1 -1
  572. langchain/vectorstores/clickhouse.py +1 -1
  573. langchain/vectorstores/elastic_vector_search.py +1 -1
  574. langchain/vectorstores/elasticsearch.py +2 -2
  575. langchain/vectorstores/myscale.py +1 -1
  576. langchain/vectorstores/neo4j_vector.py +1 -1
  577. langchain/vectorstores/pgembedding.py +1 -1
  578. langchain/vectorstores/qdrant.py +1 -1
  579. langchain/vectorstores/redis/__init__.py +1 -1
  580. langchain/vectorstores/redis/base.py +1 -1
  581. langchain/vectorstores/redis/filters.py +4 -4
  582. langchain/vectorstores/redis/schema.py +6 -6
  583. langchain/vectorstores/sklearn.py +2 -2
  584. langchain/vectorstores/starrocks.py +1 -1
  585. langchain/vectorstores/utils.py +1 -1
  586. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/METADATA +4 -14
  587. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/RECORD +590 -591
  588. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/WHEEL +1 -1
  589. langchain/smith/evaluation/utils.py +0 -0
  590. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/entry_points.txt +0 -0
  591. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/licenses/LICENSE +0 -0
@@ -39,19 +39,23 @@ try:
39
39
  from langchain_community.llms.loading import load_llm, load_llm_from_config
40
40
  except ImportError:
41
41
 
42
- def load_llm(*args: Any, **kwargs: Any) -> None:
43
- raise ImportError(
42
+ def load_llm(*_: Any, **__: Any) -> None:
43
+ """Import error for load_llm."""
44
+ msg = (
44
45
  "To use this load_llm functionality you must install the "
45
46
  "langchain_community package. "
46
47
  "You can install it with `pip install langchain_community`"
47
48
  )
49
+ raise ImportError(msg)
48
50
 
49
- def load_llm_from_config(*args: Any, **kwargs: Any) -> None:
50
- raise ImportError(
51
+ def load_llm_from_config(*_: Any, **__: Any) -> None:
52
+ """Import error for load_llm_from_config."""
53
+ msg = (
51
54
  "To use this load_llm_from_config functionality you must install the "
52
55
  "langchain_community package. "
53
56
  "You can install it with `pip install langchain_community`"
54
57
  )
58
+ raise ImportError(msg)
55
59
 
56
60
 
57
61
  URL_BASE = "https://raw.githubusercontent.com/hwchase17/langchain-hub/master/chains/"
@@ -65,7 +69,8 @@ def _load_llm_chain(config: dict, **kwargs: Any) -> LLMChain:
65
69
  elif "llm_path" in config:
66
70
  llm = load_llm(config.pop("llm_path"), **kwargs)
67
71
  else:
68
- raise ValueError("One of `llm` or `llm_path` must be present.")
72
+ msg = "One of `llm` or `llm_path` must be present."
73
+ raise ValueError(msg)
69
74
 
70
75
  if "prompt" in config:
71
76
  prompt_config = config.pop("prompt")
@@ -73,7 +78,8 @@ def _load_llm_chain(config: dict, **kwargs: Any) -> LLMChain:
73
78
  elif "prompt_path" in config:
74
79
  prompt = load_prompt(config.pop("prompt_path"))
75
80
  else:
76
- raise ValueError("One of `prompt` or `prompt_path` must be present.")
81
+ msg = "One of `prompt` or `prompt_path` must be present."
82
+ raise ValueError(msg)
77
83
  _load_output_parser(config)
78
84
 
79
85
  return LLMChain(llm=llm, prompt=prompt, **config)
@@ -87,11 +93,13 @@ def _load_hyde_chain(config: dict, **kwargs: Any) -> HypotheticalDocumentEmbedde
87
93
  elif "llm_chain_path" in config:
88
94
  llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
89
95
  else:
90
- raise ValueError("One of `llm_chain` or `llm_chain_path` must be present.")
96
+ msg = "One of `llm_chain` or `llm_chain_path` must be present."
97
+ raise ValueError(msg)
91
98
  if "embeddings" in kwargs:
92
99
  embeddings = kwargs.pop("embeddings")
93
100
  else:
94
- raise ValueError("`embeddings` must be present.")
101
+ msg = "`embeddings` must be present."
102
+ raise ValueError(msg)
95
103
  return HypotheticalDocumentEmbedder(
96
104
  llm_chain=llm_chain,
97
105
  base_embeddings=embeddings,
@@ -106,10 +114,12 @@ def _load_stuff_documents_chain(config: dict, **kwargs: Any) -> StuffDocumentsCh
106
114
  elif "llm_chain_path" in config:
107
115
  llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
108
116
  else:
109
- raise ValueError("One of `llm_chain` or `llm_chain_path` must be present.")
117
+ msg = "One of `llm_chain` or `llm_chain_path` must be present."
118
+ raise ValueError(msg)
110
119
 
111
120
  if not isinstance(llm_chain, LLMChain):
112
- raise ValueError(f"Expected LLMChain, got {llm_chain}")
121
+ msg = f"Expected LLMChain, got {llm_chain}"
122
+ raise ValueError(msg) # noqa: TRY004
113
123
 
114
124
  if "document_prompt" in config:
115
125
  prompt_config = config.pop("document_prompt")
@@ -117,17 +127,19 @@ def _load_stuff_documents_chain(config: dict, **kwargs: Any) -> StuffDocumentsCh
117
127
  elif "document_prompt_path" in config:
118
128
  document_prompt = load_prompt(config.pop("document_prompt_path"))
119
129
  else:
120
- raise ValueError(
121
- "One of `document_prompt` or `document_prompt_path` must be present."
122
- )
130
+ msg = "One of `document_prompt` or `document_prompt_path` must be present."
131
+ raise ValueError(msg)
123
132
 
124
133
  return StuffDocumentsChain(
125
- llm_chain=llm_chain, document_prompt=document_prompt, **config
134
+ llm_chain=llm_chain,
135
+ document_prompt=document_prompt,
136
+ **config,
126
137
  )
127
138
 
128
139
 
129
140
  def _load_map_reduce_documents_chain(
130
- config: dict, **kwargs: Any
141
+ config: dict,
142
+ **kwargs: Any,
131
143
  ) -> MapReduceDocumentsChain:
132
144
  if "llm_chain" in config:
133
145
  llm_chain_config = config.pop("llm_chain")
@@ -135,18 +147,22 @@ def _load_map_reduce_documents_chain(
135
147
  elif "llm_chain_path" in config:
136
148
  llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
137
149
  else:
138
- raise ValueError("One of `llm_chain` or `llm_chain_path` must be present.")
150
+ msg = "One of `llm_chain` or `llm_chain_path` must be present."
151
+ raise ValueError(msg)
139
152
 
140
153
  if not isinstance(llm_chain, LLMChain):
141
- raise ValueError(f"Expected LLMChain, got {llm_chain}")
154
+ msg = f"Expected LLMChain, got {llm_chain}"
155
+ raise ValueError(msg) # noqa: TRY004
142
156
 
143
157
  if "reduce_documents_chain" in config:
144
158
  reduce_documents_chain = load_chain_from_config(
145
- config.pop("reduce_documents_chain"), **kwargs
159
+ config.pop("reduce_documents_chain"),
160
+ **kwargs,
146
161
  )
147
162
  elif "reduce_documents_chain_path" in config:
148
163
  reduce_documents_chain = load_chain(
149
- config.pop("reduce_documents_chain_path"), **kwargs
164
+ config.pop("reduce_documents_chain_path"),
165
+ **kwargs,
150
166
  )
151
167
  else:
152
168
  reduce_documents_chain = _load_reduce_documents_chain(config, **kwargs)
@@ -165,26 +181,31 @@ def _load_reduce_documents_chain(config: dict, **kwargs: Any) -> ReduceDocuments
165
181
  if "combine_documents_chain" in config:
166
182
  combine_document_chain_config = config.pop("combine_documents_chain")
167
183
  combine_documents_chain = load_chain_from_config(
168
- combine_document_chain_config, **kwargs
184
+ combine_document_chain_config,
185
+ **kwargs,
169
186
  )
170
187
  elif "combine_document_chain" in config:
171
188
  combine_document_chain_config = config.pop("combine_document_chain")
172
189
  combine_documents_chain = load_chain_from_config(
173
- combine_document_chain_config, **kwargs
190
+ combine_document_chain_config,
191
+ **kwargs,
174
192
  )
175
193
  elif "combine_documents_chain_path" in config:
176
194
  combine_documents_chain = load_chain(
177
- config.pop("combine_documents_chain_path"), **kwargs
195
+ config.pop("combine_documents_chain_path"),
196
+ **kwargs,
178
197
  )
179
198
  elif "combine_document_chain_path" in config:
180
199
  combine_documents_chain = load_chain(
181
- config.pop("combine_document_chain_path"), **kwargs
200
+ config.pop("combine_document_chain_path"),
201
+ **kwargs,
182
202
  )
183
203
  else:
184
- raise ValueError(
204
+ msg = (
185
205
  "One of `combine_documents_chain` or "
186
206
  "`combine_documents_chain_path` must be present."
187
207
  )
208
+ raise ValueError(msg)
188
209
 
189
210
  if "collapse_documents_chain" in config:
190
211
  collapse_document_chain_config = config.pop("collapse_documents_chain")
@@ -192,11 +213,13 @@ def _load_reduce_documents_chain(config: dict, **kwargs: Any) -> ReduceDocuments
192
213
  collapse_documents_chain = None
193
214
  else:
194
215
  collapse_documents_chain = load_chain_from_config(
195
- collapse_document_chain_config, **kwargs
216
+ collapse_document_chain_config,
217
+ **kwargs,
196
218
  )
197
219
  elif "collapse_documents_chain_path" in config:
198
220
  collapse_documents_chain = load_chain(
199
- config.pop("collapse_documents_chain_path"), **kwargs
221
+ config.pop("collapse_documents_chain_path"),
222
+ **kwargs,
200
223
  )
201
224
  elif "collapse_document_chain" in config:
202
225
  collapse_document_chain_config = config.pop("collapse_document_chain")
@@ -204,11 +227,13 @@ def _load_reduce_documents_chain(config: dict, **kwargs: Any) -> ReduceDocuments
204
227
  collapse_documents_chain = None
205
228
  else:
206
229
  collapse_documents_chain = load_chain_from_config(
207
- collapse_document_chain_config, **kwargs
230
+ collapse_document_chain_config,
231
+ **kwargs,
208
232
  )
209
233
  elif "collapse_document_chain_path" in config:
210
234
  collapse_documents_chain = load_chain(
211
- config.pop("collapse_document_chain_path"), **kwargs
235
+ config.pop("collapse_document_chain_path"),
236
+ **kwargs,
212
237
  )
213
238
 
214
239
  return ReduceDocumentsChain(
@@ -220,12 +245,13 @@ def _load_reduce_documents_chain(config: dict, **kwargs: Any) -> ReduceDocuments
220
245
 
221
246
  def _load_llm_bash_chain(config: dict, **kwargs: Any) -> Any:
222
247
  """Load LLM Bash chain from config dict"""
223
- raise NotImplementedError(
248
+ msg = (
224
249
  "LLMBash Chain is not available through LangChain anymore. "
225
250
  "The relevant code can be found in langchain_experimental, "
226
251
  "but it is not appropriate for production usage due to security "
227
252
  "concerns. Please refer to langchain-experimental repository for more details."
228
253
  )
254
+ raise NotImplementedError(msg)
229
255
 
230
256
 
231
257
  def _load_llm_checker_chain(config: dict, **kwargs: Any) -> LLMCheckerChain:
@@ -235,15 +261,16 @@ def _load_llm_checker_chain(config: dict, **kwargs: Any) -> LLMCheckerChain:
235
261
  elif "llm_path" in config:
236
262
  llm = load_llm(config.pop("llm_path"), **kwargs)
237
263
  else:
238
- raise ValueError("One of `llm` or `llm_path` must be present.")
264
+ msg = "One of `llm` or `llm_path` must be present."
265
+ raise ValueError(msg)
239
266
  if "create_draft_answer_prompt" in config:
240
267
  create_draft_answer_prompt_config = config.pop("create_draft_answer_prompt")
241
268
  create_draft_answer_prompt = load_prompt_from_config(
242
- create_draft_answer_prompt_config
269
+ create_draft_answer_prompt_config,
243
270
  )
244
271
  elif "create_draft_answer_prompt_path" in config:
245
272
  create_draft_answer_prompt = load_prompt(
246
- config.pop("create_draft_answer_prompt_path")
273
+ config.pop("create_draft_answer_prompt_path"),
247
274
  )
248
275
  if "list_assertions_prompt" in config:
249
276
  list_assertions_prompt_config = config.pop("list_assertions_prompt")
@@ -253,11 +280,11 @@ def _load_llm_checker_chain(config: dict, **kwargs: Any) -> LLMCheckerChain:
253
280
  if "check_assertions_prompt" in config:
254
281
  check_assertions_prompt_config = config.pop("check_assertions_prompt")
255
282
  check_assertions_prompt = load_prompt_from_config(
256
- check_assertions_prompt_config
283
+ check_assertions_prompt_config,
257
284
  )
258
285
  elif "check_assertions_prompt_path" in config:
259
286
  check_assertions_prompt = load_prompt(
260
- config.pop("check_assertions_prompt_path")
287
+ config.pop("check_assertions_prompt_path"),
261
288
  )
262
289
  if "revised_answer_prompt" in config:
263
290
  revised_answer_prompt_config = config.pop("revised_answer_prompt")
@@ -290,7 +317,8 @@ def _load_llm_math_chain(config: dict, **kwargs: Any) -> LLMMathChain:
290
317
  elif "llm_path" in config:
291
318
  llm = load_llm(config.pop("llm_path"), **kwargs)
292
319
  else:
293
- raise ValueError("One of `llm_chain` or `llm_chain_path` must be present.")
320
+ msg = "One of `llm_chain` or `llm_chain_path` must be present."
321
+ raise ValueError(msg)
294
322
  if "prompt" in config:
295
323
  prompt_config = config.pop("prompt")
296
324
  prompt = load_prompt_from_config(prompt_config)
@@ -298,12 +326,12 @@ def _load_llm_math_chain(config: dict, **kwargs: Any) -> LLMMathChain:
298
326
  prompt = load_prompt(config.pop("prompt_path"))
299
327
  if llm_chain:
300
328
  return LLMMathChain(llm_chain=llm_chain, prompt=prompt, **config) # type: ignore[arg-type]
301
- else:
302
- return LLMMathChain(llm=llm, prompt=prompt, **config)
329
+ return LLMMathChain(llm=llm, prompt=prompt, **config)
303
330
 
304
331
 
305
332
  def _load_map_rerank_documents_chain(
306
- config: dict, **kwargs: Any
333
+ config: dict,
334
+ **kwargs: Any,
307
335
  ) -> MapRerankDocumentsChain:
308
336
  if "llm_chain" in config:
309
337
  llm_chain_config = config.pop("llm_chain")
@@ -311,17 +339,19 @@ def _load_map_rerank_documents_chain(
311
339
  elif "llm_chain_path" in config:
312
340
  llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
313
341
  else:
314
- raise ValueError("One of `llm_chain` or `llm_chain_path` must be present.")
342
+ msg = "One of `llm_chain` or `llm_chain_path` must be present."
343
+ raise ValueError(msg)
315
344
  return MapRerankDocumentsChain(llm_chain=llm_chain, **config) # type: ignore[arg-type]
316
345
 
317
346
 
318
347
  def _load_pal_chain(config: dict, **kwargs: Any) -> Any:
319
- raise NotImplementedError(
348
+ msg = (
320
349
  "PALChain is not available through LangChain anymore. "
321
350
  "The relevant code can be found in langchain_experimental, "
322
351
  "but it is not appropriate for production usage due to security "
323
352
  "concerns. Please refer to langchain-experimental repository for more details."
324
353
  )
354
+ raise NotImplementedError(msg)
325
355
 
326
356
 
327
357
  def _load_refine_documents_chain(config: dict, **kwargs: Any) -> RefineDocumentsChain:
@@ -331,18 +361,16 @@ def _load_refine_documents_chain(config: dict, **kwargs: Any) -> RefineDocuments
331
361
  elif "initial_llm_chain_path" in config:
332
362
  initial_llm_chain = load_chain(config.pop("initial_llm_chain_path"), **kwargs)
333
363
  else:
334
- raise ValueError(
335
- "One of `initial_llm_chain` or `initial_llm_chain_path` must be present."
336
- )
364
+ msg = "One of `initial_llm_chain` or `initial_llm_chain_path` must be present."
365
+ raise ValueError(msg)
337
366
  if "refine_llm_chain" in config:
338
367
  refine_llm_chain_config = config.pop("refine_llm_chain")
339
368
  refine_llm_chain = load_chain_from_config(refine_llm_chain_config, **kwargs)
340
369
  elif "refine_llm_chain_path" in config:
341
370
  refine_llm_chain = load_chain(config.pop("refine_llm_chain_path"), **kwargs)
342
371
  else:
343
- raise ValueError(
344
- "One of `refine_llm_chain` or `refine_llm_chain_path` must be present."
345
- )
372
+ msg = "One of `refine_llm_chain` or `refine_llm_chain_path` must be present."
373
+ raise ValueError(msg)
346
374
  if "document_prompt" in config:
347
375
  prompt_config = config.pop("document_prompt")
348
376
  document_prompt = load_prompt_from_config(prompt_config)
@@ -360,23 +388,26 @@ def _load_qa_with_sources_chain(config: dict, **kwargs: Any) -> QAWithSourcesCha
360
388
  if "combine_documents_chain" in config:
361
389
  combine_documents_chain_config = config.pop("combine_documents_chain")
362
390
  combine_documents_chain = load_chain_from_config(
363
- combine_documents_chain_config, **kwargs
391
+ combine_documents_chain_config,
392
+ **kwargs,
364
393
  )
365
394
  elif "combine_documents_chain_path" in config:
366
395
  combine_documents_chain = load_chain(
367
- config.pop("combine_documents_chain_path"), **kwargs
396
+ config.pop("combine_documents_chain_path"),
397
+ **kwargs,
368
398
  )
369
399
  else:
370
- raise ValueError(
400
+ msg = (
371
401
  "One of `combine_documents_chain` or "
372
402
  "`combine_documents_chain_path` must be present."
373
403
  )
404
+ raise ValueError(msg)
374
405
  return QAWithSourcesChain(combine_documents_chain=combine_documents_chain, **config) # type: ignore[arg-type]
375
406
 
376
407
 
377
408
  def _load_sql_database_chain(config: dict, **kwargs: Any) -> Any:
378
409
  """Load SQL Database chain from config dict."""
379
- raise NotImplementedError(
410
+ msg = (
380
411
  "SQLDatabaseChain is not available through LangChain anymore. "
381
412
  "The relevant code can be found in langchain_experimental, "
382
413
  "but it is not appropriate for production usage due to security "
@@ -384,29 +415,35 @@ def _load_sql_database_chain(config: dict, **kwargs: Any) -> Any:
384
415
  "or refer to this tutorial for best practices: "
385
416
  "https://python.langchain.com/docs/tutorials/sql_qa/"
386
417
  )
418
+ raise NotImplementedError(msg)
387
419
 
388
420
 
389
421
  def _load_vector_db_qa_with_sources_chain(
390
- config: dict, **kwargs: Any
422
+ config: dict,
423
+ **kwargs: Any,
391
424
  ) -> VectorDBQAWithSourcesChain:
392
425
  if "vectorstore" in kwargs:
393
426
  vectorstore = kwargs.pop("vectorstore")
394
427
  else:
395
- raise ValueError("`vectorstore` must be present.")
428
+ msg = "`vectorstore` must be present."
429
+ raise ValueError(msg)
396
430
  if "combine_documents_chain" in config:
397
431
  combine_documents_chain_config = config.pop("combine_documents_chain")
398
432
  combine_documents_chain = load_chain_from_config(
399
- combine_documents_chain_config, **kwargs
433
+ combine_documents_chain_config,
434
+ **kwargs,
400
435
  )
401
436
  elif "combine_documents_chain_path" in config:
402
437
  combine_documents_chain = load_chain(
403
- config.pop("combine_documents_chain_path"), **kwargs
438
+ config.pop("combine_documents_chain_path"),
439
+ **kwargs,
404
440
  )
405
441
  else:
406
- raise ValueError(
442
+ msg = (
407
443
  "One of `combine_documents_chain` or "
408
444
  "`combine_documents_chain_path` must be present."
409
445
  )
446
+ raise ValueError(msg)
410
447
  return VectorDBQAWithSourcesChain(
411
448
  combine_documents_chain=combine_documents_chain, # type: ignore[arg-type]
412
449
  vectorstore=vectorstore,
@@ -418,21 +455,25 @@ def _load_retrieval_qa(config: dict, **kwargs: Any) -> RetrievalQA:
418
455
  if "retriever" in kwargs:
419
456
  retriever = kwargs.pop("retriever")
420
457
  else:
421
- raise ValueError("`retriever` must be present.")
458
+ msg = "`retriever` must be present."
459
+ raise ValueError(msg)
422
460
  if "combine_documents_chain" in config:
423
461
  combine_documents_chain_config = config.pop("combine_documents_chain")
424
462
  combine_documents_chain = load_chain_from_config(
425
- combine_documents_chain_config, **kwargs
463
+ combine_documents_chain_config,
464
+ **kwargs,
426
465
  )
427
466
  elif "combine_documents_chain_path" in config:
428
467
  combine_documents_chain = load_chain(
429
- config.pop("combine_documents_chain_path"), **kwargs
468
+ config.pop("combine_documents_chain_path"),
469
+ **kwargs,
430
470
  )
431
471
  else:
432
- raise ValueError(
472
+ msg = (
433
473
  "One of `combine_documents_chain` or "
434
474
  "`combine_documents_chain_path` must be present."
435
475
  )
476
+ raise ValueError(msg)
436
477
  return RetrievalQA(
437
478
  combine_documents_chain=combine_documents_chain, # type: ignore[arg-type]
438
479
  retriever=retriever,
@@ -441,26 +482,31 @@ def _load_retrieval_qa(config: dict, **kwargs: Any) -> RetrievalQA:
441
482
 
442
483
 
443
484
  def _load_retrieval_qa_with_sources_chain(
444
- config: dict, **kwargs: Any
485
+ config: dict,
486
+ **kwargs: Any,
445
487
  ) -> RetrievalQAWithSourcesChain:
446
488
  if "retriever" in kwargs:
447
489
  retriever = kwargs.pop("retriever")
448
490
  else:
449
- raise ValueError("`retriever` must be present.")
491
+ msg = "`retriever` must be present."
492
+ raise ValueError(msg)
450
493
  if "combine_documents_chain" in config:
451
494
  combine_documents_chain_config = config.pop("combine_documents_chain")
452
495
  combine_documents_chain = load_chain_from_config(
453
- combine_documents_chain_config, **kwargs
496
+ combine_documents_chain_config,
497
+ **kwargs,
454
498
  )
455
499
  elif "combine_documents_chain_path" in config:
456
500
  combine_documents_chain = load_chain(
457
- config.pop("combine_documents_chain_path"), **kwargs
501
+ config.pop("combine_documents_chain_path"),
502
+ **kwargs,
458
503
  )
459
504
  else:
460
- raise ValueError(
505
+ msg = (
461
506
  "One of `combine_documents_chain` or "
462
507
  "`combine_documents_chain_path` must be present."
463
508
  )
509
+ raise ValueError(msg)
464
510
  return RetrievalQAWithSourcesChain(
465
511
  combine_documents_chain=combine_documents_chain, # type: ignore[arg-type]
466
512
  retriever=retriever,
@@ -472,21 +518,25 @@ def _load_vector_db_qa(config: dict, **kwargs: Any) -> VectorDBQA:
472
518
  if "vectorstore" in kwargs:
473
519
  vectorstore = kwargs.pop("vectorstore")
474
520
  else:
475
- raise ValueError("`vectorstore` must be present.")
521
+ msg = "`vectorstore` must be present."
522
+ raise ValueError(msg)
476
523
  if "combine_documents_chain" in config:
477
524
  combine_documents_chain_config = config.pop("combine_documents_chain")
478
525
  combine_documents_chain = load_chain_from_config(
479
- combine_documents_chain_config, **kwargs
526
+ combine_documents_chain_config,
527
+ **kwargs,
480
528
  )
481
529
  elif "combine_documents_chain_path" in config:
482
530
  combine_documents_chain = load_chain(
483
- config.pop("combine_documents_chain_path"), **kwargs
531
+ config.pop("combine_documents_chain_path"),
532
+ **kwargs,
484
533
  )
485
534
  else:
486
- raise ValueError(
535
+ msg = (
487
536
  "One of `combine_documents_chain` or "
488
537
  "`combine_documents_chain_path` must be present."
489
538
  )
539
+ raise ValueError(msg)
490
540
  return VectorDBQA(
491
541
  combine_documents_chain=combine_documents_chain, # type: ignore[arg-type]
492
542
  vectorstore=vectorstore,
@@ -498,28 +548,33 @@ def _load_graph_cypher_chain(config: dict, **kwargs: Any) -> GraphCypherQAChain:
498
548
  if "graph" in kwargs:
499
549
  graph = kwargs.pop("graph")
500
550
  else:
501
- raise ValueError("`graph` must be present.")
551
+ msg = "`graph` must be present."
552
+ raise ValueError(msg)
502
553
  if "cypher_generation_chain" in config:
503
554
  cypher_generation_chain_config = config.pop("cypher_generation_chain")
504
555
  cypher_generation_chain = load_chain_from_config(
505
- cypher_generation_chain_config, **kwargs
556
+ cypher_generation_chain_config,
557
+ **kwargs,
506
558
  )
507
559
  else:
508
- raise ValueError("`cypher_generation_chain` must be present.")
560
+ msg = "`cypher_generation_chain` must be present."
561
+ raise ValueError(msg)
509
562
  if "qa_chain" in config:
510
563
  qa_chain_config = config.pop("qa_chain")
511
564
  qa_chain = load_chain_from_config(qa_chain_config, **kwargs)
512
565
  else:
513
- raise ValueError("`qa_chain` must be present.")
566
+ msg = "`qa_chain` must be present."
567
+ raise ValueError(msg)
514
568
 
515
569
  try:
516
570
  from langchain_community.chains.graph_qa.cypher import GraphCypherQAChain
517
- except ImportError:
518
- raise ImportError(
571
+ except ImportError as e:
572
+ msg = (
519
573
  "To use this GraphCypherQAChain functionality you must install the "
520
574
  "langchain_community package. "
521
575
  "You can install it with `pip install langchain_community`"
522
576
  )
577
+ raise ImportError(msg) from e
523
578
  return GraphCypherQAChain(
524
579
  graph=graph,
525
580
  cypher_generation_chain=cypher_generation_chain,
@@ -535,22 +590,21 @@ def _load_api_chain(config: dict, **kwargs: Any) -> APIChain:
535
590
  elif "api_request_chain_path" in config:
536
591
  api_request_chain = load_chain(config.pop("api_request_chain_path"))
537
592
  else:
538
- raise ValueError(
539
- "One of `api_request_chain` or `api_request_chain_path` must be present."
540
- )
593
+ msg = "One of `api_request_chain` or `api_request_chain_path` must be present."
594
+ raise ValueError(msg)
541
595
  if "api_answer_chain" in config:
542
596
  api_answer_chain_config = config.pop("api_answer_chain")
543
597
  api_answer_chain = load_chain_from_config(api_answer_chain_config, **kwargs)
544
598
  elif "api_answer_chain_path" in config:
545
599
  api_answer_chain = load_chain(config.pop("api_answer_chain_path"), **kwargs)
546
600
  else:
547
- raise ValueError(
548
- "One of `api_answer_chain` or `api_answer_chain_path` must be present."
549
- )
601
+ msg = "One of `api_answer_chain` or `api_answer_chain_path` must be present."
602
+ raise ValueError(msg)
550
603
  if "requests_wrapper" in kwargs:
551
604
  requests_wrapper = kwargs.pop("requests_wrapper")
552
605
  else:
553
- raise ValueError("`requests_wrapper` must be present.")
606
+ msg = "`requests_wrapper` must be present."
607
+ raise ValueError(msg)
554
608
  return APIChain(
555
609
  api_request_chain=api_request_chain, # type: ignore[arg-type]
556
610
  api_answer_chain=api_answer_chain, # type: ignore[arg-type]
@@ -562,12 +616,13 @@ def _load_api_chain(config: dict, **kwargs: Any) -> APIChain:
562
616
  def _load_llm_requests_chain(config: dict, **kwargs: Any) -> LLMRequestsChain:
563
617
  try:
564
618
  from langchain.chains.llm_requests import LLMRequestsChain
565
- except ImportError:
566
- raise ImportError(
619
+ except ImportError as e:
620
+ msg = (
567
621
  "To use this LLMRequestsChain functionality you must install the "
568
622
  "langchain package. "
569
623
  "You can install it with `pip install langchain`"
570
624
  )
625
+ raise ImportError(msg) from e
571
626
 
572
627
  if "llm_chain" in config:
573
628
  llm_chain_config = config.pop("llm_chain")
@@ -575,14 +630,16 @@ def _load_llm_requests_chain(config: dict, **kwargs: Any) -> LLMRequestsChain:
575
630
  elif "llm_chain_path" in config:
576
631
  llm_chain = load_chain(config.pop("llm_chain_path"), **kwargs)
577
632
  else:
578
- raise ValueError("One of `llm_chain` or `llm_chain_path` must be present.")
633
+ msg = "One of `llm_chain` or `llm_chain_path` must be present."
634
+ raise ValueError(msg)
579
635
  if "requests_wrapper" in kwargs:
580
636
  requests_wrapper = kwargs.pop("requests_wrapper")
581
637
  return LLMRequestsChain(
582
- llm_chain=llm_chain, requests_wrapper=requests_wrapper, **config
638
+ llm_chain=llm_chain,
639
+ requests_wrapper=requests_wrapper,
640
+ **config,
583
641
  )
584
- else:
585
- return LLMRequestsChain(llm_chain=llm_chain, **config)
642
+ return LLMRequestsChain(llm_chain=llm_chain, **config)
586
643
 
587
644
 
588
645
  type_to_loader_dict = {
@@ -620,11 +677,13 @@ type_to_loader_dict = {
620
677
  def load_chain_from_config(config: dict, **kwargs: Any) -> Chain:
621
678
  """Load chain from Config Dict."""
622
679
  if "_type" not in config:
623
- raise ValueError("Must specify a chain Type in config")
680
+ msg = "Must specify a chain Type in config"
681
+ raise ValueError(msg)
624
682
  config_type = config.pop("_type")
625
683
 
626
684
  if config_type not in type_to_loader_dict:
627
- raise ValueError(f"Loading {config_type} chain not supported")
685
+ msg = f"Loading {config_type} chain not supported"
686
+ raise ValueError(msg)
628
687
 
629
688
  chain_loader = type_to_loader_dict[config_type]
630
689
  return chain_loader(config, **kwargs)
@@ -641,30 +700,29 @@ def load_chain_from_config(config: dict, **kwargs: Any) -> Chain:
641
700
  def load_chain(path: Union[str, Path], **kwargs: Any) -> Chain:
642
701
  """Unified method for loading a chain from LangChainHub or local fs."""
643
702
  if isinstance(path, str) and path.startswith("lc://"):
644
- raise RuntimeError(
703
+ msg = (
645
704
  "Loading from the deprecated github-based Hub is no longer supported. "
646
705
  "Please use the new LangChain Hub at https://smith.langchain.com/hub "
647
706
  "instead."
648
707
  )
708
+ raise RuntimeError(msg)
649
709
  return _load_chain_from_file(path, **kwargs)
650
710
 
651
711
 
652
712
  def _load_chain_from_file(file: Union[str, Path], **kwargs: Any) -> Chain:
653
713
  """Load chain from file."""
654
714
  # Convert file to Path object.
655
- if isinstance(file, str):
656
- file_path = Path(file)
657
- else:
658
- file_path = file
715
+ file_path = Path(file) if isinstance(file, str) else file
659
716
  # Load from either json or yaml.
660
717
  if file_path.suffix == ".json":
661
- with open(file_path) as f:
718
+ with file_path.open() as f:
662
719
  config = json.load(f)
663
720
  elif file_path.suffix.endswith((".yaml", ".yml")):
664
- with open(file_path) as f:
721
+ with file_path.open() as f:
665
722
  config = yaml.safe_load(f)
666
723
  else:
667
- raise ValueError("File type must be json or yaml")
724
+ msg = "File type must be json or yaml"
725
+ raise ValueError(msg)
668
726
 
669
727
  # Override default 'verbose' and 'memory' for the chain
670
728
  if "verbose" in kwargs:
@@ -30,7 +30,7 @@ from langchain.chains.llm import LLMChain
30
30
  removal="1.0",
31
31
  message=(
32
32
  "Refer to migration guide here for a recommended implementation using "
33
- "LangGraph: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain/" # noqa: E501
33
+ "LangGraph: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain/"
34
34
  ". See also LangGraph guides for map-reduce: "
35
35
  "https://langchain-ai.github.io/langgraph/how-tos/map-reduce/."
36
36
  ),
@@ -64,7 +64,7 @@ class MapReduceChain(Chain):
64
64
  **(reduce_chain_kwargs if reduce_chain_kwargs else {}),
65
65
  )
66
66
  reduce_documents_chain = ReduceDocumentsChain(
67
- combine_documents_chain=stuff_chain
67
+ combine_documents_chain=stuff_chain,
68
68
  )
69
69
  combine_documents_chain = MapReduceDocumentsChain(
70
70
  llm_chain=llm_chain,
@@ -115,6 +115,7 @@ class MapReduceChain(Chain):
115
115
  self.combine_documents_chain.input_key: docs,
116
116
  }
117
117
  outputs = self.combine_documents_chain.run(
118
- _inputs, callbacks=_run_manager.get_child()
118
+ _inputs,
119
+ callbacks=_run_manager.get_child(),
119
120
  )
120
121
  return {self.output_key: outputs}