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