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
@@ -3,4 +3,4 @@ from langchain_core.prompts.prompt import PromptTemplate
3
3
  # For backwards compatibility.
4
4
  Prompt = PromptTemplate
5
5
 
6
- __all__ = ["PromptTemplate", "Prompt"]
6
+ __all__ = ["Prompt", "PromptTemplate"]
@@ -148,8 +148,8 @@ __all__ = [
148
148
  "GoogleDocumentAIWarehouseRetriever",
149
149
  "GoogleVertexAIMultiTurnSearchRetriever",
150
150
  "GoogleVertexAISearchRetriever",
151
- "KayAiRetriever",
152
151
  "KNNRetriever",
152
+ "KayAiRetriever",
153
153
  "LlamaIndexGraphRetriever",
154
154
  "LlamaIndexRetriever",
155
155
  "MergerRetriever",
@@ -157,22 +157,22 @@ __all__ = [
157
157
  "MilvusRetriever",
158
158
  "MultiQueryRetriever",
159
159
  "MultiVectorRetriever",
160
+ "NeuralDBRetriever",
160
161
  "OutlineRetriever",
161
162
  "ParentDocumentRetriever",
162
163
  "PineconeHybridSearchRetriever",
163
164
  "PubMedRetriever",
164
- "RemoteLangChainRetriever",
165
165
  "RePhraseQueryRetriever",
166
- "SelfQueryRetriever",
166
+ "RemoteLangChainRetriever",
167
167
  "SVMRetriever",
168
- "TavilySearchAPIRetriever",
168
+ "SelfQueryRetriever",
169
169
  "TFIDFRetriever",
170
+ "TavilySearchAPIRetriever",
170
171
  "TimeWeightedVectorStoreRetriever",
171
172
  "VespaRetriever",
172
173
  "WeaviateHybridSearchRetriever",
173
174
  "WebResearchRetriever",
174
175
  "WikipediaRetriever",
175
176
  "ZepRetriever",
176
- "NeuralDBRetriever",
177
177
  "ZillizRetriever",
178
178
  ]
@@ -27,7 +27,7 @@ def __getattr__(name: str) -> Any:
27
27
 
28
28
 
29
29
  __all__ = [
30
- "VectorSearchConfig",
31
- "RetrievalConfig",
32
30
  "AmazonKnowledgeBasesRetriever",
31
+ "RetrievalConfig",
32
+ "VectorSearchConfig",
33
33
  ]
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "default_preprocessing_func",
27
26
  "BM25Retriever",
27
+ "default_preprocessing_func",
28
28
  ]
@@ -38,15 +38,18 @@ class ContextualCompressionRetriever(BaseRetriever):
38
38
  Sequence of relevant documents
39
39
  """
40
40
  docs = self.base_retriever.invoke(
41
- query, config={"callbacks": run_manager.get_child()}, **kwargs
41
+ query,
42
+ config={"callbacks": run_manager.get_child()},
43
+ **kwargs,
42
44
  )
43
45
  if docs:
44
46
  compressed_docs = self.base_compressor.compress_documents(
45
- docs, query, callbacks=run_manager.get_child()
47
+ docs,
48
+ query,
49
+ callbacks=run_manager.get_child(),
46
50
  )
47
51
  return list(compressed_docs)
48
- else:
49
- return []
52
+ return []
50
53
 
51
54
  async def _aget_relevant_documents(
52
55
  self,
@@ -64,12 +67,15 @@ class ContextualCompressionRetriever(BaseRetriever):
64
67
  List of relevant documents
65
68
  """
66
69
  docs = await self.base_retriever.ainvoke(
67
- query, config={"callbacks": run_manager.get_child()}, **kwargs
70
+ query,
71
+ config={"callbacks": run_manager.get_child()},
72
+ **kwargs,
68
73
  )
69
74
  if docs:
70
75
  compressed_docs = await self.base_compressor.acompress_documents(
71
- docs, query, callbacks=run_manager.get_child()
76
+ docs,
77
+ query,
78
+ callbacks=run_manager.get_child(),
72
79
  )
73
80
  return list(compressed_docs)
74
- else:
75
- return []
81
+ return []
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "SearchType",
27
26
  "DocArrayRetriever",
27
+ "SearchType",
28
28
  ]
@@ -28,16 +28,17 @@ def __getattr__(name: str) -> Any:
28
28
  if name in _module_lookup:
29
29
  module = importlib.import_module(_module_lookup[name])
30
30
  return getattr(module, name)
31
- raise AttributeError(f"module {__name__} has no attribute {name}")
31
+ msg = f"module {__name__} has no attribute {name}"
32
+ raise AttributeError(msg)
32
33
 
33
34
 
34
35
  __all__ = [
36
+ "CohereRerank",
37
+ "CrossEncoderReranker",
35
38
  "DocumentCompressorPipeline",
36
39
  "EmbeddingsFilter",
37
40
  "FlashrankRerank",
38
- "LLMListwiseRerank",
39
41
  "LLMChainExtractor",
40
42
  "LLMChainFilter",
41
- "CohereRerank",
42
- "CrossEncoderReranker",
43
+ "LLMListwiseRerank",
43
44
  ]
@@ -32,20 +32,23 @@ class DocumentCompressorPipeline(BaseDocumentCompressor):
32
32
  if isinstance(_transformer, BaseDocumentCompressor):
33
33
  accepts_callbacks = (
34
34
  signature(_transformer.compress_documents).parameters.get(
35
- "callbacks"
35
+ "callbacks",
36
36
  )
37
37
  is not None
38
38
  )
39
39
  if accepts_callbacks:
40
40
  documents = _transformer.compress_documents(
41
- documents, query, callbacks=callbacks
41
+ documents,
42
+ query,
43
+ callbacks=callbacks,
42
44
  )
43
45
  else:
44
46
  documents = _transformer.compress_documents(documents, query)
45
47
  elif isinstance(_transformer, BaseDocumentTransformer):
46
48
  documents = _transformer.transform_documents(documents)
47
49
  else:
48
- raise ValueError(f"Got unexpected transformer type: {_transformer}")
50
+ msg = f"Got unexpected transformer type: {_transformer}"
51
+ raise ValueError(msg) # noqa: TRY004
49
52
  return documents
50
53
 
51
54
  async def acompress_documents(
@@ -59,18 +62,21 @@ class DocumentCompressorPipeline(BaseDocumentCompressor):
59
62
  if isinstance(_transformer, BaseDocumentCompressor):
60
63
  accepts_callbacks = (
61
64
  signature(_transformer.acompress_documents).parameters.get(
62
- "callbacks"
65
+ "callbacks",
63
66
  )
64
67
  is not None
65
68
  )
66
69
  if accepts_callbacks:
67
70
  documents = await _transformer.acompress_documents(
68
- documents, query, callbacks=callbacks
71
+ documents,
72
+ query,
73
+ callbacks=callbacks,
69
74
  )
70
75
  else:
71
76
  documents = await _transformer.acompress_documents(documents, query)
72
77
  elif isinstance(_transformer, BaseDocumentTransformer):
73
78
  documents = await _transformer.atransform_documents(documents)
74
79
  else:
75
- raise ValueError(f"Got unexpected transformer type: {_transformer}")
80
+ msg = f"Got unexpected transformer type: {_transformer}"
81
+ raise ValueError(msg) # noqa: TRY004
76
82
  return documents
@@ -80,7 +80,7 @@ class LLMChainExtractor(BaseDocumentCompressor):
80
80
  if len(output) == 0:
81
81
  continue
82
82
  compressed_docs.append(
83
- Document(page_content=cast(str, output), metadata=doc.metadata)
83
+ Document(page_content=cast(str, output), metadata=doc.metadata),
84
84
  )
85
85
  return compressed_docs
86
86
 
@@ -98,7 +98,7 @@ class LLMChainExtractor(BaseDocumentCompressor):
98
98
  if len(outputs[i]) == 0:
99
99
  continue
100
100
  compressed_docs.append(
101
- Document(page_content=outputs[i], metadata=doc.metadata)
101
+ Document(page_content=outputs[i], metadata=doc.metadata),
102
102
  )
103
103
  return compressed_docs
104
104
 
@@ -1,5 +1,4 @@
1
- # flake8: noqa
2
- prompt_template = """Given the following question and context, extract any part of the context *AS IS* that is relevant to answer the question. If none of the context is relevant return {no_output_str}.
1
+ prompt_template = """Given the following question and context, extract any part of the context *AS IS* that is relevant to answer the question. If none of the context is relevant return {no_output_str}.
3
2
 
4
3
  Remember, *DO NOT* edit the extracted parts of the context.
5
4
 
@@ -8,4 +7,4 @@ Remember, *DO NOT* edit the extracted parts of the context.
8
7
  >>>
9
8
  {{context}}
10
9
  >>>
11
- Extracted relevant parts:"""
10
+ Extracted relevant parts:""" # noqa: E501
@@ -36,7 +36,7 @@ class LLMChainFilter(BaseDocumentCompressor):
36
36
  """Filter that drops documents that aren't relevant to the query."""
37
37
 
38
38
  llm_chain: Runnable
39
- """LLM wrapper to use for filtering documents.
39
+ """LLM wrapper to use for filtering documents.
40
40
  The chain prompt is expected to have a BooleanOutputParser."""
41
41
 
42
42
  get_input: Callable[[str, Document], dict] = default_get_input
@@ -58,7 +58,8 @@ class LLMChainFilter(BaseDocumentCompressor):
58
58
  config = RunnableConfig(callbacks=callbacks)
59
59
  outputs = zip(
60
60
  self.llm_chain.batch(
61
- [self.get_input(query, doc) for doc in documents], config=config
61
+ [self.get_input(query, doc) for doc in documents],
62
+ config=config,
62
63
  ),
63
64
  documents,
64
65
  )
@@ -69,9 +70,8 @@ class LLMChainFilter(BaseDocumentCompressor):
69
70
  output = output_[self.llm_chain.output_key]
70
71
  if self.llm_chain.prompt.output_parser is not None:
71
72
  include_doc = self.llm_chain.prompt.output_parser.parse(output)
72
- else:
73
- if isinstance(output_, bool):
74
- include_doc = output_
73
+ elif isinstance(output_, bool):
74
+ include_doc = output_
75
75
  if include_doc:
76
76
  filtered_docs.append(doc)
77
77
 
@@ -89,7 +89,8 @@ class LLMChainFilter(BaseDocumentCompressor):
89
89
  config = RunnableConfig(callbacks=callbacks)
90
90
  outputs = zip(
91
91
  await self.llm_chain.abatch(
92
- [self.get_input(query, doc) for doc in documents], config=config
92
+ [self.get_input(query, doc) for doc in documents],
93
+ config=config,
93
94
  ),
94
95
  documents,
95
96
  )
@@ -99,9 +100,8 @@ class LLMChainFilter(BaseDocumentCompressor):
99
100
  output = output_[self.llm_chain.output_key]
100
101
  if self.llm_chain.prompt.output_parser is not None:
101
102
  include_doc = self.llm_chain.prompt.output_parser.parse(output)
102
- else:
103
- if isinstance(output_, bool):
104
- include_doc = output_
103
+ elif isinstance(output_, bool):
104
+ include_doc = output_
105
105
  if include_doc:
106
106
  filtered_docs.append(doc)
107
107
 
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  prompt_template = """Given the following question and context, return YES if the context is relevant to the question and NO if it isn't.
3
2
 
4
3
  > Question: {question}
@@ -6,4 +5,4 @@ prompt_template = """Given the following question and context, return YES if the
6
5
  >>>
7
6
  {context}
8
7
  >>>
9
- > Relevant (YES / NO):"""
8
+ > Relevant (YES / NO):""" # noqa: E501
@@ -12,7 +12,9 @@ from pydantic import ConfigDict, model_validator
12
12
 
13
13
 
14
14
  @deprecated(
15
- since="0.0.30", removal="1.0", alternative_import="langchain_cohere.CohereRerank"
15
+ since="0.0.30",
16
+ removal="1.0",
17
+ alternative_import="langchain_cohere.CohereRerank",
16
18
  )
17
19
  class CohereRerank(BaseDocumentCompressor):
18
20
  """Document compressor that uses `Cohere Rerank API`."""
@@ -24,7 +26,7 @@ class CohereRerank(BaseDocumentCompressor):
24
26
  model: str = "rerank-english-v2.0"
25
27
  """Model to use for reranking."""
26
28
  cohere_api_key: Optional[str] = None
27
- """Cohere API key. Must be specified directly or via environment variable
29
+ """Cohere API key. Must be specified directly or via environment variable
28
30
  COHERE_API_KEY."""
29
31
  user_agent: str = "langchain"
30
32
  """Identifier for the application making the request."""
@@ -41,13 +43,16 @@ class CohereRerank(BaseDocumentCompressor):
41
43
  if not values.get("client"):
42
44
  try:
43
45
  import cohere
44
- except ImportError:
45
- raise ImportError(
46
+ except ImportError as e:
47
+ msg = (
46
48
  "Could not import cohere python package. "
47
49
  "Please install it with `pip install cohere`."
48
50
  )
51
+ raise ImportError(msg) from e
49
52
  cohere_api_key = get_from_dict_or_env(
50
- values, "cohere_api_key", "COHERE_API_KEY"
53
+ values,
54
+ "cohere_api_key",
55
+ "COHERE_API_KEY",
51
56
  )
52
57
  client_name = values.get("user_agent", "langchain")
53
58
  values["client"] = cohere.Client(cohere_api_key, client_name=client_name)
@@ -87,16 +92,11 @@ class CohereRerank(BaseDocumentCompressor):
87
92
  max_chunks_per_doc=max_chunks_per_doc,
88
93
  )
89
94
  if hasattr(results, "results"):
90
- results = getattr(results, "results")
91
- result_dicts = []
92
- for res in results:
93
- result_dicts.append(
94
- {
95
- "index": res.index,
96
- "relevance_score": res.relevance_score,
97
- }
98
- )
99
- return result_dicts
95
+ results = results.results
96
+ return [
97
+ {"index": res.index, "relevance_score": res.relevance_score}
98
+ for res in results
99
+ ]
100
100
 
101
101
  def compress_documents(
102
102
  self,
@@ -11,11 +11,12 @@ from pydantic import ConfigDict, Field
11
11
  def _get_similarity_function() -> Callable:
12
12
  try:
13
13
  from langchain_community.utils.math import cosine_similarity
14
- except ImportError:
15
- raise ImportError(
14
+ except ImportError as e:
15
+ msg = (
16
16
  "To use please install langchain-community "
17
17
  "with `pip install langchain-community`."
18
18
  )
19
+ raise ImportError(msg) from e
19
20
  return cosine_similarity
20
21
 
21
22
 
@@ -45,7 +46,8 @@ class EmbeddingsFilter(BaseDocumentCompressor):
45
46
  def validate_params(cls, values: dict) -> dict:
46
47
  """Validate similarity parameters."""
47
48
  if values["k"] is None and values["similarity_threshold"] is None:
48
- raise ValueError("Must specify one of `k` or `similarity_threshold`.")
49
+ msg = "Must specify one of `k` or `similarity_threshold`."
50
+ raise ValueError(msg)
49
51
  return values
50
52
 
51
53
  def compress_documents(
@@ -60,21 +62,22 @@ class EmbeddingsFilter(BaseDocumentCompressor):
60
62
  _get_embeddings_from_stateful_docs,
61
63
  get_stateful_documents,
62
64
  )
63
- except ImportError:
64
- raise ImportError(
65
+ except ImportError as e:
66
+ msg = (
65
67
  "To use please install langchain-community "
66
68
  "with `pip install langchain-community`."
67
69
  )
70
+ raise ImportError(msg) from e
68
71
 
69
72
  try:
70
73
  import numpy as np
71
74
  except ImportError as e:
72
- raise ImportError(
73
- "Could not import numpy, please install with `pip install numpy`."
74
- ) from e
75
+ msg = "Could not import numpy, please install with `pip install numpy`."
76
+ raise ImportError(msg) from e
75
77
  stateful_documents = get_stateful_documents(documents)
76
78
  embedded_documents = _get_embeddings_from_stateful_docs(
77
- self.embeddings, stateful_documents
79
+ self.embeddings,
80
+ stateful_documents,
78
81
  )
79
82
  embedded_query = self.embeddings.embed_query(query)
80
83
  similarity = self.similarity_fn([embedded_query], embedded_documents)[0]
@@ -83,7 +86,7 @@ class EmbeddingsFilter(BaseDocumentCompressor):
83
86
  included_idxs = np.argsort(similarity)[::-1][: self.k]
84
87
  if self.similarity_threshold is not None:
85
88
  similar_enough = np.where(
86
- similarity[included_idxs] > self.similarity_threshold
89
+ similarity[included_idxs] > self.similarity_threshold,
87
90
  )
88
91
  included_idxs = included_idxs[similar_enough]
89
92
  for i in included_idxs:
@@ -102,21 +105,22 @@ class EmbeddingsFilter(BaseDocumentCompressor):
102
105
  _aget_embeddings_from_stateful_docs,
103
106
  get_stateful_documents,
104
107
  )
105
- except ImportError:
106
- raise ImportError(
108
+ except ImportError as e:
109
+ msg = (
107
110
  "To use please install langchain-community "
108
111
  "with `pip install langchain-community`."
109
112
  )
113
+ raise ImportError(msg) from e
110
114
 
111
115
  try:
112
116
  import numpy as np
113
117
  except ImportError as e:
114
- raise ImportError(
115
- "Could not import numpy, please install with `pip install numpy`."
116
- ) from e
118
+ msg = "Could not import numpy, please install with `pip install numpy`."
119
+ raise ImportError(msg) from e
117
120
  stateful_documents = get_stateful_documents(documents)
118
121
  embedded_documents = await _aget_embeddings_from_stateful_docs(
119
- self.embeddings, stateful_documents
122
+ self.embeddings,
123
+ stateful_documents,
120
124
  )
121
125
  embedded_query = await self.embeddings.aembed_query(query)
122
126
  similarity = self.similarity_fn([embedded_query], embedded_documents)[0]
@@ -125,7 +129,7 @@ class EmbeddingsFilter(BaseDocumentCompressor):
125
129
  included_idxs = np.argsort(similarity)[::-1][: self.k]
126
130
  if self.similarity_threshold is not None:
127
131
  similar_enough = np.where(
128
- similarity[included_idxs] > self.similarity_threshold
132
+ similarity[included_idxs] > self.similarity_threshold,
129
133
  )
130
134
  included_idxs = included_idxs[similar_enough]
131
135
  for i in included_idxs:
@@ -11,7 +11,7 @@ if TYPE_CHECKING:
11
11
  # Used to consolidate logic for raising deprecation warnings and
12
12
  # handling optional imports.
13
13
  DEPRECATED_LOOKUP = {
14
- "FlashrankRerank": "langchain_community.document_compressors.flashrank_rerank"
14
+ "FlashrankRerank": "langchain_community.document_compressors.flashrank_rerank",
15
15
  }
16
16
 
17
17
  _import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
@@ -73,8 +73,8 @@ class LLMListwiseRerank(BaseDocumentCompressor):
73
73
  """
74
74
 
75
75
  reranker: Runnable[dict, list[Document]]
76
- """LLM-based reranker to use for filtering documents. Expected to take in a dict
77
- with 'documents: Sequence[Document]' and 'query: str' keys and output a
76
+ """LLM-based reranker to use for filtering documents. Expected to take in a dict
77
+ with 'documents: Sequence[Document]' and 'query: str' keys and output a
78
78
  List[Document]."""
79
79
 
80
80
  top_n: int = 3
@@ -92,7 +92,8 @@ class LLMListwiseRerank(BaseDocumentCompressor):
92
92
  ) -> Sequence[Document]:
93
93
  """Filter down documents based on their relevance to the query."""
94
94
  results = self.reranker.invoke(
95
- {"documents": documents, "query": query}, config={"callbacks": callbacks}
95
+ {"documents": documents, "query": query},
96
+ config={"callbacks": callbacks},
96
97
  )
97
98
  return results[: self.top_n]
98
99
 
@@ -117,9 +118,10 @@ class LLMListwiseRerank(BaseDocumentCompressor):
117
118
  """
118
119
 
119
120
  if llm.with_structured_output == BaseLanguageModel.with_structured_output:
120
- raise ValueError(
121
+ msg = (
121
122
  f"llm of type {type(llm)} does not implement `with_structured_output`."
122
123
  )
124
+ raise ValueError(msg)
123
125
 
124
126
  class RankDocuments(BaseModel):
125
127
  """Rank the documents by their relevance to the user question.
@@ -137,6 +139,6 @@ class LLMListwiseRerank(BaseDocumentCompressor):
137
139
  reranker = RunnablePassthrough.assign(
138
140
  ranking=RunnableLambda(_get_prompt_input)
139
141
  | _prompt
140
- | llm.with_structured_output(RankDocuments)
142
+ | llm.with_structured_output(RankDocuments),
141
143
  ) | RunnableLambda(_parse_ranking)
142
144
  return cls(reranker=reranker, **kwargs)
@@ -28,6 +28,7 @@ from langchain_core.runnables.utils import (
28
28
  get_unique_config_specs,
29
29
  )
30
30
  from pydantic import model_validator
31
+ from typing_extensions import override
31
32
 
32
33
  T = TypeVar("T")
33
34
  H = TypeVar("H", bound=Hashable)
@@ -86,8 +87,12 @@ class EnsembleRetriever(BaseRetriever):
86
87
  values["weights"] = [1 / n_retrievers] * n_retrievers
87
88
  return values
88
89
 
90
+ @override
89
91
  def invoke(
90
- self, input: str, config: Optional[RunnableConfig] = None, **kwargs: Any
92
+ self,
93
+ input: str,
94
+ config: Optional[RunnableConfig] = None,
95
+ **kwargs: Any,
91
96
  ) -> list[Document]:
92
97
  from langchain_core.callbacks import CallbackManager
93
98
 
@@ -111,7 +116,7 @@ class EnsembleRetriever(BaseRetriever):
111
116
  result = self.rank_fusion(input, run_manager=run_manager, config=config)
112
117
  except Exception as e:
113
118
  run_manager.on_retriever_error(e)
114
- raise e
119
+ raise
115
120
  else:
116
121
  run_manager.on_retriever_end(
117
122
  result,
@@ -119,8 +124,12 @@ class EnsembleRetriever(BaseRetriever):
119
124
  )
120
125
  return result
121
126
 
127
+ @override
122
128
  async def ainvoke(
123
- self, input: str, config: Optional[RunnableConfig] = None, **kwargs: Any
129
+ self,
130
+ input: str,
131
+ config: Optional[RunnableConfig] = None,
132
+ **kwargs: Any,
124
133
  ) -> list[Document]:
125
134
  from langchain_core.callbacks import AsyncCallbackManager
126
135
 
@@ -142,11 +151,13 @@ class EnsembleRetriever(BaseRetriever):
142
151
  )
143
152
  try:
144
153
  result = await self.arank_fusion(
145
- input, run_manager=run_manager, config=config
154
+ input,
155
+ run_manager=run_manager,
156
+ config=config,
146
157
  )
147
158
  except Exception as e:
148
159
  await run_manager.on_retriever_error(e)
149
- raise e
160
+ raise
150
161
  else:
151
162
  await run_manager.on_retriever_end(
152
163
  result,
@@ -171,9 +182,7 @@ class EnsembleRetriever(BaseRetriever):
171
182
  """
172
183
 
173
184
  # Get fused result of the retrievers.
174
- fused_documents = self.rank_fusion(query, run_manager)
175
-
176
- return fused_documents
185
+ return self.rank_fusion(query, run_manager)
177
186
 
178
187
  async def _aget_relevant_documents(
179
188
  self,
@@ -192,9 +201,7 @@ class EnsembleRetriever(BaseRetriever):
192
201
  """
193
202
 
194
203
  # Get fused result of the retrievers.
195
- fused_documents = await self.arank_fusion(query, run_manager)
196
-
197
- return fused_documents
204
+ return await self.arank_fusion(query, run_manager)
198
205
 
199
206
  def rank_fusion(
200
207
  self,
@@ -219,7 +226,8 @@ class EnsembleRetriever(BaseRetriever):
219
226
  retriever.invoke(
220
227
  query,
221
228
  patch_config(
222
- config, callbacks=run_manager.get_child(tag=f"retriever_{i + 1}")
229
+ config,
230
+ callbacks=run_manager.get_child(tag=f"retriever_{i + 1}"),
223
231
  ),
224
232
  )
225
233
  for i, retriever in enumerate(self.retrievers)
@@ -233,9 +241,7 @@ class EnsembleRetriever(BaseRetriever):
233
241
  ]
234
242
 
235
243
  # apply rank fusion
236
- fused_documents = self.weighted_reciprocal_rank(retriever_docs)
237
-
238
- return fused_documents
244
+ return self.weighted_reciprocal_rank(retriever_docs)
239
245
 
240
246
  async def arank_fusion(
241
247
  self,
@@ -266,7 +272,7 @@ class EnsembleRetriever(BaseRetriever):
266
272
  ),
267
273
  )
268
274
  for i, retriever in enumerate(self.retrievers)
269
- ]
275
+ ],
270
276
  )
271
277
 
272
278
  # Enforce that retrieved docs are Documents for each list in retriever_docs
@@ -277,12 +283,11 @@ class EnsembleRetriever(BaseRetriever):
277
283
  ]
278
284
 
279
285
  # apply rank fusion
280
- fused_documents = self.weighted_reciprocal_rank(retriever_docs)
281
-
282
- return fused_documents
286
+ return self.weighted_reciprocal_rank(retriever_docs)
283
287
 
284
288
  def weighted_reciprocal_rank(
285
- self, doc_lists: list[list[Document]]
289
+ self,
290
+ doc_lists: list[list[Document]],
286
291
  ) -> list[Document]:
287
292
  """
288
293
  Perform weighted Reciprocal Rank Fusion on multiple rank lists.
@@ -297,9 +302,8 @@ class EnsembleRetriever(BaseRetriever):
297
302
  scores in descending order.
298
303
  """
299
304
  if len(doc_lists) != len(self.weights):
300
- raise ValueError(
301
- "Number of rank lists must be equal to the number of weights."
302
- )
305
+ msg = "Number of rank lists must be equal to the number of weights."
306
+ raise ValueError(msg)
303
307
 
304
308
  # Associate each doc's content with its RRF score for later sorting by it
305
309
  # Duplicated contents across retrievers are collapsed & scored cumulatively
@@ -316,7 +320,7 @@ class EnsembleRetriever(BaseRetriever):
316
320
 
317
321
  # Docs are deduplicated by their contents then sorted by their scores
318
322
  all_docs = chain.from_iterable(doc_lists)
319
- sorted_docs = sorted(
323
+ return sorted(
320
324
  unique_by_key(
321
325
  all_docs,
322
326
  lambda doc: (
@@ -330,4 +334,3 @@ class EnsembleRetriever(BaseRetriever):
330
334
  doc.page_content if self.id_key is None else doc.metadata[self.id_key]
331
335
  ],
332
336
  )
333
- return sorted_docs
@@ -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
- "GoogleDocumentAIWarehouseRetriever": "langchain_community.retrievers"
12
+ "GoogleDocumentAIWarehouseRetriever": "langchain_community.retrievers",
13
13
  }
14
14
 
15
15
  _import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)