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
@@ -22,6 +22,7 @@ from langchain_core.retrievers import BaseRetriever
22
22
  from langchain_core.runnables import RunnableConfig
23
23
  from langchain_core.vectorstores import VectorStore
24
24
  from pydantic import BaseModel, ConfigDict, Field, model_validator
25
+ from typing_extensions import override
25
26
 
26
27
  from langchain.chains.base import Chain
27
28
  from langchain.chains.combine_documents.base import BaseCombineDocumentsChain
@@ -44,18 +45,20 @@ def _get_chat_history(chat_history: list[CHAT_TURN_TYPE]) -> str:
44
45
  if isinstance(dialogue_turn, BaseMessage):
45
46
  if len(dialogue_turn.content) > 0:
46
47
  role_prefix = _ROLE_MAP.get(
47
- dialogue_turn.type, f"{dialogue_turn.type}: "
48
+ dialogue_turn.type,
49
+ f"{dialogue_turn.type}: ",
48
50
  )
49
51
  buffer += f"\n{role_prefix}{dialogue_turn.content}"
50
52
  elif isinstance(dialogue_turn, tuple):
51
53
  human = "Human: " + dialogue_turn[0]
52
54
  ai = "Assistant: " + dialogue_turn[1]
53
- buffer += "\n" + "\n".join([human, ai])
55
+ buffer += f"\n{human}\n{ai}"
54
56
  else:
55
- raise ValueError(
57
+ msg = (
56
58
  f"Unsupported chat history format: {type(dialogue_turn)}."
57
59
  f" Full chat history: {chat_history} "
58
60
  )
61
+ raise ValueError(msg) # noqa: TRY004
59
62
  return buffer
60
63
 
61
64
 
@@ -93,7 +96,7 @@ class BaseConversationalRetrievalChain(Chain):
93
96
  """An optional function to get a string of the chat history.
94
97
  If None is provided, will use a default."""
95
98
  response_if_no_docs_found: Optional[str] = None
96
- """If specified, the chain will return a fixed response if no docs
99
+ """If specified, the chain will return a fixed response if no docs
97
100
  are found for the question. """
98
101
 
99
102
  model_config = ConfigDict(
@@ -107,8 +110,10 @@ class BaseConversationalRetrievalChain(Chain):
107
110
  """Input keys."""
108
111
  return ["question", "chat_history"]
109
112
 
113
+ @override
110
114
  def get_input_schema(
111
- self, config: Optional[RunnableConfig] = None
115
+ self,
116
+ config: Optional[RunnableConfig] = None,
112
117
  ) -> type[BaseModel]:
113
118
  return InputType
114
119
 
@@ -120,9 +125,9 @@ class BaseConversationalRetrievalChain(Chain):
120
125
  """
121
126
  _output_keys = [self.output_key]
122
127
  if self.return_source_documents:
123
- _output_keys = _output_keys + ["source_documents"]
128
+ _output_keys = [*_output_keys, "source_documents"]
124
129
  if self.return_generated_question:
125
- _output_keys = _output_keys + ["generated_question"]
130
+ _output_keys = [*_output_keys, "generated_question"]
126
131
  return _output_keys
127
132
 
128
133
  @abstractmethod
@@ -148,7 +153,9 @@ class BaseConversationalRetrievalChain(Chain):
148
153
  if chat_history_str:
149
154
  callbacks = _run_manager.get_child()
150
155
  new_question = self.question_generator.run(
151
- question=question, chat_history=chat_history_str, callbacks=callbacks
156
+ question=question,
157
+ chat_history=chat_history_str,
158
+ callbacks=callbacks,
152
159
  )
153
160
  else:
154
161
  new_question = question
@@ -168,7 +175,9 @@ class BaseConversationalRetrievalChain(Chain):
168
175
  new_inputs["question"] = new_question
169
176
  new_inputs["chat_history"] = chat_history_str
170
177
  answer = self.combine_docs_chain.run(
171
- input_documents=docs, callbacks=_run_manager.get_child(), **new_inputs
178
+ input_documents=docs,
179
+ callbacks=_run_manager.get_child(),
180
+ **new_inputs,
172
181
  )
173
182
  output[self.output_key] = answer
174
183
 
@@ -200,7 +209,9 @@ class BaseConversationalRetrievalChain(Chain):
200
209
  if chat_history_str:
201
210
  callbacks = _run_manager.get_child()
202
211
  new_question = await self.question_generator.arun(
203
- question=question, chat_history=chat_history_str, callbacks=callbacks
212
+ question=question,
213
+ chat_history=chat_history_str,
214
+ callbacks=callbacks,
204
215
  )
205
216
  else:
206
217
  new_question = question
@@ -221,7 +232,9 @@ class BaseConversationalRetrievalChain(Chain):
221
232
  new_inputs["question"] = new_question
222
233
  new_inputs["chat_history"] = chat_history_str
223
234
  answer = await self.combine_docs_chain.arun(
224
- input_documents=docs, callbacks=_run_manager.get_child(), **new_inputs
235
+ input_documents=docs,
236
+ callbacks=_run_manager.get_child(),
237
+ **new_inputs,
225
238
  )
226
239
  output[self.output_key] = answer
227
240
 
@@ -231,9 +244,11 @@ class BaseConversationalRetrievalChain(Chain):
231
244
  output["generated_question"] = new_question
232
245
  return output
233
246
 
247
+ @override
234
248
  def save(self, file_path: Union[Path, str]) -> None:
235
249
  if self.get_chat_history:
236
- raise ValueError("Chain not saveable when `get_chat_history` is not None.")
250
+ msg = "Chain not saveable when `get_chat_history` is not None."
251
+ raise ValueError(msg)
237
252
  super().save(file_path)
238
253
 
239
254
 
@@ -252,68 +267,67 @@ class ConversationalRetrievalChain(BaseConversationalRetrievalChain):
252
267
  `create_retrieval_chain`. Additional walkthroughs can be found at
253
268
  https://python.langchain.com/docs/use_cases/question_answering/chat_history
254
269
 
255
- .. code-block:: python
256
-
257
- from langchain.chains import (
258
- create_history_aware_retriever,
259
- create_retrieval_chain,
260
- )
261
- from langchain.chains.combine_documents import create_stuff_documents_chain
262
- from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
263
- from langchain_openai import ChatOpenAI
270
+ .. code-block:: python
264
271
 
272
+ from langchain.chains import (
273
+ create_history_aware_retriever,
274
+ create_retrieval_chain,
275
+ )
276
+ from langchain.chains.combine_documents import create_stuff_documents_chain
277
+ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
278
+ from langchain_openai import ChatOpenAI
265
279
 
266
- retriever = ... # Your retriever
280
+ retriever = ... # Your retriever
267
281
 
268
- llm = ChatOpenAI()
282
+ llm = ChatOpenAI()
269
283
 
270
- # Contextualize question
271
- contextualize_q_system_prompt = (
272
- "Given a chat history and the latest user question "
273
- "which might reference context in the chat history, "
274
- "formulate a standalone question which can be understood "
275
- "without the chat history. Do NOT answer the question, just "
276
- "reformulate it if needed and otherwise return it as is."
277
- )
278
- contextualize_q_prompt = ChatPromptTemplate.from_messages(
279
- [
280
- ("system", contextualize_q_system_prompt),
281
- MessagesPlaceholder("chat_history"),
282
- ("human", "{input}"),
283
- ]
284
- )
285
- history_aware_retriever = create_history_aware_retriever(
286
- llm, retriever, contextualize_q_prompt
287
- )
284
+ # Contextualize question
285
+ contextualize_q_system_prompt = (
286
+ "Given a chat history and the latest user question "
287
+ "which might reference context in the chat history, "
288
+ "formulate a standalone question which can be understood "
289
+ "without the chat history. Do NOT answer the question, just "
290
+ "reformulate it if needed and otherwise return it as is."
291
+ )
292
+ contextualize_q_prompt = ChatPromptTemplate.from_messages(
293
+ [
294
+ ("system", contextualize_q_system_prompt),
295
+ MessagesPlaceholder("chat_history"),
296
+ ("human", "{input}"),
297
+ ]
298
+ )
299
+ history_aware_retriever = create_history_aware_retriever(
300
+ llm, retriever, contextualize_q_prompt
301
+ )
288
302
 
289
- # Answer question
290
- qa_system_prompt = (
291
- "You are an assistant for question-answering tasks. Use "
292
- "the following pieces of retrieved context to answer the "
293
- "question. If you don't know the answer, just say that you "
294
- "don't know. Use three sentences maximum and keep the answer "
295
- "concise."
296
- "\n\n"
297
- "{context}"
298
- )
299
- qa_prompt = ChatPromptTemplate.from_messages(
300
- [
301
- ("system", qa_system_prompt),
302
- MessagesPlaceholder("chat_history"),
303
- ("human", "{input}"),
304
- ]
305
- )
306
- # Below we use create_stuff_documents_chain to feed all retrieved context
307
- # into the LLM. Note that we can also use StuffDocumentsChain and other
308
- # instances of BaseCombineDocumentsChain.
309
- question_answer_chain = create_stuff_documents_chain(llm, qa_prompt)
310
- rag_chain = create_retrieval_chain(
311
- history_aware_retriever, question_answer_chain
312
- )
303
+ # Answer question
304
+ qa_system_prompt = (
305
+ "You are an assistant for question-answering tasks. Use "
306
+ "the following pieces of retrieved context to answer the "
307
+ "question. If you don't know the answer, just say that you "
308
+ "don't know. Use three sentences maximum and keep the answer "
309
+ "concise."
310
+ "\n\n"
311
+ "{context}"
312
+ )
313
+ qa_prompt = ChatPromptTemplate.from_messages(
314
+ [
315
+ ("system", qa_system_prompt),
316
+ MessagesPlaceholder("chat_history"),
317
+ ("human", "{input}"),
318
+ ]
319
+ )
320
+ # Below we use create_stuff_documents_chain to feed all retrieved context
321
+ # into the LLM. Note that we can also use StuffDocumentsChain and other
322
+ # instances of BaseCombineDocumentsChain.
323
+ question_answer_chain = create_stuff_documents_chain(llm, qa_prompt)
324
+ rag_chain = create_retrieval_chain(
325
+ history_aware_retriever, question_answer_chain
326
+ )
313
327
 
314
- # Usage:
315
- chat_history = [] # Collect chat history here (a sequence of messages)
316
- rag_chain.invoke({"input": query, "chat_history": chat_history})
328
+ # Usage:
329
+ chat_history = [] # Collect chat history here (a sequence of messages)
330
+ rag_chain.invoke({"input": query, "chat_history": chat_history})
317
331
 
318
332
  This chain takes in chat history (a list of messages) and new questions,
319
333
  and then returns an answer to that question.
@@ -360,22 +374,26 @@ class ConversationalRetrievalChain(BaseConversationalRetrievalChain):
360
374
  retriever=retriever,
361
375
  question_generator=question_generator_chain,
362
376
  )
377
+
363
378
  """
364
379
 
365
380
  retriever: BaseRetriever
366
381
  """Retriever to use to fetch documents."""
367
382
  max_tokens_limit: Optional[int] = None
368
383
  """If set, enforces that the documents returned are less than this limit.
369
- This is only enforced if `combine_docs_chain` is of type StuffDocumentsChain."""
384
+
385
+ This is only enforced if ``combine_docs_chain`` is of type StuffDocumentsChain.
386
+ """
370
387
 
371
388
  def _reduce_tokens_below_limit(self, docs: list[Document]) -> list[Document]:
372
389
  num_docs = len(docs)
373
390
 
374
391
  if self.max_tokens_limit and isinstance(
375
- self.combine_docs_chain, StuffDocumentsChain
392
+ self.combine_docs_chain,
393
+ StuffDocumentsChain,
376
394
  ):
377
395
  tokens = [
378
- self.combine_docs_chain.llm_chain._get_num_tokens(doc.page_content)
396
+ self.combine_docs_chain.llm_chain._get_num_tokens(doc.page_content) # noqa: SLF001
379
397
  for doc in docs
380
398
  ]
381
399
  token_count = sum(tokens[:num_docs])
@@ -385,6 +403,7 @@ class ConversationalRetrievalChain(BaseConversationalRetrievalChain):
385
403
 
386
404
  return docs[:num_docs]
387
405
 
406
+ @override
388
407
  def _get_docs(
389
408
  self,
390
409
  question: str,
@@ -394,10 +413,12 @@ class ConversationalRetrievalChain(BaseConversationalRetrievalChain):
394
413
  ) -> list[Document]:
395
414
  """Get docs."""
396
415
  docs = self.retriever.invoke(
397
- question, config={"callbacks": run_manager.get_child()}
416
+ question,
417
+ config={"callbacks": run_manager.get_child()},
398
418
  )
399
419
  return self._reduce_tokens_below_limit(docs)
400
420
 
421
+ @override
401
422
  async def _aget_docs(
402
423
  self,
403
424
  question: str,
@@ -407,7 +428,8 @@ class ConversationalRetrievalChain(BaseConversationalRetrievalChain):
407
428
  ) -> list[Document]:
408
429
  """Get docs."""
409
430
  docs = await self.retriever.ainvoke(
410
- question, config={"callbacks": run_manager.get_child()}
431
+ question,
432
+ config={"callbacks": run_manager.get_child()},
411
433
  )
412
434
  return self._reduce_tokens_below_limit(docs)
413
435
 
@@ -418,7 +440,7 @@ class ConversationalRetrievalChain(BaseConversationalRetrievalChain):
418
440
  retriever: BaseRetriever,
419
441
  condense_question_prompt: BasePromptTemplate = CONDENSE_QUESTION_PROMPT,
420
442
  chain_type: str = "stuff",
421
- verbose: bool = False,
443
+ verbose: bool = False, # noqa: FBT001,FBT002
422
444
  condense_question_llm: Optional[BaseLanguageModel] = None,
423
445
  combine_docs_chain_kwargs: Optional[dict] = None,
424
446
  callbacks: Callbacks = None,
@@ -485,13 +507,15 @@ class ChatVectorDBChain(BaseConversationalRetrievalChain):
485
507
 
486
508
  @model_validator(mode="before")
487
509
  @classmethod
488
- def raise_deprecation(cls, values: dict) -> Any:
510
+ def _raise_deprecation(cls, values: dict) -> Any:
489
511
  warnings.warn(
490
512
  "`ChatVectorDBChain` is deprecated - "
491
- "please use `from langchain.chains import ConversationalRetrievalChain`"
513
+ "please use `from langchain.chains import ConversationalRetrievalChain`",
514
+ stacklevel=4,
492
515
  )
493
516
  return values
494
517
 
518
+ @override
495
519
  def _get_docs(
496
520
  self,
497
521
  question: str,
@@ -503,7 +527,9 @@ class ChatVectorDBChain(BaseConversationalRetrievalChain):
503
527
  vectordbkwargs = inputs.get("vectordbkwargs", {})
504
528
  full_kwargs = {**self.search_kwargs, **vectordbkwargs}
505
529
  return self.vectorstore.similarity_search(
506
- question, k=self.top_k_docs_for_context, **full_kwargs
530
+ question,
531
+ k=self.top_k_docs_for_context,
532
+ **full_kwargs,
507
533
  )
508
534
 
509
535
  async def _aget_docs(
@@ -514,7 +540,8 @@ class ChatVectorDBChain(BaseConversationalRetrievalChain):
514
540
  run_manager: AsyncCallbackManagerForChainRun,
515
541
  ) -> list[Document]:
516
542
  """Get docs."""
517
- raise NotImplementedError("ChatVectorDBChain does not support async")
543
+ msg = "ChatVectorDBChain does not support async"
544
+ raise NotImplementedError(msg)
518
545
 
519
546
  @classmethod
520
547
  def from_llm(
@@ -536,7 +563,9 @@ class ChatVectorDBChain(BaseConversationalRetrievalChain):
536
563
  **combine_docs_chain_kwargs,
537
564
  )
538
565
  condense_question_chain = LLMChain(
539
- llm=llm, prompt=condense_question_prompt, callbacks=callbacks
566
+ llm=llm,
567
+ prompt=condense_question_prompt,
568
+ callbacks=callbacks,
540
569
  )
541
570
  return cls(
542
571
  vectorstore=vectorstore,
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  _template = """Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question, in its original language.
@@ -6,7 +5,7 @@ _template = """Given the following conversation and a follow up question, rephra
6
5
  Chat History:
7
6
  {chat_history}
8
7
  Follow Up Input: {question}
9
- Standalone question:"""
8
+ Standalone question:""" # noqa: E501
10
9
  CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template)
11
10
 
12
11
  prompt_template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
@@ -14,7 +13,7 @@ prompt_template = """Use the following pieces of context to answer the question
14
13
  {context}
15
14
 
16
15
  Question: {question}
17
- Helpful Answer:"""
16
+ Helpful Answer:""" # noqa: E501
18
17
  QA_PROMPT = PromptTemplate(
19
18
  template=prompt_template, input_variables=["context", "question"]
20
19
  )
@@ -34,6 +34,7 @@ class ElasticsearchDatabaseChain(Chain):
34
34
 
35
35
  database = Elasticsearch("http://localhost:9200")
36
36
  db_chain = ElasticsearchDatabaseChain.from_llm(OpenAI(), database)
37
+
37
38
  """
38
39
 
39
40
  query_chain: Runnable
@@ -58,11 +59,10 @@ class ElasticsearchDatabaseChain(Chain):
58
59
  )
59
60
 
60
61
  @model_validator(mode="after")
61
- def validate_indices(self) -> Self:
62
+ def _validate_indices(self) -> Self:
62
63
  if self.include_indices and self.ignore_indices:
63
- raise ValueError(
64
- "Cannot specify both 'include_indices' and 'ignore_indices'."
65
- )
64
+ msg = "Cannot specify both 'include_indices' and 'ignore_indices'."
65
+ raise ValueError(msg)
66
66
  return self
67
67
 
68
68
  @property
@@ -81,8 +81,7 @@ class ElasticsearchDatabaseChain(Chain):
81
81
  """
82
82
  if not self.return_intermediate_steps:
83
83
  return [self.output_key]
84
- else:
85
- return [self.output_key, INTERMEDIATE_STEPS_KEY]
84
+ return [self.output_key, INTERMEDIATE_STEPS_KEY]
86
85
 
87
86
  def _list_indices(self) -> list[str]:
88
87
  all_indices = [
@@ -111,7 +110,7 @@ class ElasticsearchDatabaseChain(Chain):
111
110
  [
112
111
  "Mapping for index {}:\n{}".format(index, mappings[index]["mappings"])
113
112
  for index in mappings
114
- ]
113
+ ],
115
114
  )
116
115
 
117
116
  def _search(self, indices: list[str], query: str) -> str:
@@ -144,7 +143,7 @@ class ElasticsearchDatabaseChain(Chain):
144
143
 
145
144
  _run_manager.on_text(es_cmd, color="green", verbose=self.verbose)
146
145
  intermediate_steps.append(
147
- es_cmd
146
+ es_cmd,
148
147
  ) # output: elasticsearch dsl generation (no checker)
149
148
  intermediate_steps.append({"es_cmd": es_cmd}) # input: ES search
150
149
  result = self._search(indices=indices, query=es_cmd)
@@ -166,12 +165,13 @@ class ElasticsearchDatabaseChain(Chain):
166
165
  chain_result: dict[str, Any] = {self.output_key: final_result}
167
166
  if self.return_intermediate_steps:
168
167
  chain_result[INTERMEDIATE_STEPS_KEY] = intermediate_steps
169
- return chain_result
170
168
  except Exception as exc:
171
169
  # Append intermediate steps to exception, to aid in logging and later
172
170
  # improvement of few shot prompt seeds
173
171
  exc.intermediate_steps = intermediate_steps # type: ignore[attr-defined]
174
- raise exc
172
+ raise
173
+
174
+ return chain_result
175
175
 
176
176
  @property
177
177
  def _chain_type(self) -> str:
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  PROMPT_SUFFIX = """Only use the following Elasticsearch indices:
@@ -17,7 +16,7 @@ Use the following format:
17
16
 
18
17
  Question: Question here
19
18
  ESQuery: Elasticsearch Query formatted as json
20
- """
19
+ """ # noqa: E501
21
20
 
22
21
  DSL_PROMPT = PromptTemplate.from_template(DEFAULT_DSL_TEMPLATE + PROMPT_SUFFIX)
23
22
 
@@ -31,6 +30,6 @@ Answer: Final answer here
31
30
 
32
31
  Question: {input}
33
32
  Data: {data}
34
- Answer:"""
33
+ Answer:""" # noqa: E501
35
34
 
36
35
  ANSWER_PROMPT = PromptTemplate.from_template(DEFAULT_ANSWER_TEMPLATE)
@@ -36,9 +36,9 @@ def __getattr__(name: str) -> Any:
36
36
 
37
37
  __all__ = [
38
38
  "convert_to_ernie_function",
39
- "create_structured_output_chain",
40
39
  "create_ernie_fn_chain",
41
- "create_structured_output_runnable",
42
40
  "create_ernie_fn_runnable",
41
+ "create_structured_output_chain",
42
+ "create_structured_output_runnable",
43
43
  "get_ernie_output_parser",
44
44
  ]
@@ -7,7 +7,9 @@ TEST_GEN_TEMPLATE_SUFFIX = "Add another example."
7
7
 
8
8
 
9
9
  def generate_example(
10
- examples: list[dict], llm: BaseLanguageModel, prompt_template: PromptTemplate
10
+ examples: list[dict],
11
+ llm: BaseLanguageModel,
12
+ prompt_template: PromptTemplate,
11
13
  ) -> str:
12
14
  """Return another example given a list of examples for a prompt."""
13
15
  prompt = FewShotPromptTemplate(
@@ -15,6 +15,7 @@ from langchain_core.prompts import BasePromptTemplate
15
15
  from langchain_core.retrievers import BaseRetriever
16
16
  from langchain_core.runnables import Runnable
17
17
  from pydantic import Field
18
+ from typing_extensions import override
18
19
 
19
20
  from langchain.chains.base import Chain
20
21
  from langchain.chains.flare.prompts import (
@@ -44,6 +45,7 @@ class QuestionGeneratorChain(LLMChain):
44
45
  """Prompt template for the chain."""
45
46
 
46
47
  @classmethod
48
+ @override
47
49
  def is_lc_serializable(cls) -> bool:
48
50
  return False
49
51
 
@@ -69,7 +71,8 @@ def _low_confidence_spans(
69
71
  "NumPy not found in the current Python environment. FlareChain will use a "
70
72
  "pure Python implementation for internal calculations, which may "
71
73
  "significantly impact performance, especially for large datasets. For "
72
- "optimal speed and efficiency, consider installing NumPy: pip install numpy"
74
+ "optimal speed and efficiency, consider installing NumPy: pip install "
75
+ "numpy",
73
76
  )
74
77
  import math
75
78
 
@@ -171,7 +174,8 @@ class FlareChain(Chain):
171
174
  callbacks = _run_manager.get_child()
172
175
  if isinstance(self.question_generator_chain, LLMChain):
173
176
  question_gen_outputs = self.question_generator_chain.apply(
174
- question_gen_inputs, callbacks=callbacks
177
+ question_gen_inputs,
178
+ callbacks=callbacks,
175
179
  )
176
180
  questions = [
177
181
  output[self.question_generator_chain.output_keys[0]]
@@ -179,10 +183,13 @@ class FlareChain(Chain):
179
183
  ]
180
184
  else:
181
185
  questions = self.question_generator_chain.batch(
182
- question_gen_inputs, config={"callbacks": callbacks}
186
+ question_gen_inputs,
187
+ config={"callbacks": callbacks},
183
188
  )
184
189
  _run_manager.on_text(
185
- f"Generated Questions: {questions}", color="yellow", end="\n"
190
+ f"Generated Questions: {questions}",
191
+ color="yellow",
192
+ end="\n",
186
193
  )
187
194
  return self._do_generation(questions, user_input, response, _run_manager)
188
195
 
@@ -197,15 +204,18 @@ class FlareChain(Chain):
197
204
 
198
205
  response = ""
199
206
 
200
- for i in range(self.max_iter):
207
+ for _i in range(self.max_iter):
201
208
  _run_manager.on_text(
202
- f"Current Response: {response}", color="blue", end="\n"
209
+ f"Current Response: {response}",
210
+ color="blue",
211
+ end="\n",
203
212
  )
204
213
  _input = {"user_input": user_input, "context": "", "response": response}
205
214
  tokens, log_probs = _extract_tokens_and_log_probs(
206
215
  self.response_chain.invoke(
207
- _input, {"callbacks": _run_manager.get_child()}
208
- )
216
+ _input,
217
+ {"callbacks": _run_manager.get_child()},
218
+ ),
209
219
  )
210
220
  low_confidence_spans = _low_confidence_spans(
211
221
  tokens,
@@ -236,7 +246,10 @@ class FlareChain(Chain):
236
246
 
237
247
  @classmethod
238
248
  def from_llm(
239
- cls, llm: BaseLanguageModel, max_generation_len: int = 32, **kwargs: Any
249
+ cls,
250
+ llm: BaseLanguageModel,
251
+ max_generation_len: int = 32,
252
+ **kwargs: Any,
240
253
  ) -> FlareChain:
241
254
  """Creates a FlareChain from a language model.
242
255
 
@@ -250,14 +263,17 @@ class FlareChain(Chain):
250
263
  """
251
264
  try:
252
265
  from langchain_openai import ChatOpenAI
253
- except ImportError:
254
- raise ImportError(
266
+ except ImportError as e:
267
+ msg = (
255
268
  "OpenAI is required for FlareChain. "
256
269
  "Please install langchain-openai."
257
270
  "pip install langchain-openai"
258
271
  )
272
+ raise ImportError(msg) from e
259
273
  llm = ChatOpenAI(
260
- max_completion_tokens=max_generation_len, logprobs=True, temperature=0
274
+ max_completion_tokens=max_generation_len,
275
+ logprobs=True,
276
+ temperature=0,
261
277
  )
262
278
  response_chain = PROMPT | llm
263
279
  question_gen_chain = QUESTION_GENERATOR_PROMPT | llm | StrOutputParser()
@@ -1,5 +1,6 @@
1
1
  from langchain_core.output_parsers import BaseOutputParser
2
2
  from langchain_core.prompts import PromptTemplate
3
+ from typing_extensions import override
3
4
 
4
5
 
5
6
  class FinishedOutputParser(BaseOutputParser[tuple[str, bool]]):
@@ -8,6 +9,7 @@ class FinishedOutputParser(BaseOutputParser[tuple[str, bool]]):
8
9
  finished_value: str = "FINISHED"
9
10
  """Value that indicates the output is finished."""
10
11
 
12
+ @override
11
13
  def parse(self, text: str) -> tuple[str, bool]:
12
14
  cleaned = text.strip()
13
15
  finished = self.finished_value in cleaned
@@ -31,9 +31,9 @@ def __getattr__(name: str) -> Any:
31
31
 
32
32
 
33
33
  __all__ = [
34
- "GraphCypherQAChain",
34
+ "CYPHER_GENERATION_PROMPT",
35
35
  "INTERMEDIATE_STEPS_KEY",
36
+ "GraphCypherQAChain",
36
37
  "construct_schema",
37
38
  "extract_cypher",
38
- "CYPHER_GENERATION_PROMPT",
39
39
  ]
@@ -26,4 +26,4 @@ def __getattr__(name: str) -> Any:
26
26
  return _import_attribute(name)
27
27
 
28
28
 
29
- __all__ = ["FalkorDBQAChain", "INTERMEDIATE_STEPS_KEY", "extract_cypher"]
29
+ __all__ = ["INTERMEDIATE_STEPS_KEY", "FalkorDBQAChain", "extract_cypher"]
@@ -30,7 +30,7 @@ def __getattr__(name: str) -> Any:
30
30
 
31
31
  __all__ = [
32
32
  "GRAPHDB_SPARQL_FIX_TEMPLATE",
33
- "GremlinQAChain",
34
33
  "INTERMEDIATE_STEPS_KEY",
34
+ "GremlinQAChain",
35
35
  "extract_gremlin",
36
36
  ]
@@ -30,7 +30,7 @@ def __getattr__(name: str) -> Any:
30
30
 
31
31
  __all__ = [
32
32
  "INTERMEDIATE_STEPS_KEY",
33
- "NeptuneSparqlQAChain",
34
33
  "SPARQL_GENERATION_TEMPLATE",
34
+ "NeptuneSparqlQAChain",
35
35
  "extract_sparql",
36
36
  ]