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
langchain/agents/agent.py CHANGED
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import builtins
7
+ import contextlib
7
8
  import json
8
9
  import logging
9
10
  import time
@@ -41,7 +42,7 @@ from langchain_core.runnables.utils import AddableDict
41
42
  from langchain_core.tools import BaseTool
42
43
  from langchain_core.utils.input import get_color_mapping
43
44
  from pydantic import BaseModel, ConfigDict, model_validator
44
- from typing_extensions import Self
45
+ from typing_extensions import Self, override
45
46
 
46
47
  from langchain._api.deprecation import AGENT_DEPRECATION_WARNING
47
48
  from langchain.agents.agent_iterator import AgentExecutorIterator
@@ -134,12 +135,11 @@ class BaseSingleActionAgent(BaseModel):
134
135
  if early_stopping_method == "force":
135
136
  # `force` just returns a constant string
136
137
  return AgentFinish(
137
- {"output": "Agent stopped due to iteration limit or time limit."}, ""
138
- )
139
- else:
140
- raise ValueError(
141
- f"Got unsupported early_stopping_method `{early_stopping_method}`"
138
+ {"output": "Agent stopped due to iteration limit or time limit."},
139
+ "",
142
140
  )
141
+ msg = f"Got unsupported early_stopping_method `{early_stopping_method}`"
142
+ raise ValueError(msg)
143
143
 
144
144
  @classmethod
145
145
  def from_llm_and_tools(
@@ -197,10 +197,7 @@ class BaseSingleActionAgent(BaseModel):
197
197
  agent.agent.save(file_path="path/agent.yaml")
198
198
  """
199
199
  # Convert file to Path object.
200
- if isinstance(file_path, str):
201
- save_path = Path(file_path)
202
- else:
203
- save_path = file_path
200
+ save_path = Path(file_path) if isinstance(file_path, str) else file_path
204
201
 
205
202
  directory_path = save_path.parent
206
203
  directory_path.mkdir(parents=True, exist_ok=True)
@@ -208,16 +205,18 @@ class BaseSingleActionAgent(BaseModel):
208
205
  # Fetch dictionary to save
209
206
  agent_dict = self.dict()
210
207
  if "_type" not in agent_dict:
211
- raise NotImplementedError(f"Agent {self} does not support saving")
208
+ msg = f"Agent {self} does not support saving"
209
+ raise NotImplementedError(msg)
212
210
 
213
211
  if save_path.suffix == ".json":
214
- with open(file_path, "w") as f:
212
+ with save_path.open("w") as f:
215
213
  json.dump(agent_dict, f, indent=4)
216
214
  elif save_path.suffix.endswith((".yaml", ".yml")):
217
- with open(file_path, "w") as f:
215
+ with save_path.open("w") as f:
218
216
  yaml.dump(agent_dict, f, default_flow_style=False)
219
217
  else:
220
- raise ValueError(f"{save_path} must be json or yaml")
218
+ msg = f"{save_path} must be json or yaml"
219
+ raise ValueError(msg)
221
220
 
222
221
  def tool_run_logging_kwargs(self) -> builtins.dict:
223
222
  """Return logging kwargs for tool run."""
@@ -309,10 +308,8 @@ class BaseMultiActionAgent(BaseModel):
309
308
  if early_stopping_method == "force":
310
309
  # `force` just returns a constant string
311
310
  return AgentFinish({"output": "Agent stopped due to max iterations."}, "")
312
- else:
313
- raise ValueError(
314
- f"Got unsupported early_stopping_method `{early_stopping_method}`"
315
- )
311
+ msg = f"Got unsupported early_stopping_method `{early_stopping_method}`"
312
+ raise ValueError(msg)
316
313
 
317
314
  @property
318
315
  def _agent_type(self) -> str:
@@ -322,10 +319,8 @@ class BaseMultiActionAgent(BaseModel):
322
319
  def dict(self, **kwargs: Any) -> builtins.dict:
323
320
  """Return dictionary representation of agent."""
324
321
  _dict = super().model_dump()
325
- try:
322
+ with contextlib.suppress(NotImplementedError):
326
323
  _dict["_type"] = str(self._agent_type)
327
- except NotImplementedError:
328
- pass
329
324
  return _dict
330
325
 
331
326
  def save(self, file_path: Union[Path, str]) -> None:
@@ -345,27 +340,26 @@ class BaseMultiActionAgent(BaseModel):
345
340
  agent.agent.save(file_path="path/agent.yaml")
346
341
  """
347
342
  # Convert file to Path object.
348
- if isinstance(file_path, str):
349
- save_path = Path(file_path)
350
- else:
351
- save_path = file_path
343
+ save_path = Path(file_path) if isinstance(file_path, str) else file_path
352
344
 
353
345
  # Fetch dictionary to save
354
346
  agent_dict = self.dict()
355
347
  if "_type" not in agent_dict:
356
- raise NotImplementedError(f"Agent {self} does not support saving.")
348
+ msg = f"Agent {self} does not support saving."
349
+ raise NotImplementedError(msg)
357
350
 
358
351
  directory_path = save_path.parent
359
352
  directory_path.mkdir(parents=True, exist_ok=True)
360
353
 
361
354
  if save_path.suffix == ".json":
362
- with open(file_path, "w") as f:
355
+ with save_path.open("w") as f:
363
356
  json.dump(agent_dict, f, indent=4)
364
357
  elif save_path.suffix.endswith((".yaml", ".yml")):
365
- with open(file_path, "w") as f:
358
+ with save_path.open("w") as f:
366
359
  yaml.dump(agent_dict, f, default_flow_style=False)
367
360
  else:
368
- raise ValueError(f"{save_path} must be json or yaml")
361
+ msg = f"{save_path} must be json or yaml"
362
+ raise ValueError(msg)
369
363
 
370
364
  def tool_run_logging_kwargs(self) -> builtins.dict:
371
365
  """Return logging kwargs for tool run."""
@@ -382,7 +376,7 @@ class AgentOutputParser(BaseOutputParser[Union[AgentAction, AgentFinish]]):
382
376
 
383
377
 
384
378
  class MultiActionAgentOutputParser(
385
- BaseOutputParser[Union[list[AgentAction], AgentFinish]]
379
+ BaseOutputParser[Union[list[AgentAction], AgentFinish]],
386
380
  ):
387
381
  """Base class for parsing agent output into agent actions/finish.
388
382
 
@@ -449,7 +443,7 @@ class RunnableAgent(BaseSingleActionAgent):
449
443
  Returns:
450
444
  Action specifying what tool to use.
451
445
  """
452
- inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
446
+ inputs = {**kwargs, "intermediate_steps": intermediate_steps}
453
447
  final_output: Any = None
454
448
  if self.stream_runnable:
455
449
  # Use streaming to make sure that the underlying LLM is invoked in a
@@ -488,7 +482,7 @@ class RunnableAgent(BaseSingleActionAgent):
488
482
  Returns:
489
483
  Action specifying what tool to use.
490
484
  """
491
- inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
485
+ inputs = {**kwargs, "intermediate_steps": intermediate_steps}
492
486
  final_output: Any = None
493
487
  if self.stream_runnable:
494
488
  # Use streaming to make sure that the underlying LLM is invoked in a
@@ -498,7 +492,8 @@ class RunnableAgent(BaseSingleActionAgent):
498
492
  # Because the response from the plan is not a generator, we need to
499
493
  # accumulate the output into final output and return that.
500
494
  async for chunk in self.runnable.astream(
501
- inputs, config={"callbacks": callbacks}
495
+ inputs,
496
+ config={"callbacks": callbacks},
502
497
  ):
503
498
  if final_output is None:
504
499
  final_output = chunk
@@ -506,7 +501,8 @@ class RunnableAgent(BaseSingleActionAgent):
506
501
  final_output += chunk
507
502
  else:
508
503
  final_output = await self.runnable.ainvoke(
509
- inputs, config={"callbacks": callbacks}
504
+ inputs,
505
+ config={"callbacks": callbacks},
510
506
  )
511
507
  return final_output
512
508
 
@@ -565,7 +561,7 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
565
561
  Returns:
566
562
  Action specifying what tool to use.
567
563
  """
568
- inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
564
+ inputs = {**kwargs, "intermediate_steps": intermediate_steps}
569
565
  final_output: Any = None
570
566
  if self.stream_runnable:
571
567
  # Use streaming to make sure that the underlying LLM is invoked in a
@@ -604,7 +600,7 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
604
600
  Returns:
605
601
  Action specifying what tool to use.
606
602
  """
607
- inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
603
+ inputs = {**kwargs, "intermediate_steps": intermediate_steps}
608
604
  final_output: Any = None
609
605
  if self.stream_runnable:
610
606
  # Use streaming to make sure that the underlying LLM is invoked in a
@@ -614,7 +610,8 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
614
610
  # Because the response from the plan is not a generator, we need to
615
611
  # accumulate the output into final output and return that.
616
612
  async for chunk in self.runnable.astream(
617
- inputs, config={"callbacks": callbacks}
613
+ inputs,
614
+ config={"callbacks": callbacks},
618
615
  ):
619
616
  if final_output is None:
620
617
  final_output = chunk
@@ -622,7 +619,8 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
622
619
  final_output += chunk
623
620
  else:
624
621
  final_output = await self.runnable.ainvoke(
625
- inputs, config={"callbacks": callbacks}
622
+ inputs,
623
+ config={"callbacks": callbacks},
626
624
  )
627
625
 
628
626
  return final_output
@@ -760,7 +758,8 @@ class Agent(BaseSingleActionAgent):
760
758
  Returns:
761
759
  str: Fixed text.
762
760
  """
763
- raise ValueError("fix_text not implemented for this agent.")
761
+ msg = "fix_text not implemented for this agent."
762
+ raise ValueError(msg)
764
763
 
765
764
  @property
766
765
  def _stop(self) -> list[str]:
@@ -770,7 +769,8 @@ class Agent(BaseSingleActionAgent):
770
769
  ]
771
770
 
772
771
  def _construct_scratchpad(
773
- self, intermediate_steps: list[tuple[AgentAction, str]]
772
+ self,
773
+ intermediate_steps: list[tuple[AgentAction, str]],
774
774
  ) -> Union[str, list[BaseMessage]]:
775
775
  """Construct the scratchpad that lets the agent continue its thought process."""
776
776
  thoughts = ""
@@ -819,11 +819,12 @@ class Agent(BaseSingleActionAgent):
819
819
  """
820
820
  full_inputs = self.get_full_inputs(intermediate_steps, **kwargs)
821
821
  full_output = await self.llm_chain.apredict(callbacks=callbacks, **full_inputs)
822
- agent_output = await self.output_parser.aparse(full_output)
823
- return agent_output
822
+ return await self.output_parser.aparse(full_output)
824
823
 
825
824
  def get_full_inputs(
826
- self, intermediate_steps: list[tuple[AgentAction, str]], **kwargs: Any
825
+ self,
826
+ intermediate_steps: list[tuple[AgentAction, str]],
827
+ **kwargs: Any,
827
828
  ) -> builtins.dict[str, Any]:
828
829
  """Create the full inputs for the LLMChain from intermediate steps.
829
830
 
@@ -837,8 +838,7 @@ class Agent(BaseSingleActionAgent):
837
838
  """
838
839
  thoughts = self._construct_scratchpad(intermediate_steps)
839
840
  new_inputs = {"agent_scratchpad": thoughts, "stop": self._stop}
840
- full_inputs = {**kwargs, **new_inputs}
841
- return full_inputs
841
+ return {**kwargs, **new_inputs}
842
842
 
843
843
  @property
844
844
  def input_keys(self) -> list[str]:
@@ -866,7 +866,7 @@ class Agent(BaseSingleActionAgent):
866
866
  if "agent_scratchpad" not in prompt.input_variables:
867
867
  logger.warning(
868
868
  "`agent_scratchpad` should be a variable in prompt.input_variables."
869
- " Did not find it, so adding it at the end."
869
+ " Did not find it, so adding it at the end.",
870
870
  )
871
871
  prompt.input_variables.append("agent_scratchpad")
872
872
  if isinstance(prompt, PromptTemplate):
@@ -874,7 +874,8 @@ class Agent(BaseSingleActionAgent):
874
874
  elif isinstance(prompt, FewShotPromptTemplate):
875
875
  prompt.suffix += "\n{agent_scratchpad}"
876
876
  else:
877
- raise ValueError(f"Got unexpected prompt type {type(prompt)}")
877
+ msg = f"Got unexpected prompt type {type(prompt)}"
878
+ raise ValueError(msg)
878
879
  return self
879
880
 
880
881
  @property
@@ -907,8 +908,6 @@ class Agent(BaseSingleActionAgent):
907
908
  tools: Tools to use.
908
909
  """
909
910
 
910
- pass
911
-
912
911
  @classmethod
913
912
  @abstractmethod
914
913
  def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
@@ -973,9 +972,10 @@ class Agent(BaseSingleActionAgent):
973
972
  if early_stopping_method == "force":
974
973
  # `force` just returns a constant string
975
974
  return AgentFinish(
976
- {"output": "Agent stopped due to iteration limit or time limit."}, ""
975
+ {"output": "Agent stopped due to iteration limit or time limit."},
976
+ "",
977
977
  )
978
- elif early_stopping_method == "generate":
978
+ if early_stopping_method == "generate":
979
979
  # Generate does one final forward pass
980
980
  thoughts = ""
981
981
  for action, observation in intermediate_steps:
@@ -995,15 +995,14 @@ class Agent(BaseSingleActionAgent):
995
995
  if isinstance(parsed_output, AgentFinish):
996
996
  # If we can extract, we send the correct stuff
997
997
  return parsed_output
998
- else:
999
- # If we can extract, but the tool is not the final tool,
1000
- # we just return the full output
1001
- return AgentFinish({"output": full_output}, full_output)
1002
- else:
1003
- raise ValueError(
1004
- "early_stopping_method should be one of `force` or `generate`, "
1005
- f"got {early_stopping_method}"
1006
- )
998
+ # If we can extract, but the tool is not the final tool,
999
+ # we just return the full output
1000
+ return AgentFinish({"output": full_output}, full_output)
1001
+ msg = (
1002
+ "early_stopping_method should be one of `force` or `generate`, "
1003
+ f"got {early_stopping_method}"
1004
+ )
1005
+ raise ValueError(msg)
1007
1006
 
1008
1007
  def tool_run_logging_kwargs(self) -> builtins.dict:
1009
1008
  """Return logging kwargs for tool run."""
@@ -1082,7 +1081,8 @@ class AgentExecutor(Chain):
1082
1081
  as an observation.
1083
1082
  """
1084
1083
  trim_intermediate_steps: Union[
1085
- int, Callable[[list[tuple[AgentAction, str]]], list[tuple[AgentAction, str]]]
1084
+ int,
1085
+ Callable[[list[tuple[AgentAction, str]]], list[tuple[AgentAction, str]]],
1086
1086
  ] = -1
1087
1087
  """How to trim the intermediate steps before returning them.
1088
1088
  Defaults to -1, which means no trimming.
@@ -1130,12 +1130,14 @@ class AgentExecutor(Chain):
1130
1130
  agent = self.agent
1131
1131
  tools = self.tools
1132
1132
  allowed_tools = agent.get_allowed_tools() # type: ignore[union-attr]
1133
- if allowed_tools is not None:
1134
- if set(allowed_tools) != set([tool.name for tool in tools]):
1135
- raise ValueError(
1136
- f"Allowed tools ({allowed_tools}) different than "
1137
- f"provided tools ({[tool.name for tool in tools]})"
1138
- )
1133
+ if allowed_tools is not None and set(allowed_tools) != {
1134
+ tool.name for tool in tools
1135
+ }:
1136
+ msg = (
1137
+ f"Allowed tools ({allowed_tools}) different than "
1138
+ f"provided tools ({[tool.name for tool in tools]})"
1139
+ )
1140
+ raise ValueError(msg)
1139
1141
  return self
1140
1142
 
1141
1143
  @model_validator(mode="before")
@@ -1161,11 +1163,13 @@ class AgentExecutor(Chain):
1161
1163
  stream_runnable = values.pop("stream_runnable", True)
1162
1164
  if multi_action:
1163
1165
  values["agent"] = RunnableMultiActionAgent(
1164
- runnable=agent, stream_runnable=stream_runnable
1166
+ runnable=agent,
1167
+ stream_runnable=stream_runnable,
1165
1168
  )
1166
1169
  else:
1167
1170
  values["agent"] = RunnableAgent(
1168
- runnable=agent, stream_runnable=stream_runnable
1171
+ runnable=agent,
1172
+ stream_runnable=stream_runnable,
1169
1173
  )
1170
1174
  return values
1171
1175
 
@@ -1181,8 +1185,7 @@ class AgentExecutor(Chain):
1181
1185
  """
1182
1186
  if isinstance(self.agent, Runnable):
1183
1187
  return cast(RunnableAgentType, self.agent)
1184
- else:
1185
- return self.agent
1188
+ return self.agent
1186
1189
 
1187
1190
  def save(self, file_path: Union[Path, str]) -> None:
1188
1191
  """Raise error - saving not supported for Agent Executors.
@@ -1193,11 +1196,12 @@ class AgentExecutor(Chain):
1193
1196
  Raises:
1194
1197
  ValueError: Saving not supported for agent executors.
1195
1198
  """
1196
- raise ValueError(
1199
+ msg = (
1197
1200
  "Saving not supported for agent executors. "
1198
1201
  "If you are trying to save the agent, please use the "
1199
1202
  "`.save_agent(...)`"
1200
1203
  )
1204
+ raise ValueError(msg)
1201
1205
 
1202
1206
  def save_agent(self, file_path: Union[Path, str]) -> None:
1203
1207
  """Save the underlying agent.
@@ -1249,9 +1253,8 @@ class AgentExecutor(Chain):
1249
1253
  :meta private:
1250
1254
  """
1251
1255
  if self.return_intermediate_steps:
1252
- return self._action_agent.return_values + ["intermediate_steps"]
1253
- else:
1254
- return self._action_agent.return_values
1256
+ return [*self._action_agent.return_values, "intermediate_steps"]
1257
+ return self._action_agent.return_values
1255
1258
 
1256
1259
  def lookup_tool(self, name: str) -> BaseTool:
1257
1260
  """Lookup tool by name.
@@ -1267,13 +1270,7 @@ class AgentExecutor(Chain):
1267
1270
  def _should_continue(self, iterations: int, time_elapsed: float) -> bool:
1268
1271
  if self.max_iterations is not None and iterations >= self.max_iterations:
1269
1272
  return False
1270
- if (
1271
- self.max_execution_time is not None
1272
- and time_elapsed >= self.max_execution_time
1273
- ):
1274
- return False
1275
-
1276
- return True
1273
+ return self.max_execution_time is None or time_elapsed < self.max_execution_time
1277
1274
 
1278
1275
  def _return(
1279
1276
  self,
@@ -1296,7 +1293,9 @@ class AgentExecutor(Chain):
1296
1293
  ) -> dict[str, Any]:
1297
1294
  if run_manager:
1298
1295
  await run_manager.on_agent_finish(
1299
- output, color="green", verbose=self.verbose
1296
+ output,
1297
+ color="green",
1298
+ verbose=self.verbose,
1300
1299
  )
1301
1300
  final_output = output.return_values
1302
1301
  if self.return_intermediate_steps:
@@ -1304,15 +1303,15 @@ class AgentExecutor(Chain):
1304
1303
  return final_output
1305
1304
 
1306
1305
  def _consume_next_step(
1307
- self, values: NextStepOutput
1306
+ self,
1307
+ values: NextStepOutput,
1308
1308
  ) -> Union[AgentFinish, list[tuple[AgentAction, str]]]:
1309
1309
  if isinstance(values[-1], AgentFinish):
1310
- assert len(values) == 1
1310
+ if len(values) != 1:
1311
+ msg = "Expected a single AgentFinish output, but got multiple values."
1312
+ raise ValueError(msg)
1311
1313
  return values[-1]
1312
- else:
1313
- return [
1314
- (a.action, a.observation) for a in values if isinstance(a, AgentStep)
1315
- ]
1314
+ return [(a.action, a.observation) for a in values if isinstance(a, AgentStep)]
1316
1315
 
1317
1316
  def _take_next_step(
1318
1317
  self,
@@ -1323,16 +1322,15 @@ class AgentExecutor(Chain):
1323
1322
  run_manager: Optional[CallbackManagerForChainRun] = None,
1324
1323
  ) -> Union[AgentFinish, list[tuple[AgentAction, str]]]:
1325
1324
  return self._consume_next_step(
1326
- [
1327
- a
1328
- for a in self._iter_next_step(
1325
+ list(
1326
+ self._iter_next_step(
1329
1327
  name_to_tool_map,
1330
1328
  color_mapping,
1331
1329
  inputs,
1332
1330
  intermediate_steps,
1333
1331
  run_manager,
1334
- )
1335
- ]
1332
+ ),
1333
+ ),
1336
1334
  )
1337
1335
 
1338
1336
  def _iter_next_step(
@@ -1362,12 +1360,13 @@ class AgentExecutor(Chain):
1362
1360
  else:
1363
1361
  raise_error = False
1364
1362
  if raise_error:
1365
- raise ValueError(
1363
+ msg = (
1366
1364
  "An output parsing error occurred. "
1367
1365
  "In order to pass this error back to the agent and have it try "
1368
1366
  "again, pass `handle_parsing_errors=True` to the AgentExecutor. "
1369
- f"This is the error: {str(e)}"
1367
+ f"This is the error: {e!s}"
1370
1368
  )
1369
+ raise ValueError(msg) from e
1371
1370
  text = str(e)
1372
1371
  if isinstance(self.handle_parsing_errors, bool):
1373
1372
  if e.send_to_llm:
@@ -1380,7 +1379,8 @@ class AgentExecutor(Chain):
1380
1379
  elif callable(self.handle_parsing_errors):
1381
1380
  observation = self.handle_parsing_errors(e)
1382
1381
  else:
1383
- raise ValueError("Got unexpected type of `handle_parsing_errors`")
1382
+ msg = "Got unexpected type of `handle_parsing_errors`"
1383
+ raise ValueError(msg) from e # noqa: TRY004
1384
1384
  output = AgentAction("_Exception", observation, text)
1385
1385
  if run_manager:
1386
1386
  run_manager.on_agent_action(output, color="green")
@@ -1401,15 +1401,15 @@ class AgentExecutor(Chain):
1401
1401
  return
1402
1402
 
1403
1403
  actions: list[AgentAction]
1404
- if isinstance(output, AgentAction):
1405
- actions = [output]
1406
- else:
1407
- actions = output
1404
+ actions = [output] if isinstance(output, AgentAction) else output
1408
1405
  for agent_action in actions:
1409
1406
  yield agent_action
1410
1407
  for agent_action in actions:
1411
1408
  yield self._perform_agent_action(
1412
- name_to_tool_map, color_mapping, agent_action, run_manager
1409
+ name_to_tool_map,
1410
+ color_mapping,
1411
+ agent_action,
1412
+ run_manager,
1413
1413
  )
1414
1414
 
1415
1415
  def _perform_agent_action(
@@ -1469,7 +1469,7 @@ class AgentExecutor(Chain):
1469
1469
  intermediate_steps,
1470
1470
  run_manager,
1471
1471
  )
1472
- ]
1472
+ ],
1473
1473
  )
1474
1474
 
1475
1475
  async def _aiter_next_step(
@@ -1499,12 +1499,13 @@ class AgentExecutor(Chain):
1499
1499
  else:
1500
1500
  raise_error = False
1501
1501
  if raise_error:
1502
- raise ValueError(
1502
+ msg = (
1503
1503
  "An output parsing error occurred. "
1504
1504
  "In order to pass this error back to the agent and have it try "
1505
1505
  "again, pass `handle_parsing_errors=True` to the AgentExecutor. "
1506
- f"This is the error: {str(e)}"
1506
+ f"This is the error: {e!s}"
1507
1507
  )
1508
+ raise ValueError(msg) from e
1508
1509
  text = str(e)
1509
1510
  if isinstance(self.handle_parsing_errors, bool):
1510
1511
  if e.send_to_llm:
@@ -1517,7 +1518,8 @@ class AgentExecutor(Chain):
1517
1518
  elif callable(self.handle_parsing_errors):
1518
1519
  observation = self.handle_parsing_errors(e)
1519
1520
  else:
1520
- raise ValueError("Got unexpected type of `handle_parsing_errors`")
1521
+ msg = "Got unexpected type of `handle_parsing_errors`"
1522
+ raise ValueError(msg) from e # noqa: TRY004
1521
1523
  output = AgentAction("_Exception", observation, text)
1522
1524
  tool_run_kwargs = self._action_agent.tool_run_logging_kwargs()
1523
1525
  observation = await ExceptionTool().arun(
@@ -1536,10 +1538,7 @@ class AgentExecutor(Chain):
1536
1538
  return
1537
1539
 
1538
1540
  actions: list[AgentAction]
1539
- if isinstance(output, AgentAction):
1540
- actions = [output]
1541
- else:
1542
- actions = output
1541
+ actions = [output] if isinstance(output, AgentAction) else output
1543
1542
  for agent_action in actions:
1544
1543
  yield agent_action
1545
1544
 
@@ -1547,7 +1546,10 @@ class AgentExecutor(Chain):
1547
1546
  result = await asyncio.gather(
1548
1547
  *[
1549
1548
  self._aperform_agent_action(
1550
- name_to_tool_map, color_mapping, agent_action, run_manager
1549
+ name_to_tool_map,
1550
+ color_mapping,
1551
+ agent_action,
1552
+ run_manager,
1551
1553
  )
1552
1554
  for agent_action in actions
1553
1555
  ],
@@ -1566,7 +1568,9 @@ class AgentExecutor(Chain):
1566
1568
  ) -> AgentStep:
1567
1569
  if run_manager:
1568
1570
  await run_manager.on_agent_action(
1569
- agent_action, verbose=self.verbose, color="green"
1571
+ agent_action,
1572
+ verbose=self.verbose,
1573
+ color="green",
1570
1574
  )
1571
1575
  # Otherwise we lookup the tool
1572
1576
  if agent_action.tool in name_to_tool_map:
@@ -1608,7 +1612,8 @@ class AgentExecutor(Chain):
1608
1612
  name_to_tool_map = {tool.name: tool for tool in self.tools}
1609
1613
  # We construct a mapping from each tool to a color, used for logging.
1610
1614
  color_mapping = get_color_mapping(
1611
- [tool.name for tool in self.tools], excluded_colors=["green", "red"]
1615
+ [tool.name for tool in self.tools],
1616
+ excluded_colors=["green", "red"],
1612
1617
  )
1613
1618
  intermediate_steps: list[tuple[AgentAction, str]] = []
1614
1619
  # Let's start tracking the number of iterations and time elapsed
@@ -1626,7 +1631,9 @@ class AgentExecutor(Chain):
1626
1631
  )
1627
1632
  if isinstance(next_step_output, AgentFinish):
1628
1633
  return self._return(
1629
- next_step_output, intermediate_steps, run_manager=run_manager
1634
+ next_step_output,
1635
+ intermediate_steps,
1636
+ run_manager=run_manager,
1630
1637
  )
1631
1638
 
1632
1639
  intermediate_steps.extend(next_step_output)
@@ -1636,12 +1643,16 @@ class AgentExecutor(Chain):
1636
1643
  tool_return = self._get_tool_return(next_step_action)
1637
1644
  if tool_return is not None:
1638
1645
  return self._return(
1639
- tool_return, intermediate_steps, run_manager=run_manager
1646
+ tool_return,
1647
+ intermediate_steps,
1648
+ run_manager=run_manager,
1640
1649
  )
1641
1650
  iterations += 1
1642
1651
  time_elapsed = time.time() - start_time
1643
1652
  output = self._action_agent.return_stopped_response(
1644
- self.early_stopping_method, intermediate_steps, **inputs
1653
+ self.early_stopping_method,
1654
+ intermediate_steps,
1655
+ **inputs,
1645
1656
  )
1646
1657
  return self._return(output, intermediate_steps, run_manager=run_manager)
1647
1658
 
@@ -1655,7 +1666,8 @@ class AgentExecutor(Chain):
1655
1666
  name_to_tool_map = {tool.name: tool for tool in self.tools}
1656
1667
  # We construct a mapping from each tool to a color, used for logging.
1657
1668
  color_mapping = get_color_mapping(
1658
- [tool.name for tool in self.tools], excluded_colors=["green"]
1669
+ [tool.name for tool in self.tools],
1670
+ excluded_colors=["green"],
1659
1671
  )
1660
1672
  intermediate_steps: list[tuple[AgentAction, str]] = []
1661
1673
  # Let's start tracking the number of iterations and time elapsed
@@ -1687,28 +1699,39 @@ class AgentExecutor(Chain):
1687
1699
  tool_return = self._get_tool_return(next_step_action)
1688
1700
  if tool_return is not None:
1689
1701
  return await self._areturn(
1690
- tool_return, intermediate_steps, run_manager=run_manager
1702
+ tool_return,
1703
+ intermediate_steps,
1704
+ run_manager=run_manager,
1691
1705
  )
1692
1706
 
1693
1707
  iterations += 1
1694
1708
  time_elapsed = time.time() - start_time
1695
1709
  output = self._action_agent.return_stopped_response(
1696
- self.early_stopping_method, intermediate_steps, **inputs
1710
+ self.early_stopping_method,
1711
+ intermediate_steps,
1712
+ **inputs,
1697
1713
  )
1698
1714
  return await self._areturn(
1699
- output, intermediate_steps, run_manager=run_manager
1715
+ output,
1716
+ intermediate_steps,
1717
+ run_manager=run_manager,
1700
1718
  )
1701
1719
  except (TimeoutError, asyncio.TimeoutError):
1702
1720
  # stop early when interrupted by the async timeout
1703
1721
  output = self._action_agent.return_stopped_response(
1704
- self.early_stopping_method, intermediate_steps, **inputs
1722
+ self.early_stopping_method,
1723
+ intermediate_steps,
1724
+ **inputs,
1705
1725
  )
1706
1726
  return await self._areturn(
1707
- output, intermediate_steps, run_manager=run_manager
1727
+ output,
1728
+ intermediate_steps,
1729
+ run_manager=run_manager,
1708
1730
  )
1709
1731
 
1710
1732
  def _get_tool_return(
1711
- self, next_step_output: tuple[AgentAction, str]
1733
+ self,
1734
+ next_step_output: tuple[AgentAction, str],
1712
1735
  ) -> Optional[AgentFinish]:
1713
1736
  """Check if the tool is a returning tool."""
1714
1737
  agent_action, observation = next_step_output
@@ -1717,27 +1740,30 @@ class AgentExecutor(Chain):
1717
1740
  if len(self._action_agent.return_values) > 0:
1718
1741
  return_value_key = self._action_agent.return_values[0]
1719
1742
  # Invalid tools won't be in the map, so we return False.
1720
- if agent_action.tool in name_to_tool_map:
1721
- if name_to_tool_map[agent_action.tool].return_direct:
1722
- return AgentFinish(
1723
- {return_value_key: observation},
1724
- "",
1725
- )
1743
+ if (
1744
+ agent_action.tool in name_to_tool_map
1745
+ and name_to_tool_map[agent_action.tool].return_direct
1746
+ ):
1747
+ return AgentFinish(
1748
+ {return_value_key: observation},
1749
+ "",
1750
+ )
1726
1751
  return None
1727
1752
 
1728
1753
  def _prepare_intermediate_steps(
1729
- self, intermediate_steps: list[tuple[AgentAction, str]]
1754
+ self,
1755
+ intermediate_steps: list[tuple[AgentAction, str]],
1730
1756
  ) -> list[tuple[AgentAction, str]]:
1731
1757
  if (
1732
1758
  isinstance(self.trim_intermediate_steps, int)
1733
1759
  and self.trim_intermediate_steps > 0
1734
1760
  ):
1735
1761
  return intermediate_steps[-self.trim_intermediate_steps :]
1736
- elif callable(self.trim_intermediate_steps):
1762
+ if callable(self.trim_intermediate_steps):
1737
1763
  return self.trim_intermediate_steps(intermediate_steps)
1738
- else:
1739
- return intermediate_steps
1764
+ return intermediate_steps
1740
1765
 
1766
+ @override
1741
1767
  def stream(
1742
1768
  self,
1743
1769
  input: Union[dict[str, Any], Any],
@@ -1768,6 +1794,7 @@ class AgentExecutor(Chain):
1768
1794
  )
1769
1795
  yield from iterator
1770
1796
 
1797
+ @override
1771
1798
  async def astream(
1772
1799
  self,
1773
1800
  input: Union[dict[str, Any], Any],