langchain 0.3.26__py3-none-any.whl → 0.4.0.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. langchain/__init__.py +110 -96
  2. langchain/_api/__init__.py +2 -2
  3. langchain/_api/deprecation.py +3 -3
  4. langchain/_api/module_import.py +51 -46
  5. langchain/_api/path.py +1 -1
  6. langchain/adapters/openai.py +8 -8
  7. langchain/agents/__init__.py +15 -12
  8. langchain/agents/agent.py +174 -151
  9. langchain/agents/agent_iterator.py +50 -26
  10. langchain/agents/agent_toolkits/__init__.py +7 -6
  11. langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
  12. langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
  13. langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
  14. langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
  15. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
  16. langchain/agents/agent_toolkits/csv/__init__.py +4 -2
  17. langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
  18. langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
  19. langchain/agents/agent_toolkits/github/toolkit.py +9 -9
  20. langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
  21. langchain/agents/agent_toolkits/json/base.py +1 -1
  22. langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
  23. langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
  24. langchain/agents/agent_toolkits/openapi/base.py +1 -1
  25. langchain/agents/agent_toolkits/openapi/planner.py +2 -2
  26. langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
  27. langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
  28. langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
  29. langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
  30. langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
  31. langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
  32. langchain/agents/agent_toolkits/powerbi/base.py +1 -1
  33. langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
  34. langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
  35. langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
  36. langchain/agents/agent_toolkits/python/__init__.py +4 -2
  37. langchain/agents/agent_toolkits/spark/__init__.py +4 -2
  38. langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
  39. langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
  40. langchain/agents/agent_toolkits/sql/prompt.py +1 -1
  41. langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
  42. langchain/agents/agent_toolkits/vectorstore/base.py +4 -2
  43. langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
  44. langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
  45. langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
  46. langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
  47. langchain/agents/agent_types.py +6 -6
  48. langchain/agents/chat/base.py +8 -12
  49. langchain/agents/chat/output_parser.py +9 -6
  50. langchain/agents/chat/prompt.py +3 -4
  51. langchain/agents/conversational/base.py +11 -5
  52. langchain/agents/conversational/output_parser.py +4 -2
  53. langchain/agents/conversational/prompt.py +2 -3
  54. langchain/agents/conversational_chat/base.py +9 -5
  55. langchain/agents/conversational_chat/output_parser.py +9 -11
  56. langchain/agents/conversational_chat/prompt.py +5 -6
  57. langchain/agents/format_scratchpad/__init__.py +3 -3
  58. langchain/agents/format_scratchpad/log_to_messages.py +1 -1
  59. langchain/agents/format_scratchpad/openai_functions.py +8 -6
  60. langchain/agents/format_scratchpad/tools.py +5 -3
  61. langchain/agents/format_scratchpad/xml.py +33 -2
  62. langchain/agents/initialize.py +17 -9
  63. langchain/agents/json_chat/base.py +19 -18
  64. langchain/agents/json_chat/prompt.py +2 -3
  65. langchain/agents/load_tools.py +2 -1
  66. langchain/agents/loading.py +28 -18
  67. langchain/agents/mrkl/base.py +11 -4
  68. langchain/agents/mrkl/output_parser.py +17 -13
  69. langchain/agents/mrkl/prompt.py +1 -2
  70. langchain/agents/openai_assistant/base.py +81 -71
  71. langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +2 -0
  72. langchain/agents/openai_functions_agent/base.py +47 -37
  73. langchain/agents/openai_functions_multi_agent/base.py +40 -27
  74. langchain/agents/openai_tools/base.py +9 -8
  75. langchain/agents/output_parsers/__init__.py +3 -3
  76. langchain/agents/output_parsers/json.py +8 -6
  77. langchain/agents/output_parsers/openai_functions.py +24 -9
  78. langchain/agents/output_parsers/openai_tools.py +16 -4
  79. langchain/agents/output_parsers/react_json_single_input.py +13 -5
  80. langchain/agents/output_parsers/react_single_input.py +18 -11
  81. langchain/agents/output_parsers/self_ask.py +5 -2
  82. langchain/agents/output_parsers/tools.py +32 -13
  83. langchain/agents/output_parsers/xml.py +102 -28
  84. langchain/agents/react/agent.py +5 -4
  85. langchain/agents/react/base.py +26 -17
  86. langchain/agents/react/output_parser.py +7 -6
  87. langchain/agents/react/textworld_prompt.py +0 -1
  88. langchain/agents/react/wiki_prompt.py +14 -15
  89. langchain/agents/schema.py +5 -2
  90. langchain/agents/self_ask_with_search/base.py +23 -15
  91. langchain/agents/self_ask_with_search/prompt.py +0 -1
  92. langchain/agents/structured_chat/base.py +19 -11
  93. langchain/agents/structured_chat/output_parser.py +29 -18
  94. langchain/agents/structured_chat/prompt.py +3 -4
  95. langchain/agents/tool_calling_agent/base.py +8 -6
  96. langchain/agents/tools.py +5 -2
  97. langchain/agents/utils.py +2 -3
  98. langchain/agents/xml/base.py +12 -6
  99. langchain/agents/xml/prompt.py +1 -2
  100. langchain/cache.py +12 -12
  101. langchain/callbacks/__init__.py +11 -11
  102. langchain/callbacks/aim_callback.py +2 -2
  103. langchain/callbacks/argilla_callback.py +1 -1
  104. langchain/callbacks/arize_callback.py +1 -1
  105. langchain/callbacks/arthur_callback.py +1 -1
  106. langchain/callbacks/base.py +7 -7
  107. langchain/callbacks/clearml_callback.py +1 -1
  108. langchain/callbacks/comet_ml_callback.py +1 -1
  109. langchain/callbacks/confident_callback.py +1 -1
  110. langchain/callbacks/context_callback.py +1 -1
  111. langchain/callbacks/flyte_callback.py +1 -1
  112. langchain/callbacks/human.py +2 -2
  113. langchain/callbacks/infino_callback.py +1 -1
  114. langchain/callbacks/labelstudio_callback.py +1 -1
  115. langchain/callbacks/llmonitor_callback.py +1 -1
  116. langchain/callbacks/manager.py +5 -5
  117. langchain/callbacks/mlflow_callback.py +2 -2
  118. langchain/callbacks/openai_info.py +1 -1
  119. langchain/callbacks/promptlayer_callback.py +1 -1
  120. langchain/callbacks/sagemaker_callback.py +1 -1
  121. langchain/callbacks/streaming_aiter.py +17 -3
  122. langchain/callbacks/streaming_aiter_final_only.py +16 -5
  123. langchain/callbacks/streaming_stdout_final_only.py +10 -3
  124. langchain/callbacks/streamlit/__init__.py +3 -2
  125. langchain/callbacks/streamlit/mutable_expander.py +1 -1
  126. langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
  127. langchain/callbacks/tracers/__init__.py +1 -1
  128. langchain/callbacks/tracers/comet.py +1 -1
  129. langchain/callbacks/tracers/evaluation.py +1 -1
  130. langchain/callbacks/tracers/log_stream.py +1 -1
  131. langchain/callbacks/tracers/logging.py +12 -1
  132. langchain/callbacks/tracers/stdout.py +1 -1
  133. langchain/callbacks/trubrics_callback.py +1 -1
  134. langchain/callbacks/utils.py +4 -4
  135. langchain/callbacks/wandb_callback.py +1 -1
  136. langchain/callbacks/whylabs_callback.py +1 -1
  137. langchain/chains/api/base.py +41 -23
  138. langchain/chains/api/news_docs.py +1 -2
  139. langchain/chains/api/open_meteo_docs.py +1 -2
  140. langchain/chains/api/openapi/requests_chain.py +1 -1
  141. langchain/chains/api/openapi/response_chain.py +1 -1
  142. langchain/chains/api/podcast_docs.py +1 -2
  143. langchain/chains/api/prompt.py +1 -2
  144. langchain/chains/api/tmdb_docs.py +1 -2
  145. langchain/chains/base.py +96 -56
  146. langchain/chains/chat_vector_db/prompts.py +2 -3
  147. langchain/chains/combine_documents/__init__.py +1 -1
  148. langchain/chains/combine_documents/base.py +30 -11
  149. langchain/chains/combine_documents/map_reduce.py +41 -30
  150. langchain/chains/combine_documents/map_rerank.py +39 -24
  151. langchain/chains/combine_documents/reduce.py +48 -26
  152. langchain/chains/combine_documents/refine.py +27 -17
  153. langchain/chains/combine_documents/stuff.py +24 -13
  154. langchain/chains/constitutional_ai/base.py +11 -4
  155. langchain/chains/constitutional_ai/principles.py +22 -25
  156. langchain/chains/constitutional_ai/prompts.py +25 -28
  157. langchain/chains/conversation/base.py +9 -4
  158. langchain/chains/conversation/memory.py +5 -5
  159. langchain/chains/conversation/prompt.py +5 -5
  160. langchain/chains/conversational_retrieval/base.py +108 -79
  161. langchain/chains/conversational_retrieval/prompts.py +2 -3
  162. langchain/chains/elasticsearch_database/base.py +10 -10
  163. langchain/chains/elasticsearch_database/prompts.py +2 -3
  164. langchain/chains/ernie_functions/__init__.py +2 -2
  165. langchain/chains/example_generator.py +3 -1
  166. langchain/chains/flare/base.py +28 -12
  167. langchain/chains/flare/prompts.py +2 -0
  168. langchain/chains/graph_qa/cypher.py +2 -2
  169. langchain/chains/graph_qa/falkordb.py +1 -1
  170. langchain/chains/graph_qa/gremlin.py +1 -1
  171. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  172. langchain/chains/graph_qa/prompts.py +2 -2
  173. langchain/chains/history_aware_retriever.py +2 -1
  174. langchain/chains/hyde/base.py +6 -5
  175. langchain/chains/hyde/prompts.py +5 -6
  176. langchain/chains/llm.py +82 -61
  177. langchain/chains/llm_bash/__init__.py +3 -2
  178. langchain/chains/llm_checker/base.py +19 -6
  179. langchain/chains/llm_checker/prompt.py +3 -4
  180. langchain/chains/llm_math/base.py +25 -10
  181. langchain/chains/llm_math/prompt.py +1 -2
  182. langchain/chains/llm_summarization_checker/base.py +22 -7
  183. langchain/chains/llm_symbolic_math/__init__.py +3 -2
  184. langchain/chains/loading.py +155 -97
  185. langchain/chains/mapreduce.py +4 -3
  186. langchain/chains/moderation.py +11 -9
  187. langchain/chains/natbot/base.py +11 -9
  188. langchain/chains/natbot/crawler.py +102 -76
  189. langchain/chains/natbot/prompt.py +2 -3
  190. langchain/chains/openai_functions/__init__.py +7 -7
  191. langchain/chains/openai_functions/base.py +15 -10
  192. langchain/chains/openai_functions/citation_fuzzy_match.py +21 -11
  193. langchain/chains/openai_functions/extraction.py +19 -19
  194. langchain/chains/openai_functions/openapi.py +39 -35
  195. langchain/chains/openai_functions/qa_with_structure.py +22 -15
  196. langchain/chains/openai_functions/tagging.py +4 -4
  197. langchain/chains/openai_tools/extraction.py +7 -8
  198. langchain/chains/qa_generation/base.py +8 -3
  199. langchain/chains/qa_generation/prompt.py +5 -5
  200. langchain/chains/qa_with_sources/base.py +17 -6
  201. langchain/chains/qa_with_sources/loading.py +16 -8
  202. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  203. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  204. langchain/chains/qa_with_sources/retrieval.py +15 -6
  205. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  206. langchain/chains/qa_with_sources/vector_db.py +21 -8
  207. langchain/chains/query_constructor/base.py +37 -34
  208. langchain/chains/query_constructor/ir.py +4 -4
  209. langchain/chains/query_constructor/parser.py +101 -34
  210. langchain/chains/query_constructor/prompt.py +5 -6
  211. langchain/chains/question_answering/chain.py +21 -10
  212. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  213. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  214. langchain/chains/question_answering/refine_prompts.py +2 -5
  215. langchain/chains/question_answering/stuff_prompt.py +5 -5
  216. langchain/chains/retrieval.py +1 -3
  217. langchain/chains/retrieval_qa/base.py +38 -27
  218. langchain/chains/retrieval_qa/prompt.py +1 -2
  219. langchain/chains/router/__init__.py +3 -3
  220. langchain/chains/router/base.py +38 -22
  221. langchain/chains/router/embedding_router.py +15 -8
  222. langchain/chains/router/llm_router.py +23 -20
  223. langchain/chains/router/multi_prompt.py +5 -2
  224. langchain/chains/router/multi_retrieval_qa.py +28 -5
  225. langchain/chains/sequential.py +30 -18
  226. langchain/chains/sql_database/prompt.py +14 -16
  227. langchain/chains/sql_database/query.py +7 -5
  228. langchain/chains/structured_output/__init__.py +1 -1
  229. langchain/chains/structured_output/base.py +77 -67
  230. langchain/chains/summarize/chain.py +11 -5
  231. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  232. langchain/chains/summarize/stuff_prompt.py +0 -1
  233. langchain/chains/transform.py +9 -6
  234. langchain/chat_loaders/facebook_messenger.py +1 -1
  235. langchain/chat_loaders/langsmith.py +1 -1
  236. langchain/chat_loaders/utils.py +3 -3
  237. langchain/chat_models/__init__.py +20 -19
  238. langchain/chat_models/anthropic.py +1 -1
  239. langchain/chat_models/azureml_endpoint.py +1 -1
  240. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  241. langchain/chat_models/base.py +213 -139
  242. langchain/chat_models/bedrock.py +1 -1
  243. langchain/chat_models/fake.py +1 -1
  244. langchain/chat_models/meta.py +1 -1
  245. langchain/chat_models/pai_eas_endpoint.py +1 -1
  246. langchain/chat_models/promptlayer_openai.py +1 -1
  247. langchain/chat_models/volcengine_maas.py +1 -1
  248. langchain/docstore/base.py +1 -1
  249. langchain/document_loaders/__init__.py +9 -9
  250. langchain/document_loaders/airbyte.py +3 -3
  251. langchain/document_loaders/assemblyai.py +1 -1
  252. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  253. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  254. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  255. langchain/document_loaders/base.py +1 -1
  256. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  257. langchain/document_loaders/blob_loaders/schema.py +1 -4
  258. langchain/document_loaders/blockchain.py +1 -1
  259. langchain/document_loaders/chatgpt.py +1 -1
  260. langchain/document_loaders/college_confidential.py +1 -1
  261. langchain/document_loaders/confluence.py +1 -1
  262. langchain/document_loaders/email.py +1 -1
  263. langchain/document_loaders/facebook_chat.py +1 -1
  264. langchain/document_loaders/markdown.py +1 -1
  265. langchain/document_loaders/notebook.py +1 -1
  266. langchain/document_loaders/org_mode.py +1 -1
  267. langchain/document_loaders/parsers/__init__.py +1 -1
  268. langchain/document_loaders/parsers/docai.py +1 -1
  269. langchain/document_loaders/parsers/generic.py +1 -1
  270. langchain/document_loaders/parsers/html/__init__.py +1 -1
  271. langchain/document_loaders/parsers/html/bs4.py +1 -1
  272. langchain/document_loaders/parsers/language/cobol.py +1 -1
  273. langchain/document_loaders/parsers/language/python.py +1 -1
  274. langchain/document_loaders/parsers/msword.py +1 -1
  275. langchain/document_loaders/parsers/pdf.py +5 -5
  276. langchain/document_loaders/parsers/registry.py +1 -1
  277. langchain/document_loaders/pdf.py +8 -8
  278. langchain/document_loaders/powerpoint.py +1 -1
  279. langchain/document_loaders/pyspark_dataframe.py +1 -1
  280. langchain/document_loaders/telegram.py +2 -2
  281. langchain/document_loaders/tencent_cos_directory.py +1 -1
  282. langchain/document_loaders/unstructured.py +5 -5
  283. langchain/document_loaders/url_playwright.py +1 -1
  284. langchain/document_loaders/whatsapp_chat.py +1 -1
  285. langchain/document_loaders/youtube.py +2 -2
  286. langchain/document_transformers/__init__.py +3 -3
  287. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  288. langchain/document_transformers/doctran_text_extract.py +1 -1
  289. langchain/document_transformers/doctran_text_qa.py +1 -1
  290. langchain/document_transformers/doctran_text_translate.py +1 -1
  291. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  292. langchain/document_transformers/google_translate.py +1 -1
  293. langchain/document_transformers/html2text.py +1 -1
  294. langchain/document_transformers/nuclia_text_transform.py +1 -1
  295. langchain/embeddings/__init__.py +5 -5
  296. langchain/embeddings/base.py +35 -24
  297. langchain/embeddings/cache.py +37 -32
  298. langchain/embeddings/fake.py +1 -1
  299. langchain/embeddings/huggingface.py +2 -2
  300. langchain/evaluation/__init__.py +22 -22
  301. langchain/evaluation/agents/trajectory_eval_chain.py +26 -25
  302. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  303. langchain/evaluation/comparison/__init__.py +1 -1
  304. langchain/evaluation/comparison/eval_chain.py +21 -13
  305. langchain/evaluation/comparison/prompt.py +1 -2
  306. langchain/evaluation/criteria/__init__.py +1 -1
  307. langchain/evaluation/criteria/eval_chain.py +23 -11
  308. langchain/evaluation/criteria/prompt.py +2 -3
  309. langchain/evaluation/embedding_distance/base.py +34 -20
  310. langchain/evaluation/exact_match/base.py +14 -1
  311. langchain/evaluation/loading.py +16 -11
  312. langchain/evaluation/parsing/base.py +20 -4
  313. langchain/evaluation/parsing/json_distance.py +24 -10
  314. langchain/evaluation/parsing/json_schema.py +13 -12
  315. langchain/evaluation/qa/__init__.py +1 -1
  316. langchain/evaluation/qa/eval_chain.py +20 -5
  317. langchain/evaluation/qa/eval_prompt.py +7 -8
  318. langchain/evaluation/qa/generate_chain.py +4 -1
  319. langchain/evaluation/qa/generate_prompt.py +2 -4
  320. langchain/evaluation/regex_match/base.py +9 -1
  321. langchain/evaluation/schema.py +38 -30
  322. langchain/evaluation/scoring/__init__.py +1 -1
  323. langchain/evaluation/scoring/eval_chain.py +23 -15
  324. langchain/evaluation/scoring/prompt.py +0 -1
  325. langchain/evaluation/string_distance/base.py +20 -9
  326. langchain/globals.py +12 -11
  327. langchain/graphs/__init__.py +6 -6
  328. langchain/graphs/graph_document.py +1 -1
  329. langchain/graphs/networkx_graph.py +2 -2
  330. langchain/hub.py +9 -11
  331. langchain/indexes/__init__.py +3 -3
  332. langchain/indexes/_sql_record_manager.py +63 -46
  333. langchain/indexes/prompts/entity_extraction.py +1 -2
  334. langchain/indexes/prompts/entity_summarization.py +1 -2
  335. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  336. langchain/indexes/vectorstore.py +35 -19
  337. langchain/llms/__init__.py +13 -13
  338. langchain/llms/ai21.py +1 -1
  339. langchain/llms/azureml_endpoint.py +4 -4
  340. langchain/llms/base.py +15 -7
  341. langchain/llms/bedrock.py +1 -1
  342. langchain/llms/cloudflare_workersai.py +1 -1
  343. langchain/llms/gradient_ai.py +1 -1
  344. langchain/llms/loading.py +1 -1
  345. langchain/llms/openai.py +1 -1
  346. langchain/llms/sagemaker_endpoint.py +1 -1
  347. langchain/load/dump.py +1 -1
  348. langchain/load/load.py +1 -1
  349. langchain/load/serializable.py +3 -3
  350. langchain/memory/__init__.py +3 -3
  351. langchain/memory/buffer.py +14 -7
  352. langchain/memory/buffer_window.py +2 -0
  353. langchain/memory/chat_memory.py +14 -8
  354. langchain/memory/chat_message_histories/__init__.py +1 -1
  355. langchain/memory/chat_message_histories/astradb.py +1 -1
  356. langchain/memory/chat_message_histories/cassandra.py +1 -1
  357. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  358. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  359. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  360. langchain/memory/chat_message_histories/file.py +1 -1
  361. langchain/memory/chat_message_histories/firestore.py +1 -1
  362. langchain/memory/chat_message_histories/momento.py +1 -1
  363. langchain/memory/chat_message_histories/mongodb.py +1 -1
  364. langchain/memory/chat_message_histories/neo4j.py +1 -1
  365. langchain/memory/chat_message_histories/postgres.py +1 -1
  366. langchain/memory/chat_message_histories/redis.py +1 -1
  367. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  368. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  369. langchain/memory/chat_message_histories/streamlit.py +1 -1
  370. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  371. langchain/memory/chat_message_histories/xata.py +1 -1
  372. langchain/memory/chat_message_histories/zep.py +1 -1
  373. langchain/memory/combined.py +14 -13
  374. langchain/memory/entity.py +131 -61
  375. langchain/memory/prompt.py +10 -11
  376. langchain/memory/readonly.py +0 -2
  377. langchain/memory/simple.py +4 -3
  378. langchain/memory/summary.py +43 -11
  379. langchain/memory/summary_buffer.py +20 -8
  380. langchain/memory/token_buffer.py +2 -0
  381. langchain/memory/utils.py +3 -2
  382. langchain/memory/vectorstore.py +12 -5
  383. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  384. langchain/model_laboratory.py +12 -11
  385. langchain/output_parsers/__init__.py +4 -4
  386. langchain/output_parsers/boolean.py +7 -4
  387. langchain/output_parsers/combining.py +14 -7
  388. langchain/output_parsers/datetime.py +32 -31
  389. langchain/output_parsers/enum.py +10 -4
  390. langchain/output_parsers/fix.py +60 -53
  391. langchain/output_parsers/format_instructions.py +6 -8
  392. langchain/output_parsers/json.py +2 -2
  393. langchain/output_parsers/list.py +2 -2
  394. langchain/output_parsers/loading.py +9 -9
  395. langchain/output_parsers/openai_functions.py +3 -3
  396. langchain/output_parsers/openai_tools.py +1 -1
  397. langchain/output_parsers/pandas_dataframe.py +59 -48
  398. langchain/output_parsers/prompts.py +1 -2
  399. langchain/output_parsers/rail_parser.py +1 -1
  400. langchain/output_parsers/regex.py +9 -8
  401. langchain/output_parsers/regex_dict.py +7 -10
  402. langchain/output_parsers/retry.py +99 -80
  403. langchain/output_parsers/structured.py +21 -6
  404. langchain/output_parsers/yaml.py +19 -11
  405. langchain/prompts/__init__.py +5 -3
  406. langchain/prompts/base.py +5 -5
  407. langchain/prompts/chat.py +8 -8
  408. langchain/prompts/example_selector/__init__.py +3 -1
  409. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  410. langchain/prompts/few_shot.py +1 -1
  411. langchain/prompts/loading.py +3 -3
  412. langchain/prompts/prompt.py +1 -1
  413. langchain/pydantic_v1/__init__.py +1 -1
  414. langchain/retrievers/__init__.py +5 -5
  415. langchain/retrievers/bedrock.py +2 -2
  416. langchain/retrievers/bm25.py +1 -1
  417. langchain/retrievers/contextual_compression.py +14 -8
  418. langchain/retrievers/docarray.py +1 -1
  419. langchain/retrievers/document_compressors/__init__.py +5 -4
  420. langchain/retrievers/document_compressors/base.py +12 -6
  421. langchain/retrievers/document_compressors/chain_extract.py +5 -3
  422. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  423. langchain/retrievers/document_compressors/chain_filter.py +9 -9
  424. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  425. langchain/retrievers/document_compressors/cohere_rerank.py +17 -15
  426. langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -0
  427. langchain/retrievers/document_compressors/embeddings_filter.py +24 -17
  428. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  429. langchain/retrievers/document_compressors/listwise_rerank.py +8 -5
  430. langchain/retrievers/ensemble.py +30 -27
  431. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  432. langchain/retrievers/google_vertex_ai_search.py +2 -2
  433. langchain/retrievers/kendra.py +10 -10
  434. langchain/retrievers/llama_index.py +1 -1
  435. langchain/retrievers/merger_retriever.py +11 -11
  436. langchain/retrievers/milvus.py +1 -1
  437. langchain/retrievers/multi_query.py +35 -27
  438. langchain/retrievers/multi_vector.py +24 -9
  439. langchain/retrievers/parent_document_retriever.py +33 -9
  440. langchain/retrievers/re_phraser.py +6 -5
  441. langchain/retrievers/self_query/base.py +157 -127
  442. langchain/retrievers/time_weighted_retriever.py +21 -7
  443. langchain/retrievers/zilliz.py +1 -1
  444. langchain/runnables/hub.py +12 -0
  445. langchain/runnables/openai_functions.py +12 -2
  446. langchain/schema/__init__.py +23 -23
  447. langchain/schema/cache.py +1 -1
  448. langchain/schema/callbacks/base.py +7 -7
  449. langchain/schema/callbacks/manager.py +19 -19
  450. langchain/schema/callbacks/tracers/base.py +1 -1
  451. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  452. langchain/schema/callbacks/tracers/langchain.py +1 -1
  453. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  454. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  455. langchain/schema/callbacks/tracers/schemas.py +8 -8
  456. langchain/schema/callbacks/tracers/stdout.py +3 -3
  457. langchain/schema/document.py +1 -1
  458. langchain/schema/language_model.py +2 -2
  459. langchain/schema/messages.py +12 -12
  460. langchain/schema/output.py +3 -3
  461. langchain/schema/output_parser.py +3 -3
  462. langchain/schema/runnable/__init__.py +3 -3
  463. langchain/schema/runnable/base.py +9 -9
  464. langchain/schema/runnable/config.py +5 -5
  465. langchain/schema/runnable/configurable.py +1 -1
  466. langchain/schema/runnable/history.py +1 -1
  467. langchain/schema/runnable/passthrough.py +1 -1
  468. langchain/schema/runnable/utils.py +16 -16
  469. langchain/schema/vectorstore.py +1 -1
  470. langchain/smith/__init__.py +2 -1
  471. langchain/smith/evaluation/__init__.py +2 -2
  472. langchain/smith/evaluation/config.py +9 -23
  473. langchain/smith/evaluation/name_generation.py +3 -3
  474. langchain/smith/evaluation/progress.py +22 -4
  475. langchain/smith/evaluation/runner_utils.py +416 -247
  476. langchain/smith/evaluation/string_run_evaluator.py +102 -68
  477. langchain/storage/__init__.py +2 -2
  478. langchain/storage/_lc_store.py +4 -2
  479. langchain/storage/encoder_backed.py +7 -2
  480. langchain/storage/file_system.py +19 -16
  481. langchain/storage/in_memory.py +1 -1
  482. langchain/storage/upstash_redis.py +1 -1
  483. langchain/text_splitter.py +15 -15
  484. langchain/tools/__init__.py +28 -26
  485. langchain/tools/ainetwork/app.py +1 -1
  486. langchain/tools/ainetwork/base.py +1 -1
  487. langchain/tools/ainetwork/owner.py +1 -1
  488. langchain/tools/ainetwork/rule.py +1 -1
  489. langchain/tools/ainetwork/transfer.py +1 -1
  490. langchain/tools/ainetwork/value.py +1 -1
  491. langchain/tools/amadeus/closest_airport.py +1 -1
  492. langchain/tools/amadeus/flight_search.py +1 -1
  493. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  494. langchain/tools/base.py +4 -4
  495. langchain/tools/bearly/tool.py +1 -1
  496. langchain/tools/bing_search/__init__.py +1 -1
  497. langchain/tools/bing_search/tool.py +1 -1
  498. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  499. langchain/tools/dataforseo_api_search/tool.py +1 -1
  500. langchain/tools/ddg_search/tool.py +1 -1
  501. langchain/tools/e2b_data_analysis/tool.py +2 -2
  502. langchain/tools/edenai/__init__.py +1 -1
  503. langchain/tools/file_management/__init__.py +1 -1
  504. langchain/tools/file_management/copy.py +1 -1
  505. langchain/tools/file_management/delete.py +1 -1
  506. langchain/tools/gmail/__init__.py +2 -2
  507. langchain/tools/gmail/get_message.py +1 -1
  508. langchain/tools/gmail/search.py +1 -1
  509. langchain/tools/gmail/send_message.py +1 -1
  510. langchain/tools/google_finance/__init__.py +1 -1
  511. langchain/tools/google_finance/tool.py +1 -1
  512. langchain/tools/google_scholar/__init__.py +1 -1
  513. langchain/tools/google_scholar/tool.py +1 -1
  514. langchain/tools/google_search/__init__.py +1 -1
  515. langchain/tools/google_search/tool.py +1 -1
  516. langchain/tools/google_serper/__init__.py +1 -1
  517. langchain/tools/google_serper/tool.py +1 -1
  518. langchain/tools/google_trends/__init__.py +1 -1
  519. langchain/tools/google_trends/tool.py +1 -1
  520. langchain/tools/jira/tool.py +20 -1
  521. langchain/tools/json/tool.py +25 -3
  522. langchain/tools/memorize/tool.py +1 -1
  523. langchain/tools/multion/__init__.py +1 -1
  524. langchain/tools/multion/update_session.py +1 -1
  525. langchain/tools/office365/__init__.py +2 -2
  526. langchain/tools/office365/events_search.py +1 -1
  527. langchain/tools/office365/messages_search.py +1 -1
  528. langchain/tools/office365/send_event.py +1 -1
  529. langchain/tools/office365/send_message.py +1 -1
  530. langchain/tools/openapi/utils/api_models.py +6 -6
  531. langchain/tools/playwright/__init__.py +5 -5
  532. langchain/tools/playwright/click.py +1 -1
  533. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  534. langchain/tools/playwright/get_elements.py +1 -1
  535. langchain/tools/playwright/navigate.py +1 -1
  536. langchain/tools/plugin.py +2 -2
  537. langchain/tools/powerbi/tool.py +1 -1
  538. langchain/tools/python/__init__.py +3 -2
  539. langchain/tools/reddit_search/tool.py +1 -1
  540. langchain/tools/render.py +2 -2
  541. langchain/tools/requests/tool.py +2 -2
  542. langchain/tools/searchapi/tool.py +1 -1
  543. langchain/tools/searx_search/tool.py +1 -1
  544. langchain/tools/slack/get_message.py +1 -1
  545. langchain/tools/spark_sql/tool.py +1 -1
  546. langchain/tools/sql_database/tool.py +1 -1
  547. langchain/tools/tavily_search/__init__.py +1 -1
  548. langchain/tools/tavily_search/tool.py +1 -1
  549. langchain/tools/zapier/__init__.py +1 -1
  550. langchain/tools/zapier/tool.py +24 -2
  551. langchain/utilities/__init__.py +4 -4
  552. langchain/utilities/arcee.py +4 -4
  553. langchain/utilities/clickup.py +4 -4
  554. langchain/utilities/dalle_image_generator.py +1 -1
  555. langchain/utilities/dataforseo_api_search.py +1 -1
  556. langchain/utilities/opaqueprompts.py +1 -1
  557. langchain/utilities/reddit_search.py +1 -1
  558. langchain/utilities/sql_database.py +1 -1
  559. langchain/utilities/tavily_search.py +1 -1
  560. langchain/utilities/vertexai.py +2 -2
  561. langchain/utils/__init__.py +1 -1
  562. langchain/utils/aiter.py +1 -1
  563. langchain/utils/html.py +3 -3
  564. langchain/utils/input.py +1 -1
  565. langchain/utils/iter.py +1 -1
  566. langchain/utils/json_schema.py +1 -3
  567. langchain/utils/strings.py +1 -1
  568. langchain/utils/utils.py +6 -6
  569. langchain/vectorstores/__init__.py +5 -5
  570. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  571. langchain/vectorstores/azure_cosmos_db.py +1 -1
  572. langchain/vectorstores/clickhouse.py +1 -1
  573. langchain/vectorstores/elastic_vector_search.py +1 -1
  574. langchain/vectorstores/elasticsearch.py +2 -2
  575. langchain/vectorstores/myscale.py +1 -1
  576. langchain/vectorstores/neo4j_vector.py +1 -1
  577. langchain/vectorstores/pgembedding.py +1 -1
  578. langchain/vectorstores/qdrant.py +1 -1
  579. langchain/vectorstores/redis/__init__.py +1 -1
  580. langchain/vectorstores/redis/base.py +1 -1
  581. langchain/vectorstores/redis/filters.py +4 -4
  582. langchain/vectorstores/redis/schema.py +6 -6
  583. langchain/vectorstores/sklearn.py +2 -2
  584. langchain/vectorstores/starrocks.py +1 -1
  585. langchain/vectorstores/utils.py +1 -1
  586. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/METADATA +4 -14
  587. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/RECORD +590 -591
  588. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/WHEEL +1 -1
  589. langchain/smith/evaluation/utils.py +0 -0
  590. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/entry_points.txt +0 -0
  591. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/licenses/LICENSE +0 -0
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
 
@@ -106,18 +108,26 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
106
108
  arbitrary_types_allowed=True,
107
109
  )
108
110
 
111
+ @override
109
112
  def get_input_schema(
110
- self, config: Optional[RunnableConfig] = None
113
+ self,
114
+ config: Optional[RunnableConfig] = None,
111
115
  ) -> type[BaseModel]:
112
116
  # 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})
117
+ return create_model("ChainInput", **dict.fromkeys(self.input_keys, (Any, None)))
114
118
 
119
+ @override
115
120
  def get_output_schema(
116
- self, config: Optional[RunnableConfig] = None
121
+ self,
122
+ config: Optional[RunnableConfig] = None,
117
123
  ) -> type[BaseModel]:
118
124
  # 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})
125
+ return create_model(
126
+ "ChainOutput",
127
+ **dict.fromkeys(self.output_keys, (Any, None)),
128
+ )
120
129
 
130
+ @override
121
131
  def invoke(
122
132
  self,
123
133
  input: dict[str, Any],
@@ -160,17 +170,20 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
160
170
  )
161
171
 
162
172
  final_outputs: dict[str, Any] = self.prep_outputs(
163
- inputs, outputs, return_only_outputs
173
+ inputs,
174
+ outputs,
175
+ return_only_outputs,
164
176
  )
165
177
  except BaseException as e:
166
178
  run_manager.on_chain_error(e)
167
- raise e
179
+ raise
168
180
  run_manager.on_chain_end(outputs)
169
181
 
170
182
  if include_run_info:
171
183
  final_outputs[RUN_KEY] = RunInfo(run_id=run_manager.run_id)
172
184
  return final_outputs
173
185
 
186
+ @override
174
187
  async def ainvoke(
175
188
  self,
176
189
  input: dict[str, Any],
@@ -211,11 +224,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
211
224
  else await self._acall(inputs)
212
225
  )
213
226
  final_outputs: dict[str, Any] = await self.aprep_outputs(
214
- inputs, outputs, return_only_outputs
227
+ inputs,
228
+ outputs,
229
+ return_only_outputs,
215
230
  )
216
231
  except BaseException as e:
217
232
  await run_manager.on_chain_error(e)
218
- raise e
233
+ raise
219
234
  await run_manager.on_chain_end(outputs)
220
235
 
221
236
  if include_run_info:
@@ -224,7 +239,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
224
239
 
225
240
  @property
226
241
  def _chain_type(self) -> str:
227
- raise NotImplementedError("Saving not supported for this chain type.")
242
+ msg = "Saving not supported for this chain type."
243
+ raise NotImplementedError(msg)
228
244
 
229
245
  @model_validator(mode="before")
230
246
  @classmethod
@@ -232,29 +248,33 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
232
248
  """Raise deprecation warning if callback_manager is used."""
233
249
  if values.get("callback_manager") is not None:
234
250
  if values.get("callbacks") is not None:
235
- raise ValueError(
251
+ msg = (
236
252
  "Cannot specify both callback_manager and callbacks. "
237
253
  "callback_manager is deprecated, callbacks is the preferred "
238
254
  "parameter to pass in."
239
255
  )
256
+ raise ValueError(msg)
240
257
  warnings.warn(
241
258
  "callback_manager is deprecated. Please use callbacks instead.",
242
259
  DeprecationWarning,
260
+ stacklevel=4,
243
261
  )
244
262
  values["callbacks"] = values.pop("callback_manager", None)
245
263
  return values
246
264
 
247
265
  @field_validator("verbose", mode="before")
248
266
  @classmethod
249
- def set_verbose(cls, verbose: Optional[bool]) -> bool:
267
+ def set_verbose(
268
+ cls,
269
+ verbose: Optional[bool], # noqa: FBT001
270
+ ) -> bool:
250
271
  """Set the chain verbosity.
251
272
 
252
273
  Defaults to the global setting if not specified by the user.
253
274
  """
254
275
  if verbose is None:
255
276
  return _get_verbosity()
256
- else:
257
- return verbose
277
+ return verbose
258
278
 
259
279
  @property
260
280
  @abstractmethod
@@ -275,21 +295,24 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
275
295
  # only one is not set, we can still figure out which key it is.
276
296
  _input_keys = _input_keys.difference(self.memory.memory_variables)
277
297
  if len(_input_keys) != 1:
278
- raise ValueError(
298
+ msg = (
279
299
  f"A single string input was passed in, but this chain expects "
280
300
  f"multiple inputs ({_input_keys}). When a chain expects "
281
301
  f"multiple inputs, please call it by passing in a dictionary, "
282
302
  "eg `chain({'foo': 1, 'bar': 2})`"
283
303
  )
304
+ raise ValueError(msg)
284
305
 
285
306
  missing_keys = set(self.input_keys).difference(inputs)
286
307
  if missing_keys:
287
- raise ValueError(f"Missing some input keys: {missing_keys}")
308
+ msg = f"Missing some input keys: {missing_keys}"
309
+ raise ValueError(msg)
288
310
 
289
311
  def _validate_outputs(self, outputs: dict[str, Any]) -> None:
290
312
  missing_keys = set(self.output_keys).difference(outputs)
291
313
  if missing_keys:
292
- raise ValueError(f"Missing some output keys: {missing_keys}")
314
+ msg = f"Missing some output keys: {missing_keys}"
315
+ raise ValueError(msg)
293
316
 
294
317
  @abstractmethod
295
318
  def _call(
@@ -336,14 +359,17 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
336
359
  `Chain.output_keys`.
337
360
  """
338
361
  return await run_in_executor(
339
- None, self._call, inputs, run_manager.get_sync() if run_manager else None
362
+ None,
363
+ self._call,
364
+ inputs,
365
+ run_manager.get_sync() if run_manager else None,
340
366
  )
341
367
 
342
368
  @deprecated("0.1.0", alternative="invoke", removal="1.0")
343
369
  def __call__(
344
370
  self,
345
371
  inputs: Union[dict[str, Any], Any],
346
- return_only_outputs: bool = False,
372
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
347
373
  callbacks: Callbacks = None,
348
374
  *,
349
375
  tags: Optional[list[str]] = None,
@@ -385,7 +411,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
385
411
 
386
412
  return self.invoke(
387
413
  inputs,
388
- cast(RunnableConfig, {k: v for k, v in config.items() if v is not None}),
414
+ cast("RunnableConfig", {k: v for k, v in config.items() if v is not None}),
389
415
  return_only_outputs=return_only_outputs,
390
416
  include_run_info=include_run_info,
391
417
  )
@@ -394,7 +420,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
394
420
  async def acall(
395
421
  self,
396
422
  inputs: Union[dict[str, Any], Any],
397
- return_only_outputs: bool = False,
423
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
398
424
  callbacks: Callbacks = None,
399
425
  *,
400
426
  tags: Optional[list[str]] = None,
@@ -435,7 +461,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
435
461
  }
436
462
  return await self.ainvoke(
437
463
  inputs,
438
- cast(RunnableConfig, {k: v for k, v in config.items() if k is not None}),
464
+ cast("RunnableConfig", {k: v for k, v in config.items() if k is not None}),
439
465
  return_only_outputs=return_only_outputs,
440
466
  include_run_info=include_run_info,
441
467
  )
@@ -444,7 +470,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
444
470
  self,
445
471
  inputs: dict[str, str],
446
472
  outputs: dict[str, str],
447
- return_only_outputs: bool = False,
473
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
448
474
  ) -> dict[str, str]:
449
475
  """Validate and prepare chain outputs, and save info about this run to memory.
450
476
 
@@ -463,14 +489,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
463
489
  self.memory.save_context(inputs, outputs)
464
490
  if return_only_outputs:
465
491
  return outputs
466
- else:
467
- return {**inputs, **outputs}
492
+ return {**inputs, **outputs}
468
493
 
469
494
  async def aprep_outputs(
470
495
  self,
471
496
  inputs: dict[str, str],
472
497
  outputs: dict[str, str],
473
- return_only_outputs: bool = False,
498
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
474
499
  ) -> dict[str, str]:
475
500
  """Validate and prepare chain outputs, and save info about this run to memory.
476
501
 
@@ -489,8 +514,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
489
514
  await self.memory.asave_context(inputs, outputs)
490
515
  if return_only_outputs:
491
516
  return outputs
492
- else:
493
- return {**inputs, **outputs}
517
+ return {**inputs, **outputs}
494
518
 
495
519
  def prep_inputs(self, inputs: Union[dict[str, Any], Any]) -> dict[str, str]:
496
520
  """Prepare chain inputs, including adding inputs from memory.
@@ -510,7 +534,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
510
534
  # If there are multiple input keys, but some get set by memory so that
511
535
  # only one is not set, we can still figure out which key it is.
512
536
  _input_keys = _input_keys.difference(self.memory.memory_variables)
513
- inputs = {list(_input_keys)[0]: inputs}
537
+ inputs = {next(iter(_input_keys)): inputs}
514
538
  if self.memory is not None:
515
539
  external_context = self.memory.load_memory_variables(inputs)
516
540
  inputs = dict(inputs, **external_context)
@@ -534,7 +558,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
534
558
  # If there are multiple input keys, but some get set by memory so that
535
559
  # only one is not set, we can still figure out which key it is.
536
560
  _input_keys = _input_keys.difference(self.memory.memory_variables)
537
- inputs = {list(_input_keys)[0]: inputs}
561
+ inputs = {next(iter(_input_keys)): inputs}
538
562
  if self.memory is not None:
539
563
  external_context = await self.memory.aload_memory_variables(inputs)
540
564
  inputs = dict(inputs, **external_context)
@@ -543,10 +567,11 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
543
567
  @property
544
568
  def _run_output_key(self) -> str:
545
569
  if len(self.output_keys) != 1:
546
- raise ValueError(
570
+ msg = (
547
571
  f"`run` not supported when there is not exactly "
548
572
  f"one output key. Got {self.output_keys}."
549
573
  )
574
+ raise ValueError(msg)
550
575
  return self.output_keys[0]
551
576
 
552
577
  @deprecated("0.1.0", alternative="invoke", removal="1.0")
@@ -593,13 +618,15 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
593
618
  context = "Weather report for Boise, Idaho on 07/03/23..."
594
619
  chain.run(question=question, context=context)
595
620
  # -> "The temperature in Boise is..."
621
+
596
622
  """
597
623
  # Run at start to make sure this is possible/defined
598
624
  _output_key = self._run_output_key
599
625
 
600
626
  if args and not kwargs:
601
627
  if len(args) != 1:
602
- raise ValueError("`run` supports only one positional argument.")
628
+ msg = "`run` supports only one positional argument."
629
+ raise ValueError(msg)
603
630
  return self(args[0], callbacks=callbacks, tags=tags, metadata=metadata)[
604
631
  _output_key
605
632
  ]
@@ -610,15 +637,16 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
610
637
  ]
611
638
 
612
639
  if not kwargs and not args:
613
- raise ValueError(
640
+ msg = (
614
641
  "`run` supported with either positional arguments or keyword arguments,"
615
642
  " but none were provided."
616
643
  )
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
- )
644
+ raise ValueError(msg)
645
+ msg = (
646
+ f"`run` supported with either positional arguments or keyword arguments"
647
+ f" but not both. Got args: {args} and kwargs: {kwargs}."
648
+ )
649
+ raise ValueError(msg)
622
650
 
623
651
  @deprecated("0.1.0", alternative="ainvoke", removal="1.0")
624
652
  async def arun(
@@ -665,32 +693,42 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
665
693
  context = "Weather report for Boise, Idaho on 07/03/23..."
666
694
  await chain.arun(question=question, context=context)
667
695
  # -> "The temperature in Boise is..."
696
+
668
697
  """
669
698
  if len(self.output_keys) != 1:
670
- raise ValueError(
699
+ msg = (
671
700
  f"`run` not supported when there is not exactly "
672
701
  f"one output key. Got {self.output_keys}."
673
702
  )
674
- elif args and not kwargs:
703
+ raise ValueError(msg)
704
+ if args and not kwargs:
675
705
  if len(args) != 1:
676
- raise ValueError("`run` supports only one positional argument.")
706
+ msg = "`run` supports only one positional argument."
707
+ raise ValueError(msg)
677
708
  return (
678
709
  await self.acall(
679
- args[0], callbacks=callbacks, tags=tags, metadata=metadata
710
+ args[0],
711
+ callbacks=callbacks,
712
+ tags=tags,
713
+ metadata=metadata,
680
714
  )
681
715
  )[self.output_keys[0]]
682
716
 
683
717
  if kwargs and not args:
684
718
  return (
685
719
  await self.acall(
686
- kwargs, callbacks=callbacks, tags=tags, metadata=metadata
720
+ kwargs,
721
+ callbacks=callbacks,
722
+ tags=tags,
723
+ metadata=metadata,
687
724
  )
688
725
  )[self.output_keys[0]]
689
726
 
690
- raise ValueError(
727
+ msg = (
691
728
  f"`run` supported with either positional arguments or keyword arguments"
692
729
  f" but not both. Got args: {args} and kwargs: {kwargs}."
693
730
  )
731
+ raise ValueError(msg)
694
732
 
695
733
  def dict(self, **kwargs: Any) -> dict:
696
734
  """Dictionary representation of chain.
@@ -710,12 +748,11 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
710
748
 
711
749
  chain.dict(exclude_unset=True)
712
750
  # -> {"_type": "foo", "verbose": False, ...}
751
+
713
752
  """
714
753
  _dict = super().dict(**kwargs)
715
- try:
754
+ with contextlib.suppress(NotImplementedError):
716
755
  _dict["_type"] = self._chain_type
717
- except NotImplementedError:
718
- pass
719
756
  return _dict
720
757
 
721
758
  def save(self, file_path: Union[Path, str]) -> None:
@@ -731,36 +768,39 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
731
768
  .. code-block:: python
732
769
 
733
770
  chain.save(file_path="path/chain.yaml")
771
+
734
772
  """
735
773
  if self.memory is not None:
736
- raise ValueError("Saving of memory is not yet supported.")
774
+ msg = "Saving of memory is not yet supported."
775
+ raise ValueError(msg)
737
776
 
738
777
  # Fetch dictionary to save
739
778
  chain_dict = self.dict()
740
779
  if "_type" not in chain_dict:
741
- raise NotImplementedError(f"Chain {self} does not support saving.")
780
+ msg = f"Chain {self} does not support saving."
781
+ raise NotImplementedError(msg)
742
782
 
743
783
  # Convert file to Path object.
744
- if isinstance(file_path, str):
745
- save_path = Path(file_path)
746
- else:
747
- save_path = file_path
784
+ save_path = Path(file_path) if isinstance(file_path, str) else file_path
748
785
 
749
786
  directory_path = save_path.parent
750
787
  directory_path.mkdir(parents=True, exist_ok=True)
751
788
 
752
789
  if save_path.suffix == ".json":
753
- with open(file_path, "w") as f:
790
+ with save_path.open("w") as f:
754
791
  json.dump(chain_dict, f, indent=4)
755
792
  elif save_path.suffix.endswith((".yaml", ".yml")):
756
- with open(file_path, "w") as f:
793
+ with save_path.open("w") as f:
757
794
  yaml.dump(chain_dict, f, default_flow_style=False)
758
795
  else:
759
- raise ValueError(f"{save_path} must be json or yaml")
796
+ msg = f"{save_path} must be json or yaml"
797
+ raise ValueError(msg)
760
798
 
761
799
  @deprecated("0.1.0", alternative="batch", removal="1.0")
762
800
  def apply(
763
- self, input_list: list[builtins.dict[str, Any]], callbacks: Callbacks = None
801
+ self,
802
+ input_list: list[builtins.dict[str, Any]],
803
+ callbacks: Callbacks = None,
764
804
  ) -> list[builtins.dict[str, str]]:
765
805
  """Call the chain on all inputs in the list."""
766
806
  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
  ]
@@ -14,6 +14,7 @@ from langchain_core.runnables.config import RunnableConfig
14
14
  from langchain_core.utils.pydantic import create_model
15
15
  from langchain_text_splitters import RecursiveCharacterTextSplitter, TextSplitter
16
16
  from pydantic import BaseModel, Field
17
+ from typing_extensions import override
17
18
 
18
19
  from langchain.chains.base import Chain
19
20
 
@@ -24,10 +25,11 @@ DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template("{page_content}")
24
25
 
25
26
  def _validate_prompt(prompt: BasePromptTemplate, document_variable_name: str) -> None:
26
27
  if document_variable_name not in prompt.input_variables:
27
- raise ValueError(
28
+ msg = (
28
29
  f"Prompt must accept {document_variable_name} as an input variable. "
29
30
  f"Received prompt with input variables: {prompt.input_variables}"
30
31
  )
32
+ raise ValueError(msg)
31
33
 
32
34
 
33
35
  class BaseCombineDocumentsChain(Chain, ABC):
@@ -45,16 +47,20 @@ class BaseCombineDocumentsChain(Chain, ABC):
45
47
  input_key: str = "input_documents" #: :meta private:
46
48
  output_key: str = "output_text" #: :meta private:
47
49
 
50
+ @override
48
51
  def get_input_schema(
49
- self, config: Optional[RunnableConfig] = None
52
+ self,
53
+ config: Optional[RunnableConfig] = None,
50
54
  ) -> type[BaseModel]:
51
55
  return create_model(
52
56
  "CombineDocumentsInput",
53
57
  **{self.input_key: (list[Document], None)},
54
58
  )
55
59
 
60
+ @override
56
61
  def get_output_schema(
57
- self, config: Optional[RunnableConfig] = None
62
+ self,
63
+ config: Optional[RunnableConfig] = None,
58
64
  ) -> type[BaseModel]:
59
65
  return create_model(
60
66
  "CombineDocumentsOutput",
@@ -77,7 +83,7 @@ class BaseCombineDocumentsChain(Chain, ABC):
77
83
  """
78
84
  return [self.output_key]
79
85
 
80
- def prompt_length(self, docs: list[Document], **kwargs: Any) -> Optional[int]:
86
+ def prompt_length(self, docs: list[Document], **kwargs: Any) -> Optional[int]: # noqa: ARG002
81
87
  """Return the prompt length given the documents passed in.
82
88
 
83
89
  This can be used by a caller to determine whether passing in a list
@@ -111,7 +117,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
111
117
 
112
118
  @abstractmethod
113
119
  async def acombine_docs(
114
- self, docs: list[Document], **kwargs: Any
120
+ self,
121
+ docs: list[Document],
122
+ **kwargs: Any,
115
123
  ) -> tuple[str, dict]:
116
124
  """Combine documents into a single string.
117
125
 
@@ -136,7 +144,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
136
144
  # Other keys are assumed to be needed for LLM prediction
137
145
  other_keys = {k: v for k, v in inputs.items() if k != self.input_key}
138
146
  output, extra_return_dict = self.combine_docs(
139
- docs, callbacks=_run_manager.get_child(), **other_keys
147
+ docs,
148
+ callbacks=_run_manager.get_child(),
149
+ **other_keys,
140
150
  )
141
151
  extra_return_dict[self.output_key] = output
142
152
  return extra_return_dict
@@ -152,7 +162,9 @@ class BaseCombineDocumentsChain(Chain, ABC):
152
162
  # Other keys are assumed to be needed for LLM prediction
153
163
  other_keys = {k: v for k, v in inputs.items() if k != self.input_key}
154
164
  output, extra_return_dict = await self.acombine_docs(
155
- docs, callbacks=_run_manager.get_child(), **other_keys
165
+ docs,
166
+ callbacks=_run_manager.get_child(),
167
+ **other_keys,
156
168
  )
157
169
  extra_return_dict[self.output_key] = output
158
170
  return extra_return_dict
@@ -162,7 +174,7 @@ class BaseCombineDocumentsChain(Chain, ABC):
162
174
  since="0.2.7",
163
175
  alternative=(
164
176
  "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
177
+ "https://api.python.langchain.com/en/latest/chains/langchain.chains.combine_documents.base.AnalyzeDocumentChain.html"
166
178
  ),
167
179
  removal="1.0",
168
180
  )
@@ -222,6 +234,7 @@ class AnalyzeDocumentChain(Chain):
222
234
  input_documents=itemgetter("input_document") | split_text,
223
235
  ) | chain.pick("output_text")
224
236
  )
237
+
225
238
  """
226
239
 
227
240
  input_key: str = "input_document" #: :meta private:
@@ -244,16 +257,20 @@ class AnalyzeDocumentChain(Chain):
244
257
  """
245
258
  return self.combine_docs_chain.output_keys
246
259
 
260
+ @override
247
261
  def get_input_schema(
248
- self, config: Optional[RunnableConfig] = None
262
+ self,
263
+ config: Optional[RunnableConfig] = None,
249
264
  ) -> type[BaseModel]:
250
265
  return create_model(
251
266
  "AnalyzeDocumentChain",
252
267
  **{self.input_key: (str, None)},
253
268
  )
254
269
 
270
+ @override
255
271
  def get_output_schema(
256
- self, config: Optional[RunnableConfig] = None
272
+ self,
273
+ config: Optional[RunnableConfig] = None,
257
274
  ) -> type[BaseModel]:
258
275
  return self.combine_docs_chain.get_output_schema(config)
259
276
 
@@ -270,5 +287,7 @@ class AnalyzeDocumentChain(Chain):
270
287
  other_keys: dict = {k: v for k, v in inputs.items() if k != self.input_key}
271
288
  other_keys[self.combine_docs_chain.input_key] = docs
272
289
  return self.combine_docs_chain(
273
- other_keys, return_only_outputs=True, callbacks=_run_manager.get_child()
290
+ other_keys,
291
+ return_only_outputs=True,
292
+ callbacks=_run_manager.get_child(),
274
293
  )