langchain 0.3.26__py3-none-any.whl → 0.3.27__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of langchain might be problematic. Click here for more details.

Files changed (580) hide show
  1. langchain/__init__.py +110 -96
  2. langchain/_api/__init__.py +2 -2
  3. langchain/_api/deprecation.py +3 -3
  4. langchain/_api/module_import.py +51 -46
  5. langchain/_api/path.py +1 -1
  6. langchain/adapters/openai.py +8 -8
  7. langchain/agents/__init__.py +15 -12
  8. langchain/agents/agent.py +160 -133
  9. langchain/agents/agent_iterator.py +31 -14
  10. langchain/agents/agent_toolkits/__init__.py +7 -6
  11. langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
  12. langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
  13. langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
  14. langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
  15. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
  16. langchain/agents/agent_toolkits/csv/__init__.py +4 -2
  17. langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
  18. langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
  19. langchain/agents/agent_toolkits/github/toolkit.py +9 -9
  20. langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
  21. langchain/agents/agent_toolkits/json/base.py +1 -1
  22. langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
  23. langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
  24. langchain/agents/agent_toolkits/openapi/base.py +1 -1
  25. langchain/agents/agent_toolkits/openapi/planner.py +2 -2
  26. langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
  27. langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
  28. langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
  29. langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
  30. langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
  31. langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
  32. langchain/agents/agent_toolkits/powerbi/base.py +1 -1
  33. langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
  34. langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
  35. langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
  36. langchain/agents/agent_toolkits/python/__init__.py +4 -2
  37. langchain/agents/agent_toolkits/spark/__init__.py +4 -2
  38. langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
  39. langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
  40. langchain/agents/agent_toolkits/sql/prompt.py +1 -1
  41. langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
  42. langchain/agents/agent_toolkits/vectorstore/base.py +2 -2
  43. langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
  44. langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
  45. langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
  46. langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
  47. langchain/agents/agent_types.py +6 -6
  48. langchain/agents/chat/base.py +6 -12
  49. langchain/agents/chat/output_parser.py +9 -6
  50. langchain/agents/chat/prompt.py +3 -4
  51. langchain/agents/conversational/base.py +9 -5
  52. langchain/agents/conversational/output_parser.py +4 -2
  53. langchain/agents/conversational/prompt.py +2 -3
  54. langchain/agents/conversational_chat/base.py +7 -5
  55. langchain/agents/conversational_chat/output_parser.py +9 -11
  56. langchain/agents/conversational_chat/prompt.py +5 -6
  57. langchain/agents/format_scratchpad/__init__.py +3 -3
  58. langchain/agents/format_scratchpad/log_to_messages.py +1 -1
  59. langchain/agents/format_scratchpad/openai_functions.py +8 -6
  60. langchain/agents/format_scratchpad/tools.py +5 -3
  61. langchain/agents/format_scratchpad/xml.py +33 -2
  62. langchain/agents/initialize.py +16 -8
  63. langchain/agents/json_chat/base.py +18 -18
  64. langchain/agents/json_chat/prompt.py +2 -3
  65. langchain/agents/load_tools.py +2 -1
  66. langchain/agents/loading.py +28 -18
  67. langchain/agents/mrkl/base.py +9 -4
  68. langchain/agents/mrkl/output_parser.py +17 -13
  69. langchain/agents/mrkl/prompt.py +1 -2
  70. langchain/agents/openai_assistant/base.py +80 -70
  71. langchain/agents/openai_functions_agent/base.py +46 -37
  72. langchain/agents/openai_functions_multi_agent/base.py +39 -26
  73. langchain/agents/openai_tools/base.py +8 -8
  74. langchain/agents/output_parsers/__init__.py +3 -3
  75. langchain/agents/output_parsers/json.py +6 -6
  76. langchain/agents/output_parsers/openai_functions.py +15 -7
  77. langchain/agents/output_parsers/openai_tools.py +9 -4
  78. langchain/agents/output_parsers/react_json_single_input.py +10 -5
  79. langchain/agents/output_parsers/react_single_input.py +15 -11
  80. langchain/agents/output_parsers/self_ask.py +3 -2
  81. langchain/agents/output_parsers/tools.py +18 -13
  82. langchain/agents/output_parsers/xml.py +99 -28
  83. langchain/agents/react/agent.py +4 -4
  84. langchain/agents/react/base.py +22 -17
  85. langchain/agents/react/output_parser.py +5 -6
  86. langchain/agents/react/textworld_prompt.py +0 -1
  87. langchain/agents/react/wiki_prompt.py +14 -15
  88. langchain/agents/schema.py +3 -2
  89. langchain/agents/self_ask_with_search/base.py +19 -15
  90. langchain/agents/self_ask_with_search/prompt.py +0 -1
  91. langchain/agents/structured_chat/base.py +14 -11
  92. langchain/agents/structured_chat/output_parser.py +16 -18
  93. langchain/agents/structured_chat/prompt.py +3 -4
  94. langchain/agents/tool_calling_agent/base.py +7 -6
  95. langchain/agents/tools.py +2 -2
  96. langchain/agents/utils.py +2 -3
  97. langchain/agents/xml/base.py +5 -5
  98. langchain/agents/xml/prompt.py +1 -2
  99. langchain/cache.py +12 -12
  100. langchain/callbacks/__init__.py +11 -11
  101. langchain/callbacks/aim_callback.py +2 -2
  102. langchain/callbacks/argilla_callback.py +1 -1
  103. langchain/callbacks/arize_callback.py +1 -1
  104. langchain/callbacks/arthur_callback.py +1 -1
  105. langchain/callbacks/base.py +7 -7
  106. langchain/callbacks/clearml_callback.py +1 -1
  107. langchain/callbacks/comet_ml_callback.py +1 -1
  108. langchain/callbacks/confident_callback.py +1 -1
  109. langchain/callbacks/context_callback.py +1 -1
  110. langchain/callbacks/flyte_callback.py +1 -1
  111. langchain/callbacks/human.py +2 -2
  112. langchain/callbacks/infino_callback.py +1 -1
  113. langchain/callbacks/labelstudio_callback.py +1 -1
  114. langchain/callbacks/llmonitor_callback.py +1 -1
  115. langchain/callbacks/manager.py +5 -5
  116. langchain/callbacks/mlflow_callback.py +2 -2
  117. langchain/callbacks/openai_info.py +1 -1
  118. langchain/callbacks/promptlayer_callback.py +1 -1
  119. langchain/callbacks/sagemaker_callback.py +1 -1
  120. langchain/callbacks/streaming_aiter.py +4 -1
  121. langchain/callbacks/streaming_aiter_final_only.py +5 -3
  122. langchain/callbacks/streaming_stdout_final_only.py +5 -3
  123. langchain/callbacks/streamlit/__init__.py +3 -2
  124. langchain/callbacks/streamlit/mutable_expander.py +1 -1
  125. langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
  126. langchain/callbacks/tracers/__init__.py +1 -1
  127. langchain/callbacks/tracers/comet.py +1 -1
  128. langchain/callbacks/tracers/evaluation.py +1 -1
  129. langchain/callbacks/tracers/log_stream.py +1 -1
  130. langchain/callbacks/tracers/logging.py +1 -1
  131. langchain/callbacks/tracers/stdout.py +1 -1
  132. langchain/callbacks/trubrics_callback.py +1 -1
  133. langchain/callbacks/utils.py +4 -4
  134. langchain/callbacks/wandb_callback.py +1 -1
  135. langchain/callbacks/whylabs_callback.py +1 -1
  136. langchain/chains/api/base.py +36 -22
  137. langchain/chains/api/news_docs.py +1 -2
  138. langchain/chains/api/open_meteo_docs.py +1 -2
  139. langchain/chains/api/openapi/requests_chain.py +1 -1
  140. langchain/chains/api/openapi/response_chain.py +1 -1
  141. langchain/chains/api/podcast_docs.py +1 -2
  142. langchain/chains/api/prompt.py +1 -2
  143. langchain/chains/api/tmdb_docs.py +1 -2
  144. langchain/chains/base.py +88 -54
  145. langchain/chains/chat_vector_db/prompts.py +2 -3
  146. langchain/chains/combine_documents/__init__.py +1 -1
  147. langchain/chains/combine_documents/base.py +23 -10
  148. langchain/chains/combine_documents/map_reduce.py +38 -30
  149. langchain/chains/combine_documents/map_rerank.py +33 -20
  150. langchain/chains/combine_documents/reduce.py +47 -26
  151. langchain/chains/combine_documents/refine.py +26 -17
  152. langchain/chains/combine_documents/stuff.py +19 -12
  153. langchain/chains/constitutional_ai/base.py +4 -4
  154. langchain/chains/constitutional_ai/principles.py +22 -25
  155. langchain/chains/constitutional_ai/prompts.py +25 -28
  156. langchain/chains/conversation/base.py +5 -3
  157. langchain/chains/conversation/memory.py +5 -5
  158. langchain/chains/conversation/prompt.py +5 -5
  159. langchain/chains/conversational_retrieval/base.py +41 -20
  160. langchain/chains/conversational_retrieval/prompts.py +2 -3
  161. langchain/chains/elasticsearch_database/base.py +8 -9
  162. langchain/chains/elasticsearch_database/prompts.py +2 -3
  163. langchain/chains/ernie_functions/__init__.py +2 -2
  164. langchain/chains/example_generator.py +3 -1
  165. langchain/chains/flare/base.py +26 -12
  166. langchain/chains/graph_qa/cypher.py +2 -2
  167. langchain/chains/graph_qa/falkordb.py +1 -1
  168. langchain/chains/graph_qa/gremlin.py +1 -1
  169. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  170. langchain/chains/graph_qa/prompts.py +2 -2
  171. langchain/chains/history_aware_retriever.py +2 -1
  172. langchain/chains/hyde/base.py +6 -5
  173. langchain/chains/hyde/prompts.py +5 -6
  174. langchain/chains/llm.py +77 -61
  175. langchain/chains/llm_bash/__init__.py +2 -1
  176. langchain/chains/llm_checker/base.py +7 -5
  177. langchain/chains/llm_checker/prompt.py +3 -4
  178. langchain/chains/llm_math/base.py +16 -9
  179. langchain/chains/llm_math/prompt.py +1 -2
  180. langchain/chains/llm_summarization_checker/base.py +9 -6
  181. langchain/chains/llm_symbolic_math/__init__.py +2 -1
  182. langchain/chains/loading.py +151 -95
  183. langchain/chains/mapreduce.py +4 -3
  184. langchain/chains/moderation.py +8 -9
  185. langchain/chains/natbot/base.py +8 -8
  186. langchain/chains/natbot/crawler.py +73 -76
  187. langchain/chains/natbot/prompt.py +2 -3
  188. langchain/chains/openai_functions/__init__.py +7 -7
  189. langchain/chains/openai_functions/base.py +13 -10
  190. langchain/chains/openai_functions/citation_fuzzy_match.py +12 -11
  191. langchain/chains/openai_functions/extraction.py +19 -19
  192. langchain/chains/openai_functions/openapi.py +35 -35
  193. langchain/chains/openai_functions/qa_with_structure.py +19 -12
  194. langchain/chains/openai_functions/tagging.py +2 -4
  195. langchain/chains/openai_tools/extraction.py +7 -8
  196. langchain/chains/qa_generation/base.py +4 -3
  197. langchain/chains/qa_generation/prompt.py +5 -5
  198. langchain/chains/qa_with_sources/base.py +14 -6
  199. langchain/chains/qa_with_sources/loading.py +16 -8
  200. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  201. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  202. langchain/chains/qa_with_sources/retrieval.py +14 -5
  203. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  204. langchain/chains/qa_with_sources/vector_db.py +17 -6
  205. langchain/chains/query_constructor/base.py +34 -33
  206. langchain/chains/query_constructor/ir.py +4 -4
  207. langchain/chains/query_constructor/parser.py +37 -32
  208. langchain/chains/query_constructor/prompt.py +5 -6
  209. langchain/chains/question_answering/chain.py +21 -10
  210. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  211. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  212. langchain/chains/question_answering/refine_prompts.py +2 -5
  213. langchain/chains/question_answering/stuff_prompt.py +5 -5
  214. langchain/chains/retrieval.py +1 -3
  215. langchain/chains/retrieval_qa/base.py +34 -27
  216. langchain/chains/retrieval_qa/prompt.py +1 -2
  217. langchain/chains/router/__init__.py +3 -3
  218. langchain/chains/router/base.py +24 -20
  219. langchain/chains/router/embedding_router.py +12 -8
  220. langchain/chains/router/llm_router.py +17 -16
  221. langchain/chains/router/multi_prompt.py +2 -2
  222. langchain/chains/router/multi_retrieval_qa.py +10 -5
  223. langchain/chains/sequential.py +30 -18
  224. langchain/chains/sql_database/prompt.py +14 -16
  225. langchain/chains/sql_database/query.py +6 -5
  226. langchain/chains/structured_output/__init__.py +1 -1
  227. langchain/chains/structured_output/base.py +75 -67
  228. langchain/chains/summarize/chain.py +11 -5
  229. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  230. langchain/chains/summarize/stuff_prompt.py +0 -1
  231. langchain/chains/transform.py +5 -6
  232. langchain/chat_loaders/facebook_messenger.py +1 -1
  233. langchain/chat_loaders/langsmith.py +1 -1
  234. langchain/chat_loaders/utils.py +3 -3
  235. langchain/chat_models/__init__.py +20 -19
  236. langchain/chat_models/anthropic.py +1 -1
  237. langchain/chat_models/azureml_endpoint.py +1 -1
  238. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  239. langchain/chat_models/base.py +160 -123
  240. langchain/chat_models/bedrock.py +1 -1
  241. langchain/chat_models/fake.py +1 -1
  242. langchain/chat_models/meta.py +1 -1
  243. langchain/chat_models/pai_eas_endpoint.py +1 -1
  244. langchain/chat_models/promptlayer_openai.py +1 -1
  245. langchain/chat_models/volcengine_maas.py +1 -1
  246. langchain/docstore/base.py +1 -1
  247. langchain/document_loaders/__init__.py +9 -9
  248. langchain/document_loaders/airbyte.py +3 -3
  249. langchain/document_loaders/assemblyai.py +1 -1
  250. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  251. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  252. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  253. langchain/document_loaders/base.py +1 -1
  254. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  255. langchain/document_loaders/blockchain.py +1 -1
  256. langchain/document_loaders/chatgpt.py +1 -1
  257. langchain/document_loaders/college_confidential.py +1 -1
  258. langchain/document_loaders/confluence.py +1 -1
  259. langchain/document_loaders/email.py +1 -1
  260. langchain/document_loaders/facebook_chat.py +1 -1
  261. langchain/document_loaders/markdown.py +1 -1
  262. langchain/document_loaders/notebook.py +1 -1
  263. langchain/document_loaders/org_mode.py +1 -1
  264. langchain/document_loaders/parsers/__init__.py +1 -1
  265. langchain/document_loaders/parsers/docai.py +1 -1
  266. langchain/document_loaders/parsers/generic.py +1 -1
  267. langchain/document_loaders/parsers/html/__init__.py +1 -1
  268. langchain/document_loaders/parsers/html/bs4.py +1 -1
  269. langchain/document_loaders/parsers/language/cobol.py +1 -1
  270. langchain/document_loaders/parsers/language/python.py +1 -1
  271. langchain/document_loaders/parsers/msword.py +1 -1
  272. langchain/document_loaders/parsers/pdf.py +5 -5
  273. langchain/document_loaders/parsers/registry.py +1 -1
  274. langchain/document_loaders/pdf.py +8 -8
  275. langchain/document_loaders/powerpoint.py +1 -1
  276. langchain/document_loaders/pyspark_dataframe.py +1 -1
  277. langchain/document_loaders/telegram.py +2 -2
  278. langchain/document_loaders/tencent_cos_directory.py +1 -1
  279. langchain/document_loaders/unstructured.py +5 -5
  280. langchain/document_loaders/url_playwright.py +1 -1
  281. langchain/document_loaders/whatsapp_chat.py +1 -1
  282. langchain/document_loaders/youtube.py +2 -2
  283. langchain/document_transformers/__init__.py +3 -3
  284. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  285. langchain/document_transformers/doctran_text_extract.py +1 -1
  286. langchain/document_transformers/doctran_text_qa.py +1 -1
  287. langchain/document_transformers/doctran_text_translate.py +1 -1
  288. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  289. langchain/document_transformers/google_translate.py +1 -1
  290. langchain/document_transformers/html2text.py +1 -1
  291. langchain/document_transformers/nuclia_text_transform.py +1 -1
  292. langchain/embeddings/__init__.py +5 -5
  293. langchain/embeddings/base.py +33 -24
  294. langchain/embeddings/cache.py +36 -31
  295. langchain/embeddings/fake.py +1 -1
  296. langchain/embeddings/huggingface.py +2 -2
  297. langchain/evaluation/__init__.py +22 -22
  298. langchain/evaluation/agents/trajectory_eval_chain.py +23 -23
  299. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  300. langchain/evaluation/comparison/__init__.py +1 -1
  301. langchain/evaluation/comparison/eval_chain.py +20 -13
  302. langchain/evaluation/comparison/prompt.py +1 -2
  303. langchain/evaluation/criteria/__init__.py +1 -1
  304. langchain/evaluation/criteria/eval_chain.py +20 -11
  305. langchain/evaluation/criteria/prompt.py +2 -3
  306. langchain/evaluation/embedding_distance/base.py +23 -20
  307. langchain/evaluation/loading.py +15 -11
  308. langchain/evaluation/parsing/base.py +4 -1
  309. langchain/evaluation/parsing/json_distance.py +5 -2
  310. langchain/evaluation/parsing/json_schema.py +12 -8
  311. langchain/evaluation/qa/__init__.py +1 -1
  312. langchain/evaluation/qa/eval_chain.py +12 -5
  313. langchain/evaluation/qa/eval_prompt.py +7 -8
  314. langchain/evaluation/qa/generate_chain.py +2 -1
  315. langchain/evaluation/qa/generate_prompt.py +2 -4
  316. langchain/evaluation/schema.py +38 -30
  317. langchain/evaluation/scoring/__init__.py +1 -1
  318. langchain/evaluation/scoring/eval_chain.py +22 -15
  319. langchain/evaluation/scoring/prompt.py +0 -1
  320. langchain/evaluation/string_distance/base.py +14 -9
  321. langchain/globals.py +12 -11
  322. langchain/graphs/__init__.py +6 -6
  323. langchain/graphs/graph_document.py +1 -1
  324. langchain/graphs/networkx_graph.py +2 -2
  325. langchain/hub.py +9 -11
  326. langchain/indexes/__init__.py +3 -3
  327. langchain/indexes/_sql_record_manager.py +63 -46
  328. langchain/indexes/prompts/entity_extraction.py +1 -2
  329. langchain/indexes/prompts/entity_summarization.py +1 -2
  330. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  331. langchain/indexes/vectorstore.py +35 -19
  332. langchain/llms/__init__.py +13 -13
  333. langchain/llms/ai21.py +1 -1
  334. langchain/llms/azureml_endpoint.py +4 -4
  335. langchain/llms/base.py +15 -7
  336. langchain/llms/bedrock.py +1 -1
  337. langchain/llms/cloudflare_workersai.py +1 -1
  338. langchain/llms/gradient_ai.py +1 -1
  339. langchain/llms/loading.py +1 -1
  340. langchain/llms/openai.py +1 -1
  341. langchain/llms/sagemaker_endpoint.py +1 -1
  342. langchain/load/dump.py +1 -1
  343. langchain/load/load.py +1 -1
  344. langchain/load/serializable.py +3 -3
  345. langchain/memory/__init__.py +3 -3
  346. langchain/memory/buffer.py +9 -7
  347. langchain/memory/chat_memory.py +14 -8
  348. langchain/memory/chat_message_histories/__init__.py +1 -1
  349. langchain/memory/chat_message_histories/astradb.py +1 -1
  350. langchain/memory/chat_message_histories/cassandra.py +1 -1
  351. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  352. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  353. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  354. langchain/memory/chat_message_histories/file.py +1 -1
  355. langchain/memory/chat_message_histories/firestore.py +1 -1
  356. langchain/memory/chat_message_histories/momento.py +1 -1
  357. langchain/memory/chat_message_histories/mongodb.py +1 -1
  358. langchain/memory/chat_message_histories/neo4j.py +1 -1
  359. langchain/memory/chat_message_histories/postgres.py +1 -1
  360. langchain/memory/chat_message_histories/redis.py +1 -1
  361. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  362. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  363. langchain/memory/chat_message_histories/streamlit.py +1 -1
  364. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  365. langchain/memory/chat_message_histories/xata.py +1 -1
  366. langchain/memory/chat_message_histories/zep.py +1 -1
  367. langchain/memory/combined.py +13 -12
  368. langchain/memory/entity.py +84 -61
  369. langchain/memory/prompt.py +10 -11
  370. langchain/memory/readonly.py +0 -2
  371. langchain/memory/simple.py +1 -3
  372. langchain/memory/summary.py +13 -11
  373. langchain/memory/summary_buffer.py +17 -8
  374. langchain/memory/utils.py +3 -2
  375. langchain/memory/vectorstore.py +12 -5
  376. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  377. langchain/model_laboratory.py +12 -11
  378. langchain/output_parsers/__init__.py +4 -4
  379. langchain/output_parsers/boolean.py +7 -4
  380. langchain/output_parsers/combining.py +10 -5
  381. langchain/output_parsers/datetime.py +32 -31
  382. langchain/output_parsers/enum.py +5 -3
  383. langchain/output_parsers/fix.py +52 -52
  384. langchain/output_parsers/format_instructions.py +6 -8
  385. langchain/output_parsers/json.py +2 -2
  386. langchain/output_parsers/list.py +2 -2
  387. langchain/output_parsers/loading.py +9 -9
  388. langchain/output_parsers/openai_functions.py +3 -3
  389. langchain/output_parsers/openai_tools.py +1 -1
  390. langchain/output_parsers/pandas_dataframe.py +43 -47
  391. langchain/output_parsers/prompts.py +1 -2
  392. langchain/output_parsers/rail_parser.py +1 -1
  393. langchain/output_parsers/regex.py +7 -8
  394. langchain/output_parsers/regex_dict.py +7 -10
  395. langchain/output_parsers/retry.py +77 -78
  396. langchain/output_parsers/structured.py +11 -6
  397. langchain/output_parsers/yaml.py +15 -11
  398. langchain/prompts/__init__.py +5 -3
  399. langchain/prompts/base.py +5 -5
  400. langchain/prompts/chat.py +8 -8
  401. langchain/prompts/example_selector/__init__.py +3 -1
  402. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  403. langchain/prompts/few_shot.py +1 -1
  404. langchain/prompts/loading.py +3 -3
  405. langchain/prompts/prompt.py +1 -1
  406. langchain/retrievers/__init__.py +5 -5
  407. langchain/retrievers/bedrock.py +2 -2
  408. langchain/retrievers/bm25.py +1 -1
  409. langchain/retrievers/contextual_compression.py +14 -8
  410. langchain/retrievers/docarray.py +1 -1
  411. langchain/retrievers/document_compressors/__init__.py +5 -4
  412. langchain/retrievers/document_compressors/base.py +12 -6
  413. langchain/retrievers/document_compressors/chain_extract.py +2 -2
  414. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  415. langchain/retrievers/document_compressors/chain_filter.py +9 -9
  416. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  417. langchain/retrievers/document_compressors/cohere_rerank.py +15 -15
  418. langchain/retrievers/document_compressors/embeddings_filter.py +21 -17
  419. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  420. langchain/retrievers/document_compressors/listwise_rerank.py +7 -5
  421. langchain/retrievers/ensemble.py +28 -25
  422. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  423. langchain/retrievers/google_vertex_ai_search.py +2 -2
  424. langchain/retrievers/kendra.py +10 -10
  425. langchain/retrievers/llama_index.py +1 -1
  426. langchain/retrievers/merger_retriever.py +11 -11
  427. langchain/retrievers/milvus.py +1 -1
  428. langchain/retrievers/multi_query.py +32 -26
  429. langchain/retrievers/multi_vector.py +20 -8
  430. langchain/retrievers/parent_document_retriever.py +18 -9
  431. langchain/retrievers/re_phraser.py +6 -5
  432. langchain/retrievers/self_query/base.py +138 -127
  433. langchain/retrievers/time_weighted_retriever.py +18 -7
  434. langchain/retrievers/zilliz.py +1 -1
  435. langchain/runnables/openai_functions.py +6 -2
  436. langchain/schema/__init__.py +23 -23
  437. langchain/schema/cache.py +1 -1
  438. langchain/schema/callbacks/base.py +7 -7
  439. langchain/schema/callbacks/manager.py +19 -19
  440. langchain/schema/callbacks/tracers/base.py +1 -1
  441. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  442. langchain/schema/callbacks/tracers/langchain.py +1 -1
  443. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  444. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  445. langchain/schema/callbacks/tracers/schemas.py +8 -8
  446. langchain/schema/callbacks/tracers/stdout.py +3 -3
  447. langchain/schema/document.py +1 -1
  448. langchain/schema/language_model.py +2 -2
  449. langchain/schema/messages.py +12 -12
  450. langchain/schema/output.py +3 -3
  451. langchain/schema/output_parser.py +3 -3
  452. langchain/schema/runnable/__init__.py +3 -3
  453. langchain/schema/runnable/base.py +9 -9
  454. langchain/schema/runnable/config.py +5 -5
  455. langchain/schema/runnable/configurable.py +1 -1
  456. langchain/schema/runnable/history.py +1 -1
  457. langchain/schema/runnable/passthrough.py +1 -1
  458. langchain/schema/runnable/utils.py +16 -16
  459. langchain/schema/vectorstore.py +1 -1
  460. langchain/smith/__init__.py +1 -1
  461. langchain/smith/evaluation/__init__.py +2 -2
  462. langchain/smith/evaluation/config.py +10 -7
  463. langchain/smith/evaluation/name_generation.py +3 -3
  464. langchain/smith/evaluation/progress.py +11 -2
  465. langchain/smith/evaluation/runner_utils.py +179 -127
  466. langchain/smith/evaluation/string_run_evaluator.py +75 -68
  467. langchain/storage/__init__.py +2 -2
  468. langchain/storage/_lc_store.py +4 -2
  469. langchain/storage/encoder_backed.py +6 -2
  470. langchain/storage/file_system.py +19 -16
  471. langchain/storage/in_memory.py +1 -1
  472. langchain/storage/upstash_redis.py +1 -1
  473. langchain/text_splitter.py +15 -15
  474. langchain/tools/__init__.py +28 -26
  475. langchain/tools/ainetwork/app.py +1 -1
  476. langchain/tools/ainetwork/base.py +1 -1
  477. langchain/tools/ainetwork/owner.py +1 -1
  478. langchain/tools/ainetwork/rule.py +1 -1
  479. langchain/tools/ainetwork/transfer.py +1 -1
  480. langchain/tools/ainetwork/value.py +1 -1
  481. langchain/tools/amadeus/closest_airport.py +1 -1
  482. langchain/tools/amadeus/flight_search.py +1 -1
  483. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  484. langchain/tools/base.py +4 -4
  485. langchain/tools/bearly/tool.py +1 -1
  486. langchain/tools/bing_search/__init__.py +1 -1
  487. langchain/tools/bing_search/tool.py +1 -1
  488. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  489. langchain/tools/dataforseo_api_search/tool.py +1 -1
  490. langchain/tools/ddg_search/tool.py +1 -1
  491. langchain/tools/e2b_data_analysis/tool.py +2 -2
  492. langchain/tools/edenai/__init__.py +1 -1
  493. langchain/tools/file_management/__init__.py +1 -1
  494. langchain/tools/file_management/copy.py +1 -1
  495. langchain/tools/file_management/delete.py +1 -1
  496. langchain/tools/gmail/__init__.py +2 -2
  497. langchain/tools/gmail/get_message.py +1 -1
  498. langchain/tools/gmail/search.py +1 -1
  499. langchain/tools/gmail/send_message.py +1 -1
  500. langchain/tools/google_finance/__init__.py +1 -1
  501. langchain/tools/google_finance/tool.py +1 -1
  502. langchain/tools/google_scholar/__init__.py +1 -1
  503. langchain/tools/google_scholar/tool.py +1 -1
  504. langchain/tools/google_search/__init__.py +1 -1
  505. langchain/tools/google_search/tool.py +1 -1
  506. langchain/tools/google_serper/__init__.py +1 -1
  507. langchain/tools/google_serper/tool.py +1 -1
  508. langchain/tools/google_trends/__init__.py +1 -1
  509. langchain/tools/google_trends/tool.py +1 -1
  510. langchain/tools/jira/tool.py +20 -1
  511. langchain/tools/json/tool.py +25 -3
  512. langchain/tools/memorize/tool.py +1 -1
  513. langchain/tools/multion/__init__.py +1 -1
  514. langchain/tools/multion/update_session.py +1 -1
  515. langchain/tools/office365/__init__.py +2 -2
  516. langchain/tools/office365/events_search.py +1 -1
  517. langchain/tools/office365/messages_search.py +1 -1
  518. langchain/tools/office365/send_event.py +1 -1
  519. langchain/tools/office365/send_message.py +1 -1
  520. langchain/tools/openapi/utils/api_models.py +6 -6
  521. langchain/tools/playwright/__init__.py +5 -5
  522. langchain/tools/playwright/click.py +1 -1
  523. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  524. langchain/tools/playwright/get_elements.py +1 -1
  525. langchain/tools/playwright/navigate.py +1 -1
  526. langchain/tools/plugin.py +2 -2
  527. langchain/tools/powerbi/tool.py +1 -1
  528. langchain/tools/python/__init__.py +2 -1
  529. langchain/tools/reddit_search/tool.py +1 -1
  530. langchain/tools/render.py +2 -2
  531. langchain/tools/requests/tool.py +2 -2
  532. langchain/tools/searchapi/tool.py +1 -1
  533. langchain/tools/searx_search/tool.py +1 -1
  534. langchain/tools/slack/get_message.py +1 -1
  535. langchain/tools/spark_sql/tool.py +1 -1
  536. langchain/tools/sql_database/tool.py +1 -1
  537. langchain/tools/tavily_search/__init__.py +1 -1
  538. langchain/tools/tavily_search/tool.py +1 -1
  539. langchain/tools/zapier/__init__.py +1 -1
  540. langchain/tools/zapier/tool.py +24 -2
  541. langchain/utilities/__init__.py +4 -4
  542. langchain/utilities/arcee.py +4 -4
  543. langchain/utilities/clickup.py +4 -4
  544. langchain/utilities/dalle_image_generator.py +1 -1
  545. langchain/utilities/dataforseo_api_search.py +1 -1
  546. langchain/utilities/opaqueprompts.py +1 -1
  547. langchain/utilities/reddit_search.py +1 -1
  548. langchain/utilities/sql_database.py +1 -1
  549. langchain/utilities/tavily_search.py +1 -1
  550. langchain/utilities/vertexai.py +2 -2
  551. langchain/utils/__init__.py +1 -1
  552. langchain/utils/aiter.py +1 -1
  553. langchain/utils/html.py +3 -3
  554. langchain/utils/input.py +1 -1
  555. langchain/utils/iter.py +1 -1
  556. langchain/utils/json_schema.py +1 -3
  557. langchain/utils/strings.py +1 -1
  558. langchain/utils/utils.py +6 -6
  559. langchain/vectorstores/__init__.py +5 -5
  560. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  561. langchain/vectorstores/azure_cosmos_db.py +1 -1
  562. langchain/vectorstores/clickhouse.py +1 -1
  563. langchain/vectorstores/elastic_vector_search.py +1 -1
  564. langchain/vectorstores/elasticsearch.py +2 -2
  565. langchain/vectorstores/myscale.py +1 -1
  566. langchain/vectorstores/neo4j_vector.py +1 -1
  567. langchain/vectorstores/pgembedding.py +1 -1
  568. langchain/vectorstores/qdrant.py +1 -1
  569. langchain/vectorstores/redis/__init__.py +1 -1
  570. langchain/vectorstores/redis/base.py +1 -1
  571. langchain/vectorstores/redis/filters.py +4 -4
  572. langchain/vectorstores/redis/schema.py +6 -6
  573. langchain/vectorstores/sklearn.py +2 -2
  574. langchain/vectorstores/starrocks.py +1 -1
  575. langchain/vectorstores/utils.py +1 -1
  576. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/METADATA +4 -4
  577. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/RECORD +580 -580
  578. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
  579. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
  580. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/licenses/LICENSE +0 -0
@@ -36,12 +36,12 @@ class VectorStoreToolkit(BaseToolkit):
36
36
  VectorStoreQATool,
37
37
  VectorStoreQAWithSourcesTool,
38
38
  )
39
- except ImportError:
40
- raise ImportError(
41
- "You need to install langchain-community to use this toolkit."
42
- )
39
+ except ImportError as e:
40
+ msg = "You need to install langchain-community to use this toolkit."
41
+ raise ImportError(msg) from e
43
42
  description = VectorStoreQATool.get_description(
44
- self.vectorstore_info.name, self.vectorstore_info.description
43
+ self.vectorstore_info.name,
44
+ self.vectorstore_info.description,
45
45
  )
46
46
  qa_tool = VectorStoreQATool(
47
47
  name=self.vectorstore_info.name,
@@ -50,7 +50,8 @@ class VectorStoreToolkit(BaseToolkit):
50
50
  llm=self.llm,
51
51
  )
52
52
  description = VectorStoreQAWithSourcesTool.get_description(
53
- self.vectorstore_info.name, self.vectorstore_info.description
53
+ self.vectorstore_info.name,
54
+ self.vectorstore_info.description,
54
55
  )
55
56
  qa_with_sources_tool = VectorStoreQAWithSourcesTool(
56
57
  name=f"{self.vectorstore_info.name}_with_sources",
@@ -78,13 +79,13 @@ class VectorStoreRouterToolkit(BaseToolkit):
78
79
  from langchain_community.tools.vectorstore.tool import (
79
80
  VectorStoreQATool,
80
81
  )
81
- except ImportError:
82
- raise ImportError(
83
- "You need to install langchain-community to use this toolkit."
84
- )
82
+ except ImportError as e:
83
+ msg = "You need to install langchain-community to use this toolkit."
84
+ raise ImportError(msg) from e
85
85
  for vectorstore_info in self.vectorstores:
86
86
  description = VectorStoreQATool.get_description(
87
- vectorstore_info.name, vectorstore_info.description
87
+ vectorstore_info.name,
88
+ vectorstore_info.description,
88
89
  )
89
90
  qa_tool = VectorStoreQATool(
90
91
  name=vectorstore_info.name,
@@ -14,7 +14,7 @@ def __getattr__(name: str) -> Any:
14
14
 
15
15
  old_path = "langchain." + here + "." + name
16
16
  new_path = "langchain_experimental." + here + "." + name
17
- raise ImportError(
17
+ msg = (
18
18
  "This agent has been moved to langchain experiment. "
19
19
  "This agent relies on python REPL tool under the hood, so to use it "
20
20
  "safely please sandbox the python REPL. "
@@ -23,4 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
  "To keep using this code as is, install langchain experimental and "
24
24
  f"update your import statement from:\n `{old_path}` to `{new_path}`."
25
25
  )
26
- raise AttributeError(f"{name} does not exist")
26
+ raise ImportError(msg)
27
+ msg = f"{name} does not exist"
28
+ raise AttributeError(msg)
@@ -9,7 +9,7 @@ if TYPE_CHECKING:
9
9
  # Used to consolidate logic for raising deprecation warnings and
10
10
  # handling optional imports.
11
11
  DEPRECATED_LOOKUP = {
12
- "ZapierToolkit": "langchain_community.agent_toolkits.zapier.toolkit"
12
+ "ZapierToolkit": "langchain_community.agent_toolkits.zapier.toolkit",
13
13
  }
14
14
 
15
15
  _import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
@@ -23,22 +23,22 @@ class AgentType(str, Enum):
23
23
 
24
24
  REACT_DOCSTORE = "react-docstore"
25
25
  """A zero shot agent that does a reasoning step before acting.
26
-
27
- This agent has access to a document store that allows it to look up
26
+
27
+ This agent has access to a document store that allows it to look up
28
28
  relevant information to answering the question.
29
29
  """
30
30
 
31
31
  SELF_ASK_WITH_SEARCH = "self-ask-with-search"
32
32
  """An agent that breaks down a complex question into a series of simpler questions.
33
-
33
+
34
34
  This agent uses a search tool to look up answers to the simpler questions
35
35
  in order to answer the original complex question.
36
36
  """
37
37
  CONVERSATIONAL_REACT_DESCRIPTION = "conversational-react-description"
38
38
  CHAT_ZERO_SHOT_REACT_DESCRIPTION = "chat-zero-shot-react-description"
39
39
  """A zero shot agent that does a reasoning step before acting.
40
-
41
- This agent is designed to be used in conjunction
40
+
41
+ This agent is designed to be used in conjunction
42
42
  """
43
43
 
44
44
  CHAT_CONVERSATIONAL_REACT_DESCRIPTION = "chat-conversational-react-description"
@@ -47,7 +47,7 @@ class AgentType(str, Enum):
47
47
  "structured-chat-zero-shot-react-description"
48
48
  )
49
49
  """An zero-shot react agent optimized for chat models.
50
-
50
+
51
51
  This agent is capable of invoking tools that have multiple inputs.
52
52
  """
53
53
 
@@ -49,19 +49,20 @@ class ChatAgent(Agent):
49
49
  return "Thought:"
50
50
 
51
51
  def _construct_scratchpad(
52
- self, intermediate_steps: list[tuple[AgentAction, str]]
52
+ self,
53
+ intermediate_steps: list[tuple[AgentAction, str]],
53
54
  ) -> str:
54
55
  agent_scratchpad = super()._construct_scratchpad(intermediate_steps)
55
56
  if not isinstance(agent_scratchpad, str):
56
- raise ValueError("agent_scratchpad should be of type string.")
57
+ msg = "agent_scratchpad should be of type string."
58
+ raise ValueError(msg) # noqa: TRY004
57
59
  if agent_scratchpad:
58
60
  return (
59
61
  f"This was your previous work "
60
62
  f"(but I haven't seen any of it! I only see what "
61
63
  f"you return as final answer):\n{agent_scratchpad}"
62
64
  )
63
- else:
64
- return agent_scratchpad
65
+ return agent_scratchpad
65
66
 
66
67
  @classmethod
67
68
  def _get_default_output_parser(cls, **kwargs: Any) -> AgentOutputParser:
@@ -106,14 +107,7 @@ class ChatAgent(Agent):
106
107
  tool_strings = "\n".join([f"{tool.name}: {tool.description}" for tool in tools])
107
108
  tool_names = ", ".join([tool.name for tool in tools])
108
109
  format_instructions = format_instructions.format(tool_names=tool_names)
109
- template = "\n\n".join(
110
- [
111
- system_message_prefix,
112
- tool_strings,
113
- format_instructions,
114
- system_message_suffix,
115
- ]
116
- )
110
+ template = f"{system_message_prefix}\n\n{tool_strings}\n\n{format_instructions}\n\n{system_message_suffix}" # noqa: E501
117
111
  messages = [
118
112
  SystemMessagePromptTemplate.from_template(template),
119
113
  HumanMessagePromptTemplate.from_template(human_message),
@@ -45,24 +45,27 @@ class ChatOutputParser(AgentOutputParser):
45
45
  found = self.pattern.search(text)
46
46
  if not found:
47
47
  # Fast fail to parse Final Answer.
48
- raise ValueError("action not found")
48
+ msg = "action not found"
49
+ raise ValueError(msg)
49
50
  action = found.group(1)
50
51
  response = json.loads(action.strip())
51
52
  includes_action = "action" in response
52
53
  if includes_answer and includes_action:
53
- raise OutputParserException(
54
+ msg = (
54
55
  "Parsing LLM output produced a final answer "
55
56
  f"and a parse-able action: {text}"
56
57
  )
58
+ raise OutputParserException(msg)
57
59
  return AgentAction(
58
- response["action"], response.get("action_input", {}), text
60
+ response["action"],
61
+ response.get("action_input", {}),
62
+ text,
59
63
  )
60
64
 
61
65
  except Exception as exc:
62
66
  if not includes_answer:
63
- raise OutputParserException(
64
- f"Could not parse LLM output: {text}"
65
- ) from exc
67
+ msg = f"Could not parse LLM output: {text}"
68
+ raise OutputParserException(msg) from exc
66
69
  output = text.split(FINAL_ANSWER_ACTION)[-1].strip()
67
70
  return AgentFinish({"output": output}, text)
68
71
 
@@ -1,5 +1,4 @@
1
- # flake8: noqa
2
- SYSTEM_MESSAGE_PREFIX = """Answer the following questions as best you can. You have access to the following tools:"""
1
+ SYSTEM_MESSAGE_PREFIX = """Answer the following questions as best you can. You have access to the following tools:""" # noqa: E501
3
2
  FORMAT_INSTRUCTIONS = """The way you use the tools is by specifying a json blob.
4
3
  Specifically, this json should have a `action` key (with the name of the tool to use) and a `action_input` key (with the input to the tool going here).
5
4
 
@@ -25,6 +24,6 @@ $JSON_BLOB
25
24
  Observation: the result of the action
26
25
  ... (this Thought/Action/Observation can repeat N times)
27
26
  Thought: I now know the final answer
28
- Final Answer: the final answer to the original input question"""
29
- SYSTEM_MESSAGE_SUFFIX = """Begin! Reminder to always use the exact characters `Final Answer` when responding."""
27
+ Final Answer: the final answer to the original input question""" # noqa: E501
28
+ SYSTEM_MESSAGE_SUFFIX = """Begin! Reminder to always use the exact characters `Final Answer` when responding.""" # noqa: E501
30
29
  HUMAN_MESSAGE = "{input}\n\n{agent_scratchpad}"
@@ -36,7 +36,9 @@ class ConversationalAgent(Agent):
36
36
 
37
37
  @classmethod
38
38
  def _get_default_output_parser(
39
- cls, ai_prefix: str = "AI", **kwargs: Any
39
+ cls,
40
+ ai_prefix: str = "AI",
41
+ **kwargs: Any,
40
42
  ) -> AgentOutputParser:
41
43
  return ConvoOutputParser(ai_prefix=ai_prefix)
42
44
 
@@ -93,13 +95,15 @@ class ConversationalAgent(Agent):
93
95
  A PromptTemplate with the template assembled from the pieces here.
94
96
  """
95
97
  tool_strings = "\n".join(
96
- [f"> {tool.name}: {tool.description}" for tool in tools]
98
+ [f"> {tool.name}: {tool.description}" for tool in tools],
97
99
  )
98
100
  tool_names = ", ".join([tool.name for tool in tools])
99
101
  format_instructions = format_instructions.format(
100
- tool_names=tool_names, ai_prefix=ai_prefix, human_prefix=human_prefix
102
+ tool_names=tool_names,
103
+ ai_prefix=ai_prefix,
104
+ human_prefix=human_prefix,
101
105
  )
102
- template = "\n\n".join([prefix, tool_strings, format_instructions, suffix])
106
+ template = f"{prefix}\n\n{tool_strings}\n\n{format_instructions}\n\n{suffix}"
103
107
  if input_variables is None:
104
108
  input_variables = ["input", "chat_history", "agent_scratchpad"]
105
109
  return PromptTemplate(template=template, input_variables=input_variables)
@@ -161,7 +165,7 @@ class ConversationalAgent(Agent):
161
165
  )
162
166
  tool_names = [tool.name for tool in tools]
163
167
  _output_parser = output_parser or cls._get_default_output_parser(
164
- ai_prefix=ai_prefix
168
+ ai_prefix=ai_prefix,
165
169
  )
166
170
  return cls(
167
171
  llm_chain=llm_chain,
@@ -34,12 +34,14 @@ class ConvoOutputParser(AgentOutputParser):
34
34
 
35
35
  if f"{self.ai_prefix}:" in text:
36
36
  return AgentFinish(
37
- {"output": text.split(f"{self.ai_prefix}:")[-1].strip()}, text
37
+ {"output": text.split(f"{self.ai_prefix}:")[-1].strip()},
38
+ text,
38
39
  )
39
40
  regex = r"Action: (.*?)[\n]*Action Input: ([\s\S]*)"
40
41
  match = re.search(regex, text, re.DOTALL)
41
42
  if not match:
42
- raise OutputParserException(f"Could not parse LLM output: `{text}`")
43
+ msg = f"Could not parse LLM output: `{text}`"
44
+ raise OutputParserException(msg)
43
45
  action = match.group(1)
44
46
  action_input = match.group(2)
45
47
  return AgentAction(action.strip(), action_input.strip(" ").strip('"'), text)
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  PREFIX = """Assistant is a large language model trained by OpenAI.
3
2
 
4
3
  Assistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.
@@ -10,7 +9,7 @@ Overall, Assistant is a powerful tool that can help with a wide range of tasks a
10
9
  TOOLS:
11
10
  ------
12
11
 
13
- Assistant has access to the following tools:"""
12
+ Assistant has access to the following tools:""" # noqa: E501
14
13
  FORMAT_INSTRUCTIONS = """To use a tool, please use the following format:
15
14
 
16
15
  ```
@@ -25,7 +24,7 @@ When you have a response to say to the Human, or if you do not need to use a too
25
24
  ```
26
25
  Thought: Do I need to use a tool? No
27
26
  {ai_prefix}: [your response here]
28
- ```"""
27
+ ```""" # noqa: E501
29
28
 
30
29
  SUFFIX = """Begin!
31
30
 
@@ -96,15 +96,16 @@ class ConversationalChatAgent(Agent):
96
96
  A PromptTemplate.
97
97
  """
98
98
  tool_strings = "\n".join(
99
- [f"> {tool.name}: {tool.description}" for tool in tools]
99
+ [f"> {tool.name}: {tool.description}" for tool in tools],
100
100
  )
101
101
  tool_names = ", ".join([tool.name for tool in tools])
102
102
  _output_parser = output_parser or cls._get_default_output_parser()
103
103
  format_instructions = human_message.format(
104
- format_instructions=_output_parser.get_format_instructions()
104
+ format_instructions=_output_parser.get_format_instructions(),
105
105
  )
106
106
  final_prompt = format_instructions.format(
107
- tool_names=tool_names, tools=tool_strings
107
+ tool_names=tool_names,
108
+ tools=tool_strings,
108
109
  )
109
110
  if input_variables is None:
110
111
  input_variables = ["input", "chat_history", "agent_scratchpad"]
@@ -117,14 +118,15 @@ class ConversationalChatAgent(Agent):
117
118
  return ChatPromptTemplate(input_variables=input_variables, messages=messages)
118
119
 
119
120
  def _construct_scratchpad(
120
- self, intermediate_steps: list[tuple[AgentAction, str]]
121
+ self,
122
+ intermediate_steps: list[tuple[AgentAction, str]],
121
123
  ) -> list[BaseMessage]:
122
124
  """Construct the scratchpad that lets the agent continue its thought process."""
123
125
  thoughts: list[BaseMessage] = []
124
126
  for action, observation in intermediate_steps:
125
127
  thoughts.append(AIMessage(content=action.log))
126
128
  human_message = HumanMessage(
127
- content=self.template_tool_response.format(observation=observation)
129
+ content=self.template_tool_response.format(observation=observation),
128
130
  )
129
131
  thoughts.append(human_message)
130
132
  return thoughts
@@ -39,20 +39,18 @@ class ConvoOutputParser(AgentOutputParser):
39
39
  # If the action indicates a final answer, return an AgentFinish
40
40
  if action == "Final Answer":
41
41
  return AgentFinish({"output": action_input}, text)
42
- else:
43
- # Otherwise, return an AgentAction with the specified action and
44
- # input
45
- return AgentAction(action, action_input, text)
46
- else:
47
- # If the necessary keys aren't present in the response, raise an
48
- # exception
49
- raise OutputParserException(
50
- f"Missing 'action' or 'action_input' in LLM output: {text}"
51
- )
42
+ # Otherwise, return an AgentAction with the specified action and
43
+ # input
44
+ return AgentAction(action, action_input, text)
45
+ # If the necessary keys aren't present in the response, raise an
46
+ # exception
47
+ msg = f"Missing 'action' or 'action_input' in LLM output: {text}"
48
+ raise OutputParserException(msg)
52
49
  except Exception as e:
53
50
  # If any other exception is raised during parsing, also raise an
54
51
  # OutputParserException
55
- raise OutputParserException(f"Could not parse LLM output: {text}") from e
52
+ msg = f"Could not parse LLM output: {text}"
53
+ raise OutputParserException(msg) from e
56
54
 
57
55
  @property
58
56
  def _type(self) -> str:
@@ -1,11 +1,10 @@
1
- # flake8: noqa
2
1
  PREFIX = """Assistant is a large language model trained by OpenAI.
3
2
 
4
3
  Assistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.
5
4
 
6
5
  Assistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.
7
6
 
8
- Overall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist."""
7
+ Overall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.""" # noqa: E501
9
8
 
10
9
  FORMAT_INSTRUCTIONS = """RESPONSE FORMAT INSTRUCTIONS
11
10
  ----------------------------
@@ -31,7 +30,7 @@ Use this if you want to respond directly to the human. Markdown code snippet for
31
30
  "action": "Final Answer",
32
31
  "action_input": string \\\\ You should put what you want to return to use here
33
32
  }}}}
34
- ```"""
33
+ ```""" # noqa: E501
35
34
 
36
35
  SUFFIX = """TOOLS
37
36
  ------
@@ -45,13 +44,13 @@ USER'S INPUT
45
44
  --------------------
46
45
  Here is the user's input (remember to respond with a markdown code snippet of a json blob with a single action, and NOTHING else):
47
46
 
48
- {{{{input}}}}"""
47
+ {{{{input}}}}""" # noqa: E501
49
48
 
50
- TEMPLATE_TOOL_RESPONSE = """TOOL RESPONSE:
49
+ TEMPLATE_TOOL_RESPONSE = """TOOL RESPONSE:
51
50
  ---------------------
52
51
  {observation}
53
52
 
54
53
  USER'S INPUT
55
54
  --------------------
56
55
 
57
- 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."""
56
+ 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.""" # noqa: E501
@@ -16,10 +16,10 @@ from langchain.agents.format_scratchpad.tools import format_to_tool_messages
16
16
  from langchain.agents.format_scratchpad.xml import format_xml
17
17
 
18
18
  __all__ = [
19
- "format_xml",
19
+ "format_log_to_messages",
20
+ "format_log_to_str",
20
21
  "format_to_openai_function_messages",
21
22
  "format_to_openai_functions",
22
23
  "format_to_tool_messages",
23
- "format_log_to_str",
24
- "format_log_to_messages",
24
+ "format_xml",
25
25
  ]
@@ -20,7 +20,7 @@ def format_log_to_messages(
20
20
  for action, observation in intermediate_steps:
21
21
  thoughts.append(AIMessage(content=action.log))
22
22
  human_message = HumanMessage(
23
- content=template_tool_response.format(observation=observation)
23
+ content=template_tool_response.format(observation=observation),
24
24
  )
25
25
  thoughts.append(human_message)
26
26
  return thoughts
@@ -6,7 +6,8 @@ from langchain_core.messages import AIMessage, BaseMessage, FunctionMessage
6
6
 
7
7
 
8
8
  def _convert_agent_action_to_messages(
9
- agent_action: AgentAction, observation: str
9
+ agent_action: AgentAction,
10
+ observation: str,
10
11
  ) -> list[BaseMessage]:
11
12
  """Convert an agent action to a message.
12
13
 
@@ -20,15 +21,16 @@ def _convert_agent_action_to_messages(
20
21
  the original tool invocation
21
22
  """
22
23
  if isinstance(agent_action, AgentActionMessageLog):
23
- return list(agent_action.message_log) + [
24
- _create_function_message(agent_action, observation)
24
+ return [
25
+ *list(agent_action.message_log),
26
+ _create_function_message(agent_action, observation),
25
27
  ]
26
- else:
27
- return [AIMessage(content=agent_action.log)]
28
+ return [AIMessage(content=agent_action.log)]
28
29
 
29
30
 
30
31
  def _create_function_message(
31
- agent_action: AgentAction, observation: str
32
+ agent_action: AgentAction,
33
+ observation: str,
32
34
  ) -> FunctionMessage:
33
35
  """Convert agent action and observation into a function message.
34
36
  Args:
@@ -12,7 +12,8 @@ from langchain.agents.output_parsers.tools import ToolAgentAction
12
12
 
13
13
 
14
14
  def _create_tool_message(
15
- agent_action: ToolAgentAction, observation: str
15
+ agent_action: ToolAgentAction,
16
+ observation: str,
16
17
  ) -> ToolMessage:
17
18
  """Convert agent action and observation into a tool message.
18
19
 
@@ -54,8 +55,9 @@ def format_to_tool_messages(
54
55
  messages = []
55
56
  for agent_action, observation in intermediate_steps:
56
57
  if isinstance(agent_action, ToolAgentAction):
57
- new_messages = list(agent_action.message_log) + [
58
- _create_tool_message(agent_action, observation)
58
+ new_messages = [
59
+ *list(agent_action.message_log),
60
+ _create_tool_message(agent_action, observation),
59
61
  ]
60
62
  messages.extend([new for new in new_messages if new not in messages])
61
63
  else:
@@ -1,21 +1,52 @@
1
+ from typing import Literal, Optional
2
+
1
3
  from langchain_core.agents import AgentAction
2
4
 
3
5
 
6
+ def _escape(xml: str) -> str:
7
+ """Replace XML tags with custom safe delimiters."""
8
+ replacements = {
9
+ "<tool>": "[[tool]]",
10
+ "</tool>": "[[/tool]]",
11
+ "<tool_input>": "[[tool_input]]",
12
+ "</tool_input>": "[[/tool_input]]",
13
+ "<observation>": "[[observation]]",
14
+ "</observation>": "[[/observation]]",
15
+ }
16
+ for orig, repl in replacements.items():
17
+ xml = xml.replace(orig, repl)
18
+ return xml
19
+
20
+
4
21
  def format_xml(
5
22
  intermediate_steps: list[tuple[AgentAction, str]],
23
+ *,
24
+ escape_format: Optional[Literal["minimal"]] = "minimal",
6
25
  ) -> str:
7
26
  """Format the intermediate steps as XML.
8
27
 
9
28
  Args:
10
29
  intermediate_steps: The intermediate steps.
30
+ escape_format: The escaping format to use. Currently only 'minimal' is
31
+ supported, which replaces XML tags with custom delimiters to prevent
32
+ conflicts.
11
33
 
12
34
  Returns:
13
35
  The intermediate steps as XML.
14
36
  """
15
37
  log = ""
16
38
  for action, observation in intermediate_steps:
39
+ if escape_format == "minimal":
40
+ # Escape XML tags in tool names and inputs using custom delimiters
41
+ tool = _escape(action.tool)
42
+ tool_input = _escape(str(action.tool_input))
43
+ observation_ = _escape(str(observation))
44
+ else:
45
+ tool = action.tool
46
+ tool_input = str(action.tool_input)
47
+ observation_ = str(observation)
17
48
  log += (
18
- f"<tool>{action.tool}</tool><tool_input>{action.tool_input}"
19
- f"</tool_input><observation>{observation}</observation>"
49
+ f"<tool>{tool}</tool><tool_input>{tool_input}"
50
+ f"</tool_input><observation>{observation_}</observation>"
20
51
  )
21
52
  return log
@@ -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
93
  tags_.append(agent_obj._agent_type)
85
- except NotImplementedError:
86
- pass
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,