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/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
@@ -63,6 +64,7 @@ class BaseSingleActionAgent(BaseModel):
63
64
  return ["output"]
64
65
 
65
66
  def get_allowed_tools(self) -> Optional[list[str]]:
67
+ """Get allowed tools."""
66
68
  return None
67
69
 
68
70
  @abstractmethod
@@ -114,8 +116,8 @@ class BaseSingleActionAgent(BaseModel):
114
116
  def return_stopped_response(
115
117
  self,
116
118
  early_stopping_method: str,
117
- intermediate_steps: list[tuple[AgentAction, str]],
118
- **kwargs: Any,
119
+ intermediate_steps: list[tuple[AgentAction, str]], # noqa: ARG002
120
+ **_: Any,
119
121
  ) -> AgentFinish:
120
122
  """Return response when agent has been stopped due to max iterations.
121
123
 
@@ -123,7 +125,6 @@ class BaseSingleActionAgent(BaseModel):
123
125
  early_stopping_method: Method to use for early stopping.
124
126
  intermediate_steps: Steps the LLM has taken to date,
125
127
  along with observations.
126
- **kwargs: User inputs.
127
128
 
128
129
  Returns:
129
130
  AgentFinish: Agent finish object.
@@ -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(
@@ -167,6 +167,7 @@ class BaseSingleActionAgent(BaseModel):
167
167
  """Return Identifier of an agent type."""
168
168
  raise NotImplementedError
169
169
 
170
+ @override
170
171
  def dict(self, **kwargs: Any) -> builtins.dict:
171
172
  """Return dictionary representation of agent.
172
173
 
@@ -195,12 +196,10 @@ class BaseSingleActionAgent(BaseModel):
195
196
 
196
197
  # If working with agent executor
197
198
  agent.agent.save(file_path="path/agent.yaml")
199
+
198
200
  """
199
201
  # Convert file to Path object.
200
- if isinstance(file_path, str):
201
- save_path = Path(file_path)
202
- else:
203
- save_path = file_path
202
+ save_path = Path(file_path) if isinstance(file_path, str) else file_path
204
203
 
205
204
  directory_path = save_path.parent
206
205
  directory_path.mkdir(parents=True, exist_ok=True)
@@ -208,16 +207,18 @@ class BaseSingleActionAgent(BaseModel):
208
207
  # Fetch dictionary to save
209
208
  agent_dict = self.dict()
210
209
  if "_type" not in agent_dict:
211
- raise NotImplementedError(f"Agent {self} does not support saving")
210
+ msg = f"Agent {self} does not support saving"
211
+ raise NotImplementedError(msg)
212
212
 
213
213
  if save_path.suffix == ".json":
214
- with open(file_path, "w") as f:
214
+ with save_path.open("w") as f:
215
215
  json.dump(agent_dict, f, indent=4)
216
216
  elif save_path.suffix.endswith((".yaml", ".yml")):
217
- with open(file_path, "w") as f:
217
+ with save_path.open("w") as f:
218
218
  yaml.dump(agent_dict, f, default_flow_style=False)
219
219
  else:
220
- raise ValueError(f"{save_path} must be json or yaml")
220
+ msg = f"{save_path} must be json or yaml"
221
+ raise ValueError(msg)
221
222
 
222
223
  def tool_run_logging_kwargs(self) -> builtins.dict:
223
224
  """Return logging kwargs for tool run."""
@@ -289,8 +290,8 @@ class BaseMultiActionAgent(BaseModel):
289
290
  def return_stopped_response(
290
291
  self,
291
292
  early_stopping_method: str,
292
- intermediate_steps: list[tuple[AgentAction, str]],
293
- **kwargs: Any,
293
+ intermediate_steps: list[tuple[AgentAction, str]], # noqa: ARG002
294
+ **_: Any,
294
295
  ) -> AgentFinish:
295
296
  """Return response when agent has been stopped due to max iterations.
296
297
 
@@ -298,7 +299,6 @@ class BaseMultiActionAgent(BaseModel):
298
299
  early_stopping_method: Method to use for early stopping.
299
300
  intermediate_steps: Steps the LLM has taken to date,
300
301
  along with observations.
301
- **kwargs: User inputs.
302
302
 
303
303
  Returns:
304
304
  AgentFinish: Agent finish object.
@@ -309,23 +309,20 @@ class BaseMultiActionAgent(BaseModel):
309
309
  if early_stopping_method == "force":
310
310
  # `force` just returns a constant string
311
311
  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
- )
312
+ msg = f"Got unsupported early_stopping_method `{early_stopping_method}`"
313
+ raise ValueError(msg)
316
314
 
317
315
  @property
318
316
  def _agent_type(self) -> str:
319
317
  """Return Identifier of an agent type."""
320
318
  raise NotImplementedError
321
319
 
320
+ @override
322
321
  def dict(self, **kwargs: Any) -> builtins.dict:
323
322
  """Return dictionary representation of agent."""
324
323
  _dict = super().model_dump()
325
- try:
324
+ with contextlib.suppress(NotImplementedError):
326
325
  _dict["_type"] = str(self._agent_type)
327
- except NotImplementedError:
328
- pass
329
326
  return _dict
330
327
 
331
328
  def save(self, file_path: Union[Path, str]) -> None:
@@ -343,29 +340,29 @@ class BaseMultiActionAgent(BaseModel):
343
340
 
344
341
  # If working with agent executor
345
342
  agent.agent.save(file_path="path/agent.yaml")
343
+
346
344
  """
347
345
  # Convert file to Path object.
348
- if isinstance(file_path, str):
349
- save_path = Path(file_path)
350
- else:
351
- save_path = file_path
346
+ save_path = Path(file_path) if isinstance(file_path, str) else file_path
352
347
 
353
348
  # Fetch dictionary to save
354
349
  agent_dict = self.dict()
355
350
  if "_type" not in agent_dict:
356
- raise NotImplementedError(f"Agent {self} does not support saving.")
351
+ msg = f"Agent {self} does not support saving."
352
+ raise NotImplementedError(msg)
357
353
 
358
354
  directory_path = save_path.parent
359
355
  directory_path.mkdir(parents=True, exist_ok=True)
360
356
 
361
357
  if save_path.suffix == ".json":
362
- with open(file_path, "w") as f:
358
+ with save_path.open("w") as f:
363
359
  json.dump(agent_dict, f, indent=4)
364
360
  elif save_path.suffix.endswith((".yaml", ".yml")):
365
- with open(file_path, "w") as f:
361
+ with save_path.open("w") as f:
366
362
  yaml.dump(agent_dict, f, default_flow_style=False)
367
363
  else:
368
- raise ValueError(f"{save_path} must be json or yaml")
364
+ msg = f"{save_path} must be json or yaml"
365
+ raise ValueError(msg)
369
366
 
370
367
  def tool_run_logging_kwargs(self) -> builtins.dict:
371
368
  """Return logging kwargs for tool run."""
@@ -382,7 +379,7 @@ class AgentOutputParser(BaseOutputParser[Union[AgentAction, AgentFinish]]):
382
379
 
383
380
 
384
381
  class MultiActionAgentOutputParser(
385
- BaseOutputParser[Union[list[AgentAction], AgentFinish]]
382
+ BaseOutputParser[Union[list[AgentAction], AgentFinish]],
386
383
  ):
387
384
  """Base class for parsing agent output into agent actions/finish.
388
385
 
@@ -449,7 +446,7 @@ class RunnableAgent(BaseSingleActionAgent):
449
446
  Returns:
450
447
  Action specifying what tool to use.
451
448
  """
452
- inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
449
+ inputs = {**kwargs, "intermediate_steps": intermediate_steps}
453
450
  final_output: Any = None
454
451
  if self.stream_runnable:
455
452
  # Use streaming to make sure that the underlying LLM is invoked in a
@@ -488,7 +485,7 @@ class RunnableAgent(BaseSingleActionAgent):
488
485
  Returns:
489
486
  Action specifying what tool to use.
490
487
  """
491
- inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
488
+ inputs = {**kwargs, "intermediate_steps": intermediate_steps}
492
489
  final_output: Any = None
493
490
  if self.stream_runnable:
494
491
  # Use streaming to make sure that the underlying LLM is invoked in a
@@ -498,7 +495,8 @@ class RunnableAgent(BaseSingleActionAgent):
498
495
  # Because the response from the plan is not a generator, we need to
499
496
  # accumulate the output into final output and return that.
500
497
  async for chunk in self.runnable.astream(
501
- inputs, config={"callbacks": callbacks}
498
+ inputs,
499
+ config={"callbacks": callbacks},
502
500
  ):
503
501
  if final_output is None:
504
502
  final_output = chunk
@@ -506,7 +504,8 @@ class RunnableAgent(BaseSingleActionAgent):
506
504
  final_output += chunk
507
505
  else:
508
506
  final_output = await self.runnable.ainvoke(
509
- inputs, config={"callbacks": callbacks}
507
+ inputs,
508
+ config={"callbacks": callbacks},
510
509
  )
511
510
  return final_output
512
511
 
@@ -565,7 +564,7 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
565
564
  Returns:
566
565
  Action specifying what tool to use.
567
566
  """
568
- inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
567
+ inputs = {**kwargs, "intermediate_steps": intermediate_steps}
569
568
  final_output: Any = None
570
569
  if self.stream_runnable:
571
570
  # Use streaming to make sure that the underlying LLM is invoked in a
@@ -604,7 +603,7 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
604
603
  Returns:
605
604
  Action specifying what tool to use.
606
605
  """
607
- inputs = {**kwargs, **{"intermediate_steps": intermediate_steps}}
606
+ inputs = {**kwargs, "intermediate_steps": intermediate_steps}
608
607
  final_output: Any = None
609
608
  if self.stream_runnable:
610
609
  # Use streaming to make sure that the underlying LLM is invoked in a
@@ -614,7 +613,8 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
614
613
  # Because the response from the plan is not a generator, we need to
615
614
  # accumulate the output into final output and return that.
616
615
  async for chunk in self.runnable.astream(
617
- inputs, config={"callbacks": callbacks}
616
+ inputs,
617
+ config={"callbacks": callbacks},
618
618
  ):
619
619
  if final_output is None:
620
620
  final_output = chunk
@@ -622,7 +622,8 @@ class RunnableMultiActionAgent(BaseMultiActionAgent):
622
622
  final_output += chunk
623
623
  else:
624
624
  final_output = await self.runnable.ainvoke(
625
- inputs, config={"callbacks": callbacks}
625
+ inputs,
626
+ config={"callbacks": callbacks},
626
627
  )
627
628
 
628
629
  return final_output
@@ -652,6 +653,7 @@ class LLMSingleActionAgent(BaseSingleActionAgent):
652
653
  """
653
654
  return list(set(self.llm_chain.input_keys) - {"intermediate_steps"})
654
655
 
656
+ @override
655
657
  def dict(self, **kwargs: Any) -> builtins.dict:
656
658
  """Return dictionary representation of agent."""
657
659
  _dict = super().dict()
@@ -736,6 +738,7 @@ class Agent(BaseSingleActionAgent):
736
738
  allowed_tools: Optional[list[str]] = None
737
739
  """Allowed tools for the agent. If None, all tools are allowed."""
738
740
 
741
+ @override
739
742
  def dict(self, **kwargs: Any) -> builtins.dict:
740
743
  """Return dictionary representation of agent."""
741
744
  _dict = super().dict()
@@ -751,17 +754,6 @@ class Agent(BaseSingleActionAgent):
751
754
  """Return values of the agent."""
752
755
  return ["output"]
753
756
 
754
- def _fix_text(self, text: str) -> str:
755
- """Fix the text.
756
-
757
- Args:
758
- text: Text to fix.
759
-
760
- Returns:
761
- str: Fixed text.
762
- """
763
- raise ValueError("fix_text not implemented for this agent.")
764
-
765
757
  @property
766
758
  def _stop(self) -> list[str]:
767
759
  return [
@@ -770,7 +762,8 @@ class Agent(BaseSingleActionAgent):
770
762
  ]
771
763
 
772
764
  def _construct_scratchpad(
773
- self, intermediate_steps: list[tuple[AgentAction, str]]
765
+ self,
766
+ intermediate_steps: list[tuple[AgentAction, str]],
774
767
  ) -> Union[str, list[BaseMessage]]:
775
768
  """Construct the scratchpad that lets the agent continue its thought process."""
776
769
  thoughts = ""
@@ -819,11 +812,12 @@ class Agent(BaseSingleActionAgent):
819
812
  """
820
813
  full_inputs = self.get_full_inputs(intermediate_steps, **kwargs)
821
814
  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
815
+ return await self.output_parser.aparse(full_output)
824
816
 
825
817
  def get_full_inputs(
826
- self, intermediate_steps: list[tuple[AgentAction, str]], **kwargs: Any
818
+ self,
819
+ intermediate_steps: list[tuple[AgentAction, str]],
820
+ **kwargs: Any,
827
821
  ) -> builtins.dict[str, Any]:
828
822
  """Create the full inputs for the LLMChain from intermediate steps.
829
823
 
@@ -837,8 +831,7 @@ class Agent(BaseSingleActionAgent):
837
831
  """
838
832
  thoughts = self._construct_scratchpad(intermediate_steps)
839
833
  new_inputs = {"agent_scratchpad": thoughts, "stop": self._stop}
840
- full_inputs = {**kwargs, **new_inputs}
841
- return full_inputs
834
+ return {**kwargs, **new_inputs}
842
835
 
843
836
  @property
844
837
  def input_keys(self) -> list[str]:
@@ -866,7 +859,7 @@ class Agent(BaseSingleActionAgent):
866
859
  if "agent_scratchpad" not in prompt.input_variables:
867
860
  logger.warning(
868
861
  "`agent_scratchpad` should be a variable in prompt.input_variables."
869
- " Did not find it, so adding it at the end."
862
+ " Did not find it, so adding it at the end.",
870
863
  )
871
864
  prompt.input_variables.append("agent_scratchpad")
872
865
  if isinstance(prompt, PromptTemplate):
@@ -874,7 +867,8 @@ class Agent(BaseSingleActionAgent):
874
867
  elif isinstance(prompt, FewShotPromptTemplate):
875
868
  prompt.suffix += "\n{agent_scratchpad}"
876
869
  else:
877
- raise ValueError(f"Got unexpected prompt type {type(prompt)}")
870
+ msg = f"Got unexpected prompt type {type(prompt)}"
871
+ raise ValueError(msg)
878
872
  return self
879
873
 
880
874
  @property
@@ -907,8 +901,6 @@ class Agent(BaseSingleActionAgent):
907
901
  tools: Tools to use.
908
902
  """
909
903
 
910
- pass
911
-
912
904
  @classmethod
913
905
  @abstractmethod
914
906
  def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
@@ -973,9 +965,10 @@ class Agent(BaseSingleActionAgent):
973
965
  if early_stopping_method == "force":
974
966
  # `force` just returns a constant string
975
967
  return AgentFinish(
976
- {"output": "Agent stopped due to iteration limit or time limit."}, ""
968
+ {"output": "Agent stopped due to iteration limit or time limit."},
969
+ "",
977
970
  )
978
- elif early_stopping_method == "generate":
971
+ if early_stopping_method == "generate":
979
972
  # Generate does one final forward pass
980
973
  thoughts = ""
981
974
  for action, observation in intermediate_steps:
@@ -995,15 +988,14 @@ class Agent(BaseSingleActionAgent):
995
988
  if isinstance(parsed_output, AgentFinish):
996
989
  # If we can extract, we send the correct stuff
997
990
  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
- )
991
+ # If we can extract, but the tool is not the final tool,
992
+ # we just return the full output
993
+ return AgentFinish({"output": full_output}, full_output)
994
+ msg = (
995
+ "early_stopping_method should be one of `force` or `generate`, "
996
+ f"got {early_stopping_method}"
997
+ )
998
+ raise ValueError(msg)
1007
999
 
1008
1000
  def tool_run_logging_kwargs(self) -> builtins.dict:
1009
1001
  """Return logging kwargs for tool run."""
@@ -1021,6 +1013,7 @@ class ExceptionTool(BaseTool):
1021
1013
  description: str = "Exception tool"
1022
1014
  """Description of the tool."""
1023
1015
 
1016
+ @override
1024
1017
  def _run(
1025
1018
  self,
1026
1019
  query: str,
@@ -1028,6 +1021,7 @@ class ExceptionTool(BaseTool):
1028
1021
  ) -> str:
1029
1022
  return query
1030
1023
 
1024
+ @override
1031
1025
  async def _arun(
1032
1026
  self,
1033
1027
  query: str,
@@ -1082,7 +1076,8 @@ class AgentExecutor(Chain):
1082
1076
  as an observation.
1083
1077
  """
1084
1078
  trim_intermediate_steps: Union[
1085
- int, Callable[[list[tuple[AgentAction, str]]], list[tuple[AgentAction, str]]]
1079
+ int,
1080
+ Callable[[list[tuple[AgentAction, str]]], list[tuple[AgentAction, str]]],
1086
1081
  ] = -1
1087
1082
  """How to trim the intermediate steps before returning them.
1088
1083
  Defaults to -1, which means no trimming.
@@ -1130,12 +1125,14 @@ class AgentExecutor(Chain):
1130
1125
  agent = self.agent
1131
1126
  tools = self.tools
1132
1127
  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
- )
1128
+ if allowed_tools is not None and set(allowed_tools) != {
1129
+ tool.name for tool in tools
1130
+ }:
1131
+ msg = (
1132
+ f"Allowed tools ({allowed_tools}) different than "
1133
+ f"provided tools ({[tool.name for tool in tools]})"
1134
+ )
1135
+ raise ValueError(msg)
1139
1136
  return self
1140
1137
 
1141
1138
  @model_validator(mode="before")
@@ -1161,11 +1158,13 @@ class AgentExecutor(Chain):
1161
1158
  stream_runnable = values.pop("stream_runnable", True)
1162
1159
  if multi_action:
1163
1160
  values["agent"] = RunnableMultiActionAgent(
1164
- runnable=agent, stream_runnable=stream_runnable
1161
+ runnable=agent,
1162
+ stream_runnable=stream_runnable,
1165
1163
  )
1166
1164
  else:
1167
1165
  values["agent"] = RunnableAgent(
1168
- runnable=agent, stream_runnable=stream_runnable
1166
+ runnable=agent,
1167
+ stream_runnable=stream_runnable,
1169
1168
  )
1170
1169
  return values
1171
1170
 
@@ -1180,10 +1179,10 @@ class AgentExecutor(Chain):
1180
1179
  to reflect the changes made in the root_validator.
1181
1180
  """
1182
1181
  if isinstance(self.agent, Runnable):
1183
- return cast(RunnableAgentType, self.agent)
1184
- else:
1185
- return self.agent
1182
+ return cast("RunnableAgentType", self.agent)
1183
+ return self.agent
1186
1184
 
1185
+ @override
1187
1186
  def save(self, file_path: Union[Path, str]) -> None:
1188
1187
  """Raise error - saving not supported for Agent Executors.
1189
1188
 
@@ -1193,11 +1192,12 @@ class AgentExecutor(Chain):
1193
1192
  Raises:
1194
1193
  ValueError: Saving not supported for agent executors.
1195
1194
  """
1196
- raise ValueError(
1195
+ msg = (
1197
1196
  "Saving not supported for agent executors. "
1198
1197
  "If you are trying to save the agent, please use the "
1199
1198
  "`.save_agent(...)`"
1200
1199
  )
1200
+ raise ValueError(msg)
1201
1201
 
1202
1202
  def save_agent(self, file_path: Union[Path, str]) -> None:
1203
1203
  """Save the underlying agent.
@@ -1213,7 +1213,7 @@ class AgentExecutor(Chain):
1213
1213
  callbacks: Callbacks = None,
1214
1214
  *,
1215
1215
  include_run_info: bool = False,
1216
- async_: bool = False, # arg kept for backwards compat, but ignored
1216
+ async_: bool = False, # noqa: ARG002 arg kept for backwards compat, but ignored
1217
1217
  ) -> AgentExecutorIterator:
1218
1218
  """Enables iteration over steps taken to reach final output.
1219
1219
 
@@ -1249,9 +1249,8 @@ class AgentExecutor(Chain):
1249
1249
  :meta private:
1250
1250
  """
1251
1251
  if self.return_intermediate_steps:
1252
- return self._action_agent.return_values + ["intermediate_steps"]
1253
- else:
1254
- return self._action_agent.return_values
1252
+ return [*self._action_agent.return_values, "intermediate_steps"]
1253
+ return self._action_agent.return_values
1255
1254
 
1256
1255
  def lookup_tool(self, name: str) -> BaseTool:
1257
1256
  """Lookup tool by name.
@@ -1267,13 +1266,7 @@ class AgentExecutor(Chain):
1267
1266
  def _should_continue(self, iterations: int, time_elapsed: float) -> bool:
1268
1267
  if self.max_iterations is not None and iterations >= self.max_iterations:
1269
1268
  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
1269
+ return self.max_execution_time is None or time_elapsed < self.max_execution_time
1277
1270
 
1278
1271
  def _return(
1279
1272
  self,
@@ -1296,7 +1289,9 @@ class AgentExecutor(Chain):
1296
1289
  ) -> dict[str, Any]:
1297
1290
  if run_manager:
1298
1291
  await run_manager.on_agent_finish(
1299
- output, color="green", verbose=self.verbose
1292
+ output,
1293
+ color="green",
1294
+ verbose=self.verbose,
1300
1295
  )
1301
1296
  final_output = output.return_values
1302
1297
  if self.return_intermediate_steps:
@@ -1304,15 +1299,15 @@ class AgentExecutor(Chain):
1304
1299
  return final_output
1305
1300
 
1306
1301
  def _consume_next_step(
1307
- self, values: NextStepOutput
1302
+ self,
1303
+ values: NextStepOutput,
1308
1304
  ) -> Union[AgentFinish, list[tuple[AgentAction, str]]]:
1309
1305
  if isinstance(values[-1], AgentFinish):
1310
- assert len(values) == 1
1306
+ if len(values) != 1:
1307
+ msg = "Expected a single AgentFinish output, but got multiple values."
1308
+ raise ValueError(msg)
1311
1309
  return values[-1]
1312
- else:
1313
- return [
1314
- (a.action, a.observation) for a in values if isinstance(a, AgentStep)
1315
- ]
1310
+ return [(a.action, a.observation) for a in values if isinstance(a, AgentStep)]
1316
1311
 
1317
1312
  def _take_next_step(
1318
1313
  self,
@@ -1323,16 +1318,15 @@ class AgentExecutor(Chain):
1323
1318
  run_manager: Optional[CallbackManagerForChainRun] = None,
1324
1319
  ) -> Union[AgentFinish, list[tuple[AgentAction, str]]]:
1325
1320
  return self._consume_next_step(
1326
- [
1327
- a
1328
- for a in self._iter_next_step(
1321
+ list(
1322
+ self._iter_next_step(
1329
1323
  name_to_tool_map,
1330
1324
  color_mapping,
1331
1325
  inputs,
1332
1326
  intermediate_steps,
1333
1327
  run_manager,
1334
- )
1335
- ]
1328
+ ),
1329
+ ),
1336
1330
  )
1337
1331
 
1338
1332
  def _iter_next_step(
@@ -1362,12 +1356,13 @@ class AgentExecutor(Chain):
1362
1356
  else:
1363
1357
  raise_error = False
1364
1358
  if raise_error:
1365
- raise ValueError(
1359
+ msg = (
1366
1360
  "An output parsing error occurred. "
1367
1361
  "In order to pass this error back to the agent and have it try "
1368
1362
  "again, pass `handle_parsing_errors=True` to the AgentExecutor. "
1369
- f"This is the error: {str(e)}"
1363
+ f"This is the error: {e!s}"
1370
1364
  )
1365
+ raise ValueError(msg) from e
1371
1366
  text = str(e)
1372
1367
  if isinstance(self.handle_parsing_errors, bool):
1373
1368
  if e.send_to_llm:
@@ -1380,7 +1375,8 @@ class AgentExecutor(Chain):
1380
1375
  elif callable(self.handle_parsing_errors):
1381
1376
  observation = self.handle_parsing_errors(e)
1382
1377
  else:
1383
- raise ValueError("Got unexpected type of `handle_parsing_errors`")
1378
+ msg = "Got unexpected type of `handle_parsing_errors`"
1379
+ raise ValueError(msg) from e # noqa: TRY004
1384
1380
  output = AgentAction("_Exception", observation, text)
1385
1381
  if run_manager:
1386
1382
  run_manager.on_agent_action(output, color="green")
@@ -1401,15 +1397,15 @@ class AgentExecutor(Chain):
1401
1397
  return
1402
1398
 
1403
1399
  actions: list[AgentAction]
1404
- if isinstance(output, AgentAction):
1405
- actions = [output]
1406
- else:
1407
- actions = output
1400
+ actions = [output] if isinstance(output, AgentAction) else output
1408
1401
  for agent_action in actions:
1409
1402
  yield agent_action
1410
1403
  for agent_action in actions:
1411
1404
  yield self._perform_agent_action(
1412
- name_to_tool_map, color_mapping, agent_action, run_manager
1405
+ name_to_tool_map,
1406
+ color_mapping,
1407
+ agent_action,
1408
+ run_manager,
1413
1409
  )
1414
1410
 
1415
1411
  def _perform_agent_action(
@@ -1469,7 +1465,7 @@ class AgentExecutor(Chain):
1469
1465
  intermediate_steps,
1470
1466
  run_manager,
1471
1467
  )
1472
- ]
1468
+ ],
1473
1469
  )
1474
1470
 
1475
1471
  async def _aiter_next_step(
@@ -1499,12 +1495,13 @@ class AgentExecutor(Chain):
1499
1495
  else:
1500
1496
  raise_error = False
1501
1497
  if raise_error:
1502
- raise ValueError(
1498
+ msg = (
1503
1499
  "An output parsing error occurred. "
1504
1500
  "In order to pass this error back to the agent and have it try "
1505
1501
  "again, pass `handle_parsing_errors=True` to the AgentExecutor. "
1506
- f"This is the error: {str(e)}"
1502
+ f"This is the error: {e!s}"
1507
1503
  )
1504
+ raise ValueError(msg) from e
1508
1505
  text = str(e)
1509
1506
  if isinstance(self.handle_parsing_errors, bool):
1510
1507
  if e.send_to_llm:
@@ -1517,7 +1514,8 @@ class AgentExecutor(Chain):
1517
1514
  elif callable(self.handle_parsing_errors):
1518
1515
  observation = self.handle_parsing_errors(e)
1519
1516
  else:
1520
- raise ValueError("Got unexpected type of `handle_parsing_errors`")
1517
+ msg = "Got unexpected type of `handle_parsing_errors`"
1518
+ raise ValueError(msg) from e # noqa: TRY004
1521
1519
  output = AgentAction("_Exception", observation, text)
1522
1520
  tool_run_kwargs = self._action_agent.tool_run_logging_kwargs()
1523
1521
  observation = await ExceptionTool().arun(
@@ -1536,10 +1534,7 @@ class AgentExecutor(Chain):
1536
1534
  return
1537
1535
 
1538
1536
  actions: list[AgentAction]
1539
- if isinstance(output, AgentAction):
1540
- actions = [output]
1541
- else:
1542
- actions = output
1537
+ actions = [output] if isinstance(output, AgentAction) else output
1543
1538
  for agent_action in actions:
1544
1539
  yield agent_action
1545
1540
 
@@ -1547,7 +1542,10 @@ class AgentExecutor(Chain):
1547
1542
  result = await asyncio.gather(
1548
1543
  *[
1549
1544
  self._aperform_agent_action(
1550
- name_to_tool_map, color_mapping, agent_action, run_manager
1545
+ name_to_tool_map,
1546
+ color_mapping,
1547
+ agent_action,
1548
+ run_manager,
1551
1549
  )
1552
1550
  for agent_action in actions
1553
1551
  ],
@@ -1566,7 +1564,9 @@ class AgentExecutor(Chain):
1566
1564
  ) -> AgentStep:
1567
1565
  if run_manager:
1568
1566
  await run_manager.on_agent_action(
1569
- agent_action, verbose=self.verbose, color="green"
1567
+ agent_action,
1568
+ verbose=self.verbose,
1569
+ color="green",
1570
1570
  )
1571
1571
  # Otherwise we lookup the tool
1572
1572
  if agent_action.tool in name_to_tool_map:
@@ -1608,7 +1608,8 @@ class AgentExecutor(Chain):
1608
1608
  name_to_tool_map = {tool.name: tool for tool in self.tools}
1609
1609
  # We construct a mapping from each tool to a color, used for logging.
1610
1610
  color_mapping = get_color_mapping(
1611
- [tool.name for tool in self.tools], excluded_colors=["green", "red"]
1611
+ [tool.name for tool in self.tools],
1612
+ excluded_colors=["green", "red"],
1612
1613
  )
1613
1614
  intermediate_steps: list[tuple[AgentAction, str]] = []
1614
1615
  # Let's start tracking the number of iterations and time elapsed
@@ -1626,7 +1627,9 @@ class AgentExecutor(Chain):
1626
1627
  )
1627
1628
  if isinstance(next_step_output, AgentFinish):
1628
1629
  return self._return(
1629
- next_step_output, intermediate_steps, run_manager=run_manager
1630
+ next_step_output,
1631
+ intermediate_steps,
1632
+ run_manager=run_manager,
1630
1633
  )
1631
1634
 
1632
1635
  intermediate_steps.extend(next_step_output)
@@ -1636,12 +1639,16 @@ class AgentExecutor(Chain):
1636
1639
  tool_return = self._get_tool_return(next_step_action)
1637
1640
  if tool_return is not None:
1638
1641
  return self._return(
1639
- tool_return, intermediate_steps, run_manager=run_manager
1642
+ tool_return,
1643
+ intermediate_steps,
1644
+ run_manager=run_manager,
1640
1645
  )
1641
1646
  iterations += 1
1642
1647
  time_elapsed = time.time() - start_time
1643
1648
  output = self._action_agent.return_stopped_response(
1644
- self.early_stopping_method, intermediate_steps, **inputs
1649
+ self.early_stopping_method,
1650
+ intermediate_steps,
1651
+ **inputs,
1645
1652
  )
1646
1653
  return self._return(output, intermediate_steps, run_manager=run_manager)
1647
1654
 
@@ -1655,7 +1662,8 @@ class AgentExecutor(Chain):
1655
1662
  name_to_tool_map = {tool.name: tool for tool in self.tools}
1656
1663
  # We construct a mapping from each tool to a color, used for logging.
1657
1664
  color_mapping = get_color_mapping(
1658
- [tool.name for tool in self.tools], excluded_colors=["green"]
1665
+ [tool.name for tool in self.tools],
1666
+ excluded_colors=["green"],
1659
1667
  )
1660
1668
  intermediate_steps: list[tuple[AgentAction, str]] = []
1661
1669
  # Let's start tracking the number of iterations and time elapsed
@@ -1687,28 +1695,39 @@ class AgentExecutor(Chain):
1687
1695
  tool_return = self._get_tool_return(next_step_action)
1688
1696
  if tool_return is not None:
1689
1697
  return await self._areturn(
1690
- tool_return, intermediate_steps, run_manager=run_manager
1698
+ tool_return,
1699
+ intermediate_steps,
1700
+ run_manager=run_manager,
1691
1701
  )
1692
1702
 
1693
1703
  iterations += 1
1694
1704
  time_elapsed = time.time() - start_time
1695
1705
  output = self._action_agent.return_stopped_response(
1696
- self.early_stopping_method, intermediate_steps, **inputs
1706
+ self.early_stopping_method,
1707
+ intermediate_steps,
1708
+ **inputs,
1697
1709
  )
1698
1710
  return await self._areturn(
1699
- output, intermediate_steps, run_manager=run_manager
1711
+ output,
1712
+ intermediate_steps,
1713
+ run_manager=run_manager,
1700
1714
  )
1701
1715
  except (TimeoutError, asyncio.TimeoutError):
1702
1716
  # stop early when interrupted by the async timeout
1703
1717
  output = self._action_agent.return_stopped_response(
1704
- self.early_stopping_method, intermediate_steps, **inputs
1718
+ self.early_stopping_method,
1719
+ intermediate_steps,
1720
+ **inputs,
1705
1721
  )
1706
1722
  return await self._areturn(
1707
- output, intermediate_steps, run_manager=run_manager
1723
+ output,
1724
+ intermediate_steps,
1725
+ run_manager=run_manager,
1708
1726
  )
1709
1727
 
1710
1728
  def _get_tool_return(
1711
- self, next_step_output: tuple[AgentAction, str]
1729
+ self,
1730
+ next_step_output: tuple[AgentAction, str],
1712
1731
  ) -> Optional[AgentFinish]:
1713
1732
  """Check if the tool is a returning tool."""
1714
1733
  agent_action, observation = next_step_output
@@ -1717,27 +1736,30 @@ class AgentExecutor(Chain):
1717
1736
  if len(self._action_agent.return_values) > 0:
1718
1737
  return_value_key = self._action_agent.return_values[0]
1719
1738
  # 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
- )
1739
+ if (
1740
+ agent_action.tool in name_to_tool_map
1741
+ and name_to_tool_map[agent_action.tool].return_direct
1742
+ ):
1743
+ return AgentFinish(
1744
+ {return_value_key: observation},
1745
+ "",
1746
+ )
1726
1747
  return None
1727
1748
 
1728
1749
  def _prepare_intermediate_steps(
1729
- self, intermediate_steps: list[tuple[AgentAction, str]]
1750
+ self,
1751
+ intermediate_steps: list[tuple[AgentAction, str]],
1730
1752
  ) -> list[tuple[AgentAction, str]]:
1731
1753
  if (
1732
1754
  isinstance(self.trim_intermediate_steps, int)
1733
1755
  and self.trim_intermediate_steps > 0
1734
1756
  ):
1735
1757
  return intermediate_steps[-self.trim_intermediate_steps :]
1736
- elif callable(self.trim_intermediate_steps):
1758
+ if callable(self.trim_intermediate_steps):
1737
1759
  return self.trim_intermediate_steps(intermediate_steps)
1738
- else:
1739
- return intermediate_steps
1760
+ return intermediate_steps
1740
1761
 
1762
+ @override
1741
1763
  def stream(
1742
1764
  self,
1743
1765
  input: Union[dict[str, Any], Any],
@@ -1768,6 +1790,7 @@ class AgentExecutor(Chain):
1768
1790
  )
1769
1791
  yield from iterator
1770
1792
 
1793
+ @override
1771
1794
  async def astream(
1772
1795
  self,
1773
1796
  input: Union[dict[str, Any], Any],