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
@@ -7,7 +7,7 @@ from langchain_core.output_parsers import BaseOutputParser, StrOutputParser
7
7
  from langchain_core.prompts import BasePromptTemplate
8
8
  from langchain_core.runnables import Runnable, RunnableSerializable
9
9
  from pydantic import SkipValidation
10
- from typing_extensions import TypedDict
10
+ from typing_extensions import TypedDict, override
11
11
 
12
12
  from langchain.output_parsers.prompts import NAIVE_FIX_PROMPT
13
13
 
@@ -15,6 +15,8 @@ T = TypeVar("T")
15
15
 
16
16
 
17
17
  class OutputFixingParserRetryChainInput(TypedDict, total=False):
18
+ """Input for the retry chain of the OutputFixingParser."""
19
+
18
20
  instructions: str
19
21
  completion: str
20
22
  error: str
@@ -24,6 +26,7 @@ class OutputFixingParser(BaseOutputParser[T]):
24
26
  """Wrap a parser and try to fix parsing errors."""
25
27
 
26
28
  @classmethod
29
+ @override
27
30
  def is_lc_serializable(cls) -> bool:
28
31
  return True
29
32
 
@@ -62,6 +65,7 @@ class OutputFixingParser(BaseOutputParser[T]):
62
65
  chain = prompt | llm | StrOutputParser()
63
66
  return cls(parser=parser, retry_chain=chain, max_retries=max_retries)
64
67
 
68
+ @override
65
69
  def parse(self, completion: str) -> T:
66
70
  retries = 0
67
71
 
@@ -70,35 +74,36 @@ class OutputFixingParser(BaseOutputParser[T]):
70
74
  return self.parser.parse(completion)
71
75
  except OutputParserException as e:
72
76
  if retries == self.max_retries:
73
- raise e
77
+ raise
78
+ retries += 1
79
+ if self.legacy and hasattr(self.retry_chain, "run"):
80
+ completion = self.retry_chain.run(
81
+ instructions=self.parser.get_format_instructions(),
82
+ completion=completion,
83
+ error=repr(e),
84
+ )
74
85
  else:
75
- retries += 1
76
- if self.legacy and hasattr(self.retry_chain, "run"):
77
- completion = self.retry_chain.run(
78
- instructions=self.parser.get_format_instructions(),
79
- completion=completion,
80
- error=repr(e),
86
+ try:
87
+ completion = self.retry_chain.invoke(
88
+ {
89
+ "instructions": self.parser.get_format_instructions(),
90
+ "completion": completion,
91
+ "error": repr(e),
92
+ },
93
+ )
94
+ except (NotImplementedError, AttributeError):
95
+ # Case: self.parser does not have get_format_instructions
96
+ completion = self.retry_chain.invoke(
97
+ {
98
+ "completion": completion,
99
+ "error": repr(e),
100
+ },
81
101
  )
82
- else:
83
- try:
84
- completion = self.retry_chain.invoke(
85
- dict(
86
- instructions=self.parser.get_format_instructions(),
87
- completion=completion,
88
- error=repr(e),
89
- )
90
- )
91
- except (NotImplementedError, AttributeError):
92
- # Case: self.parser does not have get_format_instructions
93
- completion = self.retry_chain.invoke(
94
- dict(
95
- completion=completion,
96
- error=repr(e),
97
- )
98
- )
99
-
100
- raise OutputParserException("Failed to parse")
101
102
 
103
+ msg = "Failed to parse"
104
+ raise OutputParserException(msg)
105
+
106
+ @override
102
107
  async def aparse(self, completion: str) -> T:
103
108
  retries = 0
104
109
 
@@ -107,35 +112,36 @@ class OutputFixingParser(BaseOutputParser[T]):
107
112
  return await self.parser.aparse(completion)
108
113
  except OutputParserException as e:
109
114
  if retries == self.max_retries:
110
- raise e
115
+ raise
116
+ retries += 1
117
+ if self.legacy and hasattr(self.retry_chain, "arun"):
118
+ completion = await self.retry_chain.arun(
119
+ instructions=self.parser.get_format_instructions(),
120
+ completion=completion,
121
+ error=repr(e),
122
+ )
111
123
  else:
112
- retries += 1
113
- if self.legacy and hasattr(self.retry_chain, "arun"):
114
- completion = await self.retry_chain.arun(
115
- instructions=self.parser.get_format_instructions(),
116
- completion=completion,
117
- error=repr(e),
124
+ try:
125
+ completion = await self.retry_chain.ainvoke(
126
+ {
127
+ "instructions": self.parser.get_format_instructions(),
128
+ "completion": completion,
129
+ "error": repr(e),
130
+ },
118
131
  )
119
- else:
120
- try:
121
- completion = await self.retry_chain.ainvoke(
122
- dict(
123
- instructions=self.parser.get_format_instructions(),
124
- completion=completion,
125
- error=repr(e),
126
- )
127
- )
128
- except (NotImplementedError, AttributeError):
129
- # Case: self.parser does not have get_format_instructions
130
- completion = await self.retry_chain.ainvoke(
131
- dict(
132
- completion=completion,
133
- error=repr(e),
134
- )
135
- )
136
-
137
- raise OutputParserException("Failed to parse")
132
+ except (NotImplementedError, AttributeError):
133
+ # Case: self.parser does not have get_format_instructions
134
+ completion = await self.retry_chain.ainvoke(
135
+ {
136
+ "completion": completion,
137
+ "error": repr(e),
138
+ },
139
+ )
140
+
141
+ msg = "Failed to parse"
142
+ raise OutputParserException(msg)
138
143
 
144
+ @override
139
145
  def get_format_instructions(self) -> str:
140
146
  return self.parser.get_format_instructions()
141
147
 
@@ -144,5 +150,6 @@ class OutputFixingParser(BaseOutputParser[T]):
144
150
  return "output_fixing"
145
151
 
146
152
  @property
153
+ @override
147
154
  def OutputType(self) -> type[T]:
148
155
  return self.parser.OutputType
@@ -1,12 +1,10 @@
1
- # flake8: noqa
2
-
3
1
  STRUCTURED_FORMAT_INSTRUCTIONS = """The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":
4
2
 
5
3
  ```json
6
4
  {{
7
5
  {format}
8
6
  }}
9
- ```"""
7
+ ```""" # noqa: E501
10
8
 
11
9
  STRUCTURED_FORMAT_SIMPLE_INSTRUCTIONS = """
12
10
  ```json
@@ -24,7 +22,7 @@ the object {{"foo": ["bar", "baz"]}} is a well-formatted instance of the schema.
24
22
  Here is the output schema:
25
23
  ```
26
24
  {schema}
27
- ```"""
25
+ ```""" # noqa: E501
28
26
 
29
27
  YAML_FORMAT_INSTRUCTIONS = """The output should be formatted as a YAML instance that conforms to the given JSON schema below.
30
28
 
@@ -49,14 +47,14 @@ YAML_FORMAT_INSTRUCTIONS = """The output should be formatted as a YAML instance
49
47
  ```
50
48
  habit: Using disposable water bottles for daily hydration.
51
49
  sustainable_alternative: Switch to a reusable water bottle to reduce plastic waste and decrease your environmental footprint.
52
- ```
50
+ ```
53
51
 
54
- Please follow the standard YAML formatting conventions with an indent of 2 spaces and make sure that the data types adhere strictly to the following JSON schema:
52
+ Please follow the standard YAML formatting conventions with an indent of 2 spaces and make sure that the data types adhere strictly to the following JSON schema:
55
53
  ```
56
54
  {schema}
57
55
  ```
58
56
 
59
- Make sure to always enclose the YAML output in triple backticks (```). Please do not add anything other than valid YAML output!"""
57
+ Make sure to always enclose the YAML output in triple backticks (```). Please do not add anything other than valid YAML output!""" # noqa: E501
60
58
 
61
59
 
62
60
  PANDAS_DATAFRAME_FORMAT_INSTRUCTIONS = """The output should be formatted as a string as the operation, followed by a colon, followed by the column or row to be queried on, followed by optional array parameters.
@@ -78,4 +76,4 @@ Here are the possible columns:
78
76
  ```
79
77
  {columns}
80
78
  ```
81
- """
79
+ """ # noqa: E501
@@ -9,7 +9,7 @@ from langchain_core.utils.json import (
9
9
 
10
10
  __all__ = [
11
11
  "SimpleJsonOutputParser",
12
- "parse_partial_json",
13
- "parse_json_markdown",
14
12
  "parse_and_check_json_markdown",
13
+ "parse_json_markdown",
14
+ "parse_partial_json",
15
15
  ]
@@ -6,8 +6,8 @@ from langchain_core.output_parsers.list import (
6
6
  )
7
7
 
8
8
  __all__ = [
9
- "ListOutputParser",
10
9
  "CommaSeparatedListOutputParser",
11
- "NumberedListOutputParser",
10
+ "ListOutputParser",
12
11
  "MarkdownListOutputParser",
12
+ "NumberedListOutputParser",
13
13
  ]
@@ -10,13 +10,13 @@ def load_output_parser(config: dict) -> dict:
10
10
  Returns:
11
11
  config dict with output parser loaded
12
12
  """
13
- if "output_parsers" in config:
14
- if config["output_parsers"] is not None:
15
- _config = config["output_parsers"]
16
- output_parser_type = _config["_type"]
17
- if output_parser_type == "regex_parser":
18
- output_parser = RegexParser(**_config)
19
- else:
20
- raise ValueError(f"Unsupported output parser {output_parser_type}")
21
- config["output_parsers"] = output_parser
13
+ if "output_parsers" in config and config["output_parsers"] is not None:
14
+ _config = config["output_parsers"]
15
+ output_parser_type = _config["_type"]
16
+ if output_parser_type == "regex_parser":
17
+ output_parser = RegexParser(**_config)
18
+ else:
19
+ msg = f"Unsupported output parser {output_parser_type}"
20
+ raise ValueError(msg)
21
+ config["output_parsers"] = output_parser
22
22
  return config
@@ -6,8 +6,8 @@ from langchain_core.output_parsers.openai_functions import (
6
6
  )
7
7
 
8
8
  __all__ = [
9
- "PydanticOutputFunctionsParser",
10
- "PydanticAttrOutputFunctionsParser",
11
- "JsonOutputFunctionsParser",
12
9
  "JsonKeyOutputFunctionsParser",
10
+ "JsonOutputFunctionsParser",
11
+ "PydanticAttrOutputFunctionsParser",
12
+ "PydanticOutputFunctionsParser",
13
13
  ]
@@ -4,4 +4,4 @@ from langchain_core.output_parsers.openai_tools import (
4
4
  PydanticToolsParser,
5
5
  )
6
6
 
7
- __all__ = ["PydanticToolsParser", "JsonOutputToolsParser", "JsonOutputKeyToolsParser"]
7
+ __all__ = ["JsonOutputKeyToolsParser", "JsonOutputToolsParser", "PydanticToolsParser"]
@@ -4,6 +4,7 @@ from typing import Any, Union
4
4
  from langchain_core.exceptions import OutputParserException
5
5
  from langchain_core.output_parsers.base import BaseOutputParser
6
6
  from pydantic import field_validator
7
+ from typing_extensions import override
7
8
 
8
9
  from langchain.output_parsers.format_instructions import (
9
10
  PANDAS_DATAFRAME_FORMAT_INSTRUCTIONS,
@@ -18,22 +19,36 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
18
19
 
19
20
  @field_validator("dataframe")
20
21
  @classmethod
21
- def validate_dataframe(cls, val: Any) -> Any:
22
+ def _validate_dataframe(cls, val: Any) -> Any:
22
23
  import pandas as pd
23
24
 
24
25
  if issubclass(type(val), pd.DataFrame):
25
26
  return val
26
27
  if pd.DataFrame(val).empty:
27
- raise ValueError("DataFrame cannot be empty.")
28
+ msg = "DataFrame cannot be empty."
29
+ raise ValueError(msg)
28
30
 
29
- raise TypeError(
30
- "Wrong type for 'dataframe', must be a subclass \
31
+ msg = "Wrong type for 'dataframe', must be a subclass \
31
32
  of Pandas DataFrame (pd.DataFrame)"
32
- )
33
+ raise TypeError(msg)
33
34
 
34
35
  def parse_array(
35
- self, array: str, original_request_params: str
36
+ self,
37
+ array: str,
38
+ original_request_params: str,
36
39
  ) -> tuple[list[Union[int, str]], str]:
40
+ """Parse the array from the request parameters.
41
+
42
+ Args:
43
+ array: The array string to parse.
44
+ original_request_params: The original request parameters string.
45
+
46
+ Returns:
47
+ A tuple containing the parsed array and the stripped request parameters.
48
+
49
+ Raises:
50
+ OutputParserException: If the array format is invalid or cannot be parsed.
51
+ """
37
52
  parsed_array: list[Union[int, str]] = []
38
53
 
39
54
  # Check if the format is [1,3,5]
@@ -46,57 +61,53 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
46
61
  start, end = map(int, match.groups())
47
62
  parsed_array = list(range(start, end + 1))
48
63
  else:
49
- raise OutputParserException(
50
- f"Unable to parse the array provided in {array}. \
64
+ msg = f"Unable to parse the array provided in {array}. \
51
65
  Please check the format instructions."
52
- )
66
+ raise OutputParserException(msg)
53
67
  # Check if the format is ["column_name"]
54
68
  elif re.match(r"\[[a-zA-Z0-9_]+(?:,[a-zA-Z0-9_]+)*\]", array):
55
69
  match = re.match(r"\[[a-zA-Z0-9_]+(?:,[a-zA-Z0-9_]+)*\]", array)
56
70
  if match:
57
71
  parsed_array = list(map(str, match.group().strip("[]").split(",")))
58
72
  else:
59
- raise OutputParserException(
60
- f"Unable to parse the array provided in {array}. \
73
+ msg = f"Unable to parse the array provided in {array}. \
61
74
  Please check the format instructions."
62
- )
75
+ raise OutputParserException(msg)
63
76
 
64
77
  # Validate the array
65
78
  if not parsed_array:
66
- raise OutputParserException(
67
- f"Invalid array format in '{original_request_params}'. \
79
+ msg = f"Invalid array format in '{original_request_params}'. \
68
80
  Please check the format instructions."
69
- )
70
- elif (
81
+ raise OutputParserException(msg)
82
+ if (
71
83
  isinstance(parsed_array[0], int)
72
84
  and parsed_array[-1] > self.dataframe.index.max()
73
85
  ):
74
- raise OutputParserException(
75
- f"The maximum index {parsed_array[-1]} exceeds the maximum index of \
86
+ msg = f"The maximum index {parsed_array[-1]} exceeds the maximum index of \
76
87
  the Pandas DataFrame {self.dataframe.index.max()}."
77
- )
88
+ raise OutputParserException(msg)
78
89
 
79
90
  return parsed_array, original_request_params.split("[")[0]
80
91
 
92
+ @override
81
93
  def parse(self, request: str) -> dict[str, Any]:
82
94
  stripped_request_params = None
83
95
  splitted_request = request.strip().split(":")
84
- if len(splitted_request) != 2:
85
- raise OutputParserException(
86
- f"Request '{request}' is not correctly formatted. \
96
+ if len(splitted_request) != 2: # noqa: PLR2004
97
+ msg = f"Request '{request}' is not correctly formatted. \
87
98
  Please refer to the format instructions."
88
- )
99
+ raise OutputParserException(msg)
89
100
  result = {}
90
101
  try:
91
102
  request_type, request_params = splitted_request
92
103
  if request_type in {"Invalid column", "Invalid operation"}:
93
- raise OutputParserException(
94
- f"{request}. Please check the format instructions."
95
- )
104
+ msg = f"{request}. Please check the format instructions."
105
+ raise OutputParserException(msg)
96
106
  array_exists = re.search(r"(\[.*?\])", request_params)
97
107
  if array_exists:
98
108
  parsed_array, stripped_request_params = self.parse_array(
99
- array_exists.group(1), request_params
109
+ array_exists.group(1),
110
+ request_params,
100
111
  )
101
112
  if request_type == "column":
102
113
  filtered_df = self.dataframe[
@@ -127,34 +138,34 @@ class PandasDataFrameOutputParser(BaseOutputParser[dict[str, Any]]):
127
138
  self.dataframe.index.isin(parsed_array)
128
139
  ]
129
140
  result[request_type] = getattr(
130
- filtered_df[stripped_request_params], request_type
141
+ filtered_df[stripped_request_params],
142
+ request_type,
131
143
  )()
144
+ elif request_type == "column":
145
+ result[request_params] = self.dataframe[request_params]
146
+ elif request_type == "row":
147
+ result[request_params] = self.dataframe.iloc[int(request_params)]
132
148
  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):
149
+ result[request_type] = getattr(
150
+ self.dataframe[request_params],
151
+ request_type,
152
+ )()
153
+ except (AttributeError, IndexError, KeyError) as e:
142
154
  if request_type not in {"column", "row"}:
143
- raise OutputParserException(
144
- f"Unsupported request type '{request_type}'. \
155
+ msg = f"Unsupported request type '{request_type}'. \
145
156
  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
- )
157
+ raise OutputParserException(msg) from e
158
+ msg = f"""Requested index {
159
+ request_params
160
+ if stripped_request_params is None
161
+ else stripped_request_params
162
+ } is out of bounds."""
163
+ raise OutputParserException(msg) from e
154
164
 
155
165
  return result
156
166
 
167
+ @override
157
168
  def get_format_instructions(self) -> str:
158
169
  return PANDAS_DATAFRAME_FORMAT_INSTRUCTIONS.format(
159
- columns=", ".join(self.dataframe.columns)
170
+ columns=", ".join(self.dataframe.columns),
160
171
  )
@@ -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)
@@ -4,12 +4,14 @@ import re
4
4
  from typing import Optional
5
5
 
6
6
  from langchain_core.output_parsers import BaseOutputParser
7
+ from typing_extensions import override
7
8
 
8
9
 
9
10
  class RegexParser(BaseOutputParser[dict[str, str]]):
10
11
  """Parse the output of an LLM call using a regex."""
11
12
 
12
13
  @classmethod
14
+ @override
13
15
  def is_lc_serializable(cls) -> bool:
14
16
  return True
15
17
 
@@ -30,11 +32,10 @@ class RegexParser(BaseOutputParser[dict[str, str]]):
30
32
  match = re.search(self.regex, text)
31
33
  if match:
32
34
  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
- }
35
+ if self.default_output_key is None:
36
+ msg = f"Could not parse output: {text}"
37
+ raise ValueError(msg)
38
+ return {
39
+ key: text if key == self.default_output_key else ""
40
+ for key in self.output_keys
41
+ }
@@ -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