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
@@ -3,6 +3,7 @@ from typing import Any, Union
3
3
  from langchain_core._api import deprecated
4
4
  from langchain_core.messages import BaseMessage, get_buffer_string
5
5
  from langchain_core.utils import pre_init
6
+ from typing_extensions import override
6
7
 
7
8
  from langchain.memory.chat_memory import BaseChatMemory
8
9
  from langchain.memory.summary import SummarizerMixin
@@ -46,35 +47,41 @@ class ConversationSummaryBufferMemory(BaseChatMemory, SummarizerMixin):
46
47
  """
47
48
  return [self.memory_key]
48
49
 
50
+ @override
49
51
  def load_memory_variables(self, inputs: dict[str, Any]) -> dict[str, Any]:
50
52
  """Return history buffer."""
51
53
  buffer = self.chat_memory.messages
52
54
  if self.moving_summary_buffer != "":
53
55
  first_messages: list[BaseMessage] = [
54
- self.summary_message_cls(content=self.moving_summary_buffer)
56
+ self.summary_message_cls(content=self.moving_summary_buffer),
55
57
  ]
56
58
  buffer = first_messages + buffer
57
59
  if self.return_messages:
58
60
  final_buffer: Any = buffer
59
61
  else:
60
62
  final_buffer = get_buffer_string(
61
- buffer, human_prefix=self.human_prefix, ai_prefix=self.ai_prefix
63
+ buffer,
64
+ human_prefix=self.human_prefix,
65
+ ai_prefix=self.ai_prefix,
62
66
  )
63
67
  return {self.memory_key: final_buffer}
64
68
 
69
+ @override
65
70
  async def aload_memory_variables(self, inputs: dict[str, Any]) -> dict[str, Any]:
66
71
  """Asynchronously return key-value pairs given the text input to the chain."""
67
72
  buffer = await self.chat_memory.aget_messages()
68
73
  if self.moving_summary_buffer != "":
69
74
  first_messages: list[BaseMessage] = [
70
- self.summary_message_cls(content=self.moving_summary_buffer)
75
+ self.summary_message_cls(content=self.moving_summary_buffer),
71
76
  ]
72
77
  buffer = first_messages + buffer
73
78
  if self.return_messages:
74
79
  final_buffer: Any = buffer
75
80
  else:
76
81
  final_buffer = get_buffer_string(
77
- buffer, human_prefix=self.human_prefix, ai_prefix=self.ai_prefix
82
+ buffer,
83
+ human_prefix=self.human_prefix,
84
+ ai_prefix=self.ai_prefix,
78
85
  )
79
86
  return {self.memory_key: final_buffer}
80
87
 
@@ -84,10 +91,11 @@ class ConversationSummaryBufferMemory(BaseChatMemory, SummarizerMixin):
84
91
  prompt_variables = values["prompt"].input_variables
85
92
  expected_keys = {"summary", "new_lines"}
86
93
  if expected_keys != set(prompt_variables):
87
- raise ValueError(
94
+ msg = (
88
95
  "Got unexpected prompt input variables. The prompt expects "
89
96
  f"{prompt_variables}, but it should have {expected_keys}."
90
97
  )
98
+ raise ValueError(msg)
91
99
  return values
92
100
 
93
101
  def save_context(self, inputs: dict[str, Any], outputs: dict[str, str]) -> None:
@@ -96,7 +104,9 @@ class ConversationSummaryBufferMemory(BaseChatMemory, SummarizerMixin):
96
104
  self.prune()
97
105
 
98
106
  async def asave_context(
99
- self, inputs: dict[str, Any], outputs: dict[str, str]
107
+ self,
108
+ inputs: dict[str, Any],
109
+ outputs: dict[str, str],
100
110
  ) -> None:
101
111
  """Asynchronously save context from this conversation to buffer."""
102
112
  await super().asave_context(inputs, outputs)
@@ -112,7 +122,8 @@ class ConversationSummaryBufferMemory(BaseChatMemory, SummarizerMixin):
112
122
  pruned_memory.append(buffer.pop(0))
113
123
  curr_buffer_length = self.llm.get_num_tokens_from_messages(buffer)
114
124
  self.moving_summary_buffer = self.predict_new_summary(
115
- pruned_memory, self.moving_summary_buffer
125
+ pruned_memory,
126
+ self.moving_summary_buffer,
116
127
  )
117
128
 
118
129
  async def aprune(self) -> None:
@@ -125,7 +136,8 @@ class ConversationSummaryBufferMemory(BaseChatMemory, SummarizerMixin):
125
136
  pruned_memory.append(buffer.pop(0))
126
137
  curr_buffer_length = self.llm.get_num_tokens_from_messages(buffer)
127
138
  self.moving_summary_buffer = await self.apredict_new_summary(
128
- pruned_memory, self.moving_summary_buffer
139
+ pruned_memory,
140
+ self.moving_summary_buffer,
129
141
  )
130
142
 
131
143
  def clear(self) -> None:
@@ -3,6 +3,7 @@ from typing import Any
3
3
  from langchain_core._api import deprecated
4
4
  from langchain_core.language_models import BaseLanguageModel
5
5
  from langchain_core.messages import BaseMessage, get_buffer_string
6
+ from typing_extensions import override
6
7
 
7
8
  from langchain.memory.chat_memory import BaseChatMemory
8
9
 
@@ -55,6 +56,7 @@ class ConversationTokenBufferMemory(BaseChatMemory):
55
56
  """
56
57
  return [self.memory_key]
57
58
 
59
+ @override
58
60
  def load_memory_variables(self, inputs: dict[str, Any]) -> dict[str, Any]:
59
61
  """Return history buffer."""
60
62
  return {self.memory_key: self.buffer}
langchain/memory/utils.py CHANGED
@@ -14,7 +14,8 @@ def get_prompt_input_key(inputs: dict[str, Any], memory_variables: list[str]) ->
14
14
  """
15
15
  # "stop" is a special key that can be passed as input but is not used to
16
16
  # format the prompt.
17
- prompt_input_keys = list(set(inputs).difference(memory_variables + ["stop"]))
17
+ prompt_input_keys = list(set(inputs).difference([*memory_variables, "stop"]))
18
18
  if len(prompt_input_keys) != 1:
19
- raise ValueError(f"One input key expected got {prompt_input_keys}")
19
+ msg = f"One input key expected got {prompt_input_keys}"
20
+ raise ValueError(msg)
20
21
  return prompt_input_keys[0]
@@ -52,7 +52,8 @@ class VectorStoreRetrieverMemory(BaseMemory):
52
52
  return self.input_key
53
53
 
54
54
  def _documents_to_memory_variables(
55
- self, docs: list[Document]
55
+ self,
56
+ docs: list[Document],
56
57
  ) -> dict[str, Union[list[Document], str]]:
57
58
  result: Union[list[Document], str]
58
59
  if not self.return_docs:
@@ -62,7 +63,8 @@ class VectorStoreRetrieverMemory(BaseMemory):
62
63
  return {self.memory_key: result}
63
64
 
64
65
  def load_memory_variables(
65
- self, inputs: dict[str, Any]
66
+ self,
67
+ inputs: dict[str, Any],
66
68
  ) -> dict[str, Union[list[Document], str]]:
67
69
  """Return history buffer."""
68
70
  input_key = self._get_prompt_input_key(inputs)
@@ -71,7 +73,8 @@ class VectorStoreRetrieverMemory(BaseMemory):
71
73
  return self._documents_to_memory_variables(docs)
72
74
 
73
75
  async def aload_memory_variables(
74
- self, inputs: dict[str, Any]
76
+ self,
77
+ inputs: dict[str, Any],
75
78
  ) -> dict[str, Union[list[Document], str]]:
76
79
  """Return history buffer."""
77
80
  input_key = self._get_prompt_input_key(inputs)
@@ -80,7 +83,9 @@ class VectorStoreRetrieverMemory(BaseMemory):
80
83
  return self._documents_to_memory_variables(docs)
81
84
 
82
85
  def _form_documents(
83
- self, inputs: dict[str, Any], outputs: dict[str, str]
86
+ self,
87
+ inputs: dict[str, Any],
88
+ outputs: dict[str, str],
84
89
  ) -> list[Document]:
85
90
  """Format context from this conversation to buffer."""
86
91
  # Each document should only include the current turn, not the chat history
@@ -100,7 +105,9 @@ class VectorStoreRetrieverMemory(BaseMemory):
100
105
  self.retriever.add_documents(documents)
101
106
 
102
107
  async def asave_context(
103
- self, inputs: dict[str, Any], outputs: dict[str, str]
108
+ self,
109
+ inputs: dict[str, Any],
110
+ outputs: dict[str, str],
104
111
  ) -> None:
105
112
  """Save context from this conversation to buffer."""
106
113
  documents = self._form_documents(inputs, outputs)
@@ -23,7 +23,7 @@ from langchain.text_splitter import RecursiveCharacterTextSplitter
23
23
  DEFAULT_HISTORY_TEMPLATE = """
24
24
  Current date and time: {current_time}.
25
25
 
26
- Potentially relevant timestamped excerpts of previous conversations (you
26
+ Potentially relevant timestamped excerpts of previous conversations (you
27
27
  do not need to use these if irrelevant):
28
28
  {previous_history}
29
29
 
@@ -131,13 +131,13 @@ class ConversationVectorStoreTokenBufferMemory(ConversationTokenBufferMemory):
131
131
  previous_history = ""
132
132
  current_history = super().load_memory_variables(inputs)
133
133
  template = SystemMessagePromptTemplate.from_template(
134
- self.previous_history_template
134
+ self.previous_history_template,
135
135
  )
136
136
  messages = [
137
137
  template.format(
138
138
  previous_history=previous_history,
139
139
  current_time=datetime.now().astimezone().strftime(TIMESTAMP_FORMAT),
140
- )
140
+ ),
141
141
  ]
142
142
  messages.extend(current_history[self.memory_key])
143
143
  return {self.memory_key: messages}
@@ -167,7 +167,7 @@ class ConversationVectorStoreTokenBufferMemory(ConversationTokenBufferMemory):
167
167
  self._pop_and_store_interaction(buffer)
168
168
 
169
169
  def _pop_and_store_interaction(self, buffer: list[BaseMessage]) -> None:
170
- input = buffer.pop(0)
170
+ input_ = buffer.pop(0)
171
171
  output = buffer.pop(0)
172
172
  timestamp = self._timestamps.pop(0).strftime(TIMESTAMP_FORMAT)
173
173
  # Split AI output into smaller chunks to avoid creating documents
@@ -175,7 +175,7 @@ class ConversationVectorStoreTokenBufferMemory(ConversationTokenBufferMemory):
175
175
  ai_chunks = self._split_long_ai_text(str(output.content))
176
176
  for index, chunk in enumerate(ai_chunks):
177
177
  self.memory_retriever.save_context(
178
- {"Human": f"<{timestamp}/00> {str(input.content)}"},
178
+ {"Human": f"<{timestamp}/00> {input_.content!s}"},
179
179
  {"AI": f"<{timestamp}/{index:02}> {chunk}"},
180
180
  )
181
181
 
@@ -34,24 +34,26 @@ class ModelLaboratory:
34
34
  """
35
35
  for chain in chains:
36
36
  if not isinstance(chain, Chain):
37
- raise ValueError(
37
+ msg = (
38
38
  "ModelLaboratory should now be initialized with Chains. "
39
39
  "If you want to initialize with LLMs, use the `from_llms` method "
40
40
  "instead (`ModelLaboratory.from_llms(...)`)"
41
41
  )
42
+ raise ValueError(msg) # noqa: TRY004
42
43
  if len(chain.input_keys) != 1:
43
- raise ValueError(
44
+ msg = (
44
45
  "Currently only support chains with one input variable, "
45
46
  f"got {chain.input_keys}"
46
47
  )
48
+ raise ValueError(msg)
47
49
  if len(chain.output_keys) != 1:
48
- raise ValueError(
50
+ msg = (
49
51
  "Currently only support chains with one output variable, "
50
52
  f"got {chain.output_keys}"
51
53
  )
52
- if names is not None:
53
- if len(names) != len(chains):
54
- raise ValueError("Length of chains does not match length of names.")
54
+ if names is not None and len(names) != len(chains):
55
+ msg = "Length of chains does not match length of names."
56
+ raise ValueError(msg)
55
57
  self.chains = chains
56
58
  chain_range = [str(i) for i in range(len(self.chains))]
57
59
  self.chain_colors = get_color_mapping(chain_range)
@@ -59,7 +61,9 @@ class ModelLaboratory:
59
61
 
60
62
  @classmethod
61
63
  def from_llms(
62
- cls, llms: list[BaseLLM], prompt: Optional[PromptTemplate] = None
64
+ cls,
65
+ llms: list[BaseLLM],
66
+ prompt: Optional[PromptTemplate] = None,
63
67
  ) -> ModelLaboratory:
64
68
  """Initialize the ModelLaboratory with LLMs and an optional prompt.
65
69
 
@@ -89,10 +93,7 @@ class ModelLaboratory:
89
93
  """
90
94
  print(f"\033[1mInput:\033[0m\n{text}\n") # noqa: T201
91
95
  for i, chain in enumerate(self.chains):
92
- if self.names is not None:
93
- name = self.names[i]
94
- else:
95
- name = str(chain)
96
+ name = self.names[i] if self.names is not None else str(chain)
96
97
  print_text(name, end="\n")
97
98
  output = chain.run(text)
98
99
  print_text(output, color=self.chain_colors[str(i)], end="\n\n")
@@ -49,7 +49,7 @@ if TYPE_CHECKING:
49
49
  # Used to consolidate logic for raising deprecation warnings and
50
50
  # handling optional imports.
51
51
  DEPRECATED_LOOKUP = {
52
- "GuardrailsOutputParser": "langchain_community.output_parsers.rail_parser"
52
+ "GuardrailsOutputParser": "langchain_community.output_parsers.rail_parser",
53
53
  }
54
54
 
55
55
  _import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
@@ -67,12 +67,15 @@ __all__ = [
67
67
  "DatetimeOutputParser",
68
68
  "EnumOutputParser",
69
69
  "GuardrailsOutputParser",
70
+ "JsonOutputKeyToolsParser",
71
+ "JsonOutputToolsParser",
70
72
  "ListOutputParser",
71
73
  "MarkdownListOutputParser",
72
74
  "NumberedListOutputParser",
73
75
  "OutputFixingParser",
74
76
  "PandasDataFrameOutputParser",
75
77
  "PydanticOutputParser",
78
+ "PydanticToolsParser",
76
79
  "RegexDictParser",
77
80
  "RegexParser",
78
81
  "ResponseSchema",
@@ -80,8 +83,5 @@ __all__ = [
80
83
  "RetryWithErrorOutputParser",
81
84
  "StructuredOutputParser",
82
85
  "XMLOutputParser",
83
- "JsonOutputToolsParser",
84
- "PydanticToolsParser",
85
- "JsonOutputKeyToolsParser",
86
86
  "YamlOutputParser",
87
87
  ]
@@ -28,22 +28,25 @@ class BooleanOutputParser(BaseOutputParser[bool]):
28
28
  }
29
29
  if self.true_val.upper() in truthy:
30
30
  if self.false_val.upper() in truthy:
31
- raise ValueError(
31
+ msg = (
32
32
  f"Ambiguous response. Both {self.true_val} and {self.false_val} "
33
33
  f"in received: {text}."
34
34
  )
35
+ raise ValueError(msg)
35
36
  return True
36
- elif self.false_val.upper() in truthy:
37
+ if self.false_val.upper() in truthy:
37
38
  if self.true_val.upper() in truthy:
38
- raise ValueError(
39
+ msg = (
39
40
  f"Ambiguous response. Both {self.true_val} and {self.false_val} "
40
41
  f"in received: {text}."
41
42
  )
43
+ raise ValueError(msg)
42
44
  return False
43
- raise ValueError(
45
+ msg = (
44
46
  f"BooleanOutputParser expected output value to include either "
45
47
  f"{self.true_val} or {self.false_val}. Received {text}."
46
48
  )
49
+ raise ValueError(msg)
47
50
 
48
51
  @property
49
52
  def _type(self) -> str:
@@ -4,6 +4,9 @@ from typing import Any
4
4
 
5
5
  from langchain_core.output_parsers import BaseOutputParser
6
6
  from langchain_core.utils import pre_init
7
+ from typing_extensions import override
8
+
9
+ _MIN_PARSERS = 2
7
10
 
8
11
 
9
12
  class CombiningOutputParser(BaseOutputParser[dict[str, Any]]):
@@ -12,6 +15,7 @@ class CombiningOutputParser(BaseOutputParser[dict[str, Any]]):
12
15
  parsers: list[BaseOutputParser]
13
16
 
14
17
  @classmethod
18
+ @override
15
19
  def is_lc_serializable(cls) -> bool:
16
20
  return True
17
21
 
@@ -19,13 +23,16 @@ class CombiningOutputParser(BaseOutputParser[dict[str, Any]]):
19
23
  def validate_parsers(cls, values: dict[str, Any]) -> dict[str, Any]:
20
24
  """Validate the parsers."""
21
25
  parsers = values["parsers"]
22
- if len(parsers) < 2:
23
- raise ValueError("Must have at least two parsers")
26
+ if len(parsers) < _MIN_PARSERS:
27
+ msg = "Must have at least two parsers"
28
+ raise ValueError(msg)
24
29
  for parser in parsers:
25
- if parser._type == "combining":
26
- raise ValueError("Cannot nest combining parsers")
27
- if parser._type == "list":
28
- raise ValueError("Cannot combine list parsers")
30
+ if parser._type == "combining": # noqa: SLF001
31
+ msg = "Cannot nest combining parsers"
32
+ raise ValueError(msg)
33
+ if parser._type == "list": # noqa: SLF001
34
+ msg = "Cannot combine list parsers"
35
+ raise ValueError(msg)
29
36
  return values
30
37
 
31
38
  @property
@@ -46,7 +53,7 @@ class CombiningOutputParser(BaseOutputParser[dict[str, Any]]):
46
53
  def parse(self, text: str) -> dict[str, Any]:
47
54
  """Parse the output of an LLM call."""
48
55
  texts = text.split("\n\n")
49
- output = dict()
56
+ output = {}
50
57
  for txt, parser in zip(texts, self.parsers):
51
58
  output.update(parser.parse(txt.strip()))
52
59
  return output
@@ -1,42 +1,43 @@
1
- import random
2
- from datetime import datetime, timedelta
1
+ from datetime import datetime, timedelta, timezone
3
2
 
4
3
  from langchain_core.exceptions import OutputParserException
5
4
  from langchain_core.output_parsers import BaseOutputParser
6
5
  from langchain_core.utils import comma_list
7
6
 
8
7
 
9
- def _generate_random_datetime_strings(
10
- pattern: str,
11
- n: int = 3,
12
- start_date: datetime = datetime(1, 1, 1),
13
- end_date: datetime = datetime.now() + timedelta(days=3650),
14
- ) -> list[str]:
15
- """Generates n random datetime strings conforming to the
16
- given pattern within the specified date range.
17
-
18
- Pattern should be a string containing the desired format codes.
19
- start_date and end_date should be datetime objects representing
20
- the start and end of the date range.
21
- """
22
- examples = []
23
- delta = end_date - start_date
24
- for i in range(n):
25
- random_delta = random.uniform(0, delta.total_seconds())
26
- dt = start_date + timedelta(seconds=random_delta)
27
- date_string = dt.strftime(pattern)
28
- examples.append(date_string)
29
- return examples
30
-
31
-
32
8
  class DatetimeOutputParser(BaseOutputParser[datetime]):
33
9
  """Parse the output of an LLM call to a datetime."""
34
10
 
35
11
  format: str = "%Y-%m-%dT%H:%M:%S.%fZ"
36
- """The string value that used as the datetime format."""
12
+ """The string value that is used as the datetime format.
13
+
14
+ Update this to match the desired datetime format for your application.
15
+ """
37
16
 
38
17
  def get_format_instructions(self) -> str:
39
- examples = comma_list(_generate_random_datetime_strings(self.format))
18
+ """Returns the format instructions for the given format."""
19
+ if self.format == "%Y-%m-%dT%H:%M:%S.%fZ":
20
+ examples = comma_list(
21
+ [
22
+ "2023-07-04T14:30:00.000000Z",
23
+ "1999-12-31T23:59:59.999999Z",
24
+ "2025-01-01T00:00:00.000000Z",
25
+ ],
26
+ )
27
+ else:
28
+ try:
29
+ now = datetime.now(tz=timezone.utc)
30
+ examples = comma_list(
31
+ [
32
+ now.strftime(self.format),
33
+ (now.replace(year=now.year - 1)).strftime(self.format),
34
+ (now - timedelta(days=1)).strftime(self.format),
35
+ ],
36
+ )
37
+ except ValueError:
38
+ # Fallback if the format is very unusual
39
+ examples = f"e.g., a valid string in the format {self.format}"
40
+
40
41
  return (
41
42
  f"Write a datetime string that matches the "
42
43
  f"following pattern: '{self.format}'.\n\n"
@@ -45,12 +46,12 @@ class DatetimeOutputParser(BaseOutputParser[datetime]):
45
46
  )
46
47
 
47
48
  def parse(self, response: str) -> datetime:
49
+ """Parse a string into a datetime object."""
48
50
  try:
49
- return datetime.strptime(response.strip(), self.format)
51
+ return datetime.strptime(response.strip(), self.format) # noqa: DTZ007
50
52
  except ValueError as e:
51
- raise OutputParserException(
52
- f"Could not parse datetime string: {response}"
53
- ) from e
53
+ msg = f"Could not parse datetime string: {response}"
54
+ raise OutputParserException(msg) from e
54
55
 
55
56
  @property
56
57
  def _type(self) -> str:
@@ -3,6 +3,7 @@ from enum import Enum
3
3
  from langchain_core.exceptions import OutputParserException
4
4
  from langchain_core.output_parsers import BaseOutputParser
5
5
  from langchain_core.utils import pre_init
6
+ from typing_extensions import override
6
7
 
7
8
 
8
9
  class EnumOutputParser(BaseOutputParser[Enum]):
@@ -12,28 +13,33 @@ class EnumOutputParser(BaseOutputParser[Enum]):
12
13
  """The enum to parse. Its values must be strings."""
13
14
 
14
15
  @pre_init
15
- def raise_deprecation(cls, values: dict) -> dict:
16
+ def _raise_deprecation(cls, values: dict) -> dict:
16
17
  enum = values["enum"]
17
18
  if not all(isinstance(e.value, str) for e in enum):
18
- raise ValueError("Enum values must be strings")
19
+ msg = "Enum values must be strings"
20
+ raise ValueError(msg)
19
21
  return values
20
22
 
21
23
  @property
22
24
  def _valid_values(self) -> list[str]:
23
25
  return [e.value for e in self.enum]
24
26
 
27
+ @override
25
28
  def parse(self, response: str) -> Enum:
26
29
  try:
27
30
  return self.enum(response.strip())
28
- except ValueError:
29
- raise OutputParserException(
31
+ except ValueError as e:
32
+ msg = (
30
33
  f"Response '{response}' is not one of the "
31
34
  f"expected values: {self._valid_values}"
32
35
  )
36
+ raise OutputParserException(msg) from e
33
37
 
38
+ @override
34
39
  def get_format_instructions(self) -> str:
35
40
  return f"Select one of the following options: {', '.join(self._valid_values)}"
36
41
 
37
42
  @property
43
+ @override
38
44
  def OutputType(self) -> type[Enum]:
39
45
  return self.enum