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

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

Potentially problematic release.


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

Files changed (580) hide show
  1. langchain/__init__.py +110 -96
  2. langchain/_api/__init__.py +2 -2
  3. langchain/_api/deprecation.py +3 -3
  4. langchain/_api/module_import.py +51 -46
  5. langchain/_api/path.py +1 -1
  6. langchain/adapters/openai.py +8 -8
  7. langchain/agents/__init__.py +15 -12
  8. langchain/agents/agent.py +160 -133
  9. langchain/agents/agent_iterator.py +31 -14
  10. langchain/agents/agent_toolkits/__init__.py +7 -6
  11. langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
  12. langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
  13. langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
  14. langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
  15. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
  16. langchain/agents/agent_toolkits/csv/__init__.py +4 -2
  17. langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
  18. langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
  19. langchain/agents/agent_toolkits/github/toolkit.py +9 -9
  20. langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
  21. langchain/agents/agent_toolkits/json/base.py +1 -1
  22. langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
  23. langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
  24. langchain/agents/agent_toolkits/openapi/base.py +1 -1
  25. langchain/agents/agent_toolkits/openapi/planner.py +2 -2
  26. langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
  27. langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
  28. langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
  29. langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
  30. langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
  31. langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
  32. langchain/agents/agent_toolkits/powerbi/base.py +1 -1
  33. langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
  34. langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
  35. langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
  36. langchain/agents/agent_toolkits/python/__init__.py +4 -2
  37. langchain/agents/agent_toolkits/spark/__init__.py +4 -2
  38. langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
  39. langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
  40. langchain/agents/agent_toolkits/sql/prompt.py +1 -1
  41. langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
  42. langchain/agents/agent_toolkits/vectorstore/base.py +2 -2
  43. langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
  44. langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
  45. langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
  46. langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
  47. langchain/agents/agent_types.py +6 -6
  48. langchain/agents/chat/base.py +6 -12
  49. langchain/agents/chat/output_parser.py +9 -6
  50. langchain/agents/chat/prompt.py +3 -4
  51. langchain/agents/conversational/base.py +9 -5
  52. langchain/agents/conversational/output_parser.py +4 -2
  53. langchain/agents/conversational/prompt.py +2 -3
  54. langchain/agents/conversational_chat/base.py +7 -5
  55. langchain/agents/conversational_chat/output_parser.py +9 -11
  56. langchain/agents/conversational_chat/prompt.py +5 -6
  57. langchain/agents/format_scratchpad/__init__.py +3 -3
  58. langchain/agents/format_scratchpad/log_to_messages.py +1 -1
  59. langchain/agents/format_scratchpad/openai_functions.py +8 -6
  60. langchain/agents/format_scratchpad/tools.py +5 -3
  61. langchain/agents/format_scratchpad/xml.py +33 -2
  62. langchain/agents/initialize.py +16 -8
  63. langchain/agents/json_chat/base.py +18 -18
  64. langchain/agents/json_chat/prompt.py +2 -3
  65. langchain/agents/load_tools.py +2 -1
  66. langchain/agents/loading.py +28 -18
  67. langchain/agents/mrkl/base.py +9 -4
  68. langchain/agents/mrkl/output_parser.py +17 -13
  69. langchain/agents/mrkl/prompt.py +1 -2
  70. langchain/agents/openai_assistant/base.py +80 -70
  71. langchain/agents/openai_functions_agent/base.py +46 -37
  72. langchain/agents/openai_functions_multi_agent/base.py +39 -26
  73. langchain/agents/openai_tools/base.py +8 -8
  74. langchain/agents/output_parsers/__init__.py +3 -3
  75. langchain/agents/output_parsers/json.py +6 -6
  76. langchain/agents/output_parsers/openai_functions.py +15 -7
  77. langchain/agents/output_parsers/openai_tools.py +9 -4
  78. langchain/agents/output_parsers/react_json_single_input.py +10 -5
  79. langchain/agents/output_parsers/react_single_input.py +15 -11
  80. langchain/agents/output_parsers/self_ask.py +3 -2
  81. langchain/agents/output_parsers/tools.py +18 -13
  82. langchain/agents/output_parsers/xml.py +99 -28
  83. langchain/agents/react/agent.py +4 -4
  84. langchain/agents/react/base.py +22 -17
  85. langchain/agents/react/output_parser.py +5 -6
  86. langchain/agents/react/textworld_prompt.py +0 -1
  87. langchain/agents/react/wiki_prompt.py +14 -15
  88. langchain/agents/schema.py +3 -2
  89. langchain/agents/self_ask_with_search/base.py +19 -15
  90. langchain/agents/self_ask_with_search/prompt.py +0 -1
  91. langchain/agents/structured_chat/base.py +14 -11
  92. langchain/agents/structured_chat/output_parser.py +16 -18
  93. langchain/agents/structured_chat/prompt.py +3 -4
  94. langchain/agents/tool_calling_agent/base.py +7 -6
  95. langchain/agents/tools.py +2 -2
  96. langchain/agents/utils.py +2 -3
  97. langchain/agents/xml/base.py +5 -5
  98. langchain/agents/xml/prompt.py +1 -2
  99. langchain/cache.py +12 -12
  100. langchain/callbacks/__init__.py +11 -11
  101. langchain/callbacks/aim_callback.py +2 -2
  102. langchain/callbacks/argilla_callback.py +1 -1
  103. langchain/callbacks/arize_callback.py +1 -1
  104. langchain/callbacks/arthur_callback.py +1 -1
  105. langchain/callbacks/base.py +7 -7
  106. langchain/callbacks/clearml_callback.py +1 -1
  107. langchain/callbacks/comet_ml_callback.py +1 -1
  108. langchain/callbacks/confident_callback.py +1 -1
  109. langchain/callbacks/context_callback.py +1 -1
  110. langchain/callbacks/flyte_callback.py +1 -1
  111. langchain/callbacks/human.py +2 -2
  112. langchain/callbacks/infino_callback.py +1 -1
  113. langchain/callbacks/labelstudio_callback.py +1 -1
  114. langchain/callbacks/llmonitor_callback.py +1 -1
  115. langchain/callbacks/manager.py +5 -5
  116. langchain/callbacks/mlflow_callback.py +2 -2
  117. langchain/callbacks/openai_info.py +1 -1
  118. langchain/callbacks/promptlayer_callback.py +1 -1
  119. langchain/callbacks/sagemaker_callback.py +1 -1
  120. langchain/callbacks/streaming_aiter.py +4 -1
  121. langchain/callbacks/streaming_aiter_final_only.py +5 -3
  122. langchain/callbacks/streaming_stdout_final_only.py +5 -3
  123. langchain/callbacks/streamlit/__init__.py +3 -2
  124. langchain/callbacks/streamlit/mutable_expander.py +1 -1
  125. langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
  126. langchain/callbacks/tracers/__init__.py +1 -1
  127. langchain/callbacks/tracers/comet.py +1 -1
  128. langchain/callbacks/tracers/evaluation.py +1 -1
  129. langchain/callbacks/tracers/log_stream.py +1 -1
  130. langchain/callbacks/tracers/logging.py +1 -1
  131. langchain/callbacks/tracers/stdout.py +1 -1
  132. langchain/callbacks/trubrics_callback.py +1 -1
  133. langchain/callbacks/utils.py +4 -4
  134. langchain/callbacks/wandb_callback.py +1 -1
  135. langchain/callbacks/whylabs_callback.py +1 -1
  136. langchain/chains/api/base.py +36 -22
  137. langchain/chains/api/news_docs.py +1 -2
  138. langchain/chains/api/open_meteo_docs.py +1 -2
  139. langchain/chains/api/openapi/requests_chain.py +1 -1
  140. langchain/chains/api/openapi/response_chain.py +1 -1
  141. langchain/chains/api/podcast_docs.py +1 -2
  142. langchain/chains/api/prompt.py +1 -2
  143. langchain/chains/api/tmdb_docs.py +1 -2
  144. langchain/chains/base.py +88 -54
  145. langchain/chains/chat_vector_db/prompts.py +2 -3
  146. langchain/chains/combine_documents/__init__.py +1 -1
  147. langchain/chains/combine_documents/base.py +23 -10
  148. langchain/chains/combine_documents/map_reduce.py +38 -30
  149. langchain/chains/combine_documents/map_rerank.py +33 -20
  150. langchain/chains/combine_documents/reduce.py +47 -26
  151. langchain/chains/combine_documents/refine.py +26 -17
  152. langchain/chains/combine_documents/stuff.py +19 -12
  153. langchain/chains/constitutional_ai/base.py +4 -4
  154. langchain/chains/constitutional_ai/principles.py +22 -25
  155. langchain/chains/constitutional_ai/prompts.py +25 -28
  156. langchain/chains/conversation/base.py +5 -3
  157. langchain/chains/conversation/memory.py +5 -5
  158. langchain/chains/conversation/prompt.py +5 -5
  159. langchain/chains/conversational_retrieval/base.py +41 -20
  160. langchain/chains/conversational_retrieval/prompts.py +2 -3
  161. langchain/chains/elasticsearch_database/base.py +8 -9
  162. langchain/chains/elasticsearch_database/prompts.py +2 -3
  163. langchain/chains/ernie_functions/__init__.py +2 -2
  164. langchain/chains/example_generator.py +3 -1
  165. langchain/chains/flare/base.py +26 -12
  166. langchain/chains/graph_qa/cypher.py +2 -2
  167. langchain/chains/graph_qa/falkordb.py +1 -1
  168. langchain/chains/graph_qa/gremlin.py +1 -1
  169. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  170. langchain/chains/graph_qa/prompts.py +2 -2
  171. langchain/chains/history_aware_retriever.py +2 -1
  172. langchain/chains/hyde/base.py +6 -5
  173. langchain/chains/hyde/prompts.py +5 -6
  174. langchain/chains/llm.py +77 -61
  175. langchain/chains/llm_bash/__init__.py +2 -1
  176. langchain/chains/llm_checker/base.py +7 -5
  177. langchain/chains/llm_checker/prompt.py +3 -4
  178. langchain/chains/llm_math/base.py +16 -9
  179. langchain/chains/llm_math/prompt.py +1 -2
  180. langchain/chains/llm_summarization_checker/base.py +9 -6
  181. langchain/chains/llm_symbolic_math/__init__.py +2 -1
  182. langchain/chains/loading.py +151 -95
  183. langchain/chains/mapreduce.py +4 -3
  184. langchain/chains/moderation.py +8 -9
  185. langchain/chains/natbot/base.py +8 -8
  186. langchain/chains/natbot/crawler.py +73 -76
  187. langchain/chains/natbot/prompt.py +2 -3
  188. langchain/chains/openai_functions/__init__.py +7 -7
  189. langchain/chains/openai_functions/base.py +13 -10
  190. langchain/chains/openai_functions/citation_fuzzy_match.py +12 -11
  191. langchain/chains/openai_functions/extraction.py +19 -19
  192. langchain/chains/openai_functions/openapi.py +35 -35
  193. langchain/chains/openai_functions/qa_with_structure.py +19 -12
  194. langchain/chains/openai_functions/tagging.py +2 -4
  195. langchain/chains/openai_tools/extraction.py +7 -8
  196. langchain/chains/qa_generation/base.py +4 -3
  197. langchain/chains/qa_generation/prompt.py +5 -5
  198. langchain/chains/qa_with_sources/base.py +14 -6
  199. langchain/chains/qa_with_sources/loading.py +16 -8
  200. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  201. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  202. langchain/chains/qa_with_sources/retrieval.py +14 -5
  203. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  204. langchain/chains/qa_with_sources/vector_db.py +17 -6
  205. langchain/chains/query_constructor/base.py +34 -33
  206. langchain/chains/query_constructor/ir.py +4 -4
  207. langchain/chains/query_constructor/parser.py +37 -32
  208. langchain/chains/query_constructor/prompt.py +5 -6
  209. langchain/chains/question_answering/chain.py +21 -10
  210. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  211. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  212. langchain/chains/question_answering/refine_prompts.py +2 -5
  213. langchain/chains/question_answering/stuff_prompt.py +5 -5
  214. langchain/chains/retrieval.py +1 -3
  215. langchain/chains/retrieval_qa/base.py +34 -27
  216. langchain/chains/retrieval_qa/prompt.py +1 -2
  217. langchain/chains/router/__init__.py +3 -3
  218. langchain/chains/router/base.py +24 -20
  219. langchain/chains/router/embedding_router.py +12 -8
  220. langchain/chains/router/llm_router.py +17 -16
  221. langchain/chains/router/multi_prompt.py +2 -2
  222. langchain/chains/router/multi_retrieval_qa.py +10 -5
  223. langchain/chains/sequential.py +30 -18
  224. langchain/chains/sql_database/prompt.py +14 -16
  225. langchain/chains/sql_database/query.py +6 -5
  226. langchain/chains/structured_output/__init__.py +1 -1
  227. langchain/chains/structured_output/base.py +75 -67
  228. langchain/chains/summarize/chain.py +11 -5
  229. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  230. langchain/chains/summarize/stuff_prompt.py +0 -1
  231. langchain/chains/transform.py +5 -6
  232. langchain/chat_loaders/facebook_messenger.py +1 -1
  233. langchain/chat_loaders/langsmith.py +1 -1
  234. langchain/chat_loaders/utils.py +3 -3
  235. langchain/chat_models/__init__.py +20 -19
  236. langchain/chat_models/anthropic.py +1 -1
  237. langchain/chat_models/azureml_endpoint.py +1 -1
  238. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  239. langchain/chat_models/base.py +160 -123
  240. langchain/chat_models/bedrock.py +1 -1
  241. langchain/chat_models/fake.py +1 -1
  242. langchain/chat_models/meta.py +1 -1
  243. langchain/chat_models/pai_eas_endpoint.py +1 -1
  244. langchain/chat_models/promptlayer_openai.py +1 -1
  245. langchain/chat_models/volcengine_maas.py +1 -1
  246. langchain/docstore/base.py +1 -1
  247. langchain/document_loaders/__init__.py +9 -9
  248. langchain/document_loaders/airbyte.py +3 -3
  249. langchain/document_loaders/assemblyai.py +1 -1
  250. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  251. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  252. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  253. langchain/document_loaders/base.py +1 -1
  254. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  255. langchain/document_loaders/blockchain.py +1 -1
  256. langchain/document_loaders/chatgpt.py +1 -1
  257. langchain/document_loaders/college_confidential.py +1 -1
  258. langchain/document_loaders/confluence.py +1 -1
  259. langchain/document_loaders/email.py +1 -1
  260. langchain/document_loaders/facebook_chat.py +1 -1
  261. langchain/document_loaders/markdown.py +1 -1
  262. langchain/document_loaders/notebook.py +1 -1
  263. langchain/document_loaders/org_mode.py +1 -1
  264. langchain/document_loaders/parsers/__init__.py +1 -1
  265. langchain/document_loaders/parsers/docai.py +1 -1
  266. langchain/document_loaders/parsers/generic.py +1 -1
  267. langchain/document_loaders/parsers/html/__init__.py +1 -1
  268. langchain/document_loaders/parsers/html/bs4.py +1 -1
  269. langchain/document_loaders/parsers/language/cobol.py +1 -1
  270. langchain/document_loaders/parsers/language/python.py +1 -1
  271. langchain/document_loaders/parsers/msword.py +1 -1
  272. langchain/document_loaders/parsers/pdf.py +5 -5
  273. langchain/document_loaders/parsers/registry.py +1 -1
  274. langchain/document_loaders/pdf.py +8 -8
  275. langchain/document_loaders/powerpoint.py +1 -1
  276. langchain/document_loaders/pyspark_dataframe.py +1 -1
  277. langchain/document_loaders/telegram.py +2 -2
  278. langchain/document_loaders/tencent_cos_directory.py +1 -1
  279. langchain/document_loaders/unstructured.py +5 -5
  280. langchain/document_loaders/url_playwright.py +1 -1
  281. langchain/document_loaders/whatsapp_chat.py +1 -1
  282. langchain/document_loaders/youtube.py +2 -2
  283. langchain/document_transformers/__init__.py +3 -3
  284. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  285. langchain/document_transformers/doctran_text_extract.py +1 -1
  286. langchain/document_transformers/doctran_text_qa.py +1 -1
  287. langchain/document_transformers/doctran_text_translate.py +1 -1
  288. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  289. langchain/document_transformers/google_translate.py +1 -1
  290. langchain/document_transformers/html2text.py +1 -1
  291. langchain/document_transformers/nuclia_text_transform.py +1 -1
  292. langchain/embeddings/__init__.py +5 -5
  293. langchain/embeddings/base.py +33 -24
  294. langchain/embeddings/cache.py +36 -31
  295. langchain/embeddings/fake.py +1 -1
  296. langchain/embeddings/huggingface.py +2 -2
  297. langchain/evaluation/__init__.py +22 -22
  298. langchain/evaluation/agents/trajectory_eval_chain.py +23 -23
  299. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  300. langchain/evaluation/comparison/__init__.py +1 -1
  301. langchain/evaluation/comparison/eval_chain.py +20 -13
  302. langchain/evaluation/comparison/prompt.py +1 -2
  303. langchain/evaluation/criteria/__init__.py +1 -1
  304. langchain/evaluation/criteria/eval_chain.py +20 -11
  305. langchain/evaluation/criteria/prompt.py +2 -3
  306. langchain/evaluation/embedding_distance/base.py +23 -20
  307. langchain/evaluation/loading.py +15 -11
  308. langchain/evaluation/parsing/base.py +4 -1
  309. langchain/evaluation/parsing/json_distance.py +5 -2
  310. langchain/evaluation/parsing/json_schema.py +12 -8
  311. langchain/evaluation/qa/__init__.py +1 -1
  312. langchain/evaluation/qa/eval_chain.py +12 -5
  313. langchain/evaluation/qa/eval_prompt.py +7 -8
  314. langchain/evaluation/qa/generate_chain.py +2 -1
  315. langchain/evaluation/qa/generate_prompt.py +2 -4
  316. langchain/evaluation/schema.py +38 -30
  317. langchain/evaluation/scoring/__init__.py +1 -1
  318. langchain/evaluation/scoring/eval_chain.py +22 -15
  319. langchain/evaluation/scoring/prompt.py +0 -1
  320. langchain/evaluation/string_distance/base.py +14 -9
  321. langchain/globals.py +12 -11
  322. langchain/graphs/__init__.py +6 -6
  323. langchain/graphs/graph_document.py +1 -1
  324. langchain/graphs/networkx_graph.py +2 -2
  325. langchain/hub.py +9 -11
  326. langchain/indexes/__init__.py +3 -3
  327. langchain/indexes/_sql_record_manager.py +63 -46
  328. langchain/indexes/prompts/entity_extraction.py +1 -2
  329. langchain/indexes/prompts/entity_summarization.py +1 -2
  330. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  331. langchain/indexes/vectorstore.py +35 -19
  332. langchain/llms/__init__.py +13 -13
  333. langchain/llms/ai21.py +1 -1
  334. langchain/llms/azureml_endpoint.py +4 -4
  335. langchain/llms/base.py +15 -7
  336. langchain/llms/bedrock.py +1 -1
  337. langchain/llms/cloudflare_workersai.py +1 -1
  338. langchain/llms/gradient_ai.py +1 -1
  339. langchain/llms/loading.py +1 -1
  340. langchain/llms/openai.py +1 -1
  341. langchain/llms/sagemaker_endpoint.py +1 -1
  342. langchain/load/dump.py +1 -1
  343. langchain/load/load.py +1 -1
  344. langchain/load/serializable.py +3 -3
  345. langchain/memory/__init__.py +3 -3
  346. langchain/memory/buffer.py +9 -7
  347. langchain/memory/chat_memory.py +14 -8
  348. langchain/memory/chat_message_histories/__init__.py +1 -1
  349. langchain/memory/chat_message_histories/astradb.py +1 -1
  350. langchain/memory/chat_message_histories/cassandra.py +1 -1
  351. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  352. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  353. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  354. langchain/memory/chat_message_histories/file.py +1 -1
  355. langchain/memory/chat_message_histories/firestore.py +1 -1
  356. langchain/memory/chat_message_histories/momento.py +1 -1
  357. langchain/memory/chat_message_histories/mongodb.py +1 -1
  358. langchain/memory/chat_message_histories/neo4j.py +1 -1
  359. langchain/memory/chat_message_histories/postgres.py +1 -1
  360. langchain/memory/chat_message_histories/redis.py +1 -1
  361. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  362. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  363. langchain/memory/chat_message_histories/streamlit.py +1 -1
  364. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  365. langchain/memory/chat_message_histories/xata.py +1 -1
  366. langchain/memory/chat_message_histories/zep.py +1 -1
  367. langchain/memory/combined.py +13 -12
  368. langchain/memory/entity.py +84 -61
  369. langchain/memory/prompt.py +10 -11
  370. langchain/memory/readonly.py +0 -2
  371. langchain/memory/simple.py +1 -3
  372. langchain/memory/summary.py +13 -11
  373. langchain/memory/summary_buffer.py +17 -8
  374. langchain/memory/utils.py +3 -2
  375. langchain/memory/vectorstore.py +12 -5
  376. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  377. langchain/model_laboratory.py +12 -11
  378. langchain/output_parsers/__init__.py +4 -4
  379. langchain/output_parsers/boolean.py +7 -4
  380. langchain/output_parsers/combining.py +10 -5
  381. langchain/output_parsers/datetime.py +32 -31
  382. langchain/output_parsers/enum.py +5 -3
  383. langchain/output_parsers/fix.py +52 -52
  384. langchain/output_parsers/format_instructions.py +6 -8
  385. langchain/output_parsers/json.py +2 -2
  386. langchain/output_parsers/list.py +2 -2
  387. langchain/output_parsers/loading.py +9 -9
  388. langchain/output_parsers/openai_functions.py +3 -3
  389. langchain/output_parsers/openai_tools.py +1 -1
  390. langchain/output_parsers/pandas_dataframe.py +43 -47
  391. langchain/output_parsers/prompts.py +1 -2
  392. langchain/output_parsers/rail_parser.py +1 -1
  393. langchain/output_parsers/regex.py +7 -8
  394. langchain/output_parsers/regex_dict.py +7 -10
  395. langchain/output_parsers/retry.py +77 -78
  396. langchain/output_parsers/structured.py +11 -6
  397. langchain/output_parsers/yaml.py +15 -11
  398. langchain/prompts/__init__.py +5 -3
  399. langchain/prompts/base.py +5 -5
  400. langchain/prompts/chat.py +8 -8
  401. langchain/prompts/example_selector/__init__.py +3 -1
  402. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  403. langchain/prompts/few_shot.py +1 -1
  404. langchain/prompts/loading.py +3 -3
  405. langchain/prompts/prompt.py +1 -1
  406. langchain/retrievers/__init__.py +5 -5
  407. langchain/retrievers/bedrock.py +2 -2
  408. langchain/retrievers/bm25.py +1 -1
  409. langchain/retrievers/contextual_compression.py +14 -8
  410. langchain/retrievers/docarray.py +1 -1
  411. langchain/retrievers/document_compressors/__init__.py +5 -4
  412. langchain/retrievers/document_compressors/base.py +12 -6
  413. langchain/retrievers/document_compressors/chain_extract.py +2 -2
  414. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  415. langchain/retrievers/document_compressors/chain_filter.py +9 -9
  416. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  417. langchain/retrievers/document_compressors/cohere_rerank.py +15 -15
  418. langchain/retrievers/document_compressors/embeddings_filter.py +21 -17
  419. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  420. langchain/retrievers/document_compressors/listwise_rerank.py +7 -5
  421. langchain/retrievers/ensemble.py +28 -25
  422. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  423. langchain/retrievers/google_vertex_ai_search.py +2 -2
  424. langchain/retrievers/kendra.py +10 -10
  425. langchain/retrievers/llama_index.py +1 -1
  426. langchain/retrievers/merger_retriever.py +11 -11
  427. langchain/retrievers/milvus.py +1 -1
  428. langchain/retrievers/multi_query.py +32 -26
  429. langchain/retrievers/multi_vector.py +20 -8
  430. langchain/retrievers/parent_document_retriever.py +18 -9
  431. langchain/retrievers/re_phraser.py +6 -5
  432. langchain/retrievers/self_query/base.py +138 -127
  433. langchain/retrievers/time_weighted_retriever.py +18 -7
  434. langchain/retrievers/zilliz.py +1 -1
  435. langchain/runnables/openai_functions.py +6 -2
  436. langchain/schema/__init__.py +23 -23
  437. langchain/schema/cache.py +1 -1
  438. langchain/schema/callbacks/base.py +7 -7
  439. langchain/schema/callbacks/manager.py +19 -19
  440. langchain/schema/callbacks/tracers/base.py +1 -1
  441. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  442. langchain/schema/callbacks/tracers/langchain.py +1 -1
  443. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  444. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  445. langchain/schema/callbacks/tracers/schemas.py +8 -8
  446. langchain/schema/callbacks/tracers/stdout.py +3 -3
  447. langchain/schema/document.py +1 -1
  448. langchain/schema/language_model.py +2 -2
  449. langchain/schema/messages.py +12 -12
  450. langchain/schema/output.py +3 -3
  451. langchain/schema/output_parser.py +3 -3
  452. langchain/schema/runnable/__init__.py +3 -3
  453. langchain/schema/runnable/base.py +9 -9
  454. langchain/schema/runnable/config.py +5 -5
  455. langchain/schema/runnable/configurable.py +1 -1
  456. langchain/schema/runnable/history.py +1 -1
  457. langchain/schema/runnable/passthrough.py +1 -1
  458. langchain/schema/runnable/utils.py +16 -16
  459. langchain/schema/vectorstore.py +1 -1
  460. langchain/smith/__init__.py +1 -1
  461. langchain/smith/evaluation/__init__.py +2 -2
  462. langchain/smith/evaluation/config.py +10 -7
  463. langchain/smith/evaluation/name_generation.py +3 -3
  464. langchain/smith/evaluation/progress.py +11 -2
  465. langchain/smith/evaluation/runner_utils.py +179 -127
  466. langchain/smith/evaluation/string_run_evaluator.py +75 -68
  467. langchain/storage/__init__.py +2 -2
  468. langchain/storage/_lc_store.py +4 -2
  469. langchain/storage/encoder_backed.py +6 -2
  470. langchain/storage/file_system.py +19 -16
  471. langchain/storage/in_memory.py +1 -1
  472. langchain/storage/upstash_redis.py +1 -1
  473. langchain/text_splitter.py +15 -15
  474. langchain/tools/__init__.py +28 -26
  475. langchain/tools/ainetwork/app.py +1 -1
  476. langchain/tools/ainetwork/base.py +1 -1
  477. langchain/tools/ainetwork/owner.py +1 -1
  478. langchain/tools/ainetwork/rule.py +1 -1
  479. langchain/tools/ainetwork/transfer.py +1 -1
  480. langchain/tools/ainetwork/value.py +1 -1
  481. langchain/tools/amadeus/closest_airport.py +1 -1
  482. langchain/tools/amadeus/flight_search.py +1 -1
  483. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  484. langchain/tools/base.py +4 -4
  485. langchain/tools/bearly/tool.py +1 -1
  486. langchain/tools/bing_search/__init__.py +1 -1
  487. langchain/tools/bing_search/tool.py +1 -1
  488. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  489. langchain/tools/dataforseo_api_search/tool.py +1 -1
  490. langchain/tools/ddg_search/tool.py +1 -1
  491. langchain/tools/e2b_data_analysis/tool.py +2 -2
  492. langchain/tools/edenai/__init__.py +1 -1
  493. langchain/tools/file_management/__init__.py +1 -1
  494. langchain/tools/file_management/copy.py +1 -1
  495. langchain/tools/file_management/delete.py +1 -1
  496. langchain/tools/gmail/__init__.py +2 -2
  497. langchain/tools/gmail/get_message.py +1 -1
  498. langchain/tools/gmail/search.py +1 -1
  499. langchain/tools/gmail/send_message.py +1 -1
  500. langchain/tools/google_finance/__init__.py +1 -1
  501. langchain/tools/google_finance/tool.py +1 -1
  502. langchain/tools/google_scholar/__init__.py +1 -1
  503. langchain/tools/google_scholar/tool.py +1 -1
  504. langchain/tools/google_search/__init__.py +1 -1
  505. langchain/tools/google_search/tool.py +1 -1
  506. langchain/tools/google_serper/__init__.py +1 -1
  507. langchain/tools/google_serper/tool.py +1 -1
  508. langchain/tools/google_trends/__init__.py +1 -1
  509. langchain/tools/google_trends/tool.py +1 -1
  510. langchain/tools/jira/tool.py +20 -1
  511. langchain/tools/json/tool.py +25 -3
  512. langchain/tools/memorize/tool.py +1 -1
  513. langchain/tools/multion/__init__.py +1 -1
  514. langchain/tools/multion/update_session.py +1 -1
  515. langchain/tools/office365/__init__.py +2 -2
  516. langchain/tools/office365/events_search.py +1 -1
  517. langchain/tools/office365/messages_search.py +1 -1
  518. langchain/tools/office365/send_event.py +1 -1
  519. langchain/tools/office365/send_message.py +1 -1
  520. langchain/tools/openapi/utils/api_models.py +6 -6
  521. langchain/tools/playwright/__init__.py +5 -5
  522. langchain/tools/playwright/click.py +1 -1
  523. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  524. langchain/tools/playwright/get_elements.py +1 -1
  525. langchain/tools/playwright/navigate.py +1 -1
  526. langchain/tools/plugin.py +2 -2
  527. langchain/tools/powerbi/tool.py +1 -1
  528. langchain/tools/python/__init__.py +2 -1
  529. langchain/tools/reddit_search/tool.py +1 -1
  530. langchain/tools/render.py +2 -2
  531. langchain/tools/requests/tool.py +2 -2
  532. langchain/tools/searchapi/tool.py +1 -1
  533. langchain/tools/searx_search/tool.py +1 -1
  534. langchain/tools/slack/get_message.py +1 -1
  535. langchain/tools/spark_sql/tool.py +1 -1
  536. langchain/tools/sql_database/tool.py +1 -1
  537. langchain/tools/tavily_search/__init__.py +1 -1
  538. langchain/tools/tavily_search/tool.py +1 -1
  539. langchain/tools/zapier/__init__.py +1 -1
  540. langchain/tools/zapier/tool.py +24 -2
  541. langchain/utilities/__init__.py +4 -4
  542. langchain/utilities/arcee.py +4 -4
  543. langchain/utilities/clickup.py +4 -4
  544. langchain/utilities/dalle_image_generator.py +1 -1
  545. langchain/utilities/dataforseo_api_search.py +1 -1
  546. langchain/utilities/opaqueprompts.py +1 -1
  547. langchain/utilities/reddit_search.py +1 -1
  548. langchain/utilities/sql_database.py +1 -1
  549. langchain/utilities/tavily_search.py +1 -1
  550. langchain/utilities/vertexai.py +2 -2
  551. langchain/utils/__init__.py +1 -1
  552. langchain/utils/aiter.py +1 -1
  553. langchain/utils/html.py +3 -3
  554. langchain/utils/input.py +1 -1
  555. langchain/utils/iter.py +1 -1
  556. langchain/utils/json_schema.py +1 -3
  557. langchain/utils/strings.py +1 -1
  558. langchain/utils/utils.py +6 -6
  559. langchain/vectorstores/__init__.py +5 -5
  560. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  561. langchain/vectorstores/azure_cosmos_db.py +1 -1
  562. langchain/vectorstores/clickhouse.py +1 -1
  563. langchain/vectorstores/elastic_vector_search.py +1 -1
  564. langchain/vectorstores/elasticsearch.py +2 -2
  565. langchain/vectorstores/myscale.py +1 -1
  566. langchain/vectorstores/neo4j_vector.py +1 -1
  567. langchain/vectorstores/pgembedding.py +1 -1
  568. langchain/vectorstores/qdrant.py +1 -1
  569. langchain/vectorstores/redis/__init__.py +1 -1
  570. langchain/vectorstores/redis/base.py +1 -1
  571. langchain/vectorstores/redis/filters.py +4 -4
  572. langchain/vectorstores/redis/schema.py +6 -6
  573. langchain/vectorstores/sklearn.py +2 -2
  574. langchain/vectorstores/starrocks.py +1 -1
  575. langchain/vectorstores/utils.py +1 -1
  576. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/METADATA +4 -4
  577. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/RECORD +580 -580
  578. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
  579. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
  580. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/licenses/LICENSE +0 -0
@@ -24,15 +24,17 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
24
24
  if issubclass(type(val), pd.DataFrame):
25
25
  return val
26
26
  if pd.DataFrame(val).empty:
27
- raise ValueError("DataFrame cannot be empty.")
27
+ msg = "DataFrame cannot be empty."
28
+ raise ValueError(msg)
28
29
 
29
- raise TypeError(
30
- "Wrong type for 'dataframe', must be a subclass \
30
+ msg = "Wrong type for 'dataframe', must be a subclass \
31
31
  of Pandas DataFrame (pd.DataFrame)"
32
- )
32
+ raise TypeError(msg)
33
33
 
34
34
  def parse_array(
35
- self, array: str, original_request_params: str
35
+ self,
36
+ array: str,
37
+ original_request_params: str,
36
38
  ) -> tuple[list[Union[int, str]], str]:
37
39
  parsed_array: list[Union[int, str]] = []
38
40
 
@@ -46,57 +48,52 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
46
48
  start, end = map(int, match.groups())
47
49
  parsed_array = list(range(start, end + 1))
48
50
  else:
49
- raise OutputParserException(
50
- f"Unable to parse the array provided in {array}. \
51
+ msg = f"Unable to parse the array provided in {array}. \
51
52
  Please check the format instructions."
52
- )
53
+ raise OutputParserException(msg)
53
54
  # Check if the format is ["column_name"]
54
55
  elif re.match(r"\[[a-zA-Z0-9_]+(?:,[a-zA-Z0-9_]+)*\]", array):
55
56
  match = re.match(r"\[[a-zA-Z0-9_]+(?:,[a-zA-Z0-9_]+)*\]", array)
56
57
  if match:
57
58
  parsed_array = list(map(str, match.group().strip("[]").split(",")))
58
59
  else:
59
- raise OutputParserException(
60
- f"Unable to parse the array provided in {array}. \
60
+ msg = f"Unable to parse the array provided in {array}. \
61
61
  Please check the format instructions."
62
- )
62
+ raise OutputParserException(msg)
63
63
 
64
64
  # Validate the array
65
65
  if not parsed_array:
66
- raise OutputParserException(
67
- f"Invalid array format in '{original_request_params}'. \
66
+ msg = f"Invalid array format in '{original_request_params}'. \
68
67
  Please check the format instructions."
69
- )
70
- elif (
68
+ raise OutputParserException(msg)
69
+ if (
71
70
  isinstance(parsed_array[0], int)
72
71
  and parsed_array[-1] > self.dataframe.index.max()
73
72
  ):
74
- raise OutputParserException(
75
- f"The maximum index {parsed_array[-1]} exceeds the maximum index of \
73
+ msg = f"The maximum index {parsed_array[-1]} exceeds the maximum index of \
76
74
  the Pandas DataFrame {self.dataframe.index.max()}."
77
- )
75
+ raise OutputParserException(msg)
78
76
 
79
77
  return parsed_array, original_request_params.split("[")[0]
80
78
 
81
79
  def parse(self, request: str) -> dict[str, Any]:
82
80
  stripped_request_params = None
83
81
  splitted_request = request.strip().split(":")
84
- if len(splitted_request) != 2:
85
- raise OutputParserException(
86
- f"Request '{request}' is not correctly formatted. \
82
+ if len(splitted_request) != 2: # noqa: PLR2004
83
+ msg = f"Request '{request}' is not correctly formatted. \
87
84
  Please refer to the format instructions."
88
- )
85
+ raise OutputParserException(msg)
89
86
  result = {}
90
87
  try:
91
88
  request_type, request_params = splitted_request
92
89
  if request_type in {"Invalid column", "Invalid operation"}:
93
- raise OutputParserException(
94
- f"{request}. Please check the format instructions."
95
- )
90
+ msg = f"{request}. Please check the format instructions."
91
+ raise OutputParserException(msg)
96
92
  array_exists = re.search(r"(\[.*?\])", request_params)
97
93
  if array_exists:
98
94
  parsed_array, stripped_request_params = self.parse_array(
99
- array_exists.group(1), request_params
95
+ array_exists.group(1),
96
+ request_params,
100
97
  )
101
98
  if request_type == "column":
102
99
  filtered_df = self.dataframe[
@@ -127,34 +124,33 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
127
124
  self.dataframe.index.isin(parsed_array)
128
125
  ]
129
126
  result[request_type] = getattr(
130
- filtered_df[stripped_request_params], request_type
127
+ filtered_df[stripped_request_params],
128
+ request_type,
131
129
  )()
130
+ elif request_type == "column":
131
+ result[request_params] = self.dataframe[request_params]
132
+ elif request_type == "row":
133
+ result[request_params] = self.dataframe.iloc[int(request_params)]
132
134
  else:
133
- if request_type == "column":
134
- result[request_params] = self.dataframe[request_params]
135
- elif request_type == "row":
136
- result[request_params] = self.dataframe.iloc[int(request_params)]
137
- else:
138
- result[request_type] = getattr(
139
- self.dataframe[request_params], request_type
140
- )()
141
- except (AttributeError, IndexError, KeyError):
135
+ result[request_type] = getattr(
136
+ self.dataframe[request_params],
137
+ request_type,
138
+ )()
139
+ except (AttributeError, IndexError, KeyError) as e:
142
140
  if request_type not in {"column", "row"}:
143
- raise OutputParserException(
144
- f"Unsupported request type '{request_type}'. \
141
+ msg = f"Unsupported request type '{request_type}'. \
145
142
  Please check the format instructions."
146
- )
147
- raise OutputParserException(
148
- f"""Requested index {
149
- request_params
150
- if stripped_request_params is None
151
- else stripped_request_params
152
- } is out of bounds."""
153
- )
143
+ raise OutputParserException(msg) from e
144
+ msg = f"""Requested index {
145
+ request_params
146
+ if stripped_request_params is None
147
+ else stripped_request_params
148
+ } is out of bounds."""
149
+ raise OutputParserException(msg) from e
154
150
 
155
151
  return result
156
152
 
157
153
  def get_format_instructions(self) -> str:
158
154
  return PANDAS_DATAFRAME_FORMAT_INSTRUCTIONS.format(
159
- columns=", ".join(self.dataframe.columns)
155
+ columns=", ".join(self.dataframe.columns),
160
156
  )
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  NAIVE_FIX = """Instructions:
@@ -16,7 +15,7 @@ Error:
16
15
  {error}
17
16
  --------------
18
17
 
19
- Please try again. Please only respond with an answer that satisfies the constraints laid out in the Instructions:"""
18
+ Please try again. Please only respond with an answer that satisfies the constraints laid out in the Instructions:""" # noqa: E501
20
19
 
21
20
 
22
21
  NAIVE_FIX_PROMPT = PromptTemplate.from_template(NAIVE_FIX)
@@ -9,7 +9,7 @@ if TYPE_CHECKING:
9
9
  # Used to consolidate logic for raising deprecation warnings and
10
10
  # handling optional imports.
11
11
  DEPRECATED_LOOKUP = {
12
- "GuardrailsOutputParser": "langchain_community.output_parsers.rail_parser"
12
+ "GuardrailsOutputParser": "langchain_community.output_parsers.rail_parser",
13
13
  }
14
14
 
15
15
  _import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
@@ -30,11 +30,10 @@ class RegexParser(BaseOutputParser[dict[str, str]]):
30
30
  match = re.search(self.regex, text)
31
31
  if match:
32
32
  return {key: match.group(i + 1) for i, key in enumerate(self.output_keys)}
33
- else:
34
- if self.default_output_key is None:
35
- raise ValueError(f"Could not parse output: {text}")
36
- else:
37
- return {
38
- key: text if key == self.default_output_key else ""
39
- for key in self.output_keys
40
- }
33
+ if self.default_output_key is None:
34
+ msg = f"Could not parse output: {text}"
35
+ raise ValueError(msg)
36
+ return {
37
+ key: text if key == self.default_output_key else ""
38
+ for key in self.output_keys
39
+ }
@@ -28,19 +28,16 @@ class RegexDictParser(BaseOutputParser[dict[str, str]]):
28
28
  specific_regex = self.regex_pattern.format(re.escape(expected_format))
29
29
  matches = re.findall(specific_regex, text)
30
30
  if not matches:
31
- raise ValueError(
31
+ msg = (
32
32
  f"No match found for output key: {output_key} with expected format \
33
33
  {expected_format} on text {text}"
34
34
  )
35
- elif len(matches) > 1:
36
- raise ValueError(
37
- f"Multiple matches found for output key: {output_key} with \
35
+ raise ValueError(msg)
36
+ if len(matches) > 1:
37
+ msg = f"Multiple matches found for output key: {output_key} with \
38
38
  expected format {expected_format} on text {text}"
39
- )
40
- elif (
41
- self.no_update_value is not None and matches[0] == self.no_update_value
42
- ):
39
+ raise ValueError(msg)
40
+ if self.no_update_value is not None and matches[0] == self.no_update_value:
43
41
  continue
44
- else:
45
- result[output_key] = matches[0]
42
+ result[output_key] = matches[0]
46
43
  return result
@@ -30,7 +30,7 @@ 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")
@@ -104,25 +104,25 @@ class RetryOutputParser(BaseOutputParser[T]):
104
104
  while retries <= self.max_retries:
105
105
  try:
106
106
  return self.parser.parse(completion)
107
- except OutputParserException as e:
107
+ except OutputParserException:
108
108
  if retries == self.max_retries:
109
- raise e
109
+ raise
110
+ retries += 1
111
+ if self.legacy and hasattr(self.retry_chain, "run"):
112
+ completion = self.retry_chain.run(
113
+ prompt=prompt_value.to_string(),
114
+ completion=completion,
115
+ )
110
116
  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")
117
+ completion = self.retry_chain.invoke(
118
+ {
119
+ "prompt": prompt_value.to_string(),
120
+ "completion": completion,
121
+ },
122
+ )
123
+
124
+ msg = "Failed to parse"
125
+ raise OutputParserException(msg)
126
126
 
127
127
  async def aparse_with_prompt(self, completion: str, prompt_value: PromptValue) -> T:
128
128
  """Parse the output of an LLM call using a wrapped parser.
@@ -141,29 +141,28 @@ class RetryOutputParser(BaseOutputParser[T]):
141
141
  return await self.parser.aparse(completion)
142
142
  except OutputParserException as e:
143
143
  if retries == self.max_retries:
144
- raise e
144
+ raise
145
+ retries += 1
146
+ if self.legacy and hasattr(self.retry_chain, "arun"):
147
+ completion = await self.retry_chain.arun(
148
+ prompt=prompt_value.to_string(),
149
+ completion=completion,
150
+ error=repr(e),
151
+ )
145
152
  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")
153
+ completion = await self.retry_chain.ainvoke(
154
+ {
155
+ "prompt": prompt_value.to_string(),
156
+ "completion": completion,
157
+ },
158
+ )
159
+
160
+ msg = "Failed to parse"
161
+ raise OutputParserException(msg)
162
162
 
163
163
  def parse(self, completion: str) -> T:
164
- raise NotImplementedError(
165
- "This OutputParser can only be called by the `parse_with_prompt` method."
166
- )
164
+ msg = "This OutputParser can only be called by the `parse_with_prompt` method."
165
+ raise NotImplementedError(msg)
167
166
 
168
167
  def get_format_instructions(self) -> str:
169
168
  return self.parser.get_format_instructions()
@@ -192,7 +191,8 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
192
191
  # Should be an LLMChain but we want to avoid top-level imports from langchain.chains
193
192
  retry_chain: Annotated[
194
193
  Union[
195
- RunnableSerializable[RetryWithErrorOutputParserRetryChainInput, str], Any
194
+ RunnableSerializable[RetryWithErrorOutputParserRetryChainInput, str],
195
+ Any,
196
196
  ],
197
197
  SkipValidation(),
198
198
  ]
@@ -232,25 +232,25 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
232
232
  return self.parser.parse(completion)
233
233
  except OutputParserException as e:
234
234
  if retries == self.max_retries:
235
- raise e
235
+ raise
236
+ retries += 1
237
+ if self.legacy and hasattr(self.retry_chain, "run"):
238
+ completion = self.retry_chain.run(
239
+ prompt=prompt_value.to_string(),
240
+ completion=completion,
241
+ error=repr(e),
242
+ )
236
243
  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")
244
+ completion = self.retry_chain.invoke(
245
+ {
246
+ "completion": completion,
247
+ "prompt": prompt_value.to_string(),
248
+ "error": repr(e),
249
+ },
250
+ )
251
+
252
+ msg = "Failed to parse"
253
+ raise OutputParserException(msg)
254
254
 
255
255
  async def aparse_with_prompt(self, completion: str, prompt_value: PromptValue) -> T:
256
256
  retries = 0
@@ -260,30 +260,29 @@ class RetryWithErrorOutputParser(BaseOutputParser[T]):
260
260
  return await self.parser.aparse(completion)
261
261
  except OutputParserException as e:
262
262
  if retries == self.max_retries:
263
- raise e
263
+ raise
264
+ retries += 1
265
+ if self.legacy and hasattr(self.retry_chain, "arun"):
266
+ completion = await self.retry_chain.arun(
267
+ prompt=prompt_value.to_string(),
268
+ completion=completion,
269
+ error=repr(e),
270
+ )
264
271
  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")
272
+ completion = await self.retry_chain.ainvoke(
273
+ {
274
+ "prompt": prompt_value.to_string(),
275
+ "completion": completion,
276
+ "error": repr(e),
277
+ },
278
+ )
279
+
280
+ msg = "Failed to parse"
281
+ raise OutputParserException(msg)
282
282
 
283
283
  def parse(self, completion: str) -> T:
284
- raise NotImplementedError(
285
- "This OutputParser can only be called by the `parse_with_prompt` method."
286
- )
284
+ msg = "This OutputParser can only be called by the `parse_with_prompt` method."
285
+ raise NotImplementedError(msg)
287
286
 
288
287
  def get_format_instructions(self) -> str:
289
288
  return self.parser.get_format_instructions()
@@ -27,7 +27,9 @@ class ResponseSchema(BaseModel):
27
27
 
28
28
  def _get_sub_string(schema: ResponseSchema) -> str:
29
29
  return line_template.format(
30
- name=schema.name, description=schema.description, type=schema.type
30
+ name=schema.name,
31
+ description=schema.description,
32
+ type=schema.type,
31
33
  )
32
34
 
33
35
 
@@ -39,11 +41,15 @@ class StructuredOutputParser(BaseOutputParser[dict[str, Any]]):
39
41
 
40
42
  @classmethod
41
43
  def from_response_schemas(
42
- cls, response_schemas: list[ResponseSchema]
44
+ cls,
45
+ response_schemas: list[ResponseSchema],
43
46
  ) -> StructuredOutputParser:
44
47
  return cls(response_schemas=response_schemas)
45
48
 
46
- def get_format_instructions(self, only_json: bool = False) -> str:
49
+ def get_format_instructions(
50
+ self,
51
+ only_json: bool = False, # noqa: FBT001,FBT002
52
+ ) -> str:
47
53
  """Get format instructions for the output parser.
48
54
 
49
55
  example:
@@ -85,12 +91,11 @@ class StructuredOutputParser(BaseOutputParser[dict[str, Any]]):
85
91
  will be returned, without the introducing text. Defaults to False.
86
92
  """
87
93
  schema_str = "\n".join(
88
- [_get_sub_string(schema) for schema in self.response_schemas]
94
+ [_get_sub_string(schema) for schema in self.response_schemas],
89
95
  )
90
96
  if only_json:
91
97
  return STRUCTURED_FORMAT_SIMPLE_INSTRUCTIONS.format(format=schema_str)
92
- else:
93
- return STRUCTURED_FORMAT_INSTRUCTIONS.format(format=schema_str)
98
+ return STRUCTURED_FORMAT_INSTRUCTIONS.format(format=schema_str)
94
99
 
95
100
  def parse(self, text: str) -> dict[str, Any]:
96
101
  expected_keys = [rs.name for rs in self.response_schemas]
@@ -18,27 +18,23 @@ class YamlOutputParser(BaseOutputParser[T]):
18
18
  pydantic_object: type[T]
19
19
  """The pydantic model to parse."""
20
20
  pattern: re.Pattern = re.compile(
21
- r"^```(?:ya?ml)?(?P<yaml>[^`]*)", re.MULTILINE | re.DOTALL
21
+ r"^```(?:ya?ml)?(?P<yaml>[^`]*)",
22
+ re.MULTILINE | re.DOTALL,
22
23
  )
23
- """Regex pattern to match yaml code blocks
24
+ """Regex pattern to match yaml code blocks
24
25
  within triple backticks with optional yaml or yml prefix."""
25
26
 
26
27
  def parse(self, text: str) -> T:
27
28
  try:
28
29
  # Greedy search for 1st yaml candidate.
29
30
  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
31
+ # If no backticks were present, try to parse the entire output as yaml.
32
+ yaml_str = match.group("yaml") if match else text
36
33
 
37
34
  json_object = yaml.safe_load(yaml_str)
38
35
  if hasattr(self.pydantic_object, "model_validate"):
39
36
  return self.pydantic_object.model_validate(json_object)
40
- else:
41
- return self.pydantic_object.parse_obj(json_object)
37
+ return self.pydantic_object.parse_obj(json_object)
42
38
 
43
39
  except (yaml.YAMLError, ValidationError) as e:
44
40
  name = self.pydantic_object.__name__
@@ -47,7 +43,15 @@ class YamlOutputParser(BaseOutputParser[T]):
47
43
 
48
44
  def get_format_instructions(self) -> str:
49
45
  # Copy schema to avoid altering original Pydantic schema.
50
- schema = {k: v for k, v in self.pydantic_object.schema().items()}
46
+ if hasattr(self.pydantic_object, "model_json_schema"):
47
+ # Pydantic v2
48
+ schema = dict(self.pydantic_object.model_json_schema().items())
49
+ elif hasattr(self.pydantic_object, "schema"):
50
+ # Pydantic v1
51
+ schema = dict(self.pydantic_object.schema().items())
52
+ else:
53
+ msg = "Pydantic object must have either model_json_schema or schema method"
54
+ raise ValueError(msg)
51
55
 
52
56
  # Remove extraneous fields.
53
57
  reduced_schema = schema
@@ -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
  ]