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
@@ -11,7 +11,7 @@ try:
11
11
  from lark import Lark, Transformer, v_args
12
12
  except ImportError:
13
13
 
14
- def v_args(*args: Any, **kwargs: Any) -> Any: # type: ignore[misc]
14
+ def v_args(*_: Any, **__: Any) -> Any: # type: ignore[misc]
15
15
  """Dummy decorator for when lark is not installed."""
16
16
  return lambda _: None
17
17
 
@@ -83,98 +83,166 @@ class QueryTransformer(Transformer):
83
83
  allowed_attributes: Optional[Sequence[str]] = None,
84
84
  **kwargs: Any,
85
85
  ):
86
+ """Initialize the QueryTransformer.
87
+
88
+ Args:
89
+ allowed_comparators: Optional sequence of allowed comparators.
90
+ allowed_operators: Optional sequence of allowed operators.
91
+ allowed_attributes: Optional sequence of allowed attributes for comparators.
92
+ **kwargs: Additional keyword arguments.
93
+ """
86
94
  super().__init__(*args, **kwargs)
87
95
  self.allowed_comparators = allowed_comparators
88
96
  self.allowed_operators = allowed_operators
89
97
  self.allowed_attributes = allowed_attributes
90
98
 
91
99
  def program(self, *items: Any) -> tuple:
100
+ """Transform the items into a tuple."""
92
101
  return items
93
102
 
94
103
  def func_call(self, func_name: Any, args: list) -> FilterDirective:
104
+ """Transform a function name and args into a FilterDirective.
105
+
106
+ Args:
107
+ func_name: The name of the function.
108
+ args: The arguments passed to the function.
109
+ Returns:
110
+ FilterDirective: The filter directive.
111
+ Raises:
112
+ ValueError: If the function is a comparator and the first arg is not in the
113
+ allowed attributes.
114
+ """
95
115
  func = self._match_func_name(str(func_name))
96
116
  if isinstance(func, Comparator):
97
117
  if self.allowed_attributes and args[0] not in self.allowed_attributes:
98
- raise ValueError(
118
+ msg = (
99
119
  f"Received invalid attributes {args[0]}. Allowed attributes are "
100
120
  f"{self.allowed_attributes}"
101
121
  )
122
+ raise ValueError(msg)
102
123
  return Comparison(comparator=func, attribute=args[0], value=args[1])
103
- elif len(args) == 1 and func in (Operator.AND, Operator.OR):
124
+ if len(args) == 1 and func in (Operator.AND, Operator.OR):
104
125
  return args[0]
105
- else:
106
- return Operation(operator=func, arguments=args)
126
+ return Operation(operator=func, arguments=args)
107
127
 
108
128
  def _match_func_name(self, func_name: str) -> Union[Operator, Comparator]:
109
129
  if func_name in set(Comparator):
110
- if self.allowed_comparators is not None:
111
- if func_name not in self.allowed_comparators:
112
- raise ValueError(
113
- f"Received disallowed comparator {func_name}. Allowed "
114
- f"comparators are {self.allowed_comparators}"
115
- )
130
+ if (
131
+ self.allowed_comparators is not None
132
+ and func_name not in self.allowed_comparators
133
+ ):
134
+ msg = (
135
+ f"Received disallowed comparator {func_name}. Allowed "
136
+ f"comparators are {self.allowed_comparators}"
137
+ )
138
+ raise ValueError(msg)
116
139
  return Comparator(func_name)
117
- elif func_name in set(Operator):
118
- if self.allowed_operators is not None:
119
- if func_name not in self.allowed_operators:
120
- raise ValueError(
121
- f"Received disallowed operator {func_name}. Allowed operators"
122
- f" are {self.allowed_operators}"
123
- )
140
+ if func_name in set(Operator):
141
+ if (
142
+ self.allowed_operators is not None
143
+ and func_name not in self.allowed_operators
144
+ ):
145
+ msg = (
146
+ f"Received disallowed operator {func_name}. Allowed operators"
147
+ f" are {self.allowed_operators}"
148
+ )
149
+ raise ValueError(msg)
124
150
  return Operator(func_name)
125
- else:
126
- raise ValueError(
127
- f"Received unrecognized function {func_name}. Valid functions are "
128
- f"{list(Operator) + list(Comparator)}"
129
- )
151
+ msg = (
152
+ f"Received unrecognized function {func_name}. Valid functions are "
153
+ f"{list(Operator) + list(Comparator)}"
154
+ )
155
+ raise ValueError(msg)
130
156
 
131
157
  def args(self, *items: Any) -> tuple:
158
+ """Transforms items into a tuple.
159
+
160
+ Args:
161
+ items: The items to transform.
162
+ """
132
163
  return items
133
164
 
134
165
  def false(self) -> bool:
166
+ """Returns false."""
135
167
  return False
136
168
 
137
169
  def true(self) -> bool:
170
+ """Returns true."""
138
171
  return True
139
172
 
140
173
  def list(self, item: Any) -> list:
174
+ """Transforms an item into a list.
175
+
176
+ Args:
177
+ item: The item to transform.
178
+ """
141
179
  if item is None:
142
180
  return []
143
181
  return list(item)
144
182
 
145
183
  def int(self, item: Any) -> int:
184
+ """Transforms an item into an int.
185
+
186
+ Args:
187
+ item: The item to transform.
188
+ """
146
189
  return int(item)
147
190
 
148
191
  def float(self, item: Any) -> float:
192
+ """Transforms an item into a float.
193
+
194
+ Args:
195
+ item: The item to transform.
196
+ """
149
197
  return float(item)
150
198
 
151
199
  def date(self, item: Any) -> ISO8601Date:
200
+ """Transforms an item into a ISO8601Date object.
201
+
202
+ Args:
203
+ item: The item to transform.
204
+ Raises:
205
+ ValueError: If the item is not in ISO 8601 date format.
206
+ """
152
207
  item = str(item).strip("\"'")
153
208
  try:
154
- datetime.datetime.strptime(item, "%Y-%m-%d")
209
+ datetime.datetime.strptime(item, "%Y-%m-%d") # noqa: DTZ007
155
210
  except ValueError:
156
211
  warnings.warn(
157
212
  "Dates are expected to be provided in ISO 8601 date format "
158
- "(YYYY-MM-DD)."
213
+ "(YYYY-MM-DD).",
214
+ stacklevel=3,
159
215
  )
160
216
  return {"date": item, "type": "date"}
161
217
 
162
218
  def datetime(self, item: Any) -> ISO8601DateTime:
219
+ """Transforms an item into a ISO8601DateTime object.
220
+
221
+ Args:
222
+ item: The item to transform.
223
+ Raises:
224
+ ValueError: If the item is not in ISO 8601 datetime format.
225
+ """
163
226
  item = str(item).strip("\"'")
164
227
  try:
165
228
  # Parse full ISO 8601 datetime format
166
229
  datetime.datetime.strptime(item, "%Y-%m-%dT%H:%M:%S%z")
167
230
  except ValueError:
168
231
  try:
169
- datetime.datetime.strptime(item, "%Y-%m-%dT%H:%M:%S")
170
- except ValueError:
171
- raise ValueError(
172
- "Datetime values are expected to be in ISO 8601 format."
173
- )
232
+ datetime.datetime.strptime(item, "%Y-%m-%dT%H:%M:%S") # noqa: DTZ007
233
+ except ValueError as e:
234
+ msg = "Datetime values are expected to be in ISO 8601 format."
235
+ raise ValueError(msg) from e
174
236
  return {"datetime": item, "type": "datetime"}
175
237
 
176
238
  def string(self, item: Any) -> str:
177
- # Remove escaped quotes
239
+ """Transforms an item into a string.
240
+
241
+ Removes escaped quotes.
242
+
243
+ Args:
244
+ item: The item to transform.
245
+ """
178
246
  return str(item).strip("\"'")
179
247
 
180
248
 
@@ -194,9 +262,8 @@ def get_parser(
194
262
  """
195
263
  # QueryTransformer is None when Lark cannot be imported.
196
264
  if QueryTransformer is None:
197
- raise ImportError(
198
- "Cannot import lark, please install it with 'pip install lark'."
199
- )
265
+ msg = "Cannot import lark, please install it with 'pip install lark'."
266
+ raise ImportError(msg)
200
267
  transformer = QueryTransformer(
201
268
  allowed_comparators=allowed_comparators,
202
269
  allowed_operators=allowed_operators,
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts import PromptTemplate
3
2
 
4
3
  SONG_DATA_SOURCE = """\
@@ -30,7 +29,7 @@ FULL_ANSWER = """\
30
29
  "filter": "and(or(eq(\\"artist\\", \\"Taylor Swift\\"), eq(\\"artist\\", \\"Katy Perry\\")), lt(\\"length\\", 180), eq(\\"genre\\", \\"pop\\"))"
31
30
  }}
32
31
  ```\
33
- """
32
+ """ # noqa: E501
34
33
 
35
34
  NO_FILTER_ANSWER = """\
36
35
  ```json
@@ -55,7 +54,7 @@ DEFAULT_EXAMPLES = [
55
54
  {
56
55
  "i": 1,
57
56
  "data_source": SONG_DATA_SOURCE,
58
- "user_query": "What are songs by Taylor Swift or Katy Perry about teenage romance under 3 minutes long in the dance pop genre",
57
+ "user_query": "What are songs by Taylor Swift or Katy Perry about teenage romance under 3 minutes long in the dance pop genre", # noqa: E501
59
58
  "structured_request": FULL_ANSWER,
60
59
  },
61
60
  {
@@ -70,7 +69,7 @@ EXAMPLES_WITH_LIMIT = [
70
69
  {
71
70
  "i": 1,
72
71
  "data_source": SONG_DATA_SOURCE,
73
- "user_query": "What are songs by Taylor Swift or Katy Perry about teenage romance under 3 minutes long in the dance pop genre",
72
+ "user_query": "What are songs by Taylor Swift or Katy Perry about teenage romance under 3 minutes long in the dance pop genre", # noqa: E501
74
73
  "structured_request": FULL_ANSWER,
75
74
  },
76
75
  {
@@ -144,7 +143,7 @@ Make sure that filters only use the attributed names with its function names if
144
143
  Make sure that filters only use format `YYYY-MM-DD` when handling date data typed values.
145
144
  Make sure that filters take into account the descriptions of attributes and only make comparisons that are feasible given the type of data being stored.
146
145
  Make sure that filters are only used as needed. If there are no filters that should be applied return "NO_FILTER" for the filter value.\
147
- """
146
+ """ # noqa: E501
148
147
  DEFAULT_SCHEMA_PROMPT = PromptTemplate.from_template(DEFAULT_SCHEMA)
149
148
 
150
149
  SCHEMA_WITH_LIMIT = """\
@@ -179,7 +178,7 @@ Make sure that filters only use format `YYYY-MM-DD` when handling date data type
179
178
  Make sure that filters take into account the descriptions of attributes and only make comparisons that are feasible given the type of data being stored.
180
179
  Make sure that filters are only used as needed. If there are no filters that should be applied return "NO_FILTER" for the filter value.
181
180
  Make sure the `limit` is always an int value. It is an optional parameter so leave it blank if it does not make sense.
182
- """
181
+ """ # noqa: E501
183
182
  SCHEMA_WITH_LIMIT_PROMPT = PromptTemplate.from_template(SCHEMA_WITH_LIMIT)
184
183
 
185
184
  DEFAULT_PREFIX = """\
@@ -29,13 +29,16 @@ class LoadingCallable(Protocol):
29
29
  """Interface for loading the combine documents chain."""
30
30
 
31
31
  def __call__(
32
- self, llm: BaseLanguageModel, **kwargs: Any
32
+ self,
33
+ llm: BaseLanguageModel,
34
+ **kwargs: Any,
33
35
  ) -> BaseCombineDocumentsChain:
34
36
  """Callable to load the combine documents chain."""
35
37
 
36
38
 
37
39
  def _load_map_rerank_chain(
38
40
  llm: BaseLanguageModel,
41
+ *,
39
42
  prompt: BasePromptTemplate = MAP_RERANK_PROMPT,
40
43
  verbose: bool = False,
41
44
  document_variable_name: str = "context",
@@ -65,6 +68,7 @@ def _load_map_rerank_chain(
65
68
 
66
69
  def _load_stuff_chain(
67
70
  llm: BaseLanguageModel,
71
+ *,
68
72
  prompt: Optional[BasePromptTemplate] = None,
69
73
  document_variable_name: str = "context",
70
74
  verbose: Optional[bool] = None,
@@ -93,6 +97,7 @@ def _load_stuff_chain(
93
97
 
94
98
  def _load_map_reduce_chain(
95
99
  llm: BaseLanguageModel,
100
+ *,
96
101
  question_prompt: Optional[BasePromptTemplate] = None,
97
102
  combine_prompt: Optional[BasePromptTemplate] = None,
98
103
  combine_document_variable_name: str = "summaries",
@@ -138,10 +143,11 @@ def _load_map_reduce_chain(
138
143
  if collapse_prompt is None:
139
144
  collapse_chain = None
140
145
  if collapse_llm is not None:
141
- raise ValueError(
146
+ msg = (
142
147
  "collapse_llm provided, but collapse_prompt was not: please "
143
148
  "provide one or stop providing collapse_llm."
144
149
  )
150
+ raise ValueError(msg)
145
151
  else:
146
152
  _collapse_llm = collapse_llm or llm
147
153
  collapse_chain = StuffDocumentsChain(
@@ -175,6 +181,7 @@ def _load_map_reduce_chain(
175
181
 
176
182
  def _load_refine_chain(
177
183
  llm: BaseLanguageModel,
184
+ *,
178
185
  question_prompt: Optional[BasePromptTemplate] = None,
179
186
  refine_prompt: Optional[BasePromptTemplate] = None,
180
187
  document_variable_name: str = "context_str",
@@ -189,7 +196,7 @@ def _load_refine_chain(
189
196
  question_prompt or refine_prompts.QUESTION_PROMPT_SELECTOR.get_prompt(llm)
190
197
  )
191
198
  _refine_prompt = refine_prompt or refine_prompts.REFINE_PROMPT_SELECTOR.get_prompt(
192
- llm
199
+ llm,
193
200
  )
194
201
  initial_chain = LLMChain(
195
202
  llm=llm,
@@ -224,10 +231,10 @@ def _load_refine_chain(
224
231
  message=(
225
232
  "This class is deprecated. See the following migration guides for replacements "
226
233
  "based on `chain_type`:\n"
227
- "stuff: https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain\n" # noqa: E501
228
- "map_reduce: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain\n" # noqa: E501
229
- "refine: https://python.langchain.com/docs/versions/migrating_chains/refine_chain\n" # noqa: E501
230
- "map_rerank: https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain\n" # noqa: E501
234
+ "stuff: https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain\n"
235
+ "map_reduce: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain\n"
236
+ "refine: https://python.langchain.com/docs/versions/migrating_chains/refine_chain\n"
237
+ "map_rerank: https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain\n"
231
238
  "\nSee also guides on retrieval and question-answering here: "
232
239
  "https://python.langchain.com/docs/how_to/#qa-with-rag"
233
240
  ),
@@ -235,7 +242,7 @@ def _load_refine_chain(
235
242
  def load_qa_chain(
236
243
  llm: BaseLanguageModel,
237
244
  chain_type: str = "stuff",
238
- verbose: Optional[bool] = None,
245
+ verbose: Optional[bool] = None, # noqa: FBT001
239
246
  callback_manager: Optional[BaseCallbackManager] = None,
240
247
  **kwargs: Any,
241
248
  ) -> BaseCombineDocumentsChain:
@@ -259,10 +266,14 @@ def load_qa_chain(
259
266
  "map_rerank": _load_map_rerank_chain,
260
267
  }
261
268
  if chain_type not in loader_mapping:
262
- raise ValueError(
269
+ msg = (
263
270
  f"Got unsupported chain type: {chain_type}. "
264
271
  f"Should be one of {loader_mapping.keys()}"
265
272
  )
273
+ raise ValueError(msg)
266
274
  return loader_mapping[chain_type](
267
- llm, verbose=verbose, callback_manager=callback_manager, **kwargs
275
+ llm,
276
+ verbose=verbose,
277
+ callback_manager=callback_manager,
278
+ **kwargs,
268
279
  )
@@ -1,5 +1,3 @@
1
- # flake8: noqa
2
- from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
3
1
  from langchain_core.prompts.chat import (
4
2
  ChatPromptTemplate,
5
3
  HumanMessagePromptTemplate,
@@ -7,18 +5,20 @@ from langchain_core.prompts.chat import (
7
5
  )
8
6
  from langchain_core.prompts.prompt import PromptTemplate
9
7
 
10
- question_prompt_template = """Use the following portion of a long document to see if any of the text is relevant to answer the question.
8
+ from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
9
+
10
+ question_prompt_template = """Use the following portion of a long document to see if any of the text is relevant to answer the question.
11
11
  Return any relevant text verbatim.
12
12
  {context}
13
13
  Question: {question}
14
- Relevant text, if any:"""
14
+ Relevant text, if any:""" # noqa: E501
15
15
  QUESTION_PROMPT = PromptTemplate(
16
16
  template=question_prompt_template, input_variables=["context", "question"]
17
17
  )
18
- system_template = """Use the following portion of a long document to see if any of the text is relevant to answer the question.
18
+ system_template = """Use the following portion of a long document to see if any of the text is relevant to answer the question.
19
19
  Return any relevant text verbatim.
20
20
  ______________________
21
- {context}"""
21
+ {context}""" # noqa: E501
22
22
  messages = [
23
23
  SystemMessagePromptTemplate.from_template(system_template),
24
24
  HumanMessagePromptTemplate.from_template("{question}"),
@@ -30,7 +30,7 @@ QUESTION_PROMPT_SELECTOR = ConditionalPromptSelector(
30
30
  default_prompt=QUESTION_PROMPT, conditionals=[(is_chat_model, CHAT_QUESTION_PROMPT)]
31
31
  )
32
32
 
33
- combine_prompt_template = """Given the following extracted parts of a long document and a question, create a final answer.
33
+ combine_prompt_template = """Given the following extracted parts of a long document and a question, create a final answer.
34
34
  If you don't know the answer, just say that you don't know. Don't try to make up an answer.
35
35
 
36
36
  QUESTION: Which state/country's law governs the interpretation of the contract?
@@ -45,13 +45,13 @@ FINAL ANSWER: This Agreement is governed by English law.
45
45
 
46
46
  QUESTION: What did the president say about Michael Jackson?
47
47
  =========
48
- Content: Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans. \n\nLast year COVID-19 kept us apart. This year we are finally together again. \n\nTonight, we meet as Democrats Republicans and Independents. But most importantly as Americans. \n\nWith a duty to one another to the American people to the Constitution. \n\nAnd with an unwavering resolve that freedom will always triumph over tyranny. \n\nSix days ago, Russias Vladimir Putin sought to shake the foundations of the free world thinking he could make it bend to his menacing ways. But he badly miscalculated. \n\nHe thought he could roll into Ukraine and the world would roll over. Instead he met a wall of strength he never imagined. \n\nHe met the Ukrainian people. \n\nFrom President Zelenskyy to every Ukrainian, their fearlessness, their courage, their determination, inspires the world. \n\nGroups of citizens blocking tanks with their bodies. Everyone from students to retirees teachers turned soldiers defending their homeland.
48
+ Content: Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans. \n\nLast year COVID-19 kept us apart. This year we are finally together again. \n\nTonight, we meet as Democrats Republicans and Independents. But most importantly as Americans. \n\nWith a duty to one another to the American people to the Constitution. \n\nAnd with an unwavering resolve that freedom will always triumph over tyranny. \n\nSix days ago, Russia's Vladimir Putin sought to shake the foundations of the free world thinking he could make it bend to his menacing ways. But he badly miscalculated. \n\nHe thought he could roll into Ukraine and the world would roll over. Instead he met a wall of strength he never imagined. \n\nHe met the Ukrainian people. \n\nFrom President Zelenskyy to every Ukrainian, their fearlessness, their courage, their determination, inspires the world. \n\nGroups of citizens blocking tanks with their bodies. Everyone from students to retirees teachers turned soldiers defending their homeland.
49
49
 
50
- Content: And we wont stop. \n\nWe have lost so much to COVID-19. Time with one another. And worst of all, so much loss of life. \n\nLets use this moment to reset. Lets stop looking at COVID-19 as a partisan dividing line and see it for what it is: A God-awful disease. \n\nLets stop seeing each other as enemies, and start seeing each other for who we really are: Fellow Americans. \n\nWe cant change how divided weve been. But we can change how we move forward—on COVID-19 and other issues we must face together. \n\nI recently visited the New York City Police Department days after the funerals of Officer Wilbert Mora and his partner, Officer Jason Rivera. \n\nThey were responding to a 9-1-1 call when a man shot and killed them with a stolen gun. \n\nOfficer Mora was 27 years old. \n\nOfficer Rivera was 22. \n\nBoth Dominican Americans whod grown up on the same streets they later chose to patrol as police officers. \n\nI spoke with their families and told them that we are forever in debt for their sacrifice, and we will carry on their mission to restore the trust and safety every community deserves.
50
+ Content: And we won't stop. \n\nWe have lost so much to COVID-19. Time with one another. And worst of all, so much loss of life. \n\nLet's use this moment to reset. Let's stop looking at COVID-19 as a partisan dividing line and see it for what it is: A God-awful disease. \n\nLet's stop seeing each other as enemies, and start seeing each other for who we really are: Fellow Americans. \n\nWe can't change how divided we've been. But we can change how we move forward—on COVID-19 and other issues we must face together. \n\nI recently visited the New York City Police Department days after the funerals of Officer Wilbert Mora and his partner, Officer Jason Rivera. \n\nThey were responding to a 9-1-1 call when a man shot and killed them with a stolen gun. \n\nOfficer Mora was 27 years old. \n\nOfficer Rivera was 22. \n\nBoth Dominican Americans who'd grown up on the same streets they later chose to patrol as police officers. \n\nI spoke with their families and told them that we are forever in debt for their sacrifice, and we will carry on their mission to restore the trust and safety every community deserves.
51
51
 
52
- Content: And a proud Ukrainian people, who have known 30 years of independence, have repeatedly shown that they will not tolerate anyone who tries to take their country backwards. \n\nTo all Americans, I will be honest with you, as Ive always promised. A Russian dictator, invading a foreign country, has costs around the world. \n\nAnd Im taking robust action to make sure the pain of our sanctions is targeted at Russias economy. And I will use every tool at our disposal to protect American businesses and consumers. \n\nTonight, I can announce that the United States has worked with 30 other countries to release 60 Million barrels of oil from reserves around the world. \n\nAmerica will lead that effort, releasing 30 Million barrels from our own Strategic Petroleum Reserve. And we stand ready to do more if necessary, unified with our allies. \n\nThese steps will help blunt gas prices here at home. And I know the news about whats happening can seem alarming. \n\nBut I want you to know that we are going to be okay.
52
+ Content: And a proud Ukrainian people, who have known 30 years of independence, have repeatedly shown that they will not tolerate anyone who tries to take their country backwards. \n\nTo all Americans, I will be honest with you, as I've always promised. A Russian dictator, invading a foreign country, has costs around the world. \n\nAnd I'm taking robust action to make sure the pain of our sanctions is targeted at Russia's economy. And I will use every tool at our disposal to protect American businesses and consumers. \n\nTonight, I can announce that the United States has worked with 30 other countries to release 60 Million barrels of oil from reserves around the world. \n\nAmerica will lead that effort, releasing 30 Million barrels from our own Strategic Petroleum Reserve. And we stand ready to do more if necessary, unified with our allies. \n\nThese steps will help blunt gas prices here at home. And I know the news about what's happening can seem alarming. \n\nBut I want you to know that we are going to be okay.
53
53
 
54
- Content: More support for patients and families. \n\nTo get there, I call on Congress to fund ARPA-H, the Advanced Research Projects Agency for Health. \n\nIts based on DARPA—the Defense Department project that led to the Internet, GPS, and so much more. \n\nARPA-H will have a singular purpose—to drive breakthroughs in cancer, Alzheimers, diabetes, and more. \n\nA unity agenda for the nation. \n\nWe can do this. \n\nMy fellow Americans—tonight , we have gathered in a sacred space—the citadel of our democracy. \n\nIn this Capitol, generation after generation, Americans have debated great questions amid great strife, and have done great things. \n\nWe have fought for freedom, expanded liberty, defeated totalitarianism and terror. \n\nAnd built the strongest, freest, and most prosperous nation the world has ever known. \n\nNow is the hour. \n\nOur moment of responsibility. \n\nOur test of resolve and conscience, of history itself. \n\nIt is in this moment that our character is formed. Our purpose is found. Our future is forged. \n\nWell I know this nation.
54
+ Content: More support for patients and families. \n\nTo get there, I call on Congress to fund ARPA-H, the Advanced Research Projects Agency for Health. \n\nIt's based on DARPA—the Defense Department project that led to the Internet, GPS, and so much more. \n\nARPA-H will have a singular purpose—to drive breakthroughs in cancer, Alzheimer's, diabetes, and more. \n\nA unity agenda for the nation. \n\nWe can do this. \n\nMy fellow Americans—tonight , we have gathered in a sacred space—the citadel of our democracy. \n\nIn this Capitol, generation after generation, Americans have debated great questions amid great strife, and have done great things. \n\nWe have fought for freedom, expanded liberty, defeated totalitarianism and terror. \n\nAnd built the strongest, freest, and most prosperous nation the world has ever known. \n\nNow is the hour. \n\nOur moment of responsibility. \n\nOur test of resolve and conscience, of history itself. \n\nIt is in this moment that our character is formed. Our purpose is found. Our future is forged. \n\nWell I know this nation.
55
55
  =========
56
56
  FINAL ANSWER: The president did not mention Michael Jackson.
57
57
 
@@ -59,15 +59,15 @@ QUESTION: {question}
59
59
  =========
60
60
  {summaries}
61
61
  =========
62
- FINAL ANSWER:"""
62
+ FINAL ANSWER:""" # noqa: E501
63
63
  COMBINE_PROMPT = PromptTemplate(
64
64
  template=combine_prompt_template, input_variables=["summaries", "question"]
65
65
  )
66
66
 
67
- system_template = """Given the following extracted parts of a long document and a question, create a final answer.
67
+ system_template = """Given the following extracted parts of a long document and a question, create a final answer.
68
68
  If you don't know the answer, just say that you don't know. Don't try to make up an answer.
69
69
  ______________________
70
- {summaries}"""
70
+ {summaries}""" # noqa: E501
71
71
  messages = [
72
72
  SystemMessagePromptTemplate.from_template(system_template),
73
73
  HumanMessagePromptTemplate.from_template("{question}"),
@@ -1,7 +1,7 @@
1
- # flake8: noqa
2
- from langchain.output_parsers.regex import RegexParser
3
1
  from langchain_core.prompts import PromptTemplate
4
2
 
3
+ from langchain.output_parsers.regex import RegexParser
4
+
5
5
  output_parser = RegexParser(
6
6
  regex=r"(.*?)\nScore: (\d*)",
7
7
  output_keys=["answer", "score"],
@@ -58,7 +58,7 @@ Context:
58
58
  {context}
59
59
  ---------
60
60
  Question: {question}
61
- Helpful Answer:"""
61
+ Helpful Answer:""" # noqa: E501
62
62
  PROMPT = PromptTemplate(
63
63
  template=prompt_template,
64
64
  input_variables=["context", "question"],
@@ -1,13 +1,10 @@
1
- # flake8: noqa
2
- from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
3
1
  from langchain_core.prompts.chat import (
4
- AIMessagePromptTemplate,
5
2
  ChatPromptTemplate,
6
- HumanMessagePromptTemplate,
7
- SystemMessagePromptTemplate,
8
3
  )
9
4
  from langchain_core.prompts.prompt import PromptTemplate
10
5
 
6
+ from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
7
+
11
8
  DEFAULT_REFINE_PROMPT_TMPL = (
12
9
  "The original question is as follows: {question}\n"
13
10
  "We have provided an existing answer: {existing_answer}\n"
@@ -1,5 +1,3 @@
1
- # flake8: noqa
2
- from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
3
1
  from langchain_core.prompts import PromptTemplate
4
2
  from langchain_core.prompts.chat import (
5
3
  ChatPromptTemplate,
@@ -7,20 +5,22 @@ from langchain_core.prompts.chat import (
7
5
  SystemMessagePromptTemplate,
8
6
  )
9
7
 
8
+ from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
9
+
10
10
  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.
11
11
 
12
12
  {context}
13
13
 
14
14
  Question: {question}
15
- Helpful Answer:"""
15
+ Helpful Answer:""" # noqa: E501
16
16
  PROMPT = PromptTemplate(
17
17
  template=prompt_template, input_variables=["context", "question"]
18
18
  )
19
19
 
20
- system_template = """Use the following pieces of context to answer the user's question.
20
+ system_template = """Use the following pieces of context to answer the user's question.
21
21
  If you don't know the answer, just say that you don't know, don't try to make up an answer.
22
22
  ----------------
23
- {context}"""
23
+ {context}""" # noqa: E501
24
24
  messages = [
25
25
  SystemMessagePromptTemplate.from_template(system_template),
26
26
  HumanMessagePromptTemplate.from_template("{question}"),
@@ -60,10 +60,8 @@ def create_retrieval_chain(
60
60
  else:
61
61
  retrieval_docs = (lambda x: x["input"]) | retriever
62
62
 
63
- retrieval_chain = (
63
+ return (
64
64
  RunnablePassthrough.assign(
65
65
  context=retrieval_docs.with_config(run_name="retrieve_documents"),
66
66
  ).assign(answer=combine_docs_chain)
67
67
  ).with_config(run_name="retrieval_chain")
68
-
69
- return retrieval_chain