langchain 0.3.26__py3-none-any.whl → 0.4.0.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. langchain/__init__.py +110 -96
  2. langchain/_api/__init__.py +2 -2
  3. langchain/_api/deprecation.py +3 -3
  4. langchain/_api/module_import.py +51 -46
  5. langchain/_api/path.py +1 -1
  6. langchain/adapters/openai.py +8 -8
  7. langchain/agents/__init__.py +15 -12
  8. langchain/agents/agent.py +174 -151
  9. langchain/agents/agent_iterator.py +50 -26
  10. langchain/agents/agent_toolkits/__init__.py +7 -6
  11. langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
  12. langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
  13. langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
  14. langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
  15. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
  16. langchain/agents/agent_toolkits/csv/__init__.py +4 -2
  17. langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
  18. langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
  19. langchain/agents/agent_toolkits/github/toolkit.py +9 -9
  20. langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
  21. langchain/agents/agent_toolkits/json/base.py +1 -1
  22. langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
  23. langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
  24. langchain/agents/agent_toolkits/openapi/base.py +1 -1
  25. langchain/agents/agent_toolkits/openapi/planner.py +2 -2
  26. langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
  27. langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
  28. langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
  29. langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
  30. langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
  31. langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
  32. langchain/agents/agent_toolkits/powerbi/base.py +1 -1
  33. langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
  34. langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
  35. langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
  36. langchain/agents/agent_toolkits/python/__init__.py +4 -2
  37. langchain/agents/agent_toolkits/spark/__init__.py +4 -2
  38. langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
  39. langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
  40. langchain/agents/agent_toolkits/sql/prompt.py +1 -1
  41. langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
  42. langchain/agents/agent_toolkits/vectorstore/base.py +4 -2
  43. langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
  44. langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
  45. langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
  46. langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
  47. langchain/agents/agent_types.py +6 -6
  48. langchain/agents/chat/base.py +8 -12
  49. langchain/agents/chat/output_parser.py +9 -6
  50. langchain/agents/chat/prompt.py +3 -4
  51. langchain/agents/conversational/base.py +11 -5
  52. langchain/agents/conversational/output_parser.py +4 -2
  53. langchain/agents/conversational/prompt.py +2 -3
  54. langchain/agents/conversational_chat/base.py +9 -5
  55. langchain/agents/conversational_chat/output_parser.py +9 -11
  56. langchain/agents/conversational_chat/prompt.py +5 -6
  57. langchain/agents/format_scratchpad/__init__.py +3 -3
  58. langchain/agents/format_scratchpad/log_to_messages.py +1 -1
  59. langchain/agents/format_scratchpad/openai_functions.py +8 -6
  60. langchain/agents/format_scratchpad/tools.py +5 -3
  61. langchain/agents/format_scratchpad/xml.py +33 -2
  62. langchain/agents/initialize.py +17 -9
  63. langchain/agents/json_chat/base.py +19 -18
  64. langchain/agents/json_chat/prompt.py +2 -3
  65. langchain/agents/load_tools.py +2 -1
  66. langchain/agents/loading.py +28 -18
  67. langchain/agents/mrkl/base.py +11 -4
  68. langchain/agents/mrkl/output_parser.py +17 -13
  69. langchain/agents/mrkl/prompt.py +1 -2
  70. langchain/agents/openai_assistant/base.py +81 -71
  71. langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +2 -0
  72. langchain/agents/openai_functions_agent/base.py +47 -37
  73. langchain/agents/openai_functions_multi_agent/base.py +40 -27
  74. langchain/agents/openai_tools/base.py +9 -8
  75. langchain/agents/output_parsers/__init__.py +3 -3
  76. langchain/agents/output_parsers/json.py +8 -6
  77. langchain/agents/output_parsers/openai_functions.py +24 -9
  78. langchain/agents/output_parsers/openai_tools.py +16 -4
  79. langchain/agents/output_parsers/react_json_single_input.py +13 -5
  80. langchain/agents/output_parsers/react_single_input.py +18 -11
  81. langchain/agents/output_parsers/self_ask.py +5 -2
  82. langchain/agents/output_parsers/tools.py +32 -13
  83. langchain/agents/output_parsers/xml.py +102 -28
  84. langchain/agents/react/agent.py +5 -4
  85. langchain/agents/react/base.py +26 -17
  86. langchain/agents/react/output_parser.py +7 -6
  87. langchain/agents/react/textworld_prompt.py +0 -1
  88. langchain/agents/react/wiki_prompt.py +14 -15
  89. langchain/agents/schema.py +5 -2
  90. langchain/agents/self_ask_with_search/base.py +23 -15
  91. langchain/agents/self_ask_with_search/prompt.py +0 -1
  92. langchain/agents/structured_chat/base.py +19 -11
  93. langchain/agents/structured_chat/output_parser.py +29 -18
  94. langchain/agents/structured_chat/prompt.py +3 -4
  95. langchain/agents/tool_calling_agent/base.py +8 -6
  96. langchain/agents/tools.py +5 -2
  97. langchain/agents/utils.py +2 -3
  98. langchain/agents/xml/base.py +12 -6
  99. langchain/agents/xml/prompt.py +1 -2
  100. langchain/cache.py +12 -12
  101. langchain/callbacks/__init__.py +11 -11
  102. langchain/callbacks/aim_callback.py +2 -2
  103. langchain/callbacks/argilla_callback.py +1 -1
  104. langchain/callbacks/arize_callback.py +1 -1
  105. langchain/callbacks/arthur_callback.py +1 -1
  106. langchain/callbacks/base.py +7 -7
  107. langchain/callbacks/clearml_callback.py +1 -1
  108. langchain/callbacks/comet_ml_callback.py +1 -1
  109. langchain/callbacks/confident_callback.py +1 -1
  110. langchain/callbacks/context_callback.py +1 -1
  111. langchain/callbacks/flyte_callback.py +1 -1
  112. langchain/callbacks/human.py +2 -2
  113. langchain/callbacks/infino_callback.py +1 -1
  114. langchain/callbacks/labelstudio_callback.py +1 -1
  115. langchain/callbacks/llmonitor_callback.py +1 -1
  116. langchain/callbacks/manager.py +5 -5
  117. langchain/callbacks/mlflow_callback.py +2 -2
  118. langchain/callbacks/openai_info.py +1 -1
  119. langchain/callbacks/promptlayer_callback.py +1 -1
  120. langchain/callbacks/sagemaker_callback.py +1 -1
  121. langchain/callbacks/streaming_aiter.py +17 -3
  122. langchain/callbacks/streaming_aiter_final_only.py +16 -5
  123. langchain/callbacks/streaming_stdout_final_only.py +10 -3
  124. langchain/callbacks/streamlit/__init__.py +3 -2
  125. langchain/callbacks/streamlit/mutable_expander.py +1 -1
  126. langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
  127. langchain/callbacks/tracers/__init__.py +1 -1
  128. langchain/callbacks/tracers/comet.py +1 -1
  129. langchain/callbacks/tracers/evaluation.py +1 -1
  130. langchain/callbacks/tracers/log_stream.py +1 -1
  131. langchain/callbacks/tracers/logging.py +12 -1
  132. langchain/callbacks/tracers/stdout.py +1 -1
  133. langchain/callbacks/trubrics_callback.py +1 -1
  134. langchain/callbacks/utils.py +4 -4
  135. langchain/callbacks/wandb_callback.py +1 -1
  136. langchain/callbacks/whylabs_callback.py +1 -1
  137. langchain/chains/api/base.py +41 -23
  138. langchain/chains/api/news_docs.py +1 -2
  139. langchain/chains/api/open_meteo_docs.py +1 -2
  140. langchain/chains/api/openapi/requests_chain.py +1 -1
  141. langchain/chains/api/openapi/response_chain.py +1 -1
  142. langchain/chains/api/podcast_docs.py +1 -2
  143. langchain/chains/api/prompt.py +1 -2
  144. langchain/chains/api/tmdb_docs.py +1 -2
  145. langchain/chains/base.py +96 -56
  146. langchain/chains/chat_vector_db/prompts.py +2 -3
  147. langchain/chains/combine_documents/__init__.py +1 -1
  148. langchain/chains/combine_documents/base.py +30 -11
  149. langchain/chains/combine_documents/map_reduce.py +41 -30
  150. langchain/chains/combine_documents/map_rerank.py +39 -24
  151. langchain/chains/combine_documents/reduce.py +48 -26
  152. langchain/chains/combine_documents/refine.py +27 -17
  153. langchain/chains/combine_documents/stuff.py +24 -13
  154. langchain/chains/constitutional_ai/base.py +11 -4
  155. langchain/chains/constitutional_ai/principles.py +22 -25
  156. langchain/chains/constitutional_ai/prompts.py +25 -28
  157. langchain/chains/conversation/base.py +9 -4
  158. langchain/chains/conversation/memory.py +5 -5
  159. langchain/chains/conversation/prompt.py +5 -5
  160. langchain/chains/conversational_retrieval/base.py +108 -79
  161. langchain/chains/conversational_retrieval/prompts.py +2 -3
  162. langchain/chains/elasticsearch_database/base.py +10 -10
  163. langchain/chains/elasticsearch_database/prompts.py +2 -3
  164. langchain/chains/ernie_functions/__init__.py +2 -2
  165. langchain/chains/example_generator.py +3 -1
  166. langchain/chains/flare/base.py +28 -12
  167. langchain/chains/flare/prompts.py +2 -0
  168. langchain/chains/graph_qa/cypher.py +2 -2
  169. langchain/chains/graph_qa/falkordb.py +1 -1
  170. langchain/chains/graph_qa/gremlin.py +1 -1
  171. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  172. langchain/chains/graph_qa/prompts.py +2 -2
  173. langchain/chains/history_aware_retriever.py +2 -1
  174. langchain/chains/hyde/base.py +6 -5
  175. langchain/chains/hyde/prompts.py +5 -6
  176. langchain/chains/llm.py +82 -61
  177. langchain/chains/llm_bash/__init__.py +3 -2
  178. langchain/chains/llm_checker/base.py +19 -6
  179. langchain/chains/llm_checker/prompt.py +3 -4
  180. langchain/chains/llm_math/base.py +25 -10
  181. langchain/chains/llm_math/prompt.py +1 -2
  182. langchain/chains/llm_summarization_checker/base.py +22 -7
  183. langchain/chains/llm_symbolic_math/__init__.py +3 -2
  184. langchain/chains/loading.py +155 -97
  185. langchain/chains/mapreduce.py +4 -3
  186. langchain/chains/moderation.py +11 -9
  187. langchain/chains/natbot/base.py +11 -9
  188. langchain/chains/natbot/crawler.py +102 -76
  189. langchain/chains/natbot/prompt.py +2 -3
  190. langchain/chains/openai_functions/__init__.py +7 -7
  191. langchain/chains/openai_functions/base.py +15 -10
  192. langchain/chains/openai_functions/citation_fuzzy_match.py +21 -11
  193. langchain/chains/openai_functions/extraction.py +19 -19
  194. langchain/chains/openai_functions/openapi.py +39 -35
  195. langchain/chains/openai_functions/qa_with_structure.py +22 -15
  196. langchain/chains/openai_functions/tagging.py +4 -4
  197. langchain/chains/openai_tools/extraction.py +7 -8
  198. langchain/chains/qa_generation/base.py +8 -3
  199. langchain/chains/qa_generation/prompt.py +5 -5
  200. langchain/chains/qa_with_sources/base.py +17 -6
  201. langchain/chains/qa_with_sources/loading.py +16 -8
  202. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  203. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  204. langchain/chains/qa_with_sources/retrieval.py +15 -6
  205. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  206. langchain/chains/qa_with_sources/vector_db.py +21 -8
  207. langchain/chains/query_constructor/base.py +37 -34
  208. langchain/chains/query_constructor/ir.py +4 -4
  209. langchain/chains/query_constructor/parser.py +101 -34
  210. langchain/chains/query_constructor/prompt.py +5 -6
  211. langchain/chains/question_answering/chain.py +21 -10
  212. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  213. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  214. langchain/chains/question_answering/refine_prompts.py +2 -5
  215. langchain/chains/question_answering/stuff_prompt.py +5 -5
  216. langchain/chains/retrieval.py +1 -3
  217. langchain/chains/retrieval_qa/base.py +38 -27
  218. langchain/chains/retrieval_qa/prompt.py +1 -2
  219. langchain/chains/router/__init__.py +3 -3
  220. langchain/chains/router/base.py +38 -22
  221. langchain/chains/router/embedding_router.py +15 -8
  222. langchain/chains/router/llm_router.py +23 -20
  223. langchain/chains/router/multi_prompt.py +5 -2
  224. langchain/chains/router/multi_retrieval_qa.py +28 -5
  225. langchain/chains/sequential.py +30 -18
  226. langchain/chains/sql_database/prompt.py +14 -16
  227. langchain/chains/sql_database/query.py +7 -5
  228. langchain/chains/structured_output/__init__.py +1 -1
  229. langchain/chains/structured_output/base.py +77 -67
  230. langchain/chains/summarize/chain.py +11 -5
  231. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  232. langchain/chains/summarize/stuff_prompt.py +0 -1
  233. langchain/chains/transform.py +9 -6
  234. langchain/chat_loaders/facebook_messenger.py +1 -1
  235. langchain/chat_loaders/langsmith.py +1 -1
  236. langchain/chat_loaders/utils.py +3 -3
  237. langchain/chat_models/__init__.py +20 -19
  238. langchain/chat_models/anthropic.py +1 -1
  239. langchain/chat_models/azureml_endpoint.py +1 -1
  240. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  241. langchain/chat_models/base.py +213 -139
  242. langchain/chat_models/bedrock.py +1 -1
  243. langchain/chat_models/fake.py +1 -1
  244. langchain/chat_models/meta.py +1 -1
  245. langchain/chat_models/pai_eas_endpoint.py +1 -1
  246. langchain/chat_models/promptlayer_openai.py +1 -1
  247. langchain/chat_models/volcengine_maas.py +1 -1
  248. langchain/docstore/base.py +1 -1
  249. langchain/document_loaders/__init__.py +9 -9
  250. langchain/document_loaders/airbyte.py +3 -3
  251. langchain/document_loaders/assemblyai.py +1 -1
  252. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  253. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  254. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  255. langchain/document_loaders/base.py +1 -1
  256. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  257. langchain/document_loaders/blob_loaders/schema.py +1 -4
  258. langchain/document_loaders/blockchain.py +1 -1
  259. langchain/document_loaders/chatgpt.py +1 -1
  260. langchain/document_loaders/college_confidential.py +1 -1
  261. langchain/document_loaders/confluence.py +1 -1
  262. langchain/document_loaders/email.py +1 -1
  263. langchain/document_loaders/facebook_chat.py +1 -1
  264. langchain/document_loaders/markdown.py +1 -1
  265. langchain/document_loaders/notebook.py +1 -1
  266. langchain/document_loaders/org_mode.py +1 -1
  267. langchain/document_loaders/parsers/__init__.py +1 -1
  268. langchain/document_loaders/parsers/docai.py +1 -1
  269. langchain/document_loaders/parsers/generic.py +1 -1
  270. langchain/document_loaders/parsers/html/__init__.py +1 -1
  271. langchain/document_loaders/parsers/html/bs4.py +1 -1
  272. langchain/document_loaders/parsers/language/cobol.py +1 -1
  273. langchain/document_loaders/parsers/language/python.py +1 -1
  274. langchain/document_loaders/parsers/msword.py +1 -1
  275. langchain/document_loaders/parsers/pdf.py +5 -5
  276. langchain/document_loaders/parsers/registry.py +1 -1
  277. langchain/document_loaders/pdf.py +8 -8
  278. langchain/document_loaders/powerpoint.py +1 -1
  279. langchain/document_loaders/pyspark_dataframe.py +1 -1
  280. langchain/document_loaders/telegram.py +2 -2
  281. langchain/document_loaders/tencent_cos_directory.py +1 -1
  282. langchain/document_loaders/unstructured.py +5 -5
  283. langchain/document_loaders/url_playwright.py +1 -1
  284. langchain/document_loaders/whatsapp_chat.py +1 -1
  285. langchain/document_loaders/youtube.py +2 -2
  286. langchain/document_transformers/__init__.py +3 -3
  287. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  288. langchain/document_transformers/doctran_text_extract.py +1 -1
  289. langchain/document_transformers/doctran_text_qa.py +1 -1
  290. langchain/document_transformers/doctran_text_translate.py +1 -1
  291. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  292. langchain/document_transformers/google_translate.py +1 -1
  293. langchain/document_transformers/html2text.py +1 -1
  294. langchain/document_transformers/nuclia_text_transform.py +1 -1
  295. langchain/embeddings/__init__.py +5 -5
  296. langchain/embeddings/base.py +35 -24
  297. langchain/embeddings/cache.py +37 -32
  298. langchain/embeddings/fake.py +1 -1
  299. langchain/embeddings/huggingface.py +2 -2
  300. langchain/evaluation/__init__.py +22 -22
  301. langchain/evaluation/agents/trajectory_eval_chain.py +26 -25
  302. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  303. langchain/evaluation/comparison/__init__.py +1 -1
  304. langchain/evaluation/comparison/eval_chain.py +21 -13
  305. langchain/evaluation/comparison/prompt.py +1 -2
  306. langchain/evaluation/criteria/__init__.py +1 -1
  307. langchain/evaluation/criteria/eval_chain.py +23 -11
  308. langchain/evaluation/criteria/prompt.py +2 -3
  309. langchain/evaluation/embedding_distance/base.py +34 -20
  310. langchain/evaluation/exact_match/base.py +14 -1
  311. langchain/evaluation/loading.py +16 -11
  312. langchain/evaluation/parsing/base.py +20 -4
  313. langchain/evaluation/parsing/json_distance.py +24 -10
  314. langchain/evaluation/parsing/json_schema.py +13 -12
  315. langchain/evaluation/qa/__init__.py +1 -1
  316. langchain/evaluation/qa/eval_chain.py +20 -5
  317. langchain/evaluation/qa/eval_prompt.py +7 -8
  318. langchain/evaluation/qa/generate_chain.py +4 -1
  319. langchain/evaluation/qa/generate_prompt.py +2 -4
  320. langchain/evaluation/regex_match/base.py +9 -1
  321. langchain/evaluation/schema.py +38 -30
  322. langchain/evaluation/scoring/__init__.py +1 -1
  323. langchain/evaluation/scoring/eval_chain.py +23 -15
  324. langchain/evaluation/scoring/prompt.py +0 -1
  325. langchain/evaluation/string_distance/base.py +20 -9
  326. langchain/globals.py +12 -11
  327. langchain/graphs/__init__.py +6 -6
  328. langchain/graphs/graph_document.py +1 -1
  329. langchain/graphs/networkx_graph.py +2 -2
  330. langchain/hub.py +9 -11
  331. langchain/indexes/__init__.py +3 -3
  332. langchain/indexes/_sql_record_manager.py +63 -46
  333. langchain/indexes/prompts/entity_extraction.py +1 -2
  334. langchain/indexes/prompts/entity_summarization.py +1 -2
  335. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  336. langchain/indexes/vectorstore.py +35 -19
  337. langchain/llms/__init__.py +13 -13
  338. langchain/llms/ai21.py +1 -1
  339. langchain/llms/azureml_endpoint.py +4 -4
  340. langchain/llms/base.py +15 -7
  341. langchain/llms/bedrock.py +1 -1
  342. langchain/llms/cloudflare_workersai.py +1 -1
  343. langchain/llms/gradient_ai.py +1 -1
  344. langchain/llms/loading.py +1 -1
  345. langchain/llms/openai.py +1 -1
  346. langchain/llms/sagemaker_endpoint.py +1 -1
  347. langchain/load/dump.py +1 -1
  348. langchain/load/load.py +1 -1
  349. langchain/load/serializable.py +3 -3
  350. langchain/memory/__init__.py +3 -3
  351. langchain/memory/buffer.py +14 -7
  352. langchain/memory/buffer_window.py +2 -0
  353. langchain/memory/chat_memory.py +14 -8
  354. langchain/memory/chat_message_histories/__init__.py +1 -1
  355. langchain/memory/chat_message_histories/astradb.py +1 -1
  356. langchain/memory/chat_message_histories/cassandra.py +1 -1
  357. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  358. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  359. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  360. langchain/memory/chat_message_histories/file.py +1 -1
  361. langchain/memory/chat_message_histories/firestore.py +1 -1
  362. langchain/memory/chat_message_histories/momento.py +1 -1
  363. langchain/memory/chat_message_histories/mongodb.py +1 -1
  364. langchain/memory/chat_message_histories/neo4j.py +1 -1
  365. langchain/memory/chat_message_histories/postgres.py +1 -1
  366. langchain/memory/chat_message_histories/redis.py +1 -1
  367. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  368. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  369. langchain/memory/chat_message_histories/streamlit.py +1 -1
  370. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  371. langchain/memory/chat_message_histories/xata.py +1 -1
  372. langchain/memory/chat_message_histories/zep.py +1 -1
  373. langchain/memory/combined.py +14 -13
  374. langchain/memory/entity.py +131 -61
  375. langchain/memory/prompt.py +10 -11
  376. langchain/memory/readonly.py +0 -2
  377. langchain/memory/simple.py +4 -3
  378. langchain/memory/summary.py +43 -11
  379. langchain/memory/summary_buffer.py +20 -8
  380. langchain/memory/token_buffer.py +2 -0
  381. langchain/memory/utils.py +3 -2
  382. langchain/memory/vectorstore.py +12 -5
  383. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  384. langchain/model_laboratory.py +12 -11
  385. langchain/output_parsers/__init__.py +4 -4
  386. langchain/output_parsers/boolean.py +7 -4
  387. langchain/output_parsers/combining.py +14 -7
  388. langchain/output_parsers/datetime.py +32 -31
  389. langchain/output_parsers/enum.py +10 -4
  390. langchain/output_parsers/fix.py +60 -53
  391. langchain/output_parsers/format_instructions.py +6 -8
  392. langchain/output_parsers/json.py +2 -2
  393. langchain/output_parsers/list.py +2 -2
  394. langchain/output_parsers/loading.py +9 -9
  395. langchain/output_parsers/openai_functions.py +3 -3
  396. langchain/output_parsers/openai_tools.py +1 -1
  397. langchain/output_parsers/pandas_dataframe.py +59 -48
  398. langchain/output_parsers/prompts.py +1 -2
  399. langchain/output_parsers/rail_parser.py +1 -1
  400. langchain/output_parsers/regex.py +9 -8
  401. langchain/output_parsers/regex_dict.py +7 -10
  402. langchain/output_parsers/retry.py +99 -80
  403. langchain/output_parsers/structured.py +21 -6
  404. langchain/output_parsers/yaml.py +19 -11
  405. langchain/prompts/__init__.py +5 -3
  406. langchain/prompts/base.py +5 -5
  407. langchain/prompts/chat.py +8 -8
  408. langchain/prompts/example_selector/__init__.py +3 -1
  409. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  410. langchain/prompts/few_shot.py +1 -1
  411. langchain/prompts/loading.py +3 -3
  412. langchain/prompts/prompt.py +1 -1
  413. langchain/pydantic_v1/__init__.py +1 -1
  414. langchain/retrievers/__init__.py +5 -5
  415. langchain/retrievers/bedrock.py +2 -2
  416. langchain/retrievers/bm25.py +1 -1
  417. langchain/retrievers/contextual_compression.py +14 -8
  418. langchain/retrievers/docarray.py +1 -1
  419. langchain/retrievers/document_compressors/__init__.py +5 -4
  420. langchain/retrievers/document_compressors/base.py +12 -6
  421. langchain/retrievers/document_compressors/chain_extract.py +5 -3
  422. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  423. langchain/retrievers/document_compressors/chain_filter.py +9 -9
  424. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  425. langchain/retrievers/document_compressors/cohere_rerank.py +17 -15
  426. langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -0
  427. langchain/retrievers/document_compressors/embeddings_filter.py +24 -17
  428. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  429. langchain/retrievers/document_compressors/listwise_rerank.py +8 -5
  430. langchain/retrievers/ensemble.py +30 -27
  431. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  432. langchain/retrievers/google_vertex_ai_search.py +2 -2
  433. langchain/retrievers/kendra.py +10 -10
  434. langchain/retrievers/llama_index.py +1 -1
  435. langchain/retrievers/merger_retriever.py +11 -11
  436. langchain/retrievers/milvus.py +1 -1
  437. langchain/retrievers/multi_query.py +35 -27
  438. langchain/retrievers/multi_vector.py +24 -9
  439. langchain/retrievers/parent_document_retriever.py +33 -9
  440. langchain/retrievers/re_phraser.py +6 -5
  441. langchain/retrievers/self_query/base.py +157 -127
  442. langchain/retrievers/time_weighted_retriever.py +21 -7
  443. langchain/retrievers/zilliz.py +1 -1
  444. langchain/runnables/hub.py +12 -0
  445. langchain/runnables/openai_functions.py +12 -2
  446. langchain/schema/__init__.py +23 -23
  447. langchain/schema/cache.py +1 -1
  448. langchain/schema/callbacks/base.py +7 -7
  449. langchain/schema/callbacks/manager.py +19 -19
  450. langchain/schema/callbacks/tracers/base.py +1 -1
  451. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  452. langchain/schema/callbacks/tracers/langchain.py +1 -1
  453. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  454. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  455. langchain/schema/callbacks/tracers/schemas.py +8 -8
  456. langchain/schema/callbacks/tracers/stdout.py +3 -3
  457. langchain/schema/document.py +1 -1
  458. langchain/schema/language_model.py +2 -2
  459. langchain/schema/messages.py +12 -12
  460. langchain/schema/output.py +3 -3
  461. langchain/schema/output_parser.py +3 -3
  462. langchain/schema/runnable/__init__.py +3 -3
  463. langchain/schema/runnable/base.py +9 -9
  464. langchain/schema/runnable/config.py +5 -5
  465. langchain/schema/runnable/configurable.py +1 -1
  466. langchain/schema/runnable/history.py +1 -1
  467. langchain/schema/runnable/passthrough.py +1 -1
  468. langchain/schema/runnable/utils.py +16 -16
  469. langchain/schema/vectorstore.py +1 -1
  470. langchain/smith/__init__.py +2 -1
  471. langchain/smith/evaluation/__init__.py +2 -2
  472. langchain/smith/evaluation/config.py +9 -23
  473. langchain/smith/evaluation/name_generation.py +3 -3
  474. langchain/smith/evaluation/progress.py +22 -4
  475. langchain/smith/evaluation/runner_utils.py +416 -247
  476. langchain/smith/evaluation/string_run_evaluator.py +102 -68
  477. langchain/storage/__init__.py +2 -2
  478. langchain/storage/_lc_store.py +4 -2
  479. langchain/storage/encoder_backed.py +7 -2
  480. langchain/storage/file_system.py +19 -16
  481. langchain/storage/in_memory.py +1 -1
  482. langchain/storage/upstash_redis.py +1 -1
  483. langchain/text_splitter.py +15 -15
  484. langchain/tools/__init__.py +28 -26
  485. langchain/tools/ainetwork/app.py +1 -1
  486. langchain/tools/ainetwork/base.py +1 -1
  487. langchain/tools/ainetwork/owner.py +1 -1
  488. langchain/tools/ainetwork/rule.py +1 -1
  489. langchain/tools/ainetwork/transfer.py +1 -1
  490. langchain/tools/ainetwork/value.py +1 -1
  491. langchain/tools/amadeus/closest_airport.py +1 -1
  492. langchain/tools/amadeus/flight_search.py +1 -1
  493. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  494. langchain/tools/base.py +4 -4
  495. langchain/tools/bearly/tool.py +1 -1
  496. langchain/tools/bing_search/__init__.py +1 -1
  497. langchain/tools/bing_search/tool.py +1 -1
  498. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  499. langchain/tools/dataforseo_api_search/tool.py +1 -1
  500. langchain/tools/ddg_search/tool.py +1 -1
  501. langchain/tools/e2b_data_analysis/tool.py +2 -2
  502. langchain/tools/edenai/__init__.py +1 -1
  503. langchain/tools/file_management/__init__.py +1 -1
  504. langchain/tools/file_management/copy.py +1 -1
  505. langchain/tools/file_management/delete.py +1 -1
  506. langchain/tools/gmail/__init__.py +2 -2
  507. langchain/tools/gmail/get_message.py +1 -1
  508. langchain/tools/gmail/search.py +1 -1
  509. langchain/tools/gmail/send_message.py +1 -1
  510. langchain/tools/google_finance/__init__.py +1 -1
  511. langchain/tools/google_finance/tool.py +1 -1
  512. langchain/tools/google_scholar/__init__.py +1 -1
  513. langchain/tools/google_scholar/tool.py +1 -1
  514. langchain/tools/google_search/__init__.py +1 -1
  515. langchain/tools/google_search/tool.py +1 -1
  516. langchain/tools/google_serper/__init__.py +1 -1
  517. langchain/tools/google_serper/tool.py +1 -1
  518. langchain/tools/google_trends/__init__.py +1 -1
  519. langchain/tools/google_trends/tool.py +1 -1
  520. langchain/tools/jira/tool.py +20 -1
  521. langchain/tools/json/tool.py +25 -3
  522. langchain/tools/memorize/tool.py +1 -1
  523. langchain/tools/multion/__init__.py +1 -1
  524. langchain/tools/multion/update_session.py +1 -1
  525. langchain/tools/office365/__init__.py +2 -2
  526. langchain/tools/office365/events_search.py +1 -1
  527. langchain/tools/office365/messages_search.py +1 -1
  528. langchain/tools/office365/send_event.py +1 -1
  529. langchain/tools/office365/send_message.py +1 -1
  530. langchain/tools/openapi/utils/api_models.py +6 -6
  531. langchain/tools/playwright/__init__.py +5 -5
  532. langchain/tools/playwright/click.py +1 -1
  533. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  534. langchain/tools/playwright/get_elements.py +1 -1
  535. langchain/tools/playwright/navigate.py +1 -1
  536. langchain/tools/plugin.py +2 -2
  537. langchain/tools/powerbi/tool.py +1 -1
  538. langchain/tools/python/__init__.py +3 -2
  539. langchain/tools/reddit_search/tool.py +1 -1
  540. langchain/tools/render.py +2 -2
  541. langchain/tools/requests/tool.py +2 -2
  542. langchain/tools/searchapi/tool.py +1 -1
  543. langchain/tools/searx_search/tool.py +1 -1
  544. langchain/tools/slack/get_message.py +1 -1
  545. langchain/tools/spark_sql/tool.py +1 -1
  546. langchain/tools/sql_database/tool.py +1 -1
  547. langchain/tools/tavily_search/__init__.py +1 -1
  548. langchain/tools/tavily_search/tool.py +1 -1
  549. langchain/tools/zapier/__init__.py +1 -1
  550. langchain/tools/zapier/tool.py +24 -2
  551. langchain/utilities/__init__.py +4 -4
  552. langchain/utilities/arcee.py +4 -4
  553. langchain/utilities/clickup.py +4 -4
  554. langchain/utilities/dalle_image_generator.py +1 -1
  555. langchain/utilities/dataforseo_api_search.py +1 -1
  556. langchain/utilities/opaqueprompts.py +1 -1
  557. langchain/utilities/reddit_search.py +1 -1
  558. langchain/utilities/sql_database.py +1 -1
  559. langchain/utilities/tavily_search.py +1 -1
  560. langchain/utilities/vertexai.py +2 -2
  561. langchain/utils/__init__.py +1 -1
  562. langchain/utils/aiter.py +1 -1
  563. langchain/utils/html.py +3 -3
  564. langchain/utils/input.py +1 -1
  565. langchain/utils/iter.py +1 -1
  566. langchain/utils/json_schema.py +1 -3
  567. langchain/utils/strings.py +1 -1
  568. langchain/utils/utils.py +6 -6
  569. langchain/vectorstores/__init__.py +5 -5
  570. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  571. langchain/vectorstores/azure_cosmos_db.py +1 -1
  572. langchain/vectorstores/clickhouse.py +1 -1
  573. langchain/vectorstores/elastic_vector_search.py +1 -1
  574. langchain/vectorstores/elasticsearch.py +2 -2
  575. langchain/vectorstores/myscale.py +1 -1
  576. langchain/vectorstores/neo4j_vector.py +1 -1
  577. langchain/vectorstores/pgembedding.py +1 -1
  578. langchain/vectorstores/qdrant.py +1 -1
  579. langchain/vectorstores/redis/__init__.py +1 -1
  580. langchain/vectorstores/redis/base.py +1 -1
  581. langchain/vectorstores/redis/filters.py +4 -4
  582. langchain/vectorstores/redis/schema.py +6 -6
  583. langchain/vectorstores/sklearn.py +2 -2
  584. langchain/vectorstores/starrocks.py +1 -1
  585. langchain/vectorstores/utils.py +1 -1
  586. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/METADATA +4 -14
  587. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/RECORD +590 -591
  588. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/WHEEL +1 -1
  589. langchain/smith/evaluation/utils.py +0 -0
  590. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/entry_points.txt +0 -0
  591. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/licenses/LICENSE +0 -0
langchain/hub.py CHANGED
@@ -1,4 +1,4 @@
1
- """Interface with the LangChain Hub."""
1
+ """Interface with the `LangChain Hub <https://smith.langchain.com/hub>`__."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -21,25 +21,25 @@ def _get_client(
21
21
  ls_client = LangSmithClient(api_url, api_key=api_key)
22
22
  if hasattr(ls_client, "push_prompt") and hasattr(ls_client, "pull_prompt"):
23
23
  return ls_client
24
- else:
25
- from langchainhub import Client as LangChainHubClient
24
+ from langchainhub import Client as LangChainHubClient
26
25
 
27
- return LangChainHubClient(api_url, api_key=api_key)
26
+ return LangChainHubClient(api_url, api_key=api_key)
28
27
  except ImportError:
29
28
  try:
30
29
  from langchainhub import Client as LangChainHubClient
31
30
 
32
31
  return LangChainHubClient(api_url, api_key=api_key)
33
32
  except ImportError as e:
34
- raise ImportError(
33
+ msg = (
35
34
  "Could not import langsmith or langchainhub (deprecated),"
36
35
  "please install with `pip install langsmith`."
37
- ) from e
36
+ )
37
+ raise ImportError(msg) from e
38
38
 
39
39
 
40
40
  def push(
41
41
  repo_full_name: str,
42
- object: Any,
42
+ object: Any, # noqa: A002
43
43
  *,
44
44
  api_url: Optional[str] = None,
45
45
  api_key: Optional[str] = None,
@@ -81,14 +81,13 @@ def push(
81
81
 
82
82
  # Then it's langchainhub
83
83
  manifest_json = dumps(object)
84
- message = client.push(
84
+ return client.push(
85
85
  repo_full_name,
86
86
  manifest_json,
87
87
  parent_commit_hash=parent_commit_hash,
88
88
  new_repo_is_public=new_repo_is_public,
89
89
  new_repo_description=new_repo_description,
90
90
  )
91
- return message
92
91
 
93
92
 
94
93
  def pull(
@@ -112,8 +111,7 @@ def pull(
112
111
 
113
112
  # Then it's langsmith
114
113
  if hasattr(client, "pull_prompt"):
115
- response = client.pull_prompt(owner_repo_commit, include_model=include_model)
116
- return response
114
+ return client.pull_prompt(owner_repo_commit, include_model=include_model)
117
115
 
118
116
  # Then it's langchainhub
119
117
  if hasattr(client, "pull_repo"):
@@ -40,11 +40,11 @@ def __getattr__(name: str) -> Any:
40
40
 
41
41
 
42
42
  __all__ = [
43
- # Keep sorted
44
- "aindex",
45
43
  "GraphIndexCreator",
46
- "index",
47
44
  "IndexingResult",
48
45
  "SQLRecordManager",
49
46
  "VectorstoreIndexCreator",
47
+ # Keep sorted
48
+ "aindex",
49
+ "index",
50
50
  ]
@@ -119,10 +119,12 @@ class SQLRecordManager(RecordManager):
119
119
  """
120
120
  super().__init__(namespace=namespace)
121
121
  if db_url is None and engine is None:
122
- raise ValueError("Must specify either db_url or engine")
122
+ msg = "Must specify either db_url or engine"
123
+ raise ValueError(msg)
123
124
 
124
125
  if db_url is not None and engine is not None:
125
- raise ValueError("Must specify either db_url or engine, not both")
126
+ msg = "Must specify either db_url or engine, not both"
127
+ raise ValueError(msg)
126
128
 
127
129
  _engine: Union[Engine, AsyncEngine]
128
130
  if db_url:
@@ -134,7 +136,8 @@ class SQLRecordManager(RecordManager):
134
136
  _engine = engine
135
137
 
136
138
  else:
137
- raise AssertionError("Something went wrong with configuration of engine.")
139
+ msg = "Something went wrong with configuration of engine."
140
+ raise AssertionError(msg)
138
141
 
139
142
  _session_factory: Union[sessionmaker[Session], async_sessionmaker[AsyncSession]]
140
143
  if isinstance(_engine, AsyncEngine):
@@ -149,7 +152,8 @@ class SQLRecordManager(RecordManager):
149
152
  def create_schema(self) -> None:
150
153
  """Create the database schema."""
151
154
  if isinstance(self.engine, AsyncEngine):
152
- raise AssertionError("This method is not supported for async engines.")
155
+ msg = "This method is not supported for async engines."
156
+ raise AssertionError(msg) # noqa: TRY004
153
157
 
154
158
  Base.metadata.create_all(self.engine)
155
159
 
@@ -157,7 +161,8 @@ class SQLRecordManager(RecordManager):
157
161
  """Create the database schema."""
158
162
 
159
163
  if not isinstance(self.engine, AsyncEngine):
160
- raise AssertionError("This method is not supported for sync engines.")
164
+ msg = "This method is not supported for sync engines."
165
+ raise AssertionError(msg) # noqa: TRY004
161
166
 
162
167
  async with self.engine.begin() as session:
163
168
  await session.run_sync(Base.metadata.create_all)
@@ -167,7 +172,8 @@ class SQLRecordManager(RecordManager):
167
172
  """Create a session and close it after use."""
168
173
 
169
174
  if isinstance(self.session_factory, async_sessionmaker):
170
- raise AssertionError("This method is not supported for async engines.")
175
+ msg = "This method is not supported for async engines."
176
+ raise AssertionError(msg) # noqa: TRY004
171
177
 
172
178
  session = self.session_factory()
173
179
  try:
@@ -180,7 +186,8 @@ class SQLRecordManager(RecordManager):
180
186
  """Create a session and close it after use."""
181
187
 
182
188
  if not isinstance(self.session_factory, async_sessionmaker):
183
- raise AssertionError("This method is not supported for sync engines.")
189
+ msg = "This method is not supported for sync engines."
190
+ raise AssertionError(msg) # noqa: TRY004
184
191
 
185
192
  async with self.session_factory() as session:
186
193
  yield session
@@ -206,13 +213,15 @@ class SQLRecordManager(RecordManager):
206
213
  elif self.dialect == "postgresql":
207
214
  query = text("SELECT EXTRACT (EPOCH FROM CURRENT_TIMESTAMP);")
208
215
  else:
209
- raise NotImplementedError(f"Not implemented for dialect {self.dialect}")
216
+ msg = f"Not implemented for dialect {self.dialect}"
217
+ raise NotImplementedError(msg)
210
218
 
211
219
  dt = session.execute(query).scalar()
212
220
  if isinstance(dt, decimal.Decimal):
213
221
  dt = float(dt)
214
222
  if not isinstance(dt, float):
215
- raise AssertionError(f"Unexpected type for datetime: {type(dt)}")
223
+ msg = f"Unexpected type for datetime: {type(dt)}"
224
+ raise AssertionError(msg) # noqa: TRY004
216
225
  return dt
217
226
 
218
227
  async def aget_time(self) -> float:
@@ -236,14 +245,16 @@ class SQLRecordManager(RecordManager):
236
245
  elif self.dialect == "postgresql":
237
246
  query = text("SELECT EXTRACT (EPOCH FROM CURRENT_TIMESTAMP);")
238
247
  else:
239
- raise NotImplementedError(f"Not implemented for dialect {self.dialect}")
248
+ msg = f"Not implemented for dialect {self.dialect}"
249
+ raise NotImplementedError(msg)
240
250
 
241
251
  dt = (await session.execute(query)).scalar_one_or_none()
242
252
 
243
253
  if isinstance(dt, decimal.Decimal):
244
254
  dt = float(dt)
245
255
  if not isinstance(dt, float):
246
- raise AssertionError(f"Unexpected type for datetime: {type(dt)}")
256
+ msg = f"Unexpected type for datetime: {type(dt)}"
257
+ raise AssertionError(msg) # noqa: TRY004
247
258
  return dt
248
259
 
249
260
  def update(
@@ -258,10 +269,11 @@ class SQLRecordManager(RecordManager):
258
269
  group_ids = [None] * len(keys)
259
270
 
260
271
  if len(keys) != len(group_ids):
261
- raise ValueError(
272
+ msg = (
262
273
  f"Number of keys ({len(keys)}) does not match number of "
263
274
  f"group_ids ({len(group_ids)})"
264
275
  )
276
+ raise ValueError(msg)
265
277
 
266
278
  # Get the current time from the server.
267
279
  # This makes an extra round trip to the server, should not be a big deal
@@ -274,7 +286,8 @@ class SQLRecordManager(RecordManager):
274
286
 
275
287
  if time_at_least and update_time < time_at_least:
276
288
  # Safeguard against time sync issues
277
- raise AssertionError(f"Time sync issue: {update_time} < {time_at_least}")
289
+ msg = f"Time sync issue: {update_time} < {time_at_least}"
290
+ raise AssertionError(msg)
278
291
 
279
292
  records_to_upsert = [
280
293
  {
@@ -294,14 +307,14 @@ class SQLRecordManager(RecordManager):
294
307
  # Note: uses SQLite insert to make on_conflict_do_update work.
295
308
  # This code needs to be generalized a bit to work with more dialects.
296
309
  sqlite_insert_stmt: SqliteInsertType = sqlite_insert(
297
- UpsertionRecord
310
+ UpsertionRecord,
298
311
  ).values(records_to_upsert)
299
312
  stmt = sqlite_insert_stmt.on_conflict_do_update(
300
313
  [UpsertionRecord.key, UpsertionRecord.namespace],
301
- set_=dict(
302
- updated_at=sqlite_insert_stmt.excluded.updated_at,
303
- group_id=sqlite_insert_stmt.excluded.group_id,
304
- ),
314
+ set_={
315
+ "updated_at": sqlite_insert_stmt.excluded.updated_at,
316
+ "group_id": sqlite_insert_stmt.excluded.group_id,
317
+ },
305
318
  )
306
319
  elif self.dialect == "postgresql":
307
320
  from sqlalchemy.dialects.postgresql import Insert as PgInsertType
@@ -310,17 +323,18 @@ class SQLRecordManager(RecordManager):
310
323
  # Note: uses postgresql insert to make on_conflict_do_update work.
311
324
  # This code needs to be generalized a bit to work with more dialects.
312
325
  pg_insert_stmt: PgInsertType = pg_insert(UpsertionRecord).values(
313
- records_to_upsert
326
+ records_to_upsert,
314
327
  )
315
328
  stmt = pg_insert_stmt.on_conflict_do_update( # type: ignore[assignment]
316
329
  "uix_key_namespace", # Name of constraint
317
- set_=dict(
318
- updated_at=pg_insert_stmt.excluded.updated_at,
319
- group_id=pg_insert_stmt.excluded.group_id,
320
- ),
330
+ set_={
331
+ "updated_at": pg_insert_stmt.excluded.updated_at,
332
+ "group_id": pg_insert_stmt.excluded.group_id,
333
+ },
321
334
  )
322
335
  else:
323
- raise NotImplementedError(f"Unsupported dialect {self.dialect}")
336
+ msg = f"Unsupported dialect {self.dialect}"
337
+ raise NotImplementedError(msg)
324
338
 
325
339
  session.execute(stmt)
326
340
  session.commit()
@@ -337,10 +351,11 @@ class SQLRecordManager(RecordManager):
337
351
  group_ids = [None] * len(keys)
338
352
 
339
353
  if len(keys) != len(group_ids):
340
- raise ValueError(
354
+ msg = (
341
355
  f"Number of keys ({len(keys)}) does not match number of "
342
356
  f"group_ids ({len(group_ids)})"
343
357
  )
358
+ raise ValueError(msg)
344
359
 
345
360
  # Get the current time from the server.
346
361
  # This makes an extra round trip to the server, should not be a big deal
@@ -353,7 +368,8 @@ class SQLRecordManager(RecordManager):
353
368
 
354
369
  if time_at_least and update_time < time_at_least:
355
370
  # Safeguard against time sync issues
356
- raise AssertionError(f"Time sync issue: {update_time} < {time_at_least}")
371
+ msg = f"Time sync issue: {update_time} < {time_at_least}"
372
+ raise AssertionError(msg)
357
373
 
358
374
  records_to_upsert = [
359
375
  {
@@ -373,14 +389,14 @@ class SQLRecordManager(RecordManager):
373
389
  # Note: uses SQLite insert to make on_conflict_do_update work.
374
390
  # This code needs to be generalized a bit to work with more dialects.
375
391
  sqlite_insert_stmt: SqliteInsertType = sqlite_insert(
376
- UpsertionRecord
392
+ UpsertionRecord,
377
393
  ).values(records_to_upsert)
378
394
  stmt = sqlite_insert_stmt.on_conflict_do_update(
379
395
  [UpsertionRecord.key, UpsertionRecord.namespace],
380
- set_=dict(
381
- updated_at=sqlite_insert_stmt.excluded.updated_at,
382
- group_id=sqlite_insert_stmt.excluded.group_id,
383
- ),
396
+ set_={
397
+ "updated_at": sqlite_insert_stmt.excluded.updated_at,
398
+ "group_id": sqlite_insert_stmt.excluded.group_id,
399
+ },
384
400
  )
385
401
  elif self.dialect == "postgresql":
386
402
  from sqlalchemy.dialects.postgresql import Insert as PgInsertType
@@ -389,17 +405,18 @@ class SQLRecordManager(RecordManager):
389
405
  # Note: uses SQLite insert to make on_conflict_do_update work.
390
406
  # This code needs to be generalized a bit to work with more dialects.
391
407
  pg_insert_stmt: PgInsertType = pg_insert(UpsertionRecord).values(
392
- records_to_upsert
408
+ records_to_upsert,
393
409
  )
394
410
  stmt = pg_insert_stmt.on_conflict_do_update( # type: ignore[assignment]
395
411
  "uix_key_namespace", # Name of constraint
396
- set_=dict(
397
- updated_at=pg_insert_stmt.excluded.updated_at,
398
- group_id=pg_insert_stmt.excluded.group_id,
399
- ),
412
+ set_={
413
+ "updated_at": pg_insert_stmt.excluded.updated_at,
414
+ "group_id": pg_insert_stmt.excluded.group_id,
415
+ },
400
416
  )
401
417
  else:
402
- raise NotImplementedError(f"Unsupported dialect {self.dialect}")
418
+ msg = f"Unsupported dialect {self.dialect}"
419
+ raise NotImplementedError(msg)
403
420
 
404
421
  await session.execute(stmt)
405
422
  await session.commit()
@@ -412,10 +429,10 @@ class SQLRecordManager(RecordManager):
412
429
  and_(
413
430
  UpsertionRecord.key.in_(keys),
414
431
  UpsertionRecord.namespace == self.namespace,
415
- )
432
+ ),
416
433
  )
417
434
  records = filtered_query.all()
418
- found_keys = set(r.key for r in records)
435
+ found_keys = {r.key for r in records}
419
436
  return [k in found_keys for k in keys]
420
437
 
421
438
  async def aexists(self, keys: Sequence[str]) -> list[bool]:
@@ -428,8 +445,8 @@ class SQLRecordManager(RecordManager):
428
445
  and_(
429
446
  UpsertionRecord.key.in_(keys),
430
447
  UpsertionRecord.namespace == self.namespace,
431
- )
432
- )
448
+ ),
449
+ ),
433
450
  )
434
451
  )
435
452
  .scalars()
@@ -450,7 +467,7 @@ class SQLRecordManager(RecordManager):
450
467
  session: Session
451
468
  with self._make_session() as session:
452
469
  query: Query = session.query(UpsertionRecord).filter(
453
- UpsertionRecord.namespace == self.namespace
470
+ UpsertionRecord.namespace == self.namespace,
454
471
  )
455
472
 
456
473
  if after:
@@ -477,7 +494,7 @@ class SQLRecordManager(RecordManager):
477
494
  session: AsyncSession
478
495
  async with self._amake_session() as session:
479
496
  query: Query = select(UpsertionRecord.key).filter( # type: ignore[assignment]
480
- UpsertionRecord.namespace == self.namespace
497
+ UpsertionRecord.namespace == self.namespace,
481
498
  )
482
499
 
483
500
  # mypy does not recognize .all() or .filter()
@@ -501,7 +518,7 @@ class SQLRecordManager(RecordManager):
501
518
  and_(
502
519
  UpsertionRecord.key.in_(keys),
503
520
  UpsertionRecord.namespace == self.namespace,
504
- )
521
+ ),
505
522
  )
506
523
 
507
524
  filtered_query.delete()
@@ -515,8 +532,8 @@ class SQLRecordManager(RecordManager):
515
532
  and_(
516
533
  UpsertionRecord.key.in_(keys),
517
534
  UpsertionRecord.namespace == self.namespace,
518
- )
519
- )
535
+ ),
536
+ ),
520
537
  )
521
538
 
522
539
  await session.commit()
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  _DEFAULT_ENTITY_EXTRACTION_TEMPLATE = """You are an AI assistant reading the transcript of a conversation between an AI and a human. Extract all of the proper nouns from the last line of conversation. As a guideline, a proper noun is generally capitalized. You should definitely extract all names and places.
@@ -34,7 +33,7 @@ Conversation history (for reference only):
34
33
  Last line of conversation (for extraction):
35
34
  Human: {input}
36
35
 
37
- Output:"""
36
+ Output:""" # noqa: E501
38
37
  ENTITY_EXTRACTION_PROMPT = PromptTemplate(
39
38
  input_variables=["history", "input"], template=_DEFAULT_ENTITY_EXTRACTION_TEMPLATE
40
39
  )
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  _DEFAULT_ENTITY_SUMMARIZATION_TEMPLATE = """You are an AI assistant helping a human keep track of facts about relevant people, places, and concepts in their life. Update the summary of the provided entity in the "Entity" section based on the last line of your conversation with the human. If you are writing the summary for the first time, return a single sentence.
@@ -17,7 +16,7 @@ Existing summary of {entity}:
17
16
 
18
17
  Last line of conversation:
19
18
  Human: {input}
20
- Updated summary:"""
19
+ Updated summary:""" # noqa: E501
21
20
 
22
21
  ENTITY_SUMMARIZATION_PROMPT = PromptTemplate(
23
22
  input_variables=["entity", "summary", "history", "input"],
@@ -1,5 +1,3 @@
1
- # flake8: noqa
2
-
3
1
  from langchain_core.prompts.prompt import PromptTemplate
4
2
 
5
3
  KG_TRIPLE_DELIMITER = "<|>"
@@ -25,7 +23,7 @@ _DEFAULT_KNOWLEDGE_TRIPLE_EXTRACTION_TEMPLATE = (
25
23
  "END OF EXAMPLE\n\n"
26
24
  "EXAMPLE\n"
27
25
  "Oh huh. I know Descartes likes to drive antique scooters and play the mandolin.\n"
28
- f"Output: (Descartes, likes to drive, antique scooters){KG_TRIPLE_DELIMITER}(Descartes, plays, mandolin)\n"
26
+ f"Output: (Descartes, likes to drive, antique scooters){KG_TRIPLE_DELIMITER}(Descartes, plays, mandolin)\n" # noqa: E501
29
27
  "END OF EXAMPLE\n\n"
30
28
  "EXAMPLE\n"
31
29
  "{text}"
@@ -48,16 +48,19 @@ class VectorStoreIndexWrapper(BaseModel):
48
48
  The result string from the RetrievalQA chain.
49
49
  """
50
50
  if llm is None:
51
- raise NotImplementedError(
51
+ msg = (
52
52
  "This API has been changed to require an LLM. "
53
53
  "Please provide an llm to use for querying the vectorstore.\n"
54
54
  "For example,\n"
55
55
  "from langchain_openai import OpenAI\n"
56
56
  "llm = OpenAI(temperature=0)"
57
57
  )
58
+ raise NotImplementedError(msg)
58
59
  retriever_kwargs = retriever_kwargs or {}
59
60
  chain = RetrievalQA.from_chain_type(
60
- llm, retriever=self.vectorstore.as_retriever(**retriever_kwargs), **kwargs
61
+ llm,
62
+ retriever=self.vectorstore.as_retriever(**retriever_kwargs),
63
+ **kwargs,
61
64
  )
62
65
  return chain.invoke({chain.input_key: question})[chain.output_key]
63
66
 
@@ -80,16 +83,19 @@ class VectorStoreIndexWrapper(BaseModel):
80
83
  The asynchronous result string from the RetrievalQA chain.
81
84
  """
82
85
  if llm is None:
83
- raise NotImplementedError(
86
+ msg = (
84
87
  "This API has been changed to require an LLM. "
85
88
  "Please provide an llm to use for querying the vectorstore.\n"
86
89
  "For example,\n"
87
90
  "from langchain_openai import OpenAI\n"
88
91
  "llm = OpenAI(temperature=0)"
89
92
  )
93
+ raise NotImplementedError(msg)
90
94
  retriever_kwargs = retriever_kwargs or {}
91
95
  chain = RetrievalQA.from_chain_type(
92
- llm, retriever=self.vectorstore.as_retriever(**retriever_kwargs), **kwargs
96
+ llm,
97
+ retriever=self.vectorstore.as_retriever(**retriever_kwargs),
98
+ **kwargs,
93
99
  )
94
100
  return (await chain.ainvoke({chain.input_key: question}))[chain.output_key]
95
101
 
@@ -112,16 +118,19 @@ class VectorStoreIndexWrapper(BaseModel):
112
118
  A dictionary containing the answer and source documents.
113
119
  """
114
120
  if llm is None:
115
- raise NotImplementedError(
121
+ msg = (
116
122
  "This API has been changed to require an LLM. "
117
123
  "Please provide an llm to use for querying the vectorstore.\n"
118
124
  "For example,\n"
119
125
  "from langchain_openai import OpenAI\n"
120
126
  "llm = OpenAI(temperature=0)"
121
127
  )
128
+ raise NotImplementedError(msg)
122
129
  retriever_kwargs = retriever_kwargs or {}
123
130
  chain = RetrievalQAWithSourcesChain.from_chain_type(
124
- llm, retriever=self.vectorstore.as_retriever(**retriever_kwargs), **kwargs
131
+ llm,
132
+ retriever=self.vectorstore.as_retriever(**retriever_kwargs),
133
+ **kwargs,
125
134
  )
126
135
  return chain.invoke({chain.question_key: question})
127
136
 
@@ -144,16 +153,19 @@ class VectorStoreIndexWrapper(BaseModel):
144
153
  A dictionary containing the answer and source documents.
145
154
  """
146
155
  if llm is None:
147
- raise NotImplementedError(
156
+ msg = (
148
157
  "This API has been changed to require an LLM. "
149
158
  "Please provide an llm to use for querying the vectorstore.\n"
150
159
  "For example,\n"
151
160
  "from langchain_openai import OpenAI\n"
152
161
  "llm = OpenAI(temperature=0)"
153
162
  )
163
+ raise NotImplementedError(msg)
154
164
  retriever_kwargs = retriever_kwargs or {}
155
165
  chain = RetrievalQAWithSourcesChain.from_chain_type(
156
- llm, retriever=self.vectorstore.as_retriever(**retriever_kwargs), **kwargs
166
+ llm,
167
+ retriever=self.vectorstore.as_retriever(**retriever_kwargs),
168
+ **kwargs,
157
169
  )
158
170
  return await chain.ainvoke({chain.question_key: question})
159
171
 
@@ -164,14 +176,14 @@ def _get_in_memory_vectorstore() -> type[VectorStore]:
164
176
 
165
177
  try:
166
178
  from langchain_community.vectorstores.inmemory import InMemoryVectorStore
167
- except ImportError:
168
- raise ImportError(
169
- "Please install langchain-community to use the InMemoryVectorStore."
170
- )
179
+ except ImportError as e:
180
+ msg = "Please install langchain-community to use the InMemoryVectorStore."
181
+ raise ImportError(msg) from e
171
182
  warnings.warn(
172
183
  "Using InMemoryVectorStore as the default vectorstore."
173
184
  "This memory store won't persist data. You should explicitly"
174
- "specify a vectorstore when using VectorstoreIndexCreator"
185
+ "specify a vectorstore when using VectorstoreIndexCreator",
186
+ stacklevel=3,
175
187
  )
176
188
  return InMemoryVectorStore
177
189
 
@@ -180,7 +192,7 @@ class VectorstoreIndexCreator(BaseModel):
180
192
  """Logic for creating indexes."""
181
193
 
182
194
  vectorstore_cls: type[VectorStore] = Field(
183
- default_factory=_get_in_memory_vectorstore
195
+ default_factory=_get_in_memory_vectorstore,
184
196
  )
185
197
  embedding: Embeddings
186
198
  text_splitter: TextSplitter = Field(default_factory=_get_default_text_splitter)
@@ -216,8 +228,7 @@ class VectorstoreIndexCreator(BaseModel):
216
228
  """
217
229
  docs = []
218
230
  for loader in loaders:
219
- async for doc in loader.alazy_load():
220
- docs.append(doc)
231
+ docs.extend([doc async for doc in loader.alazy_load()])
221
232
  return await self.afrom_documents(docs)
222
233
 
223
234
  def from_documents(self, documents: list[Document]) -> VectorStoreIndexWrapper:
@@ -231,12 +242,15 @@ class VectorstoreIndexCreator(BaseModel):
231
242
  """
232
243
  sub_docs = self.text_splitter.split_documents(documents)
233
244
  vectorstore = self.vectorstore_cls.from_documents(
234
- sub_docs, self.embedding, **self.vectorstore_kwargs
245
+ sub_docs,
246
+ self.embedding,
247
+ **self.vectorstore_kwargs,
235
248
  )
236
249
  return VectorStoreIndexWrapper(vectorstore=vectorstore)
237
250
 
238
251
  async def afrom_documents(
239
- self, documents: list[Document]
252
+ self,
253
+ documents: list[Document],
240
254
  ) -> VectorStoreIndexWrapper:
241
255
  """Asynchronously create a vectorstore index from a list of documents.
242
256
 
@@ -248,6 +262,8 @@ class VectorstoreIndexCreator(BaseModel):
248
262
  """
249
263
  sub_docs = self.text_splitter.split_documents(documents)
250
264
  vectorstore = await self.vectorstore_cls.afrom_documents(
251
- sub_docs, self.embedding, **self.vectorstore_kwargs
265
+ sub_docs,
266
+ self.embedding,
267
+ **self.vectorstore_kwargs,
252
268
  )
253
269
  return VectorStoreIndexWrapper(vectorstore=vectorstore)
@@ -552,6 +552,7 @@ def __getattr__(name: str) -> Any:
552
552
  "Please import from langchain-community instead:\n\n"
553
553
  f"`from langchain_community.llms import {name}`.\n\n"
554
554
  "To install langchain-community run `pip install -U langchain-community`.",
555
+ stacklevel=2,
555
556
  category=LangChainDeprecationWarning,
556
557
  )
557
558
 
@@ -561,12 +562,13 @@ def __getattr__(name: str) -> Any:
561
562
  k: v() for k, v in get_type_to_cls_dict().items()
562
563
  }
563
564
  return type_to_cls_dict
564
- else:
565
- return getattr(llms, name)
565
+ return getattr(llms, name)
566
566
 
567
567
 
568
568
  __all__ = [
569
569
  "AI21",
570
+ "RWKV",
571
+ "VLLM",
570
572
  "AlephAlpha",
571
573
  "AmazonAPIGateway",
572
574
  "Anthropic",
@@ -592,8 +594,8 @@ __all__ = [
592
594
  "FakeListLLM",
593
595
  "Fireworks",
594
596
  "ForefrontAI",
595
- "GigaChat",
596
597
  "GPT4All",
598
+ "GigaChat",
597
599
  "GooglePalm",
598
600
  "GooseAI",
599
601
  "GradientLLM",
@@ -602,18 +604,20 @@ __all__ = [
602
604
  "HuggingFacePipeline",
603
605
  "HuggingFaceTextGenInference",
604
606
  "HumanInputLLM",
607
+ "JavelinAIGateway",
605
608
  "KoboldApiLLM",
606
609
  "LlamaCpp",
607
- "TextGen",
608
610
  "ManifestWrapper",
609
611
  "Minimax",
610
612
  "MlflowAIGateway",
611
613
  "Modal",
612
614
  "MosaicML",
613
- "Nebula",
614
615
  "NIBittensorLLM",
615
616
  "NLPCloud",
617
+ "Nebula",
618
+ "OctoAIEndpoint",
616
619
  "Ollama",
620
+ "OpaquePrompts",
617
621
  "OpenAI",
618
622
  "OpenAIChat",
619
623
  "OpenLLM",
@@ -625,28 +629,24 @@ __all__ = [
625
629
  "PredictionGuard",
626
630
  "PromptLayerOpenAI",
627
631
  "PromptLayerOpenAIChat",
628
- "OpaquePrompts",
629
- "RWKV",
632
+ "QianfanLLMEndpoint",
630
633
  "Replicate",
631
634
  "SagemakerEndpoint",
632
635
  "SelfHostedHuggingFaceLLM",
633
636
  "SelfHostedPipeline",
634
637
  "StochasticAI",
638
+ "TextGen",
635
639
  "TitanTakeoff",
636
640
  "TitanTakeoffPro",
637
641
  "Tongyi",
642
+ "VLLMOpenAI",
638
643
  "VertexAI",
639
644
  "VertexAIModelGarden",
640
- "VLLM",
641
- "VLLMOpenAI",
645
+ "VolcEngineMaasLLM",
642
646
  "WatsonxLLM",
643
647
  "Writer",
644
- "OctoAIEndpoint",
645
648
  "Xinference",
646
- "JavelinAIGateway",
647
- "QianfanLLMEndpoint",
648
649
  "YandexGPT",
649
- "VolcEngineMaasLLM",
650
650
  ]
651
651
 
652
652
 
langchain/llms/ai21.py CHANGED
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "AI21PenaltyData",
27
26
  "AI21",
27
+ "AI21PenaltyData",
28
28
  ]