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
@@ -1,5 +1,6 @@
1
1
  """Load agent."""
2
2
 
3
+ import contextlib
3
4
  from collections.abc import Sequence
4
5
  from typing import Any, Optional
5
6
 
@@ -59,35 +60,42 @@ def initialize_agent(
59
60
  if agent is None and agent_path is None:
60
61
  agent = AgentType.ZERO_SHOT_REACT_DESCRIPTION
61
62
  if agent is not None and agent_path is not None:
62
- raise ValueError(
63
+ msg = (
63
64
  "Both `agent` and `agent_path` are specified, "
64
65
  "but at most only one should be."
65
66
  )
67
+ raise ValueError(msg)
66
68
  if agent is not None:
67
69
  if agent not in AGENT_TO_CLASS:
68
- raise ValueError(
70
+ msg = (
69
71
  f"Got unknown agent type: {agent}. "
70
72
  f"Valid types are: {AGENT_TO_CLASS.keys()}."
71
73
  )
74
+ raise ValueError(msg)
72
75
  tags_.append(agent.value if isinstance(agent, AgentType) else agent)
73
76
  agent_cls = AGENT_TO_CLASS[agent]
74
77
  agent_kwargs = agent_kwargs or {}
75
78
  agent_obj = agent_cls.from_llm_and_tools(
76
- llm, tools, callback_manager=callback_manager, **agent_kwargs
79
+ llm,
80
+ tools,
81
+ callback_manager=callback_manager,
82
+ **agent_kwargs,
77
83
  )
78
84
  elif agent_path is not None:
79
85
  agent_obj = load_agent(
80
- agent_path, llm=llm, tools=tools, callback_manager=callback_manager
86
+ agent_path,
87
+ llm=llm,
88
+ tools=tools,
89
+ callback_manager=callback_manager,
81
90
  )
82
- try:
91
+ with contextlib.suppress(NotImplementedError):
83
92
  # TODO: Add tags from the serialized object directly.
84
- tags_.append(agent_obj._agent_type)
85
- except NotImplementedError:
86
- pass
93
+ tags_.append(agent_obj._agent_type) # noqa: SLF001
87
94
  else:
88
- raise ValueError(
95
+ msg = (
89
96
  "Somehow both `agent` and `agent_path` are None, this should never happen."
90
97
  )
98
+ raise ValueError(msg)
91
99
  return AgentExecutor.from_agent_and_tools(
92
100
  agent=agent_obj,
93
101
  tools=tools,
@@ -16,7 +16,7 @@ def create_json_chat_agent(
16
16
  llm: BaseLanguageModel,
17
17
  tools: Sequence[BaseTool],
18
18
  prompt: ChatPromptTemplate,
19
- stop_sequence: Union[bool, list[str]] = True,
19
+ stop_sequence: Union[bool, list[str]] = True, # noqa: FBT001,FBT002
20
20
  tools_renderer: ToolsRenderer = render_text_description,
21
21
  template_tool_response: str = TEMPLATE_TOOL_RESPONSE,
22
22
  ) -> Runnable:
@@ -27,10 +27,10 @@ def create_json_chat_agent(
27
27
  tools: Tools this agent has access to.
28
28
  prompt: The prompt to use. See Prompt section below for more.
29
29
  stop_sequence: bool or list of str.
30
- If True, adds a stop token of "Observation:" to avoid hallucinates.
30
+ If True, adds a stop token of "Observation:" to avoid hallucinates.
31
31
  If False, does not add a stop token.
32
32
  If a list of str, uses the provided list as the stop tokens.
33
-
33
+
34
34
  Default is True. You may to set this to False if the LLM you are using
35
35
  does not support stop sequences.
36
36
  tools_renderer: This controls how the tools are converted into a string and
@@ -43,7 +43,7 @@ def create_json_chat_agent(
43
43
  A Runnable sequence representing an agent. It takes as input all the same input
44
44
  variables as the prompt passed in does. It returns as output either an
45
45
  AgentAction or AgentFinish.
46
-
46
+
47
47
  Raises:
48
48
  ValueError: If the prompt is missing required variables.
49
49
  ValueError: If the template_tool_response is missing
@@ -79,18 +79,18 @@ def create_json_chat_agent(
79
79
  )
80
80
 
81
81
  Prompt:
82
-
82
+
83
83
  The prompt must have input keys:
84
84
  * `tools`: contains descriptions and arguments for each tool.
85
85
  * `tool_names`: contains all tool names.
86
86
  * `agent_scratchpad`: must be a MessagesPlaceholder. Contains previous agent actions and tool outputs as messages.
87
-
87
+
88
88
  Here's an example:
89
89
 
90
90
  .. code-block:: python
91
91
 
92
92
  from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
93
-
93
+
94
94
  system = '''Assistant is a large language model trained by OpenAI.
95
95
 
96
96
  Assistant is designed to be able to assist with a wide range of tasks, from answering \
@@ -110,7 +110,7 @@ def create_json_chat_agent(
110
110
  and provide valuable insights and information on a wide range of topics. Whether \
111
111
  you need help with a specific question or just want to have a conversation about \
112
112
  a particular topic, Assistant is here to assist.'''
113
-
113
+
114
114
  human = '''TOOLS
115
115
  ------
116
116
  Assistant can ask the user to use tools to look up information that may be helpful in \
@@ -151,7 +151,7 @@ def create_json_chat_agent(
151
151
  blob with a single action, and NOTHING else):
152
152
 
153
153
  {input}'''
154
-
154
+
155
155
  prompt = ChatPromptTemplate.from_messages(
156
156
  [
157
157
  ("system", system),
@@ -160,17 +160,18 @@ def create_json_chat_agent(
160
160
  MessagesPlaceholder("agent_scratchpad"),
161
161
  ]
162
162
  )
163
+
163
164
  """ # noqa: E501
164
165
  missing_vars = {"tools", "tool_names", "agent_scratchpad"}.difference(
165
- prompt.input_variables + list(prompt.partial_variables)
166
+ prompt.input_variables + list(prompt.partial_variables),
166
167
  )
167
168
  if missing_vars:
168
- raise ValueError(f"Prompt missing required variables: {missing_vars}")
169
+ msg = f"Prompt missing required variables: {missing_vars}"
170
+ raise ValueError(msg)
169
171
 
170
172
  if "{observation}" not in template_tool_response:
171
- raise ValueError(
172
- "Template tool response missing required variable 'observation'"
173
- )
173
+ msg = "Template tool response missing required variable 'observation'"
174
+ raise ValueError(msg)
174
175
 
175
176
  prompt = prompt.partial(
176
177
  tools=tools_renderer(list(tools)),
@@ -182,14 +183,14 @@ def create_json_chat_agent(
182
183
  else:
183
184
  llm_to_use = llm
184
185
 
185
- agent = (
186
+ return (
186
187
  RunnablePassthrough.assign(
187
188
  agent_scratchpad=lambda x: format_log_to_messages(
188
- x["intermediate_steps"], template_tool_response=template_tool_response
189
- )
189
+ x["intermediate_steps"],
190
+ template_tool_response=template_tool_response,
191
+ ),
190
192
  )
191
193
  | prompt
192
194
  | llm_to_use
193
195
  | JSONAgentOutputParser()
194
196
  )
195
- return agent
@@ -1,9 +1,8 @@
1
- # flake8: noqa
2
- TEMPLATE_TOOL_RESPONSE = """TOOL RESPONSE:
1
+ TEMPLATE_TOOL_RESPONSE = """TOOL RESPONSE:
3
2
  ---------------------
4
3
  {observation}
5
4
 
6
5
  USER'S INPUT
7
6
  --------------------
8
7
 
9
- Okay, so what is the response to my last comment? If using information obtained from the tools you must mention it explicitly without mentioning the tool names - I have forgotten all TOOL RESPONSES! Remember to respond with a markdown code snippet of a json blob with a single action, and NOTHING else - even if you just want to respond to the user. Do NOT respond with anything except a JSON snippet no matter what!"""
8
+ Okay, so what is the response to my last comment? If using information obtained from the tools you must mention it explicitly without mentioning the tool names - I have forgotten all TOOL RESPONSES! Remember to respond with a markdown code snippet of a json blob with a single action, and NOTHING else - even if you just want to respond to the user. Do NOT respond with anything except a JSON snippet no matter what!""" # noqa: E501
@@ -3,7 +3,8 @@ from typing import Any
3
3
  from langchain._api import create_importer
4
4
 
5
5
  _importer = create_importer(
6
- __package__, fallback_module="langchain_community.agent_toolkits.load_tools"
6
+ __package__,
7
+ fallback_module="langchain_community.agent_toolkits.load_tools",
7
8
  )
8
9
 
9
10
 
@@ -20,11 +20,15 @@ URL_BASE = "https://raw.githubusercontent.com/hwchase17/langchain-hub/master/age
20
20
 
21
21
 
22
22
  def _load_agent_from_tools(
23
- config: dict, llm: BaseLanguageModel, tools: list[Tool], **kwargs: Any
23
+ config: dict,
24
+ llm: BaseLanguageModel,
25
+ tools: list[Tool],
26
+ **kwargs: Any,
24
27
  ) -> Union[BaseSingleActionAgent, BaseMultiActionAgent]:
25
28
  config_type = config.pop("_type")
26
29
  if config_type not in AGENT_TO_CLASS:
27
- raise ValueError(f"Loading {config_type} agent not supported")
30
+ msg = f"Loading {config_type} agent not supported"
31
+ raise ValueError(msg)
28
32
 
29
33
  agent_cls = AGENT_TO_CLASS[config_type]
30
34
  combined_config = {**config, **kwargs}
@@ -53,23 +57,27 @@ def load_agent_from_config(
53
57
  ValueError: If agent type is not specified in the config.
54
58
  """
55
59
  if "_type" not in config:
56
- raise ValueError("Must specify an agent Type in config")
60
+ msg = "Must specify an agent Type in config"
61
+ raise ValueError(msg)
57
62
  load_from_tools = config.pop("load_from_llm_and_tools", False)
58
63
  if load_from_tools:
59
64
  if llm is None:
60
- raise ValueError(
65
+ msg = (
61
66
  "If `load_from_llm_and_tools` is set to True, then LLM must be provided"
62
67
  )
68
+ raise ValueError(msg)
63
69
  if tools is None:
64
- raise ValueError(
70
+ msg = (
65
71
  "If `load_from_llm_and_tools` is set to True, "
66
72
  "then tools must be provided"
67
73
  )
74
+ raise ValueError(msg)
68
75
  return _load_agent_from_tools(config, llm, tools, **kwargs)
69
76
  config_type = config.pop("_type")
70
77
 
71
78
  if config_type not in AGENT_TO_CLASS:
72
- raise ValueError(f"Loading {config_type} agent not supported")
79
+ msg = f"Loading {config_type} agent not supported"
80
+ raise ValueError(msg)
73
81
 
74
82
  agent_cls = AGENT_TO_CLASS[config_type]
75
83
  if "llm_chain" in config:
@@ -77,11 +85,12 @@ def load_agent_from_config(
77
85
  elif "llm_chain_path" in config:
78
86
  config["llm_chain"] = load_chain(config.pop("llm_chain_path"))
79
87
  else:
80
- raise ValueError("One of `llm_chain` and `llm_chain_path` should be specified.")
88
+ msg = "One of `llm_chain` and `llm_chain_path` should be specified."
89
+ raise ValueError(msg)
81
90
  if "output_parser" in config:
82
91
  logger.warning(
83
92
  "Currently loading output parsers on agent is not supported, "
84
- "will just use the default one."
93
+ "will just use the default one.",
85
94
  )
86
95
  del config["output_parser"]
87
96
 
@@ -91,7 +100,8 @@ def load_agent_from_config(
91
100
 
92
101
  @deprecated("0.1.0", removal="1.0")
93
102
  def load_agent(
94
- path: Union[str, Path], **kwargs: Any
103
+ path: Union[str, Path],
104
+ **kwargs: Any,
95
105
  ) -> Union[BaseSingleActionAgent, BaseMultiActionAgent]:
96
106
  """Unified method for loading an agent from LangChainHub or local fs.
97
107
 
@@ -107,32 +117,32 @@ def load_agent(
107
117
  Hub is attempted.
108
118
  """
109
119
  if isinstance(path, str) and path.startswith("lc://"):
110
- raise RuntimeError(
120
+ msg = (
111
121
  "Loading from the deprecated github-based Hub is no longer supported. "
112
122
  "Please use the new LangChain Hub at https://smith.langchain.com/hub "
113
123
  "instead."
114
124
  )
125
+ raise RuntimeError(msg)
115
126
  return _load_agent_from_file(path, **kwargs)
116
127
 
117
128
 
118
129
  def _load_agent_from_file(
119
- file: Union[str, Path], **kwargs: Any
130
+ file: Union[str, Path],
131
+ **kwargs: Any,
120
132
  ) -> Union[BaseSingleActionAgent, BaseMultiActionAgent]:
121
133
  """Load agent from file."""
122
134
  valid_suffixes = {"json", "yaml"}
123
135
  # Convert file to Path object.
124
- if isinstance(file, str):
125
- file_path = Path(file)
126
- else:
127
- file_path = file
136
+ file_path = Path(file) if isinstance(file, str) else file
128
137
  # Load from either json or yaml.
129
138
  if file_path.suffix[1:] == "json":
130
- with open(file_path) as f:
139
+ with file_path.open() as f:
131
140
  config = json.load(f)
132
141
  elif file_path.suffix[1:] == "yaml":
133
- with open(file_path) as f:
142
+ with file_path.open() as f:
134
143
  config = yaml.safe_load(f)
135
144
  else:
136
- raise ValueError(f"Unsupported file type, must be one of {valid_suffixes}.")
145
+ msg = f"Unsupported file type, must be one of {valid_suffixes}."
146
+ raise ValueError(msg)
137
147
  # Load the agent from the config now.
138
148
  return load_agent_from_config(config, **kwargs)
@@ -12,6 +12,7 @@ from langchain_core.prompts import PromptTemplate
12
12
  from langchain_core.tools import BaseTool, Tool
13
13
  from langchain_core.tools.render import render_text_description
14
14
  from pydantic import Field
15
+ from typing_extensions import override
15
16
 
16
17
  from langchain._api.deprecation import AGENT_DEPRECATION_WARNING
17
18
  from langchain.agents.agent import Agent, AgentExecutor, AgentOutputParser
@@ -51,6 +52,7 @@ class ZeroShotAgent(Agent):
51
52
  output_parser: AgentOutputParser = Field(default_factory=MRKLOutputParser)
52
53
 
53
54
  @classmethod
55
+ @override
54
56
  def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
55
57
  return MRKLOutputParser()
56
58
 
@@ -104,7 +106,7 @@ class ZeroShotAgent(Agent):
104
106
  tool_strings = render_text_description(list(tools))
105
107
  tool_names = ", ".join([tool.name for tool in tools])
106
108
  format_instructions = format_instructions.format(tool_names=tool_names)
107
- template = "\n\n".join([prefix, tool_strings, format_instructions, suffix])
109
+ template = f"{prefix}\n\n{tool_strings}\n\n{format_instructions}\n\n{suffix}"
108
110
  if input_variables:
109
111
  return PromptTemplate(template=template, input_variables=input_variables)
110
112
  return PromptTemplate.from_template(template)
@@ -162,15 +164,17 @@ class ZeroShotAgent(Agent):
162
164
  def _validate_tools(cls, tools: Sequence[BaseTool]) -> None:
163
165
  validate_tools_single_input(cls.__name__, tools)
164
166
  if len(tools) == 0:
165
- raise ValueError(
167
+ msg = (
166
168
  f"Got no tools for {cls.__name__}. At least one tool must be provided."
167
169
  )
170
+ raise ValueError(msg)
168
171
  for tool in tools:
169
172
  if tool.description is None:
170
- raise ValueError(
173
+ msg = (
171
174
  f"Got a tool {tool.name} without a description. For this agent, "
172
175
  f"a description must always be provided."
173
176
  )
177
+ raise ValueError(msg)
174
178
  super()._validate_tools(tools)
175
179
 
176
180
 
@@ -184,7 +188,10 @@ class MRKLChain(AgentExecutor):
184
188
 
185
189
  @classmethod
186
190
  def from_chains(
187
- cls, llm: BaseLanguageModel, chains: list[ChainConfig], **kwargs: Any
191
+ cls,
192
+ llm: BaseLanguageModel,
193
+ chains: list[ChainConfig],
194
+ **kwargs: Any,
188
195
  ) -> AgentExecutor:
189
196
  """User-friendly way to initialize the MRKL chain.
190
197
 
@@ -53,12 +53,11 @@ class MRKLOutputParser(AgentOutputParser):
53
53
  start_index = text.find(FINAL_ANSWER_ACTION) + len(FINAL_ANSWER_ACTION)
54
54
  end_index = text.find("\n\n", start_index)
55
55
  return AgentFinish(
56
- {"output": text[start_index:end_index].strip()}, text[:end_index]
57
- )
58
- else:
59
- raise OutputParserException(
60
- f"{FINAL_ANSWER_AND_PARSABLE_ACTION_ERROR_MESSAGE}: {text}"
56
+ {"output": text[start_index:end_index].strip()},
57
+ text[:end_index],
61
58
  )
59
+ msg = f"{FINAL_ANSWER_AND_PARSABLE_ACTION_ERROR_MESSAGE}: {text}"
60
+ raise OutputParserException(msg)
62
61
 
63
62
  if action_match:
64
63
  action = action_match.group(1).strip()
@@ -70,29 +69,34 @@ class MRKLOutputParser(AgentOutputParser):
70
69
 
71
70
  return AgentAction(action, tool_input, text)
72
71
 
73
- elif includes_answer:
72
+ if includes_answer:
74
73
  return AgentFinish(
75
- {"output": text.split(FINAL_ANSWER_ACTION)[-1].strip()}, text
74
+ {"output": text.split(FINAL_ANSWER_ACTION)[-1].strip()},
75
+ text,
76
76
  )
77
77
 
78
78
  if not re.search(r"Action\s*\d*\s*:[\s]*(.*?)", text, re.DOTALL):
79
+ msg = f"Could not parse LLM output: `{text}`"
79
80
  raise OutputParserException(
80
- f"Could not parse LLM output: `{text}`",
81
+ msg,
81
82
  observation=MISSING_ACTION_AFTER_THOUGHT_ERROR_MESSAGE,
82
83
  llm_output=text,
83
84
  send_to_llm=True,
84
85
  )
85
- elif not re.search(
86
- r"[\s]*Action\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)", text, re.DOTALL
86
+ if not re.search(
87
+ r"[\s]*Action\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)",
88
+ text,
89
+ re.DOTALL,
87
90
  ):
91
+ msg = f"Could not parse LLM output: `{text}`"
88
92
  raise OutputParserException(
89
- f"Could not parse LLM output: `{text}`",
93
+ msg,
90
94
  observation=MISSING_ACTION_INPUT_AFTER_ACTION_ERROR_MESSAGE,
91
95
  llm_output=text,
92
96
  send_to_llm=True,
93
97
  )
94
- else:
95
- raise OutputParserException(f"Could not parse LLM output: `{text}`")
98
+ msg = f"Could not parse LLM output: `{text}`"
99
+ raise OutputParserException(msg)
96
100
 
97
101
  @property
98
102
  def _type(self) -> str:
@@ -1,5 +1,4 @@
1
- # flake8: noqa
2
- PREFIX = """Answer the following questions as best you can. You have access to the following tools:"""
1
+ PREFIX = """Answer the following questions as best you can. You have access to the following tools:""" # noqa: E501
3
2
  FORMAT_INSTRUCTIONS = """Use the following format:
4
3
 
5
4
  Question: the input question you must answer