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
@@ -26,4 +26,4 @@ def __getattr__(name: str) -> Any:
26
26
  return _import_attribute(name)
27
27
 
28
28
 
29
- __all__ = ["APIRequesterChain", "APIRequesterOutputParser", "REQUEST_TEMPLATE"]
29
+ __all__ = ["REQUEST_TEMPLATE", "APIRequesterChain", "APIRequesterOutputParser"]
@@ -26,4 +26,4 @@ def __getattr__(name: str) -> Any:
26
26
  return _import_attribute(name)
27
27
 
28
28
 
29
- __all__ = ["APIResponderChain", "APIResponderOutputParser", "RESPONSE_TEMPLATE"]
29
+ __all__ = ["RESPONSE_TEMPLATE", "APIResponderChain", "APIResponderOutputParser"]
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  PODCAST_DOCS = """API documentation:
3
2
  Endpoint: https://listen-api.listennotes.com/api/v2
4
3
  GET /search
@@ -25,4 +24,4 @@ id | integer | optional
25
24
  title_highlighted | string | optional
26
25
 
27
26
  Use page_size: 3
28
- """
27
+ """ # noqa: E501
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  API_URL_PROMPT_TEMPLATE = """You are given the below API Documentation:
@@ -7,7 +6,7 @@ Using this documentation, generate the full API url to call for answering the us
7
6
  You should build the API url in order to get a response that is as short as possible, while still getting the necessary information to answer the question. Pay attention to deliberately exclude any unnecessary pieces of data in the API call.
8
7
 
9
8
  Question:{question}
10
- API url:"""
9
+ API url:""" # noqa: E501
11
10
 
12
11
  API_URL_PROMPT = PromptTemplate(
13
12
  input_variables=[
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  TMDB_DOCS = """API documentation:
3
2
  Endpoint: https://api.themoviedb.org/3
4
3
  GET /search/movie
@@ -34,4 +33,4 @@ backdrop_path | string or null | optional
34
33
  popularity | number | optional
35
34
  vote_count | integer | optional
36
35
  video | boolean | optional
37
- vote_average | number | optional"""
36
+ vote_average | number | optional""" # noqa: E501
langchain/chains/base.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """Base interface that all chains should implement."""
2
2
 
3
3
  import builtins
4
+ import contextlib
4
5
  import inspect
5
6
  import json
6
7
  import logging
@@ -35,6 +36,7 @@ from pydantic import (
35
36
  field_validator,
36
37
  model_validator,
37
38
  )
39
+ from typing_extensions import override
38
40
 
39
41
  from langchain.schema import RUN_KEY
40
42
 
@@ -107,17 +109,23 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
107
109
  )
108
110
 
109
111
  def get_input_schema(
110
- self, config: Optional[RunnableConfig] = None
112
+ self,
113
+ config: Optional[RunnableConfig] = None,
111
114
  ) -> type[BaseModel]:
112
115
  # This is correct, but pydantic typings/mypy don't think so.
113
- return create_model("ChainInput", **{k: (Any, None) for k in self.input_keys})
116
+ return create_model("ChainInput", **dict.fromkeys(self.input_keys, (Any, None)))
114
117
 
115
118
  def get_output_schema(
116
- self, config: Optional[RunnableConfig] = None
119
+ self,
120
+ config: Optional[RunnableConfig] = None,
117
121
  ) -> type[BaseModel]:
118
122
  # This is correct, but pydantic typings/mypy don't think so.
119
- return create_model("ChainOutput", **{k: (Any, None) for k in self.output_keys})
123
+ return create_model(
124
+ "ChainOutput",
125
+ **dict.fromkeys(self.output_keys, (Any, None)),
126
+ )
120
127
 
128
+ @override
121
129
  def invoke(
122
130
  self,
123
131
  input: dict[str, Any],
@@ -160,17 +168,20 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
160
168
  )
161
169
 
162
170
  final_outputs: dict[str, Any] = self.prep_outputs(
163
- inputs, outputs, return_only_outputs
171
+ inputs,
172
+ outputs,
173
+ return_only_outputs,
164
174
  )
165
175
  except BaseException as e:
166
176
  run_manager.on_chain_error(e)
167
- raise e
177
+ raise
168
178
  run_manager.on_chain_end(outputs)
169
179
 
170
180
  if include_run_info:
171
181
  final_outputs[RUN_KEY] = RunInfo(run_id=run_manager.run_id)
172
182
  return final_outputs
173
183
 
184
+ @override
174
185
  async def ainvoke(
175
186
  self,
176
187
  input: dict[str, Any],
@@ -211,11 +222,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
211
222
  else await self._acall(inputs)
212
223
  )
213
224
  final_outputs: dict[str, Any] = await self.aprep_outputs(
214
- inputs, outputs, return_only_outputs
225
+ inputs,
226
+ outputs,
227
+ return_only_outputs,
215
228
  )
216
229
  except BaseException as e:
217
230
  await run_manager.on_chain_error(e)
218
- raise e
231
+ raise
219
232
  await run_manager.on_chain_end(outputs)
220
233
 
221
234
  if include_run_info:
@@ -224,7 +237,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
224
237
 
225
238
  @property
226
239
  def _chain_type(self) -> str:
227
- raise NotImplementedError("Saving not supported for this chain type.")
240
+ msg = "Saving not supported for this chain type."
241
+ raise NotImplementedError(msg)
228
242
 
229
243
  @model_validator(mode="before")
230
244
  @classmethod
@@ -232,29 +246,33 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
232
246
  """Raise deprecation warning if callback_manager is used."""
233
247
  if values.get("callback_manager") is not None:
234
248
  if values.get("callbacks") is not None:
235
- raise ValueError(
249
+ msg = (
236
250
  "Cannot specify both callback_manager and callbacks. "
237
251
  "callback_manager is deprecated, callbacks is the preferred "
238
252
  "parameter to pass in."
239
253
  )
254
+ raise ValueError(msg)
240
255
  warnings.warn(
241
256
  "callback_manager is deprecated. Please use callbacks instead.",
242
257
  DeprecationWarning,
258
+ stacklevel=4,
243
259
  )
244
260
  values["callbacks"] = values.pop("callback_manager", None)
245
261
  return values
246
262
 
247
263
  @field_validator("verbose", mode="before")
248
264
  @classmethod
249
- def set_verbose(cls, verbose: Optional[bool]) -> bool:
265
+ def set_verbose(
266
+ cls,
267
+ verbose: Optional[bool], # noqa: FBT001
268
+ ) -> bool:
250
269
  """Set the chain verbosity.
251
270
 
252
271
  Defaults to the global setting if not specified by the user.
253
272
  """
254
273
  if verbose is None:
255
274
  return _get_verbosity()
256
- else:
257
- return verbose
275
+ return verbose
258
276
 
259
277
  @property
260
278
  @abstractmethod
@@ -275,21 +293,24 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
275
293
  # only one is not set, we can still figure out which key it is.
276
294
  _input_keys = _input_keys.difference(self.memory.memory_variables)
277
295
  if len(_input_keys) != 1:
278
- raise ValueError(
296
+ msg = (
279
297
  f"A single string input was passed in, but this chain expects "
280
298
  f"multiple inputs ({_input_keys}). When a chain expects "
281
299
  f"multiple inputs, please call it by passing in a dictionary, "
282
300
  "eg `chain({'foo': 1, 'bar': 2})`"
283
301
  )
302
+ raise ValueError(msg)
284
303
 
285
304
  missing_keys = set(self.input_keys).difference(inputs)
286
305
  if missing_keys:
287
- raise ValueError(f"Missing some input keys: {missing_keys}")
306
+ msg = f"Missing some input keys: {missing_keys}"
307
+ raise ValueError(msg)
288
308
 
289
309
  def _validate_outputs(self, outputs: dict[str, Any]) -> None:
290
310
  missing_keys = set(self.output_keys).difference(outputs)
291
311
  if missing_keys:
292
- raise ValueError(f"Missing some output keys: {missing_keys}")
312
+ msg = f"Missing some output keys: {missing_keys}"
313
+ raise ValueError(msg)
293
314
 
294
315
  @abstractmethod
295
316
  def _call(
@@ -336,14 +357,17 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
336
357
  `Chain.output_keys`.
337
358
  """
338
359
  return await run_in_executor(
339
- None, self._call, inputs, run_manager.get_sync() if run_manager else None
360
+ None,
361
+ self._call,
362
+ inputs,
363
+ run_manager.get_sync() if run_manager else None,
340
364
  )
341
365
 
342
366
  @deprecated("0.1.0", alternative="invoke", removal="1.0")
343
367
  def __call__(
344
368
  self,
345
369
  inputs: Union[dict[str, Any], Any],
346
- return_only_outputs: bool = False,
370
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
347
371
  callbacks: Callbacks = None,
348
372
  *,
349
373
  tags: Optional[list[str]] = None,
@@ -394,7 +418,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
394
418
  async def acall(
395
419
  self,
396
420
  inputs: Union[dict[str, Any], Any],
397
- return_only_outputs: bool = False,
421
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
398
422
  callbacks: Callbacks = None,
399
423
  *,
400
424
  tags: Optional[list[str]] = None,
@@ -444,7 +468,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
444
468
  self,
445
469
  inputs: dict[str, str],
446
470
  outputs: dict[str, str],
447
- return_only_outputs: bool = False,
471
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
448
472
  ) -> dict[str, str]:
449
473
  """Validate and prepare chain outputs, and save info about this run to memory.
450
474
 
@@ -463,14 +487,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
463
487
  self.memory.save_context(inputs, outputs)
464
488
  if return_only_outputs:
465
489
  return outputs
466
- else:
467
- return {**inputs, **outputs}
490
+ return {**inputs, **outputs}
468
491
 
469
492
  async def aprep_outputs(
470
493
  self,
471
494
  inputs: dict[str, str],
472
495
  outputs: dict[str, str],
473
- return_only_outputs: bool = False,
496
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
474
497
  ) -> dict[str, str]:
475
498
  """Validate and prepare chain outputs, and save info about this run to memory.
476
499
 
@@ -489,8 +512,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
489
512
  await self.memory.asave_context(inputs, outputs)
490
513
  if return_only_outputs:
491
514
  return outputs
492
- else:
493
- return {**inputs, **outputs}
515
+ return {**inputs, **outputs}
494
516
 
495
517
  def prep_inputs(self, inputs: Union[dict[str, Any], Any]) -> dict[str, str]:
496
518
  """Prepare chain inputs, including adding inputs from memory.
@@ -510,7 +532,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
510
532
  # If there are multiple input keys, but some get set by memory so that
511
533
  # only one is not set, we can still figure out which key it is.
512
534
  _input_keys = _input_keys.difference(self.memory.memory_variables)
513
- inputs = {list(_input_keys)[0]: inputs}
535
+ inputs = {next(iter(_input_keys)): inputs}
514
536
  if self.memory is not None:
515
537
  external_context = self.memory.load_memory_variables(inputs)
516
538
  inputs = dict(inputs, **external_context)
@@ -534,7 +556,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
534
556
  # If there are multiple input keys, but some get set by memory so that
535
557
  # only one is not set, we can still figure out which key it is.
536
558
  _input_keys = _input_keys.difference(self.memory.memory_variables)
537
- inputs = {list(_input_keys)[0]: inputs}
559
+ inputs = {next(iter(_input_keys)): inputs}
538
560
  if self.memory is not None:
539
561
  external_context = await self.memory.aload_memory_variables(inputs)
540
562
  inputs = dict(inputs, **external_context)
@@ -543,10 +565,11 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
543
565
  @property
544
566
  def _run_output_key(self) -> str:
545
567
  if len(self.output_keys) != 1:
546
- raise ValueError(
568
+ msg = (
547
569
  f"`run` not supported when there is not exactly "
548
570
  f"one output key. Got {self.output_keys}."
549
571
  )
572
+ raise ValueError(msg)
550
573
  return self.output_keys[0]
551
574
 
552
575
  @deprecated("0.1.0", alternative="invoke", removal="1.0")
@@ -599,7 +622,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
599
622
 
600
623
  if args and not kwargs:
601
624
  if len(args) != 1:
602
- raise ValueError("`run` supports only one positional argument.")
625
+ msg = "`run` supports only one positional argument."
626
+ raise ValueError(msg)
603
627
  return self(args[0], callbacks=callbacks, tags=tags, metadata=metadata)[
604
628
  _output_key
605
629
  ]
@@ -610,15 +634,16 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
610
634
  ]
611
635
 
612
636
  if not kwargs and not args:
613
- raise ValueError(
637
+ msg = (
614
638
  "`run` supported with either positional arguments or keyword arguments,"
615
639
  " but none were provided."
616
640
  )
617
- else:
618
- raise ValueError(
619
- f"`run` supported with either positional arguments or keyword arguments"
620
- f" but not both. Got args: {args} and kwargs: {kwargs}."
621
- )
641
+ raise ValueError(msg)
642
+ msg = (
643
+ f"`run` supported with either positional arguments or keyword arguments"
644
+ f" but not both. Got args: {args} and kwargs: {kwargs}."
645
+ )
646
+ raise ValueError(msg)
622
647
 
623
648
  @deprecated("0.1.0", alternative="ainvoke", removal="1.0")
624
649
  async def arun(
@@ -667,30 +692,39 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
667
692
  # -> "The temperature in Boise is..."
668
693
  """
669
694
  if len(self.output_keys) != 1:
670
- raise ValueError(
695
+ msg = (
671
696
  f"`run` not supported when there is not exactly "
672
697
  f"one output key. Got {self.output_keys}."
673
698
  )
674
- elif args and not kwargs:
699
+ raise ValueError(msg)
700
+ if args and not kwargs:
675
701
  if len(args) != 1:
676
- raise ValueError("`run` supports only one positional argument.")
702
+ msg = "`run` supports only one positional argument."
703
+ raise ValueError(msg)
677
704
  return (
678
705
  await self.acall(
679
- args[0], callbacks=callbacks, tags=tags, metadata=metadata
706
+ args[0],
707
+ callbacks=callbacks,
708
+ tags=tags,
709
+ metadata=metadata,
680
710
  )
681
711
  )[self.output_keys[0]]
682
712
 
683
713
  if kwargs and not args:
684
714
  return (
685
715
  await self.acall(
686
- kwargs, callbacks=callbacks, tags=tags, metadata=metadata
716
+ kwargs,
717
+ callbacks=callbacks,
718
+ tags=tags,
719
+ metadata=metadata,
687
720
  )
688
721
  )[self.output_keys[0]]
689
722
 
690
- raise ValueError(
723
+ msg = (
691
724
  f"`run` supported with either positional arguments or keyword arguments"
692
725
  f" but not both. Got args: {args} and kwargs: {kwargs}."
693
726
  )
727
+ raise ValueError(msg)
694
728
 
695
729
  def dict(self, **kwargs: Any) -> dict:
696
730
  """Dictionary representation of chain.
@@ -712,10 +746,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
712
746
  # -> {"_type": "foo", "verbose": False, ...}
713
747
  """
714
748
  _dict = super().dict(**kwargs)
715
- try:
749
+ with contextlib.suppress(NotImplementedError):
716
750
  _dict["_type"] = self._chain_type
717
- except NotImplementedError:
718
- pass
719
751
  return _dict
720
752
 
721
753
  def save(self, file_path: Union[Path, str]) -> None:
@@ -733,34 +765,36 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
733
765
  chain.save(file_path="path/chain.yaml")
734
766
  """
735
767
  if self.memory is not None:
736
- raise ValueError("Saving of memory is not yet supported.")
768
+ msg = "Saving of memory is not yet supported."
769
+ raise ValueError(msg)
737
770
 
738
771
  # Fetch dictionary to save
739
772
  chain_dict = self.dict()
740
773
  if "_type" not in chain_dict:
741
- raise NotImplementedError(f"Chain {self} does not support saving.")
774
+ msg = f"Chain {self} does not support saving."
775
+ raise NotImplementedError(msg)
742
776
 
743
777
  # Convert file to Path object.
744
- if isinstance(file_path, str):
745
- save_path = Path(file_path)
746
- else:
747
- save_path = file_path
778
+ save_path = Path(file_path) if isinstance(file_path, str) else file_path
748
779
 
749
780
  directory_path = save_path.parent
750
781
  directory_path.mkdir(parents=True, exist_ok=True)
751
782
 
752
783
  if save_path.suffix == ".json":
753
- with open(file_path, "w") as f:
784
+ with save_path.open("w") as f:
754
785
  json.dump(chain_dict, f, indent=4)
755
786
  elif save_path.suffix.endswith((".yaml", ".yml")):
756
- with open(file_path, "w") as f:
787
+ with save_path.open("w") as f:
757
788
  yaml.dump(chain_dict, f, default_flow_style=False)
758
789
  else:
759
- raise ValueError(f"{save_path} must be json or yaml")
790
+ msg = f"{save_path} must be json or yaml"
791
+ raise ValueError(msg)
760
792
 
761
793
  @deprecated("0.1.0", alternative="batch", removal="1.0")
762
794
  def apply(
763
- self, input_list: list[builtins.dict[str, Any]], callbacks: Callbacks = None
795
+ self,
796
+ input_list: list[builtins.dict[str, Any]],
797
+ callbacks: Callbacks = None,
764
798
  ) -> list[builtins.dict[str, str]]:
765
799
  """Call the chain on all inputs in the list."""
766
800
  return [self(inputs, callbacks=callbacks) for inputs in input_list]
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  _template = """Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question.
@@ -6,7 +5,7 @@ _template = """Given the following conversation and a follow up question, rephra
6
5
  Chat History:
7
6
  {chat_history}
8
7
  Follow Up Input: {question}
9
- Standalone question:"""
8
+ Standalone question:""" # noqa: E501
10
9
  CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template)
11
10
 
12
11
  prompt_template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
@@ -14,7 +13,7 @@ prompt_template = """Use the following pieces of context to answer the question
14
13
  {context}
15
14
 
16
15
  Question: {question}
17
- Helpful Answer:"""
16
+ Helpful Answer:""" # noqa: E501
18
17
  QA_PROMPT = PromptTemplate(
19
18
  template=prompt_template, input_variables=["context", "question"]
20
19
  )
@@ -10,6 +10,6 @@ from langchain.chains.combine_documents.stuff import create_stuff_documents_chai
10
10
  __all__ = [
11
11
  "acollapse_docs",
12
12
  "collapse_docs",
13
- "split_list_of_docs",
14
13
  "create_stuff_documents_chain",
14
+ "split_list_of_docs",
15
15
  ]
@@ -24,10 +24,11 @@ DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template("{page_content}")
24
24
 
25
25
  def _validate_prompt(prompt: BasePromptTemplate, document_variable_name: str) -> None:
26
26
  if document_variable_name not in prompt.input_variables:
27
- raise ValueError(
27
+ msg = (
28
28
  f"Prompt must accept {document_variable_name} as an input variable. "
29
29
  f"Received prompt with input variables: {prompt.input_variables}"
30
30
  )
31
+ raise ValueError(msg)
31
32
 
32
33
 
33
34
  class BaseCombineDocumentsChain(Chain, ABC):
@@ -46,7 +47,8 @@ class BaseCombineDocumentsChain(Chain, ABC):
46
47
  output_key: str = "output_text" #: :meta private:
47
48
 
48
49
  def get_input_schema(
49
- self, config: Optional[RunnableConfig] = None
50
+ self,
51
+ config: Optional[RunnableConfig] = None,
50
52
  ) -> type[BaseModel]:
51
53
  return create_model(
52
54
  "CombineDocumentsInput",
@@ -54,7 +56,8 @@ class BaseCombineDocumentsChain(Chain, ABC):
54
56
  )
55
57
 
56
58
  def get_output_schema(
57
- self, config: Optional[RunnableConfig] = None
59
+ self,
60
+ config: Optional[RunnableConfig] = None,
58
61
  ) -> type[BaseModel]:
59
62
  return create_model(
60
63
  "CombineDocumentsOutput",
@@ -111,7 +114,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
111
114
 
112
115
  @abstractmethod
113
116
  async def acombine_docs(
114
- self, docs: list[Document], **kwargs: Any
117
+ self,
118
+ docs: list[Document],
119
+ **kwargs: Any,
115
120
  ) -> tuple[str, dict]:
116
121
  """Combine documents into a single string.
117
122
 
@@ -136,7 +141,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
136
141
  # Other keys are assumed to be needed for LLM prediction
137
142
  other_keys = {k: v for k, v in inputs.items() if k != self.input_key}
138
143
  output, extra_return_dict = self.combine_docs(
139
- docs, callbacks=_run_manager.get_child(), **other_keys
144
+ docs,
145
+ callbacks=_run_manager.get_child(),
146
+ **other_keys,
140
147
  )
141
148
  extra_return_dict[self.output_key] = output
142
149
  return extra_return_dict
@@ -152,7 +159,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
152
159
  # Other keys are assumed to be needed for LLM prediction
153
160
  other_keys = {k: v for k, v in inputs.items() if k != self.input_key}
154
161
  output, extra_return_dict = await self.acombine_docs(
155
- docs, callbacks=_run_manager.get_child(), **other_keys
162
+ docs,
163
+ callbacks=_run_manager.get_child(),
164
+ **other_keys,
156
165
  )
157
166
  extra_return_dict[self.output_key] = output
158
167
  return extra_return_dict
@@ -162,7 +171,7 @@ class BaseCombineDocumentsChain(Chain, ABC):
162
171
  since="0.2.7",
163
172
  alternative=(
164
173
  "example in API reference with more detail: "
165
- "https://api.python.langchain.com/en/latest/chains/langchain.chains.combine_documents.base.AnalyzeDocumentChain.html" # noqa: E501
174
+ "https://api.python.langchain.com/en/latest/chains/langchain.chains.combine_documents.base.AnalyzeDocumentChain.html"
166
175
  ),
167
176
  removal="1.0",
168
177
  )
@@ -245,7 +254,8 @@ class AnalyzeDocumentChain(Chain):
245
254
  return self.combine_docs_chain.output_keys
246
255
 
247
256
  def get_input_schema(
248
- self, config: Optional[RunnableConfig] = None
257
+ self,
258
+ config: Optional[RunnableConfig] = None,
249
259
  ) -> type[BaseModel]:
250
260
  return create_model(
251
261
  "AnalyzeDocumentChain",
@@ -253,7 +263,8 @@ class AnalyzeDocumentChain(Chain):
253
263
  )
254
264
 
255
265
  def get_output_schema(
256
- self, config: Optional[RunnableConfig] = None
266
+ self,
267
+ config: Optional[RunnableConfig] = None,
257
268
  ) -> type[BaseModel]:
258
269
  return self.combine_docs_chain.get_output_schema(config)
259
270
 
@@ -270,5 +281,7 @@ class AnalyzeDocumentChain(Chain):
270
281
  other_keys: dict = {k: v for k, v in inputs.items() if k != self.input_key}
271
282
  other_keys[self.combine_docs_chain.input_key] = docs
272
283
  return self.combine_docs_chain(
273
- other_keys, return_only_outputs=True, callbacks=_run_manager.get_child()
284
+ other_keys,
285
+ return_only_outputs=True,
286
+ callbacks=_run_manager.get_child(),
274
287
  )