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
@@ -112,7 +112,8 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
112
112
  """Return the results of the map steps in the output."""
113
113
 
114
114
  def get_output_schema(
115
- self, config: Optional[RunnableConfig] = None
115
+ self,
116
+ config: Optional[RunnableConfig] = None,
116
117
  ) -> type[BaseModel]:
117
118
  if self.return_intermediate_steps:
118
119
  return create_model(
@@ -133,7 +134,7 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
133
134
  """
134
135
  _output_keys = super().output_keys
135
136
  if self.return_intermediate_steps:
136
- _output_keys = _output_keys + ["intermediate_steps"]
137
+ _output_keys = [*_output_keys, "intermediate_steps"]
137
138
  return _output_keys
138
139
 
139
140
  model_config = ConfigDict(
@@ -147,11 +148,12 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
147
148
  """For backwards compatibility."""
148
149
  if "combine_document_chain" in values:
149
150
  if "reduce_documents_chain" in values:
150
- raise ValueError(
151
+ msg = (
151
152
  "Both `reduce_documents_chain` and `combine_document_chain` "
152
153
  "cannot be provided at the same time. `combine_document_chain` "
153
154
  "is deprecated, please only provide `reduce_documents_chain`"
154
155
  )
156
+ raise ValueError(msg)
155
157
  combine_chain = values["combine_document_chain"]
156
158
  collapse_chain = values.get("collapse_document_chain")
157
159
  reduce_chain = ReduceDocumentsChain(
@@ -160,8 +162,7 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
160
162
  )
161
163
  values["reduce_documents_chain"] = reduce_chain
162
164
  del values["combine_document_chain"]
163
- if "collapse_document_chain" in values:
164
- del values["collapse_document_chain"]
165
+ values.pop("collapse_document_chain", None)
165
166
 
166
167
  return values
167
168
 
@@ -179,23 +180,25 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
179
180
  def get_default_document_variable_name(cls, values: dict) -> Any:
180
181
  """Get default document variable name, if not provided."""
181
182
  if "llm_chain" not in values:
182
- raise ValueError("llm_chain must be provided")
183
+ msg = "llm_chain must be provided"
184
+ raise ValueError(msg)
183
185
 
184
186
  llm_chain_variables = values["llm_chain"].prompt.input_variables
185
187
  if "document_variable_name" not in values:
186
188
  if len(llm_chain_variables) == 1:
187
189
  values["document_variable_name"] = llm_chain_variables[0]
188
190
  else:
189
- raise ValueError(
191
+ msg = (
190
192
  "document_variable_name must be provided if there are "
191
193
  "multiple llm_chain input_variables"
192
194
  )
193
- else:
194
- if values["document_variable_name"] not in llm_chain_variables:
195
- raise ValueError(
196
- f"document_variable_name {values['document_variable_name']} was "
197
- f"not found in llm_chain input_variables: {llm_chain_variables}"
198
- )
195
+ raise ValueError(msg)
196
+ elif values["document_variable_name"] not in llm_chain_variables:
197
+ msg = (
198
+ f"document_variable_name {values['document_variable_name']} was "
199
+ f"not found in llm_chain input_variables: {llm_chain_variables}"
200
+ )
201
+ raise ValueError(msg)
199
202
  return values
200
203
 
201
204
  @property
@@ -204,26 +207,25 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
204
207
  if isinstance(self.reduce_documents_chain, ReduceDocumentsChain):
205
208
  if self.reduce_documents_chain.collapse_documents_chain:
206
209
  return self.reduce_documents_chain.collapse_documents_chain
207
- else:
208
- return self.reduce_documents_chain.combine_documents_chain
209
- else:
210
- raise ValueError(
211
- f"`reduce_documents_chain` is of type "
212
- f"{type(self.reduce_documents_chain)} so it does not have "
213
- f"this attribute."
214
- )
210
+ return self.reduce_documents_chain.combine_documents_chain
211
+ msg = (
212
+ f"`reduce_documents_chain` is of type "
213
+ f"{type(self.reduce_documents_chain)} so it does not have "
214
+ f"this attribute."
215
+ )
216
+ raise ValueError(msg)
215
217
 
216
218
  @property
217
219
  def combine_document_chain(self) -> BaseCombineDocumentsChain:
218
220
  """Kept for backward compatibility."""
219
221
  if isinstance(self.reduce_documents_chain, ReduceDocumentsChain):
220
222
  return self.reduce_documents_chain.combine_documents_chain
221
- else:
222
- raise ValueError(
223
- f"`reduce_documents_chain` is of type "
224
- f"{type(self.reduce_documents_chain)} so it does not have "
225
- f"this attribute."
226
- )
223
+ msg = (
224
+ f"`reduce_documents_chain` is of type "
225
+ f"{type(self.reduce_documents_chain)} so it does not have "
226
+ f"this attribute."
227
+ )
228
+ raise ValueError(msg)
227
229
 
228
230
  def combine_docs(
229
231
  self,
@@ -249,7 +251,10 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
249
251
  for i, r in enumerate(map_results)
250
252
  ]
251
253
  result, extra_return_dict = self.reduce_documents_chain.combine_docs(
252
- result_docs, token_max=token_max, callbacks=callbacks, **kwargs
254
+ result_docs,
255
+ token_max=token_max,
256
+ callbacks=callbacks,
257
+ **kwargs,
253
258
  )
254
259
  if self.return_intermediate_steps:
255
260
  intermediate_steps = [r[question_result_key] for r in map_results]
@@ -270,7 +275,7 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
270
275
  """
271
276
  map_results = await self.llm_chain.aapply(
272
277
  # FYI - this is parallelized and so it is fast.
273
- [{**{self.document_variable_name: d.page_content}, **kwargs} for d in docs],
278
+ [{self.document_variable_name: d.page_content, **kwargs} for d in docs],
274
279
  callbacks=callbacks,
275
280
  )
276
281
  question_result_key = self.llm_chain.output_key
@@ -280,7 +285,10 @@ class MapReduceDocumentsChain(BaseCombineDocumentsChain):
280
285
  for i, r in enumerate(map_results)
281
286
  ]
282
287
  result, extra_return_dict = await self.reduce_documents_chain.acombine_docs(
283
- result_docs, token_max=token_max, callbacks=callbacks, **kwargs
288
+ result_docs,
289
+ token_max=token_max,
290
+ callbacks=callbacks,
291
+ **kwargs,
284
292
  )
285
293
  if self.return_intermediate_steps:
286
294
  intermediate_steps = [r[question_result_key] for r in map_results]
@@ -24,7 +24,7 @@ from langchain.output_parsers.regex import RegexParser
24
24
  message=(
25
25
  "This class is deprecated. Please see the migration guide here for "
26
26
  "a recommended replacement: "
27
- "https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain/" # noqa: E501
27
+ "https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain/"
28
28
  ),
29
29
  )
30
30
  class MapRerankDocumentsChain(BaseCombineDocumentsChain):
@@ -92,7 +92,8 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
92
92
  )
93
93
 
94
94
  def get_output_schema(
95
- self, config: Optional[RunnableConfig] = None
95
+ self,
96
+ config: Optional[RunnableConfig] = None,
96
97
  ) -> type[BaseModel]:
97
98
  schema: dict[str, Any] = {
98
99
  self.output_key: (str, None),
@@ -100,7 +101,7 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
100
101
  if self.return_intermediate_steps:
101
102
  schema["intermediate_steps"] = (list[str], None)
102
103
  if self.metadata_keys:
103
- schema.update({key: (Any, None) for key in self.metadata_keys})
104
+ schema.update(dict.fromkeys(self.metadata_keys, (Any, None)))
104
105
 
105
106
  return create_model("MapRerankOutput", **schema)
106
107
 
@@ -112,7 +113,7 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
112
113
  """
113
114
  _output_keys = super().output_keys
114
115
  if self.return_intermediate_steps:
115
- _output_keys = _output_keys + ["intermediate_steps"]
116
+ _output_keys = [*_output_keys, "intermediate_steps"]
116
117
  if self.metadata_keys is not None:
117
118
  _output_keys += self.metadata_keys
118
119
  return _output_keys
@@ -122,21 +123,24 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
122
123
  """Validate that the combine chain outputs a dictionary."""
123
124
  output_parser = self.llm_chain.prompt.output_parser
124
125
  if not isinstance(output_parser, RegexParser):
125
- raise ValueError(
126
+ msg = (
126
127
  "Output parser of llm_chain should be a RegexParser,"
127
128
  f" got {output_parser}"
128
129
  )
130
+ raise ValueError(msg) # noqa: TRY004
129
131
  output_keys = output_parser.output_keys
130
132
  if self.rank_key not in output_keys:
131
- raise ValueError(
133
+ msg = (
132
134
  f"Got {self.rank_key} as key to rank on, but did not find "
133
135
  f"it in the llm_chain output keys ({output_keys})"
134
136
  )
137
+ raise ValueError(msg)
135
138
  if self.answer_key not in output_keys:
136
- raise ValueError(
139
+ msg = (
137
140
  f"Got {self.answer_key} as key to return, but did not find "
138
141
  f"it in the llm_chain output keys ({output_keys})"
139
142
  )
143
+ raise ValueError(msg)
140
144
  return self
141
145
 
142
146
  @model_validator(mode="before")
@@ -144,27 +148,32 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
144
148
  def get_default_document_variable_name(cls, values: dict) -> Any:
145
149
  """Get default document variable name, if not provided."""
146
150
  if "llm_chain" not in values:
147
- raise ValueError("llm_chain must be provided")
151
+ msg = "llm_chain must be provided"
152
+ raise ValueError(msg)
148
153
 
149
154
  llm_chain_variables = values["llm_chain"].prompt.input_variables
150
155
  if "document_variable_name" not in values:
151
156
  if len(llm_chain_variables) == 1:
152
157
  values["document_variable_name"] = llm_chain_variables[0]
153
158
  else:
154
- raise ValueError(
159
+ msg = (
155
160
  "document_variable_name must be provided if there are "
156
161
  "multiple llm_chain input_variables"
157
162
  )
158
- else:
159
- if values["document_variable_name"] not in llm_chain_variables:
160
- raise ValueError(
161
- f"document_variable_name {values['document_variable_name']} was "
162
- f"not found in llm_chain input_variables: {llm_chain_variables}"
163
- )
163
+ raise ValueError(msg)
164
+ elif values["document_variable_name"] not in llm_chain_variables:
165
+ msg = (
166
+ f"document_variable_name {values['document_variable_name']} was "
167
+ f"not found in llm_chain input_variables: {llm_chain_variables}"
168
+ )
169
+ raise ValueError(msg)
164
170
  return values
165
171
 
166
172
  def combine_docs(
167
- self, docs: list[Document], callbacks: Callbacks = None, **kwargs: Any
173
+ self,
174
+ docs: list[Document],
175
+ callbacks: Callbacks = None,
176
+ **kwargs: Any,
168
177
  ) -> tuple[str, dict]:
169
178
  """Combine documents in a map rerank manner.
170
179
 
@@ -182,13 +191,16 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
182
191
  """
183
192
  results = self.llm_chain.apply_and_parse(
184
193
  # FYI - this is parallelized and so it is fast.
185
- [{**{self.document_variable_name: d.page_content}, **kwargs} for d in docs],
194
+ [{self.document_variable_name: d.page_content, **kwargs} for d in docs],
186
195
  callbacks=callbacks,
187
196
  )
188
197
  return self._process_results(docs, results)
189
198
 
190
199
  async def acombine_docs(
191
- self, docs: list[Document], callbacks: Callbacks = None, **kwargs: Any
200
+ self,
201
+ docs: list[Document],
202
+ callbacks: Callbacks = None,
203
+ **kwargs: Any,
192
204
  ) -> tuple[str, dict]:
193
205
  """Combine documents in a map rerank manner.
194
206
 
@@ -206,7 +218,7 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
206
218
  """
207
219
  results = await self.llm_chain.aapply_and_parse(
208
220
  # FYI - this is parallelized and so it is fast.
209
- [{**{self.document_variable_name: d.page_content}, **kwargs} for d in docs],
221
+ [{self.document_variable_name: d.page_content, **kwargs} for d in docs],
210
222
  callbacks=callbacks,
211
223
  )
212
224
  return self._process_results(docs, results)
@@ -218,7 +230,8 @@ class MapRerankDocumentsChain(BaseCombineDocumentsChain):
218
230
  ) -> tuple[str, dict]:
219
231
  typed_results = cast(list[dict], results)
220
232
  sorted_res = sorted(
221
- zip(typed_results, docs), key=lambda x: -int(x[0][self.rank_key])
233
+ zip(typed_results, docs),
234
+ key=lambda x: -int(x[0][self.rank_key]),
222
235
  )
223
236
  output, document = sorted_res[0]
224
237
  extra_info = {}
@@ -27,7 +27,10 @@ class AsyncCombineDocsProtocol(Protocol):
27
27
 
28
28
 
29
29
  def split_list_of_docs(
30
- docs: list[Document], length_func: Callable, token_max: int, **kwargs: Any
30
+ docs: list[Document],
31
+ length_func: Callable,
32
+ token_max: int,
33
+ **kwargs: Any,
31
34
  ) -> list[list[Document]]:
32
35
  """Split Documents into subsets that each meet a cumulative length constraint.
33
36
 
@@ -48,10 +51,11 @@ def split_list_of_docs(
48
51
  _num_tokens = length_func(_sub_result_docs, **kwargs)
49
52
  if _num_tokens > token_max:
50
53
  if len(_sub_result_docs) == 1:
51
- raise ValueError(
54
+ msg = (
52
55
  "A single document was longer than the context length,"
53
56
  " we cannot handle this."
54
57
  )
58
+ raise ValueError(msg)
55
59
  new_result_doc_list.append(_sub_result_docs[:-1])
56
60
  _sub_result_docs = _sub_result_docs[-1:]
57
61
  new_result_doc_list.append(_sub_result_docs)
@@ -224,8 +228,7 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
224
228
  def _collapse_chain(self) -> BaseCombineDocumentsChain:
225
229
  if self.collapse_documents_chain is not None:
226
230
  return self.collapse_documents_chain
227
- else:
228
- return self.combine_documents_chain
231
+ return self.combine_documents_chain
229
232
 
230
233
  def combine_docs(
231
234
  self,
@@ -250,10 +253,15 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
250
253
  element returned is a dictionary of other keys to return.
251
254
  """
252
255
  result_docs, extra_return_dict = self._collapse(
253
- docs, token_max=token_max, callbacks=callbacks, **kwargs
256
+ docs,
257
+ token_max=token_max,
258
+ callbacks=callbacks,
259
+ **kwargs,
254
260
  )
255
261
  return self.combine_documents_chain.combine_docs(
256
- docs=result_docs, callbacks=callbacks, **kwargs
262
+ docs=result_docs,
263
+ callbacks=callbacks,
264
+ **kwargs,
257
265
  )
258
266
 
259
267
  async def acombine_docs(
@@ -279,10 +287,15 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
279
287
  element returned is a dictionary of other keys to return.
280
288
  """
281
289
  result_docs, extra_return_dict = await self._acollapse(
282
- docs, token_max=token_max, callbacks=callbacks, **kwargs
290
+ docs,
291
+ token_max=token_max,
292
+ callbacks=callbacks,
293
+ **kwargs,
283
294
  )
284
295
  return await self.combine_documents_chain.acombine_docs(
285
- docs=result_docs, callbacks=callbacks, **kwargs
296
+ docs=result_docs,
297
+ callbacks=callbacks,
298
+ **kwargs,
286
299
  )
287
300
 
288
301
  def _collapse(
@@ -298,26 +311,30 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
298
311
 
299
312
  def _collapse_docs_func(docs: list[Document], **kwargs: Any) -> str:
300
313
  return self._collapse_chain.run(
301
- input_documents=docs, callbacks=callbacks, **kwargs
314
+ input_documents=docs,
315
+ callbacks=callbacks,
316
+ **kwargs,
302
317
  )
303
318
 
304
319
  _token_max = token_max or self.token_max
305
320
  retries: int = 0
306
321
  while num_tokens is not None and num_tokens > _token_max:
307
322
  new_result_doc_list = split_list_of_docs(
308
- result_docs, length_func, _token_max, **kwargs
323
+ result_docs,
324
+ length_func,
325
+ _token_max,
326
+ **kwargs,
309
327
  )
310
- result_docs = []
311
- for docs in new_result_doc_list:
312
- new_doc = collapse_docs(docs, _collapse_docs_func, **kwargs)
313
- result_docs.append(new_doc)
328
+ result_docs = [
329
+ collapse_docs(docs_, _collapse_docs_func, **kwargs)
330
+ for docs_ in new_result_doc_list
331
+ ]
314
332
  num_tokens = length_func(result_docs, **kwargs)
315
333
  retries += 1
316
334
  if self.collapse_max_retries and retries == self.collapse_max_retries:
317
- raise ValueError(
318
- f"Exceed {self.collapse_max_retries} tries to \
335
+ msg = f"Exceed {self.collapse_max_retries} tries to \
319
336
  collapse document to {_token_max} tokens."
320
- )
337
+ raise ValueError(msg)
321
338
  return result_docs, {}
322
339
 
323
340
  async def _acollapse(
@@ -333,26 +350,30 @@ class ReduceDocumentsChain(BaseCombineDocumentsChain):
333
350
 
334
351
  async def _collapse_docs_func(docs: list[Document], **kwargs: Any) -> str:
335
352
  return await self._collapse_chain.arun(
336
- input_documents=docs, callbacks=callbacks, **kwargs
353
+ input_documents=docs,
354
+ callbacks=callbacks,
355
+ **kwargs,
337
356
  )
338
357
 
339
358
  _token_max = token_max or self.token_max
340
359
  retries: int = 0
341
360
  while num_tokens is not None and num_tokens > _token_max:
342
361
  new_result_doc_list = split_list_of_docs(
343
- result_docs, length_func, _token_max, **kwargs
362
+ result_docs,
363
+ length_func,
364
+ _token_max,
365
+ **kwargs,
344
366
  )
345
- result_docs = []
346
- for docs in new_result_doc_list:
347
- new_doc = await acollapse_docs(docs, _collapse_docs_func, **kwargs)
348
- result_docs.append(new_doc)
367
+ result_docs = [
368
+ await acollapse_docs(docs_, _collapse_docs_func, **kwargs)
369
+ for docs_ in new_result_doc_list
370
+ ]
349
371
  num_tokens = length_func(result_docs, **kwargs)
350
372
  retries += 1
351
373
  if self.collapse_max_retries and retries == self.collapse_max_retries:
352
- raise ValueError(
353
- f"Exceed {self.collapse_max_retries} tries to \
374
+ msg = f"Exceed {self.collapse_max_retries} tries to \
354
375
  collapse document to {_token_max} tokens."
355
- )
376
+ raise ValueError(msg)
356
377
  return result_docs, {}
357
378
 
358
379
  @property
@@ -27,7 +27,7 @@ def _get_default_document_prompt() -> PromptTemplate:
27
27
  message=(
28
28
  "This class is deprecated. Please see the migration guide here for "
29
29
  "a recommended replacement: "
30
- "https://python.langchain.com/docs/versions/migrating_chains/refine_docs_chain/" # noqa: E501
30
+ "https://python.langchain.com/docs/versions/migrating_chains/refine_docs_chain/"
31
31
  ),
32
32
  )
33
33
  class RefineDocumentsChain(BaseCombineDocumentsChain):
@@ -91,7 +91,7 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
91
91
  initial_response_name: str
92
92
  """The variable name to format the initial response in when refining."""
93
93
  document_prompt: BasePromptTemplate = Field(
94
- default_factory=_get_default_document_prompt
94
+ default_factory=_get_default_document_prompt,
95
95
  )
96
96
  """Prompt to use to format each document, gets passed to `format_document`."""
97
97
  return_intermediate_steps: bool = False
@@ -105,7 +105,7 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
105
105
  """
106
106
  _output_keys = super().output_keys
107
107
  if self.return_intermediate_steps:
108
- _output_keys = _output_keys + ["intermediate_steps"]
108
+ _output_keys = [*_output_keys, "intermediate_steps"]
109
109
  return _output_keys
110
110
 
111
111
  model_config = ConfigDict(
@@ -127,27 +127,32 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
127
127
  def get_default_document_variable_name(cls, values: dict) -> Any:
128
128
  """Get default document variable name, if not provided."""
129
129
  if "initial_llm_chain" not in values:
130
- raise ValueError("initial_llm_chain must be provided")
130
+ msg = "initial_llm_chain must be provided"
131
+ raise ValueError(msg)
131
132
 
132
133
  llm_chain_variables = values["initial_llm_chain"].prompt.input_variables
133
134
  if "document_variable_name" not in values:
134
135
  if len(llm_chain_variables) == 1:
135
136
  values["document_variable_name"] = llm_chain_variables[0]
136
137
  else:
137
- raise ValueError(
138
+ msg = (
138
139
  "document_variable_name must be provided if there are "
139
140
  "multiple llm_chain input_variables"
140
141
  )
141
- else:
142
- if values["document_variable_name"] not in llm_chain_variables:
143
- raise ValueError(
144
- f"document_variable_name {values['document_variable_name']} was "
145
- f"not found in llm_chain input_variables: {llm_chain_variables}"
146
- )
142
+ raise ValueError(msg)
143
+ elif values["document_variable_name"] not in llm_chain_variables:
144
+ msg = (
145
+ f"document_variable_name {values['document_variable_name']} was "
146
+ f"not found in llm_chain input_variables: {llm_chain_variables}"
147
+ )
148
+ raise ValueError(msg)
147
149
  return values
148
150
 
149
151
  def combine_docs(
150
- self, docs: list[Document], callbacks: Callbacks = None, **kwargs: Any
152
+ self,
153
+ docs: list[Document],
154
+ callbacks: Callbacks = None,
155
+ **kwargs: Any,
151
156
  ) -> tuple[str, dict]:
152
157
  """Combine by mapping first chain over all, then stuffing into final chain.
153
158
 
@@ -172,7 +177,10 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
172
177
  return self._construct_result(refine_steps, res)
173
178
 
174
179
  async def acombine_docs(
175
- self, docs: list[Document], callbacks: Callbacks = None, **kwargs: Any
180
+ self,
181
+ docs: list[Document],
182
+ callbacks: Callbacks = None,
183
+ **kwargs: Any,
176
184
  ) -> tuple[str, dict]:
177
185
  """Async combine by mapping a first chain over all, then stuffing
178
186
  into a final chain.
@@ -211,16 +219,17 @@ class RefineDocumentsChain(BaseCombineDocumentsChain):
211
219
  }
212
220
 
213
221
  def _construct_initial_inputs(
214
- self, docs: list[Document], **kwargs: Any
222
+ self,
223
+ docs: list[Document],
224
+ **kwargs: Any,
215
225
  ) -> dict[str, Any]:
216
226
  base_info = {"page_content": docs[0].page_content}
217
227
  base_info.update(docs[0].metadata)
218
228
  document_info = {k: base_info[k] for k in self.document_prompt.input_variables}
219
229
  base_inputs: dict = {
220
- self.document_variable_name: self.document_prompt.format(**document_info)
230
+ self.document_variable_name: self.document_prompt.format(**document_info),
221
231
  }
222
- inputs = {**base_inputs, **kwargs}
223
- return inputs
232
+ return {**base_inputs, **kwargs}
224
233
 
225
234
  @property
226
235
  def _chain_type(self) -> str:
@@ -88,7 +88,7 @@ def create_stuff_documents_chain(
88
88
 
89
89
  return (
90
90
  RunnablePassthrough.assign(**{document_variable_name: format_docs}).with_config(
91
- run_name="format_inputs"
91
+ run_name="format_inputs",
92
92
  )
93
93
  | prompt
94
94
  | llm
@@ -102,7 +102,7 @@ def create_stuff_documents_chain(
102
102
  message=(
103
103
  "This class is deprecated. Use the `create_stuff_documents_chain` constructor "
104
104
  "instead. See migration guide here: "
105
- "https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain/" # noqa: E501
105
+ "https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain/"
106
106
  ),
107
107
  )
108
108
  class StuffDocumentsChain(BaseCombineDocumentsChain):
@@ -147,7 +147,7 @@ class StuffDocumentsChain(BaseCombineDocumentsChain):
147
147
  """LLM chain which is called with the formatted document string,
148
148
  along with any other inputs."""
149
149
  document_prompt: BasePromptTemplate = Field(
150
- default_factory=lambda: DEFAULT_DOCUMENT_PROMPT
150
+ default_factory=lambda: DEFAULT_DOCUMENT_PROMPT,
151
151
  )
152
152
  """Prompt to use to format each document, gets passed to `format_document`."""
153
153
  document_variable_name: str
@@ -175,16 +175,17 @@ class StuffDocumentsChain(BaseCombineDocumentsChain):
175
175
  if len(llm_chain_variables) == 1:
176
176
  values["document_variable_name"] = llm_chain_variables[0]
177
177
  else:
178
- raise ValueError(
178
+ msg = (
179
179
  "document_variable_name must be provided if there are "
180
180
  "multiple llm_chain_variables"
181
181
  )
182
- else:
183
- if values["document_variable_name"] not in llm_chain_variables:
184
- raise ValueError(
185
- f"document_variable_name {values['document_variable_name']} was "
186
- f"not found in llm_chain input_variables: {llm_chain_variables}"
187
- )
182
+ raise ValueError(msg)
183
+ elif values["document_variable_name"] not in llm_chain_variables:
184
+ msg = (
185
+ f"document_variable_name {values['document_variable_name']} was "
186
+ f"not found in llm_chain input_variables: {llm_chain_variables}"
187
+ )
188
+ raise ValueError(msg)
188
189
  return values
189
190
 
190
191
  @property
@@ -241,7 +242,10 @@ class StuffDocumentsChain(BaseCombineDocumentsChain):
241
242
  return self.llm_chain._get_num_tokens(prompt)
242
243
 
243
244
  def combine_docs(
244
- self, docs: list[Document], callbacks: Callbacks = None, **kwargs: Any
245
+ self,
246
+ docs: list[Document],
247
+ callbacks: Callbacks = None,
248
+ **kwargs: Any,
245
249
  ) -> tuple[str, dict]:
246
250
  """Stuff all documents into one prompt and pass to LLM.
247
251
 
@@ -259,7 +263,10 @@ class StuffDocumentsChain(BaseCombineDocumentsChain):
259
263
  return self.llm_chain.predict(callbacks=callbacks, **inputs), {}
260
264
 
261
265
  async def acombine_docs(
262
- self, docs: list[Document], callbacks: Callbacks = None, **kwargs: Any
266
+ self,
267
+ docs: list[Document],
268
+ callbacks: Callbacks = None,
269
+ **kwargs: Any,
263
270
  ) -> tuple[str, dict]:
264
271
  """Async stuff all documents into one prompt and pass to LLM.
265
272
 
@@ -19,7 +19,7 @@ from langchain.chains.llm import LLMChain
19
19
  message=(
20
20
  "This class is deprecated and will be removed in langchain 1.0. "
21
21
  "See API reference for replacement: "
22
- "https://api.python.langchain.com/en/latest/chains/langchain.chains.constitutional_ai.base.ConstitutionalChain.html" # noqa: E501
22
+ "https://api.python.langchain.com/en/latest/chains/langchain.chains.constitutional_ai.base.ConstitutionalChain.html"
23
23
  ),
24
24
  removal="1.0",
25
25
  )
@@ -197,12 +197,12 @@ class ConstitutionalChain(Chain):
197
197
 
198
198
  @classmethod
199
199
  def get_principles(
200
- cls, names: Optional[list[str]] = None
200
+ cls,
201
+ names: Optional[list[str]] = None,
201
202
  ) -> list[ConstitutionalPrinciple]:
202
203
  if names is None:
203
204
  return list(PRINCIPLES.values())
204
- else:
205
- return [PRINCIPLES[name] for name in names]
205
+ return [PRINCIPLES[name] for name in names]
206
206
 
207
207
  @classmethod
208
208
  def from_llm(