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