langchain 0.3.25__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 (582) 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 +7 -7
  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 +18 -9
  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 +47 -38
  72. langchain/agents/openai_functions_multi_agent/base.py +40 -27
  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 +7 -7
  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 +6 -6
  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/base.py +2 -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 +1 -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 +36 -22
  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 +89 -55
  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 +24 -11
  149. langchain/chains/combine_documents/map_reduce.py +39 -31
  150. langchain/chains/combine_documents/map_rerank.py +34 -21
  151. langchain/chains/combine_documents/reduce.py +47 -26
  152. langchain/chains/combine_documents/refine.py +26 -17
  153. langchain/chains/combine_documents/stuff.py +19 -12
  154. langchain/chains/constitutional_ai/base.py +4 -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 +6 -7
  158. langchain/chains/conversation/memory.py +5 -5
  159. langchain/chains/conversation/prompt.py +5 -5
  160. langchain/chains/conversational_retrieval/base.py +41 -20
  161. langchain/chains/conversational_retrieval/prompts.py +2 -3
  162. langchain/chains/elasticsearch_database/base.py +8 -9
  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 +26 -12
  167. langchain/chains/graph_qa/cypher.py +2 -2
  168. langchain/chains/graph_qa/falkordb.py +1 -1
  169. langchain/chains/graph_qa/gremlin.py +1 -1
  170. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  171. langchain/chains/graph_qa/prompts.py +2 -2
  172. langchain/chains/history_aware_retriever.py +2 -1
  173. langchain/chains/hyde/base.py +6 -5
  174. langchain/chains/hyde/prompts.py +5 -6
  175. langchain/chains/llm.py +77 -61
  176. langchain/chains/llm_bash/__init__.py +2 -1
  177. langchain/chains/llm_checker/base.py +7 -5
  178. langchain/chains/llm_checker/prompt.py +3 -4
  179. langchain/chains/llm_math/base.py +16 -9
  180. langchain/chains/llm_math/prompt.py +1 -2
  181. langchain/chains/llm_summarization_checker/base.py +9 -6
  182. langchain/chains/llm_symbolic_math/__init__.py +2 -1
  183. langchain/chains/loading.py +170 -153
  184. langchain/chains/mapreduce.py +4 -3
  185. langchain/chains/moderation.py +8 -9
  186. langchain/chains/natbot/base.py +8 -8
  187. langchain/chains/natbot/crawler.py +73 -76
  188. langchain/chains/natbot/prompt.py +2 -3
  189. langchain/chains/openai_functions/__init__.py +7 -7
  190. langchain/chains/openai_functions/base.py +13 -10
  191. langchain/chains/openai_functions/citation_fuzzy_match.py +12 -11
  192. langchain/chains/openai_functions/extraction.py +19 -19
  193. langchain/chains/openai_functions/openapi.py +35 -35
  194. langchain/chains/openai_functions/qa_with_structure.py +19 -12
  195. langchain/chains/openai_functions/tagging.py +2 -4
  196. langchain/chains/openai_tools/extraction.py +7 -8
  197. langchain/chains/qa_generation/base.py +4 -3
  198. langchain/chains/qa_generation/prompt.py +5 -5
  199. langchain/chains/qa_with_sources/base.py +14 -6
  200. langchain/chains/qa_with_sources/loading.py +16 -8
  201. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  202. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  203. langchain/chains/qa_with_sources/retrieval.py +14 -5
  204. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  205. langchain/chains/qa_with_sources/vector_db.py +17 -6
  206. langchain/chains/query_constructor/base.py +34 -33
  207. langchain/chains/query_constructor/ir.py +4 -4
  208. langchain/chains/query_constructor/parser.py +37 -32
  209. langchain/chains/query_constructor/prompt.py +5 -6
  210. langchain/chains/question_answering/chain.py +21 -10
  211. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  212. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  213. langchain/chains/question_answering/refine_prompts.py +2 -5
  214. langchain/chains/question_answering/stuff_prompt.py +5 -5
  215. langchain/chains/retrieval.py +1 -3
  216. langchain/chains/retrieval_qa/base.py +34 -27
  217. langchain/chains/retrieval_qa/prompt.py +1 -2
  218. langchain/chains/router/__init__.py +3 -3
  219. langchain/chains/router/base.py +24 -20
  220. langchain/chains/router/embedding_router.py +12 -8
  221. langchain/chains/router/llm_router.py +17 -16
  222. langchain/chains/router/multi_prompt.py +2 -2
  223. langchain/chains/router/multi_retrieval_qa.py +10 -5
  224. langchain/chains/sequential.py +30 -18
  225. langchain/chains/sql_database/prompt.py +14 -16
  226. langchain/chains/sql_database/query.py +6 -5
  227. langchain/chains/structured_output/__init__.py +1 -1
  228. langchain/chains/structured_output/base.py +75 -67
  229. langchain/chains/summarize/chain.py +11 -5
  230. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  231. langchain/chains/summarize/stuff_prompt.py +0 -1
  232. langchain/chains/transform.py +5 -6
  233. langchain/chat_loaders/facebook_messenger.py +1 -1
  234. langchain/chat_loaders/langsmith.py +1 -1
  235. langchain/chat_loaders/utils.py +3 -3
  236. langchain/chat_models/__init__.py +20 -19
  237. langchain/chat_models/anthropic.py +1 -1
  238. langchain/chat_models/azureml_endpoint.py +1 -1
  239. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  240. langchain/chat_models/base.py +160 -123
  241. langchain/chat_models/bedrock.py +1 -1
  242. langchain/chat_models/fake.py +1 -1
  243. langchain/chat_models/meta.py +1 -1
  244. langchain/chat_models/pai_eas_endpoint.py +1 -1
  245. langchain/chat_models/promptlayer_openai.py +1 -1
  246. langchain/chat_models/volcengine_maas.py +1 -1
  247. langchain/docstore/base.py +1 -1
  248. langchain/document_loaders/__init__.py +9 -9
  249. langchain/document_loaders/airbyte.py +3 -3
  250. langchain/document_loaders/assemblyai.py +1 -1
  251. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  252. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  253. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  254. langchain/document_loaders/base.py +1 -1
  255. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  256. langchain/document_loaders/blockchain.py +1 -1
  257. langchain/document_loaders/chatgpt.py +1 -1
  258. langchain/document_loaders/college_confidential.py +1 -1
  259. langchain/document_loaders/confluence.py +1 -1
  260. langchain/document_loaders/email.py +1 -1
  261. langchain/document_loaders/facebook_chat.py +1 -1
  262. langchain/document_loaders/markdown.py +1 -1
  263. langchain/document_loaders/notebook.py +1 -1
  264. langchain/document_loaders/org_mode.py +1 -1
  265. langchain/document_loaders/parsers/__init__.py +1 -1
  266. langchain/document_loaders/parsers/docai.py +1 -1
  267. langchain/document_loaders/parsers/generic.py +1 -1
  268. langchain/document_loaders/parsers/html/__init__.py +1 -1
  269. langchain/document_loaders/parsers/html/bs4.py +1 -1
  270. langchain/document_loaders/parsers/language/cobol.py +1 -1
  271. langchain/document_loaders/parsers/language/python.py +1 -1
  272. langchain/document_loaders/parsers/msword.py +1 -1
  273. langchain/document_loaders/parsers/pdf.py +5 -5
  274. langchain/document_loaders/parsers/registry.py +1 -1
  275. langchain/document_loaders/pdf.py +8 -8
  276. langchain/document_loaders/powerpoint.py +1 -1
  277. langchain/document_loaders/pyspark_dataframe.py +1 -1
  278. langchain/document_loaders/telegram.py +2 -2
  279. langchain/document_loaders/tencent_cos_directory.py +1 -1
  280. langchain/document_loaders/unstructured.py +5 -5
  281. langchain/document_loaders/url_playwright.py +1 -1
  282. langchain/document_loaders/whatsapp_chat.py +1 -1
  283. langchain/document_loaders/youtube.py +2 -2
  284. langchain/document_transformers/__init__.py +3 -3
  285. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  286. langchain/document_transformers/doctran_text_extract.py +1 -1
  287. langchain/document_transformers/doctran_text_qa.py +1 -1
  288. langchain/document_transformers/doctran_text_translate.py +1 -1
  289. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  290. langchain/document_transformers/google_translate.py +1 -1
  291. langchain/document_transformers/html2text.py +1 -1
  292. langchain/document_transformers/nuclia_text_transform.py +1 -1
  293. langchain/embeddings/__init__.py +5 -5
  294. langchain/embeddings/base.py +33 -24
  295. langchain/embeddings/cache.py +117 -26
  296. langchain/embeddings/fake.py +1 -1
  297. langchain/embeddings/huggingface.py +2 -2
  298. langchain/evaluation/__init__.py +22 -22
  299. langchain/evaluation/agents/trajectory_eval_chain.py +24 -24
  300. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  301. langchain/evaluation/comparison/__init__.py +1 -1
  302. langchain/evaluation/comparison/eval_chain.py +21 -14
  303. langchain/evaluation/comparison/prompt.py +1 -2
  304. langchain/evaluation/criteria/__init__.py +1 -1
  305. langchain/evaluation/criteria/eval_chain.py +21 -12
  306. langchain/evaluation/criteria/prompt.py +2 -3
  307. langchain/evaluation/embedding_distance/base.py +24 -21
  308. langchain/evaluation/loading.py +15 -11
  309. langchain/evaluation/parsing/base.py +4 -1
  310. langchain/evaluation/parsing/json_distance.py +5 -2
  311. langchain/evaluation/parsing/json_schema.py +12 -8
  312. langchain/evaluation/qa/__init__.py +1 -1
  313. langchain/evaluation/qa/eval_chain.py +13 -6
  314. langchain/evaluation/qa/eval_prompt.py +7 -8
  315. langchain/evaluation/qa/generate_chain.py +2 -1
  316. langchain/evaluation/qa/generate_prompt.py +2 -4
  317. langchain/evaluation/schema.py +38 -30
  318. langchain/evaluation/scoring/__init__.py +1 -1
  319. langchain/evaluation/scoring/eval_chain.py +23 -16
  320. langchain/evaluation/scoring/prompt.py +0 -1
  321. langchain/evaluation/string_distance/base.py +15 -10
  322. langchain/globals.py +12 -11
  323. langchain/graphs/__init__.py +6 -6
  324. langchain/graphs/graph_document.py +1 -1
  325. langchain/graphs/networkx_graph.py +2 -2
  326. langchain/hub.py +9 -11
  327. langchain/indexes/__init__.py +3 -3
  328. langchain/indexes/_sql_record_manager.py +63 -46
  329. langchain/indexes/prompts/entity_extraction.py +1 -2
  330. langchain/indexes/prompts/entity_summarization.py +1 -2
  331. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  332. langchain/indexes/vectorstore.py +35 -19
  333. langchain/llms/__init__.py +13 -13
  334. langchain/llms/ai21.py +1 -1
  335. langchain/llms/azureml_endpoint.py +4 -4
  336. langchain/llms/base.py +15 -7
  337. langchain/llms/bedrock.py +1 -1
  338. langchain/llms/cloudflare_workersai.py +1 -1
  339. langchain/llms/gradient_ai.py +1 -1
  340. langchain/llms/loading.py +1 -1
  341. langchain/llms/openai.py +1 -1
  342. langchain/llms/sagemaker_endpoint.py +1 -1
  343. langchain/load/dump.py +1 -1
  344. langchain/load/load.py +1 -1
  345. langchain/load/serializable.py +3 -3
  346. langchain/memory/__init__.py +3 -3
  347. langchain/memory/buffer.py +11 -8
  348. langchain/memory/chat_memory.py +14 -8
  349. langchain/memory/chat_message_histories/__init__.py +1 -1
  350. langchain/memory/chat_message_histories/astradb.py +1 -1
  351. langchain/memory/chat_message_histories/cassandra.py +1 -1
  352. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  353. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  354. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  355. langchain/memory/chat_message_histories/file.py +1 -1
  356. langchain/memory/chat_message_histories/firestore.py +1 -1
  357. langchain/memory/chat_message_histories/momento.py +1 -1
  358. langchain/memory/chat_message_histories/mongodb.py +1 -1
  359. langchain/memory/chat_message_histories/neo4j.py +1 -1
  360. langchain/memory/chat_message_histories/postgres.py +1 -1
  361. langchain/memory/chat_message_histories/redis.py +1 -1
  362. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  363. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  364. langchain/memory/chat_message_histories/streamlit.py +1 -1
  365. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  366. langchain/memory/chat_message_histories/xata.py +1 -1
  367. langchain/memory/chat_message_histories/zep.py +1 -1
  368. langchain/memory/combined.py +13 -12
  369. langchain/memory/entity.py +84 -61
  370. langchain/memory/prompt.py +10 -11
  371. langchain/memory/readonly.py +0 -2
  372. langchain/memory/simple.py +1 -3
  373. langchain/memory/summary.py +13 -11
  374. langchain/memory/summary_buffer.py +17 -8
  375. langchain/memory/utils.py +3 -2
  376. langchain/memory/vectorstore.py +13 -6
  377. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  378. langchain/model_laboratory.py +12 -11
  379. langchain/output_parsers/__init__.py +4 -4
  380. langchain/output_parsers/boolean.py +7 -4
  381. langchain/output_parsers/combining.py +10 -5
  382. langchain/output_parsers/datetime.py +32 -31
  383. langchain/output_parsers/enum.py +5 -3
  384. langchain/output_parsers/fix.py +52 -52
  385. langchain/output_parsers/format_instructions.py +6 -8
  386. langchain/output_parsers/json.py +2 -2
  387. langchain/output_parsers/list.py +2 -2
  388. langchain/output_parsers/loading.py +9 -9
  389. langchain/output_parsers/openai_functions.py +3 -3
  390. langchain/output_parsers/openai_tools.py +1 -1
  391. langchain/output_parsers/pandas_dataframe.py +43 -47
  392. langchain/output_parsers/prompts.py +1 -2
  393. langchain/output_parsers/rail_parser.py +1 -1
  394. langchain/output_parsers/regex.py +7 -8
  395. langchain/output_parsers/regex_dict.py +7 -10
  396. langchain/output_parsers/retry.py +77 -78
  397. langchain/output_parsers/structured.py +11 -6
  398. langchain/output_parsers/yaml.py +15 -11
  399. langchain/prompts/__init__.py +5 -3
  400. langchain/prompts/base.py +5 -5
  401. langchain/prompts/chat.py +10 -9
  402. langchain/prompts/example_selector/__init__.py +3 -1
  403. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  404. langchain/prompts/few_shot.py +1 -1
  405. langchain/prompts/loading.py +3 -3
  406. langchain/prompts/prompt.py +1 -1
  407. langchain/retrievers/__init__.py +5 -5
  408. langchain/retrievers/bedrock.py +2 -2
  409. langchain/retrievers/bm25.py +1 -1
  410. langchain/retrievers/contextual_compression.py +15 -13
  411. langchain/retrievers/docarray.py +1 -1
  412. langchain/retrievers/document_compressors/__init__.py +7 -5
  413. langchain/retrievers/document_compressors/base.py +13 -7
  414. langchain/retrievers/document_compressors/chain_extract.py +4 -5
  415. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  416. langchain/retrievers/document_compressors/chain_filter.py +11 -12
  417. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  418. langchain/retrievers/document_compressors/cohere_rerank.py +17 -19
  419. langchain/retrievers/document_compressors/embeddings_filter.py +23 -23
  420. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  421. langchain/retrievers/document_compressors/listwise_rerank.py +11 -6
  422. langchain/retrievers/ensemble.py +28 -25
  423. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  424. langchain/retrievers/google_vertex_ai_search.py +2 -2
  425. langchain/retrievers/kendra.py +10 -10
  426. langchain/retrievers/llama_index.py +1 -1
  427. langchain/retrievers/merger_retriever.py +11 -11
  428. langchain/retrievers/milvus.py +1 -1
  429. langchain/retrievers/multi_query.py +32 -26
  430. langchain/retrievers/multi_vector.py +20 -8
  431. langchain/retrievers/parent_document_retriever.py +18 -9
  432. langchain/retrievers/re_phraser.py +6 -5
  433. langchain/retrievers/self_query/base.py +138 -119
  434. langchain/retrievers/time_weighted_retriever.py +18 -7
  435. langchain/retrievers/zilliz.py +1 -1
  436. langchain/runnables/hub.py +2 -1
  437. langchain/runnables/openai_functions.py +6 -2
  438. langchain/schema/__init__.py +23 -23
  439. langchain/schema/cache.py +1 -1
  440. langchain/schema/callbacks/base.py +7 -7
  441. langchain/schema/callbacks/manager.py +19 -19
  442. langchain/schema/callbacks/tracers/base.py +3 -2
  443. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  444. langchain/schema/callbacks/tracers/langchain.py +1 -1
  445. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  446. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  447. langchain/schema/callbacks/tracers/schemas.py +8 -8
  448. langchain/schema/callbacks/tracers/stdout.py +3 -3
  449. langchain/schema/document.py +1 -1
  450. langchain/schema/language_model.py +2 -2
  451. langchain/schema/messages.py +12 -12
  452. langchain/schema/output.py +3 -3
  453. langchain/schema/output_parser.py +3 -3
  454. langchain/schema/runnable/__init__.py +3 -3
  455. langchain/schema/runnable/base.py +9 -9
  456. langchain/schema/runnable/config.py +5 -5
  457. langchain/schema/runnable/configurable.py +1 -1
  458. langchain/schema/runnable/history.py +1 -1
  459. langchain/schema/runnable/passthrough.py +1 -1
  460. langchain/schema/runnable/utils.py +16 -16
  461. langchain/schema/vectorstore.py +1 -1
  462. langchain/smith/__init__.py +1 -1
  463. langchain/smith/evaluation/__init__.py +2 -2
  464. langchain/smith/evaluation/config.py +10 -7
  465. langchain/smith/evaluation/name_generation.py +3 -3
  466. langchain/smith/evaluation/progress.py +11 -2
  467. langchain/smith/evaluation/runner_utils.py +181 -129
  468. langchain/smith/evaluation/string_run_evaluator.py +75 -68
  469. langchain/storage/__init__.py +2 -2
  470. langchain/storage/_lc_store.py +4 -2
  471. langchain/storage/encoder_backed.py +6 -2
  472. langchain/storage/file_system.py +19 -16
  473. langchain/storage/in_memory.py +1 -1
  474. langchain/storage/upstash_redis.py +1 -1
  475. langchain/text_splitter.py +15 -15
  476. langchain/tools/__init__.py +28 -26
  477. langchain/tools/ainetwork/app.py +1 -1
  478. langchain/tools/ainetwork/base.py +1 -1
  479. langchain/tools/ainetwork/owner.py +1 -1
  480. langchain/tools/ainetwork/rule.py +1 -1
  481. langchain/tools/ainetwork/transfer.py +1 -1
  482. langchain/tools/ainetwork/value.py +1 -1
  483. langchain/tools/amadeus/closest_airport.py +1 -1
  484. langchain/tools/amadeus/flight_search.py +1 -1
  485. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  486. langchain/tools/base.py +4 -4
  487. langchain/tools/bearly/tool.py +1 -1
  488. langchain/tools/bing_search/__init__.py +1 -1
  489. langchain/tools/bing_search/tool.py +1 -1
  490. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  491. langchain/tools/dataforseo_api_search/tool.py +1 -1
  492. langchain/tools/ddg_search/tool.py +1 -1
  493. langchain/tools/e2b_data_analysis/tool.py +2 -2
  494. langchain/tools/edenai/__init__.py +1 -1
  495. langchain/tools/file_management/__init__.py +1 -1
  496. langchain/tools/file_management/copy.py +1 -1
  497. langchain/tools/file_management/delete.py +1 -1
  498. langchain/tools/gmail/__init__.py +2 -2
  499. langchain/tools/gmail/get_message.py +1 -1
  500. langchain/tools/gmail/search.py +1 -1
  501. langchain/tools/gmail/send_message.py +1 -1
  502. langchain/tools/google_finance/__init__.py +1 -1
  503. langchain/tools/google_finance/tool.py +1 -1
  504. langchain/tools/google_scholar/__init__.py +1 -1
  505. langchain/tools/google_scholar/tool.py +1 -1
  506. langchain/tools/google_search/__init__.py +1 -1
  507. langchain/tools/google_search/tool.py +1 -1
  508. langchain/tools/google_serper/__init__.py +1 -1
  509. langchain/tools/google_serper/tool.py +1 -1
  510. langchain/tools/google_trends/__init__.py +1 -1
  511. langchain/tools/google_trends/tool.py +1 -1
  512. langchain/tools/jira/tool.py +20 -1
  513. langchain/tools/json/tool.py +25 -3
  514. langchain/tools/memorize/tool.py +1 -1
  515. langchain/tools/multion/__init__.py +1 -1
  516. langchain/tools/multion/update_session.py +1 -1
  517. langchain/tools/office365/__init__.py +2 -2
  518. langchain/tools/office365/events_search.py +1 -1
  519. langchain/tools/office365/messages_search.py +1 -1
  520. langchain/tools/office365/send_event.py +1 -1
  521. langchain/tools/office365/send_message.py +1 -1
  522. langchain/tools/openapi/utils/api_models.py +6 -6
  523. langchain/tools/playwright/__init__.py +5 -5
  524. langchain/tools/playwright/click.py +1 -1
  525. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  526. langchain/tools/playwright/get_elements.py +1 -1
  527. langchain/tools/playwright/navigate.py +1 -1
  528. langchain/tools/plugin.py +2 -2
  529. langchain/tools/powerbi/tool.py +1 -1
  530. langchain/tools/python/__init__.py +2 -1
  531. langchain/tools/reddit_search/tool.py +1 -1
  532. langchain/tools/render.py +2 -2
  533. langchain/tools/requests/tool.py +2 -2
  534. langchain/tools/searchapi/tool.py +1 -1
  535. langchain/tools/searx_search/tool.py +1 -1
  536. langchain/tools/slack/get_message.py +1 -1
  537. langchain/tools/spark_sql/tool.py +1 -1
  538. langchain/tools/sql_database/tool.py +1 -1
  539. langchain/tools/tavily_search/__init__.py +1 -1
  540. langchain/tools/tavily_search/tool.py +1 -1
  541. langchain/tools/zapier/__init__.py +1 -1
  542. langchain/tools/zapier/tool.py +24 -2
  543. langchain/utilities/__init__.py +4 -4
  544. langchain/utilities/arcee.py +4 -4
  545. langchain/utilities/clickup.py +4 -4
  546. langchain/utilities/dalle_image_generator.py +1 -1
  547. langchain/utilities/dataforseo_api_search.py +1 -1
  548. langchain/utilities/opaqueprompts.py +1 -1
  549. langchain/utilities/reddit_search.py +1 -1
  550. langchain/utilities/sql_database.py +1 -1
  551. langchain/utilities/tavily_search.py +1 -1
  552. langchain/utilities/vertexai.py +2 -2
  553. langchain/utils/__init__.py +1 -1
  554. langchain/utils/aiter.py +1 -1
  555. langchain/utils/html.py +3 -3
  556. langchain/utils/input.py +1 -1
  557. langchain/utils/iter.py +1 -1
  558. langchain/utils/json_schema.py +1 -3
  559. langchain/utils/strings.py +1 -1
  560. langchain/utils/utils.py +6 -6
  561. langchain/vectorstores/__init__.py +5 -5
  562. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  563. langchain/vectorstores/azure_cosmos_db.py +1 -1
  564. langchain/vectorstores/clickhouse.py +1 -1
  565. langchain/vectorstores/elastic_vector_search.py +1 -1
  566. langchain/vectorstores/elasticsearch.py +2 -2
  567. langchain/vectorstores/myscale.py +1 -1
  568. langchain/vectorstores/neo4j_vector.py +1 -1
  569. langchain/vectorstores/pgembedding.py +1 -1
  570. langchain/vectorstores/qdrant.py +1 -1
  571. langchain/vectorstores/redis/__init__.py +1 -1
  572. langchain/vectorstores/redis/base.py +1 -1
  573. langchain/vectorstores/redis/filters.py +4 -4
  574. langchain/vectorstores/redis/schema.py +6 -6
  575. langchain/vectorstores/sklearn.py +2 -2
  576. langchain/vectorstores/starrocks.py +1 -1
  577. langchain/vectorstores/utils.py +1 -1
  578. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/METADATA +5 -5
  579. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/RECORD +582 -582
  580. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
  581. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
  582. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/licenses/LICENSE +0 -0
@@ -24,7 +24,10 @@ def _get_prompt_input(input_: dict) -> dict[str, Any]:
24
24
  context = ""
25
25
  for index, doc in enumerate(documents):
26
26
  context += f"Document ID: {index}\n```{doc.page_content}```\n\n"
27
- context += f"Documents = [Document ID: 0, ..., Document ID: {len(documents) - 1}]"
27
+ document_range = "empty list"
28
+ if len(documents) > 0:
29
+ document_range = f"Document ID: 0, ..., Document ID: {len(documents) - 1}"
30
+ context += f"Documents = [{document_range}]"
28
31
  return {"query": input_["query"], "context": context}
29
32
 
30
33
 
@@ -70,8 +73,8 @@ class LLMListwiseRerank(BaseDocumentCompressor):
70
73
  """
71
74
 
72
75
  reranker: Runnable[dict, list[Document]]
73
- """LLM-based reranker to use for filtering documents. Expected to take in a dict
74
- 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
75
78
  List[Document]."""
76
79
 
77
80
  top_n: int = 3
@@ -89,7 +92,8 @@ class LLMListwiseRerank(BaseDocumentCompressor):
89
92
  ) -> Sequence[Document]:
90
93
  """Filter down documents based on their relevance to the query."""
91
94
  results = self.reranker.invoke(
92
- {"documents": documents, "query": query}, config={"callbacks": callbacks}
95
+ {"documents": documents, "query": query},
96
+ config={"callbacks": callbacks},
93
97
  )
94
98
  return results[: self.top_n]
95
99
 
@@ -114,9 +118,10 @@ class LLMListwiseRerank(BaseDocumentCompressor):
114
118
  """
115
119
 
116
120
  if llm.with_structured_output == BaseLanguageModel.with_structured_output:
117
- raise ValueError(
121
+ msg = (
118
122
  f"llm of type {type(llm)} does not implement `with_structured_output`."
119
123
  )
124
+ raise ValueError(msg)
120
125
 
121
126
  class RankDocuments(BaseModel):
122
127
  """Rank the documents by their relevance to the user question.
@@ -134,6 +139,6 @@ class LLMListwiseRerank(BaseDocumentCompressor):
134
139
  reranker = RunnablePassthrough.assign(
135
140
  ranking=RunnableLambda(_get_prompt_input)
136
141
  | _prompt
137
- | llm.with_structured_output(RankDocuments)
142
+ | llm.with_structured_output(RankDocuments),
138
143
  ) | RunnableLambda(_parse_ranking)
139
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)
@@ -27,7 +27,7 @@ def __getattr__(name: str) -> Any:
27
27
 
28
28
 
29
29
  __all__ = [
30
- "GoogleVertexAISearchRetriever",
31
- "GoogleVertexAIMultiTurnSearchRetriever",
32
30
  "GoogleCloudEnterpriseSearchRetriever",
31
+ "GoogleVertexAIMultiTurnSearchRetriever",
32
+ "GoogleVertexAISearchRetriever",
33
33
  ]
@@ -49,18 +49,18 @@ def __getattr__(name: str) -> Any:
49
49
 
50
50
 
51
51
  __all__ = [
52
- "clean_excerpt",
53
- "combined_text",
54
- "Highlight",
55
- "TextWithHighLights",
56
- "AdditionalResultAttributeValue",
57
52
  "AdditionalResultAttribute",
58
- "DocumentAttributeValue",
53
+ "AdditionalResultAttributeValue",
54
+ "AmazonKendraRetriever",
59
55
  "DocumentAttribute",
60
- "ResultItem",
61
- "QueryResultItem",
62
- "RetrieveResultItem",
56
+ "DocumentAttributeValue",
57
+ "Highlight",
63
58
  "QueryResult",
59
+ "QueryResultItem",
60
+ "ResultItem",
64
61
  "RetrieveResult",
65
- "AmazonKendraRetriever",
62
+ "RetrieveResultItem",
63
+ "TextWithHighLights",
64
+ "clean_excerpt",
65
+ "combined_text",
66
66
  ]
@@ -25,6 +25,6 @@ def __getattr__(name: str) -> Any:
25
25
 
26
26
 
27
27
  __all__ = [
28
- "LlamaIndexRetriever",
29
28
  "LlamaIndexGraphRetriever",
29
+ "LlamaIndexRetriever",
30
30
  ]
@@ -31,9 +31,7 @@ class MergerRetriever(BaseRetriever):
31
31
  """
32
32
 
33
33
  # Merge the results of the retrievers.
34
- merged_documents = self.merge_documents(query, run_manager)
35
-
36
- return merged_documents
34
+ return self.merge_documents(query, run_manager)
37
35
 
38
36
  async def _aget_relevant_documents(
39
37
  self,
@@ -52,12 +50,12 @@ class MergerRetriever(BaseRetriever):
52
50
  """
53
51
 
54
52
  # Merge the results of the retrievers.
55
- merged_documents = await self.amerge_documents(query, run_manager)
56
-
57
- return merged_documents
53
+ return await self.amerge_documents(query, run_manager)
58
54
 
59
55
  def merge_documents(
60
- self, query: str, run_manager: CallbackManagerForRetrieverRun
56
+ self,
57
+ query: str,
58
+ run_manager: CallbackManagerForRetrieverRun,
61
59
  ) -> list[Document]:
62
60
  """
63
61
  Merge the results of the retrievers.
@@ -82,14 +80,16 @@ class MergerRetriever(BaseRetriever):
82
80
  merged_documents = []
83
81
  max_docs = max(map(len, retriever_docs), default=0)
84
82
  for i in range(max_docs):
85
- for retriever, doc in zip(self.retrievers, retriever_docs):
83
+ for _retriever, doc in zip(self.retrievers, retriever_docs):
86
84
  if i < len(doc):
87
85
  merged_documents.append(doc[i])
88
86
 
89
87
  return merged_documents
90
88
 
91
89
  async def amerge_documents(
92
- self, query: str, run_manager: AsyncCallbackManagerForRetrieverRun
90
+ self,
91
+ query: str,
92
+ run_manager: AsyncCallbackManagerForRetrieverRun,
93
93
  ) -> list[Document]:
94
94
  """
95
95
  Asynchronously merge the results of the retrievers.
@@ -109,14 +109,14 @@ class MergerRetriever(BaseRetriever):
109
109
  config={"callbacks": run_manager.get_child(f"retriever_{i + 1}")},
110
110
  )
111
111
  for i, retriever in enumerate(self.retrievers)
112
- )
112
+ ),
113
113
  )
114
114
 
115
115
  # Merge the results of the retrievers.
116
116
  merged_documents = []
117
117
  max_docs = max(map(len, retriever_docs), default=0)
118
118
  for i in range(max_docs):
119
- for retriever, doc in zip(self.retrievers, retriever_docs):
119
+ for _retriever, doc in zip(self.retrievers, retriever_docs):
120
120
  if i < len(doc):
121
121
  merged_documents.append(doc[i])
122
122
 
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "MilvusRetriever",
27
26
  "MilvusRetreiver",
27
+ "MilvusRetriever",
28
28
  ]
@@ -31,12 +31,12 @@ class LineListOutputParser(BaseOutputParser[list[str]]):
31
31
  # Default prompt
32
32
  DEFAULT_QUERY_PROMPT = PromptTemplate(
33
33
  input_variables=["question"],
34
- template="""You are an AI language model assistant. Your task is
35
- to generate 3 different versions of the given user
36
- question to retrieve relevant documents from a vector database.
37
- By generating multiple perspectives on the user question,
38
- your goal is to help the user overcome some of the limitations
39
- of distance-based similarity search. Provide these alternative
34
+ template="""You are an AI language model assistant. Your task is
35
+ to generate 3 different versions of the given user
36
+ question to retrieve relevant documents from a vector database.
37
+ By generating multiple perspectives on the user question,
38
+ your goal is to help the user overcome some of the limitations
39
+ of distance-based similarity search. Provide these alternative
40
40
  questions separated by newlines. Original question: {question}""",
41
41
  )
42
42
 
@@ -66,7 +66,7 @@ class MultiQueryRetriever(BaseRetriever):
66
66
  llm: BaseLanguageModel,
67
67
  prompt: BasePromptTemplate = DEFAULT_QUERY_PROMPT,
68
68
  parser_key: Optional[str] = None,
69
- include_original: bool = False,
69
+ include_original: bool = False, # noqa: FBT001,FBT002
70
70
  ) -> "MultiQueryRetriever":
71
71
  """Initialize from llm using default template.
72
72
 
@@ -110,7 +110,9 @@ class MultiQueryRetriever(BaseRetriever):
110
110
  return self.unique_union(documents)
111
111
 
112
112
  async def agenerate_queries(
113
- self, question: str, run_manager: AsyncCallbackManagerForRetrieverRun
113
+ self,
114
+ question: str,
115
+ run_manager: AsyncCallbackManagerForRetrieverRun,
114
116
  ) -> list[str]:
115
117
  """Generate queries based upon user input.
116
118
 
@@ -121,18 +123,18 @@ class MultiQueryRetriever(BaseRetriever):
121
123
  List of LLM generated queries that are similar to the user input
122
124
  """
123
125
  response = await self.llm_chain.ainvoke(
124
- {"question": question}, config={"callbacks": run_manager.get_child()}
126
+ {"question": question},
127
+ config={"callbacks": run_manager.get_child()},
125
128
  )
126
- if isinstance(self.llm_chain, LLMChain):
127
- lines = response["text"]
128
- else:
129
- lines = response
129
+ lines = response["text"] if isinstance(self.llm_chain, LLMChain) else response
130
130
  if self.verbose:
131
- logger.info(f"Generated queries: {lines}")
131
+ logger.info("Generated queries: %s", lines)
132
132
  return lines
133
133
 
134
134
  async def aretrieve_documents(
135
- self, queries: list[str], run_manager: AsyncCallbackManagerForRetrieverRun
135
+ self,
136
+ queries: list[str],
137
+ run_manager: AsyncCallbackManagerForRetrieverRun,
136
138
  ) -> list[Document]:
137
139
  """Run all LLM generated queries.
138
140
 
@@ -145,10 +147,11 @@ class MultiQueryRetriever(BaseRetriever):
145
147
  document_lists = await asyncio.gather(
146
148
  *(
147
149
  self.retriever.ainvoke(
148
- query, config={"callbacks": run_manager.get_child()}
150
+ query,
151
+ config={"callbacks": run_manager.get_child()},
149
152
  )
150
153
  for query in queries
151
- )
154
+ ),
152
155
  )
153
156
  return [doc for docs in document_lists for doc in docs]
154
157
 
@@ -173,7 +176,9 @@ class MultiQueryRetriever(BaseRetriever):
173
176
  return self.unique_union(documents)
174
177
 
175
178
  def generate_queries(
176
- self, question: str, run_manager: CallbackManagerForRetrieverRun
179
+ self,
180
+ question: str,
181
+ run_manager: CallbackManagerForRetrieverRun,
177
182
  ) -> list[str]:
178
183
  """Generate queries based upon user input.
179
184
 
@@ -184,18 +189,18 @@ class MultiQueryRetriever(BaseRetriever):
184
189
  List of LLM generated queries that are similar to the user input
185
190
  """
186
191
  response = self.llm_chain.invoke(
187
- {"question": question}, config={"callbacks": run_manager.get_child()}
192
+ {"question": question},
193
+ config={"callbacks": run_manager.get_child()},
188
194
  )
189
- if isinstance(self.llm_chain, LLMChain):
190
- lines = response["text"]
191
- else:
192
- lines = response
195
+ lines = response["text"] if isinstance(self.llm_chain, LLMChain) else response
193
196
  if self.verbose:
194
- logger.info(f"Generated queries: {lines}")
197
+ logger.info("Generated queries: %s", lines)
195
198
  return lines
196
199
 
197
200
  def retrieve_documents(
198
- self, queries: list[str], run_manager: CallbackManagerForRetrieverRun
201
+ self,
202
+ queries: list[str],
203
+ run_manager: CallbackManagerForRetrieverRun,
199
204
  ) -> list[Document]:
200
205
  """Run all LLM generated queries.
201
206
 
@@ -208,7 +213,8 @@ class MultiQueryRetriever(BaseRetriever):
208
213
  documents = []
209
214
  for query in queries:
210
215
  docs = self.retriever.invoke(
211
- query, config={"callbacks": run_manager.get_child()}
216
+ query,
217
+ config={"callbacks": run_manager.get_child()},
212
218
  )
213
219
  documents.extend(docs)
214
220
  return documents
@@ -49,12 +49,16 @@ class MultiVectorRetriever(BaseRetriever):
49
49
  if byte_store is not None:
50
50
  docstore = create_kv_docstore(byte_store)
51
51
  elif docstore is None:
52
- raise Exception("You must pass a `byte_store` parameter.")
52
+ msg = "You must pass a `byte_store` parameter."
53
+ raise ValueError(msg)
53
54
  values["docstore"] = docstore
54
55
  return values
55
56
 
56
57
  def _get_relevant_documents(
57
- self, query: str, *, run_manager: CallbackManagerForRetrieverRun
58
+ self,
59
+ query: str,
60
+ *,
61
+ run_manager: CallbackManagerForRetrieverRun,
58
62
  ) -> list[Document]:
59
63
  """Get documents relevant to a query.
60
64
  Args:
@@ -65,12 +69,14 @@ class MultiVectorRetriever(BaseRetriever):
65
69
  """
66
70
  if self.search_type == SearchType.mmr:
67
71
  sub_docs = self.vectorstore.max_marginal_relevance_search(
68
- query, **self.search_kwargs
72
+ query,
73
+ **self.search_kwargs,
69
74
  )
70
75
  elif self.search_type == SearchType.similarity_score_threshold:
71
76
  sub_docs_and_similarities = (
72
77
  self.vectorstore.similarity_search_with_relevance_scores(
73
- query, **self.search_kwargs
78
+ query,
79
+ **self.search_kwargs,
74
80
  )
75
81
  )
76
82
  sub_docs = [sub_doc for sub_doc, _ in sub_docs_and_similarities]
@@ -86,7 +92,10 @@ class MultiVectorRetriever(BaseRetriever):
86
92
  return [d for d in docs if d is not None]
87
93
 
88
94
  async def _aget_relevant_documents(
89
- self, query: str, *, run_manager: AsyncCallbackManagerForRetrieverRun
95
+ self,
96
+ query: str,
97
+ *,
98
+ run_manager: AsyncCallbackManagerForRetrieverRun,
90
99
  ) -> list[Document]:
91
100
  """Asynchronously get documents relevant to a query.
92
101
  Args:
@@ -97,18 +106,21 @@ class MultiVectorRetriever(BaseRetriever):
97
106
  """
98
107
  if self.search_type == SearchType.mmr:
99
108
  sub_docs = await self.vectorstore.amax_marginal_relevance_search(
100
- query, **self.search_kwargs
109
+ query,
110
+ **self.search_kwargs,
101
111
  )
102
112
  elif self.search_type == SearchType.similarity_score_threshold:
103
113
  sub_docs_and_similarities = (
104
114
  await self.vectorstore.asimilarity_search_with_relevance_scores(
105
- query, **self.search_kwargs
115
+ query,
116
+ **self.search_kwargs,
106
117
  )
107
118
  )
108
119
  sub_docs = [sub_doc for sub_doc, _ in sub_docs_and_similarities]
109
120
  else:
110
121
  sub_docs = await self.vectorstore.asimilarity_search(
111
- query, **self.search_kwargs
122
+ query,
123
+ **self.search_kwargs,
112
124
  )
113
125
 
114
126
  # We do this to maintain the order of the ids that are returned
@@ -66,7 +66,7 @@ class ParentDocumentRetriever(MultiVectorRetriever):
66
66
  If none, then the parent documents will be the raw documents passed in."""
67
67
 
68
68
  child_metadata_fields: Optional[Sequence[str]] = None
69
- """Metadata fields to leave in child documents. If None, leave all parent document
69
+ """Metadata fields to leave in child documents. If None, leave all parent document
70
70
  metadata.
71
71
  """
72
72
 
@@ -74,6 +74,7 @@ class ParentDocumentRetriever(MultiVectorRetriever):
74
74
  self,
75
75
  documents: list[Document],
76
76
  ids: Optional[list[str]] = None,
77
+ *,
77
78
  add_to_docstore: bool = True,
78
79
  ) -> tuple[list[Document], list[tuple[str, Document]]]:
79
80
  if self.parent_splitter is not None:
@@ -81,15 +82,15 @@ class ParentDocumentRetriever(MultiVectorRetriever):
81
82
  if ids is None:
82
83
  doc_ids = [str(uuid.uuid4()) for _ in documents]
83
84
  if not add_to_docstore:
84
- raise ValueError(
85
- "If ids are not passed in, `add_to_docstore` MUST be True"
86
- )
85
+ msg = "If ids are not passed in, `add_to_docstore` MUST be True"
86
+ raise ValueError(msg)
87
87
  else:
88
88
  if len(documents) != len(ids):
89
- raise ValueError(
89
+ msg = (
90
90
  "Got uneven list of documents and ids. "
91
91
  "If `ids` is provided, should be same length as `documents`."
92
92
  )
93
+ raise ValueError(msg)
93
94
  doc_ids = ids
94
95
 
95
96
  docs = []
@@ -113,7 +114,7 @@ class ParentDocumentRetriever(MultiVectorRetriever):
113
114
  self,
114
115
  documents: list[Document],
115
116
  ids: Optional[list[str]] = None,
116
- add_to_docstore: bool = True,
117
+ add_to_docstore: bool = True, # noqa: FBT001,FBT002
117
118
  **kwargs: Any,
118
119
  ) -> None:
119
120
  """Adds documents to the docstore and vectorstores.
@@ -130,7 +131,11 @@ class ParentDocumentRetriever(MultiVectorRetriever):
130
131
  to set this to False if the documents are already in the docstore
131
132
  and you don't want to re-add them.
132
133
  """
133
- docs, full_docs = self._split_docs_for_adding(documents, ids, add_to_docstore)
134
+ docs, full_docs = self._split_docs_for_adding(
135
+ documents,
136
+ ids,
137
+ add_to_docstore=add_to_docstore,
138
+ )
134
139
  self.vectorstore.add_documents(docs, **kwargs)
135
140
  if add_to_docstore:
136
141
  self.docstore.mset(full_docs)
@@ -139,10 +144,14 @@ class ParentDocumentRetriever(MultiVectorRetriever):
139
144
  self,
140
145
  documents: list[Document],
141
146
  ids: Optional[list[str]] = None,
142
- add_to_docstore: bool = True,
147
+ add_to_docstore: bool = True, # noqa: FBT001,FBT002
143
148
  **kwargs: Any,
144
149
  ) -> None:
145
- docs, full_docs = self._split_docs_for_adding(documents, ids, add_to_docstore)
150
+ docs, full_docs = self._split_docs_for_adding(
151
+ documents,
152
+ ids,
153
+ add_to_docstore=add_to_docstore,
154
+ )
146
155
  await self.vectorstore.aadd_documents(docs, **kwargs)
147
156
  if add_to_docstore:
148
157
  await self.docstore.amset(full_docs)
@@ -71,13 +71,14 @@ class RePhraseQueryRetriever(BaseRetriever):
71
71
  Relevant documents for re-phrased question
72
72
  """
73
73
  re_phrased_question = self.llm_chain.invoke(
74
- query, {"callbacks": run_manager.get_child()}
74
+ query,
75
+ {"callbacks": run_manager.get_child()},
75
76
  )
76
- logger.info(f"Re-phrased question: {re_phrased_question}")
77
- docs = self.retriever.invoke(
78
- re_phrased_question, config={"callbacks": run_manager.get_child()}
77
+ logger.info("Re-phrased question: %s", re_phrased_question)
78
+ return self.retriever.invoke(
79
+ re_phrased_question,
80
+ config={"callbacks": run_manager.get_child()},
79
81
  )
80
- return docs
81
82
 
82
83
  async def _aget_relevant_documents(
83
84
  self,