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
@@ -9,7 +9,7 @@ from langchain_core.prompt_values import PromptValue
9
9
  from langchain_core.prompts import BasePromptTemplate, PromptTemplate
10
10
  from langchain_core.runnables import RunnableSerializable
11
11
  from pydantic import SkipValidation
12
- from typing_extensions import TypedDict
12
+ from typing_extensions import TypedDict, override
13
13
 
14
14
  NAIVE_COMPLETION_RETRY = """Prompt:
15
15
  {prompt}
@@ -30,18 +30,22 @@ Please try again:"""
30
30
 
31
31
  NAIVE_RETRY_PROMPT = PromptTemplate.from_template(NAIVE_COMPLETION_RETRY)
32
32
  NAIVE_RETRY_WITH_ERROR_PROMPT = PromptTemplate.from_template(
33
- NAIVE_COMPLETION_RETRY_WITH_ERROR
33
+ NAIVE_COMPLETION_RETRY_WITH_ERROR,
34
34
  )
35
35
 
36
36
  T = TypeVar("T")
37
37
 
38
38
 
39
39
  class RetryOutputParserRetryChainInput(TypedDict):
40
+ """Retry chain input for RetryOutputParser."""
41
+
40
42
  prompt: str
41
43
  completion: str
42
44
 
43
45
 
44
46
  class RetryWithErrorOutputParserRetryChainInput(TypedDict):
47
+ """Retry chain input for RetryWithErrorOutputParser."""
48
+
45
49
  prompt: str
46
50
  completion: str
47
51
  error: str
@@ -104,25 +108,25 @@ class RetryOutputParser(BaseOutputParser[T]):
104
108
  while retries <= self.max_retries:
105
109
  try:
106
110
  return self.parser.parse(completion)
107
- except OutputParserException as e:
111
+ except OutputParserException:
108
112
  if retries == self.max_retries:
109
- raise e
113
+ raise
114
+ retries += 1
115
+ if self.legacy and hasattr(self.retry_chain, "run"):
116
+ completion = self.retry_chain.run(
117
+ prompt=prompt_value.to_string(),
118
+ completion=completion,
119
+ )
110
120
  else:
111
- retries += 1
112
- if self.legacy and hasattr(self.retry_chain, "run"):
113
- completion = self.retry_chain.run(
114
- prompt=prompt_value.to_string(),
115
- completion=completion,
116
- )
117
- else:
118
- completion = self.retry_chain.invoke(
119
- dict(
120
- prompt=prompt_value.to_string(),
121
- completion=completion,
122
- )
123
- )
124
-
125
- raise OutputParserException("Failed to parse")
121
+ completion = self.retry_chain.invoke(
122
+ {
123
+ "prompt": prompt_value.to_string(),
124
+ "completion": completion,
125
+ },
126
+ )
127
+
128
+ msg = "Failed to parse"
129
+ raise OutputParserException(msg)
126
130
 
127
131
  async def aparse_with_prompt(self, completion: str, prompt_value: PromptValue) -> T:
128
132
  """Parse the output of an LLM call using a wrapped parser.
@@ -141,30 +145,31 @@ class RetryOutputParser(BaseOutputParser[T]):
141
145
  return await self.parser.aparse(completion)
142
146
  except OutputParserException as e:
143
147
  if retries == self.max_retries:
144
- raise e
148
+ raise
149
+ retries += 1
150
+ if self.legacy and hasattr(self.retry_chain, "arun"):
151
+ completion = await self.retry_chain.arun(
152
+ prompt=prompt_value.to_string(),
153
+ completion=completion,
154
+ error=repr(e),
155
+ )
145
156
  else:
146
- retries += 1
147
- if self.legacy and hasattr(self.retry_chain, "arun"):
148
- completion = await self.retry_chain.arun(
149
- prompt=prompt_value.to_string(),
150
- completion=completion,
151
- error=repr(e),
152
- )
153
- else:
154
- completion = await self.retry_chain.ainvoke(
155
- dict(
156
- prompt=prompt_value.to_string(),
157
- completion=completion,
158
- )
159
- )
160
-
161
- raise OutputParserException("Failed to parse")
157
+ completion = await self.retry_chain.ainvoke(
158
+ {
159
+ "prompt": prompt_value.to_string(),
160
+ "completion": completion,
161
+ },
162
+ )
162
163
 
164
+ msg = "Failed to parse"
165
+ raise OutputParserException(msg)
166
+
167
+ @override
163
168
  def parse(self, completion: str) -> T:
164
- raise NotImplementedError(
165
- "This OutputParser can only be called by the `parse_with_prompt` method."
166
- )
169
+ msg = "This OutputParser can only be called by the `parse_with_prompt` method."
170
+ raise NotImplementedError(msg)
167
171
 
172
+ @override
168
173
  def get_format_instructions(self) -> str:
169
174
  return self.parser.get_format_instructions()
170
175
 
@@ -173,6 +178,7 @@ class RetryOutputParser(BaseOutputParser[T]):
173
178
  return "retry"
174
179
 
175
180
  @property
181
+ @override
176
182
  def OutputType(self) -> type[T]:
177
183
  return self.parser.OutputType
178
184
 
@@ -192,7 +198,8 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
192
198
  # Should be an LLMChain but we want to avoid top-level imports from langchain.chains
193
199
  retry_chain: Annotated[
194
200
  Union[
195
- RunnableSerializable[RetryWithErrorOutputParserRetryChainInput, str], Any
201
+ RunnableSerializable[RetryWithErrorOutputParserRetryChainInput, str],
202
+ Any,
196
203
  ],
197
204
  SkipValidation(),
198
205
  ]
@@ -224,6 +231,7 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
224
231
  chain = prompt | llm | StrOutputParser()
225
232
  return cls(parser=parser, retry_chain=chain, max_retries=max_retries)
226
233
 
234
+ @override
227
235
  def parse_with_prompt(self, completion: str, prompt_value: PromptValue) -> T:
228
236
  retries = 0
229
237
 
@@ -232,27 +240,36 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
232
240
  return self.parser.parse(completion)
233
241
  except OutputParserException as e:
234
242
  if retries == self.max_retries:
235
- raise e
243
+ raise
244
+ retries += 1
245
+ if self.legacy and hasattr(self.retry_chain, "run"):
246
+ completion = self.retry_chain.run(
247
+ prompt=prompt_value.to_string(),
248
+ completion=completion,
249
+ error=repr(e),
250
+ )
236
251
  else:
237
- retries += 1
238
- if self.legacy and hasattr(self.retry_chain, "run"):
239
- completion = self.retry_chain.run(
240
- prompt=prompt_value.to_string(),
241
- completion=completion,
242
- error=repr(e),
243
- )
244
- else:
245
- completion = self.retry_chain.invoke(
246
- dict(
247
- completion=completion,
248
- prompt=prompt_value.to_string(),
249
- error=repr(e),
250
- )
251
- )
252
-
253
- raise OutputParserException("Failed to parse")
252
+ completion = self.retry_chain.invoke(
253
+ {
254
+ "completion": completion,
255
+ "prompt": prompt_value.to_string(),
256
+ "error": repr(e),
257
+ },
258
+ )
259
+
260
+ msg = "Failed to parse"
261
+ raise OutputParserException(msg)
254
262
 
255
263
  async def aparse_with_prompt(self, completion: str, prompt_value: PromptValue) -> T:
264
+ """Parse the output of an LLM call using a wrapped parser.
265
+
266
+ Args:
267
+ completion: The chain completion to parse.
268
+ prompt_value: The prompt to use to parse the completion.
269
+
270
+ Returns:
271
+ The parsed completion.
272
+ """
256
273
  retries = 0
257
274
 
258
275
  while retries <= self.max_retries:
@@ -260,31 +277,32 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
260
277
  return await self.parser.aparse(completion)
261
278
  except OutputParserException as e:
262
279
  if retries == self.max_retries:
263
- raise e
280
+ raise
281
+ retries += 1
282
+ if self.legacy and hasattr(self.retry_chain, "arun"):
283
+ completion = await self.retry_chain.arun(
284
+ prompt=prompt_value.to_string(),
285
+ completion=completion,
286
+ error=repr(e),
287
+ )
264
288
  else:
265
- retries += 1
266
- if self.legacy and hasattr(self.retry_chain, "arun"):
267
- completion = await self.retry_chain.arun(
268
- prompt=prompt_value.to_string(),
269
- completion=completion,
270
- error=repr(e),
271
- )
272
- else:
273
- completion = await self.retry_chain.ainvoke(
274
- dict(
275
- prompt=prompt_value.to_string(),
276
- completion=completion,
277
- error=repr(e),
278
- )
279
- )
280
-
281
- raise OutputParserException("Failed to parse")
282
-
289
+ completion = await self.retry_chain.ainvoke(
290
+ {
291
+ "prompt": prompt_value.to_string(),
292
+ "completion": completion,
293
+ "error": repr(e),
294
+ },
295
+ )
296
+
297
+ msg = "Failed to parse"
298
+ raise OutputParserException(msg)
299
+
300
+ @override
283
301
  def parse(self, completion: str) -> T:
284
- raise NotImplementedError(
285
- "This OutputParser can only be called by the `parse_with_prompt` method."
286
- )
302
+ msg = "This OutputParser can only be called by the `parse_with_prompt` method."
303
+ raise NotImplementedError(msg)
287
304
 
305
+ @override
288
306
  def get_format_instructions(self) -> str:
289
307
  return self.parser.get_format_instructions()
290
308
 
@@ -293,5 +311,6 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
293
311
  return "retry_with_error"
294
312
 
295
313
  @property
314
+ @override
296
315
  def OutputType(self) -> type[T]:
297
316
  return self.parser.OutputType
@@ -5,6 +5,7 @@ from typing import Any
5
5
  from langchain_core.output_parsers import BaseOutputParser
6
6
  from langchain_core.output_parsers.json import parse_and_check_json_markdown
7
7
  from pydantic import BaseModel
8
+ from typing_extensions import override
8
9
 
9
10
  from langchain.output_parsers.format_instructions import (
10
11
  STRUCTURED_FORMAT_INSTRUCTIONS,
@@ -27,7 +28,9 @@ class ResponseSchema(BaseModel):
27
28
 
28
29
  def _get_sub_string(schema: ResponseSchema) -> str:
29
30
  return line_template.format(
30
- name=schema.name, description=schema.description, type=schema.type
31
+ name=schema.name,
32
+ description=schema.description,
33
+ type=schema.type,
31
34
  )
32
35
 
33
36
 
@@ -39,11 +42,23 @@ class StructuredOutputParser(BaseOutputParser[dict[str, Any]]):
39
42
 
40
43
  @classmethod
41
44
  def from_response_schemas(
42
- cls, response_schemas: list[ResponseSchema]
45
+ cls,
46
+ response_schemas: list[ResponseSchema],
43
47
  ) -> StructuredOutputParser:
48
+ """Create a StructuredOutputParser from a list of ResponseSchema.
49
+
50
+ Args:
51
+ response_schemas: The schemas for the response.
52
+
53
+ Returns:
54
+ An instance of StructuredOutputParser.
55
+ """
44
56
  return cls(response_schemas=response_schemas)
45
57
 
46
- def get_format_instructions(self, only_json: bool = False) -> str:
58
+ def get_format_instructions(
59
+ self,
60
+ only_json: bool = False, # noqa: FBT001,FBT002
61
+ ) -> str:
47
62
  """Get format instructions for the output parser.
48
63
 
49
64
  example:
@@ -85,13 +100,13 @@ class StructuredOutputParser(BaseOutputParser[dict[str, Any]]):
85
100
  will be returned, without the introducing text. Defaults to False.
86
101
  """
87
102
  schema_str = "\n".join(
88
- [_get_sub_string(schema) for schema in self.response_schemas]
103
+ [_get_sub_string(schema) for schema in self.response_schemas],
89
104
  )
90
105
  if only_json:
91
106
  return STRUCTURED_FORMAT_SIMPLE_INSTRUCTIONS.format(format=schema_str)
92
- else:
93
- return STRUCTURED_FORMAT_INSTRUCTIONS.format(format=schema_str)
107
+ return STRUCTURED_FORMAT_INSTRUCTIONS.format(format=schema_str)
94
108
 
109
+ @override
95
110
  def parse(self, text: str) -> dict[str, Any]:
96
111
  expected_keys = [rs.name for rs in self.response_schemas]
97
112
  return parse_and_check_json_markdown(text, expected_keys)
@@ -6,6 +6,7 @@ import yaml
6
6
  from langchain_core.exceptions import OutputParserException
7
7
  from langchain_core.output_parsers import BaseOutputParser
8
8
  from pydantic import BaseModel, ValidationError
9
+ from typing_extensions import override
9
10
 
10
11
  from langchain.output_parsers.format_instructions import YAML_FORMAT_INSTRUCTIONS
11
12
 
@@ -18,36 +19,42 @@ class YamlOutputParser(BaseOutputParser[T]):
18
19
  pydantic_object: type[T]
19
20
  """The pydantic model to parse."""
20
21
  pattern: re.Pattern = re.compile(
21
- r"^```(?:ya?ml)?(?P<yaml>[^`]*)", re.MULTILINE | re.DOTALL
22
+ r"^```(?:ya?ml)?(?P<yaml>[^`]*)",
23
+ re.MULTILINE | re.DOTALL,
22
24
  )
23
- """Regex pattern to match yaml code blocks
25
+ """Regex pattern to match yaml code blocks
24
26
  within triple backticks with optional yaml or yml prefix."""
25
27
 
28
+ @override
26
29
  def parse(self, text: str) -> T:
27
30
  try:
28
31
  # Greedy search for 1st yaml candidate.
29
32
  match = re.search(self.pattern, text.strip())
30
- yaml_str = ""
31
- if match:
32
- yaml_str = match.group("yaml")
33
- else:
34
- # If no backticks were present, try to parse the entire output as yaml.
35
- yaml_str = text
33
+ # If no backticks were present, try to parse the entire output as yaml.
34
+ yaml_str = match.group("yaml") if match else text
36
35
 
37
36
  json_object = yaml.safe_load(yaml_str)
38
37
  if hasattr(self.pydantic_object, "model_validate"):
39
38
  return self.pydantic_object.model_validate(json_object)
40
- else:
41
- return self.pydantic_object.parse_obj(json_object)
39
+ return self.pydantic_object.parse_obj(json_object)
42
40
 
43
41
  except (yaml.YAMLError, ValidationError) as e:
44
42
  name = self.pydantic_object.__name__
45
43
  msg = f"Failed to parse {name} from completion {text}. Got: {e}"
46
44
  raise OutputParserException(msg, llm_output=text) from e
47
45
 
46
+ @override
48
47
  def get_format_instructions(self) -> str:
49
48
  # Copy schema to avoid altering original Pydantic schema.
50
- schema = {k: v for k, v in self.pydantic_object.schema().items()}
49
+ if hasattr(self.pydantic_object, "model_json_schema"):
50
+ # Pydantic v2
51
+ schema = dict(self.pydantic_object.model_json_schema().items())
52
+ elif hasattr(self.pydantic_object, "schema"):
53
+ # Pydantic v1
54
+ schema = dict(self.pydantic_object.schema().items())
55
+ else:
56
+ msg = "Pydantic object must have either model_json_schema or schema method"
57
+ raise ValueError(msg)
51
58
 
52
59
  # Remove extraneous fields.
53
60
  reduced_schema = schema
@@ -65,5 +72,6 @@ class YamlOutputParser(BaseOutputParser[T]):
65
72
  return "yaml"
66
73
 
67
74
  @property
75
+ @override
68
76
  def OutputType(self) -> type[T]:
69
77
  return self.pydantic_object
@@ -65,7 +65,9 @@ if TYPE_CHECKING:
65
65
  # Used to consolidate logic for raising deprecation warnings and
66
66
  # handling optional imports.
67
67
  MODULE_LOOKUP = {
68
- "NGramOverlapExampleSelector": "langchain_community.example_selectors.ngram_overlap"
68
+ "NGramOverlapExampleSelector": (
69
+ "langchain_community.example_selectors.ngram_overlap"
70
+ ),
69
71
  }
70
72
 
71
73
  _import_attribute = create_importer(__file__, module_lookup=MODULE_LOOKUP)
@@ -82,6 +84,7 @@ __all__ = [
82
84
  "BasePromptTemplate",
83
85
  "ChatMessagePromptTemplate",
84
86
  "ChatPromptTemplate",
87
+ "FewShotChatMessagePromptTemplate",
85
88
  "FewShotPromptTemplate",
86
89
  "FewShotPromptWithTemplates",
87
90
  "HumanMessagePromptTemplate",
@@ -90,11 +93,10 @@ __all__ = [
90
93
  "MessagesPlaceholder",
91
94
  "NGramOverlapExampleSelector",
92
95
  "PipelinePromptTemplate",
96
+ "Prompt",
93
97
  "PromptTemplate",
94
98
  "SemanticSimilarityExampleSelector",
95
99
  "StringPromptTemplate",
96
100
  "SystemMessagePromptTemplate",
97
101
  "load_prompt",
98
- "FewShotChatMessagePromptTemplate",
99
- "Prompt",
100
102
  ]
langchain/prompts/base.py CHANGED
@@ -10,12 +10,12 @@ from langchain_core.prompts import (
10
10
  from langchain_core.prompts.string import _get_jinja2_variables_from_template
11
11
 
12
12
  __all__ = [
13
- "jinja2_formatter",
14
- "validate_jinja2",
15
- "check_valid_template",
16
- "get_template_variables",
17
- "StringPromptTemplate",
18
13
  "BasePromptTemplate",
14
+ "StringPromptTemplate",
19
15
  "StringPromptValue",
20
16
  "_get_jinja2_variables_from_template",
17
+ "check_valid_template",
18
+ "get_template_variables",
19
+ "jinja2_formatter",
20
+ "validate_jinja2",
21
21
  ]
langchain/prompts/chat.py CHANGED
@@ -16,22 +16,22 @@ from langchain_core.prompts.chat import (
16
16
  )
17
17
 
18
18
  __all__ = [
19
+ "AIMessagePromptTemplate",
20
+ "BaseChatPromptTemplate",
19
21
  "BaseMessagePromptTemplate",
20
- "MessagesPlaceholder",
21
22
  "BaseStringMessagePromptTemplate",
22
23
  "ChatMessagePromptTemplate",
23
- "HumanMessagePromptTemplate",
24
- "AIMessagePromptTemplate",
25
- "SystemMessagePromptTemplate",
26
- "BaseChatPromptTemplate",
27
24
  "ChatPromptTemplate",
28
25
  "ChatPromptValue",
29
26
  "ChatPromptValueConcrete",
30
- "_convert_to_message",
31
- "_create_template_from_message_type",
32
- "MessagePromptTemplateT",
27
+ "HumanMessagePromptTemplate",
33
28
  "MessageLike",
34
29
  "MessageLikeRepresentation",
30
+ "MessagePromptTemplateT",
31
+ "MessagesPlaceholder",
32
+ "SystemMessagePromptTemplate",
33
+ "_convert_to_message",
34
+ "_create_template_from_message_type",
35
35
  ]
36
36
 
37
37
  from langchain_core.prompts.message import BaseMessagePromptTemplate
@@ -21,7 +21,9 @@ if TYPE_CHECKING:
21
21
  # Used to consolidate logic for raising deprecation warnings and
22
22
  # handling optional imports.
23
23
  DEPRECATED_LOOKUPS = {
24
- "NGramOverlapExampleSelector": "langchain_community.example_selectors.ngram_overlap"
24
+ "NGramOverlapExampleSelector": (
25
+ "langchain_community.example_selectors.ngram_overlap"
26
+ ),
25
27
  }
26
28
 
27
29
  _import_attribute = create_importer(__file__, deprecated_lookups=DEPRECATED_LOOKUPS)
@@ -5,7 +5,7 @@ from langchain_core.example_selectors.semantic_similarity import (
5
5
  )
6
6
 
7
7
  __all__ = [
8
- "sorted_values",
9
- "SemanticSimilarityExampleSelector",
10
8
  "MaxMarginalRelevanceExampleSelector",
9
+ "SemanticSimilarityExampleSelector",
10
+ "sorted_values",
11
11
  ]
@@ -5,7 +5,7 @@ from langchain_core.prompts.few_shot import (
5
5
  )
6
6
 
7
7
  __all__ = [
8
- "FewShotPromptTemplate",
9
8
  "FewShotChatMessagePromptTemplate",
9
+ "FewShotPromptTemplate",
10
10
  "_FewShotPromptTemplateMixin",
11
11
  ]
@@ -11,13 +11,13 @@ from langchain_core.prompts.loading import (
11
11
  from langchain_core.utils.loading import try_load_from_hub
12
12
 
13
13
  __all__ = [
14
- "load_prompt_from_config",
15
- "load_prompt",
16
- "try_load_from_hub",
17
14
  "_load_examples",
18
15
  "_load_few_shot_prompt",
19
16
  "_load_output_parser",
20
17
  "_load_prompt",
21
18
  "_load_prompt_from_file",
22
19
  "_load_template",
20
+ "load_prompt",
21
+ "load_prompt_from_config",
22
+ "try_load_from_hub",
23
23
  ]
@@ -3,4 +3,4 @@ from langchain_core.prompts.prompt import PromptTemplate
3
3
  # For backwards compatibility.
4
4
  Prompt = PromptTemplate
5
5
 
6
- __all__ = ["PromptTemplate", "Prompt"]
6
+ __all__ = ["Prompt", "PromptTemplate"]
@@ -7,7 +7,7 @@ from langchain_core._api import warn_deprecated
7
7
  # attempt to import pydantic since it adds pydantic_v1 and pydantic_v2 to sys.modules.
8
8
  #
9
9
  # This hack is done for the following reasons:
10
- # * Langchain will attempt to remain compatible with both pydantic v1 and v2 since
10
+ # * LangChain will attempt to remain compatible with both pydantic v1 and v2 since
11
11
  # both dependencies and dependents may be stuck on either version of v1 or v2.
12
12
  # * Creating namespaces for pydantic v1 and v2 should allow us to write code that
13
13
  # unambiguously uses either v1 or v2 API.
@@ -148,8 +148,8 @@ __all__ = [
148
148
  "GoogleDocumentAIWarehouseRetriever",
149
149
  "GoogleVertexAIMultiTurnSearchRetriever",
150
150
  "GoogleVertexAISearchRetriever",
151
- "KayAiRetriever",
152
151
  "KNNRetriever",
152
+ "KayAiRetriever",
153
153
  "LlamaIndexGraphRetriever",
154
154
  "LlamaIndexRetriever",
155
155
  "MergerRetriever",
@@ -157,22 +157,22 @@ __all__ = [
157
157
  "MilvusRetriever",
158
158
  "MultiQueryRetriever",
159
159
  "MultiVectorRetriever",
160
+ "NeuralDBRetriever",
160
161
  "OutlineRetriever",
161
162
  "ParentDocumentRetriever",
162
163
  "PineconeHybridSearchRetriever",
163
164
  "PubMedRetriever",
164
- "RemoteLangChainRetriever",
165
165
  "RePhraseQueryRetriever",
166
- "SelfQueryRetriever",
166
+ "RemoteLangChainRetriever",
167
167
  "SVMRetriever",
168
- "TavilySearchAPIRetriever",
168
+ "SelfQueryRetriever",
169
169
  "TFIDFRetriever",
170
+ "TavilySearchAPIRetriever",
170
171
  "TimeWeightedVectorStoreRetriever",
171
172
  "VespaRetriever",
172
173
  "WeaviateHybridSearchRetriever",
173
174
  "WebResearchRetriever",
174
175
  "WikipediaRetriever",
175
176
  "ZepRetriever",
176
- "NeuralDBRetriever",
177
177
  "ZillizRetriever",
178
178
  ]
@@ -27,7 +27,7 @@ def __getattr__(name: str) -> Any:
27
27
 
28
28
 
29
29
  __all__ = [
30
- "VectorSearchConfig",
31
- "RetrievalConfig",
32
30
  "AmazonKnowledgeBasesRetriever",
31
+ "RetrievalConfig",
32
+ "VectorSearchConfig",
33
33
  ]
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "default_preprocessing_func",
27
26
  "BM25Retriever",
27
+ "default_preprocessing_func",
28
28
  ]
@@ -38,15 +38,18 @@ class ContextualCompressionRetriever(BaseRetriever):
38
38
  Sequence of relevant documents
39
39
  """
40
40
  docs = self.base_retriever.invoke(
41
- query, config={"callbacks": run_manager.get_child()}, **kwargs
41
+ query,
42
+ config={"callbacks": run_manager.get_child()},
43
+ **kwargs,
42
44
  )
43
45
  if docs:
44
46
  compressed_docs = self.base_compressor.compress_documents(
45
- docs, query, callbacks=run_manager.get_child()
47
+ docs,
48
+ query,
49
+ callbacks=run_manager.get_child(),
46
50
  )
47
51
  return list(compressed_docs)
48
- else:
49
- return []
52
+ return []
50
53
 
51
54
  async def _aget_relevant_documents(
52
55
  self,
@@ -64,12 +67,15 @@ class ContextualCompressionRetriever(BaseRetriever):
64
67
  List of relevant documents
65
68
  """
66
69
  docs = await self.base_retriever.ainvoke(
67
- query, config={"callbacks": run_manager.get_child()}, **kwargs
70
+ query,
71
+ config={"callbacks": run_manager.get_child()},
72
+ **kwargs,
68
73
  )
69
74
  if docs:
70
75
  compressed_docs = await self.base_compressor.acompress_documents(
71
- docs, query, callbacks=run_manager.get_child()
76
+ docs,
77
+ query,
78
+ callbacks=run_manager.get_child(),
72
79
  )
73
80
  return list(compressed_docs)
74
- else:
75
- return []
81
+ return []
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "SearchType",
27
26
  "DocArrayRetriever",
27
+ "SearchType",
28
28
  ]