langchain 0.3.25__py3-none-any.whl → 0.3.27__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of langchain might be problematic. Click here for more details.

Files changed (582) hide show
  1. langchain/__init__.py +110 -96
  2. langchain/_api/__init__.py +2 -2
  3. langchain/_api/deprecation.py +3 -3
  4. langchain/_api/module_import.py +51 -46
  5. langchain/_api/path.py +1 -1
  6. langchain/adapters/openai.py +8 -8
  7. langchain/agents/__init__.py +15 -12
  8. langchain/agents/agent.py +160 -133
  9. langchain/agents/agent_iterator.py +31 -14
  10. langchain/agents/agent_toolkits/__init__.py +7 -6
  11. langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
  12. langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
  13. langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
  14. langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
  15. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
  16. langchain/agents/agent_toolkits/csv/__init__.py +4 -2
  17. langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
  18. langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
  19. langchain/agents/agent_toolkits/github/toolkit.py +9 -9
  20. langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
  21. langchain/agents/agent_toolkits/json/base.py +1 -1
  22. langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
  23. langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
  24. langchain/agents/agent_toolkits/openapi/base.py +1 -1
  25. langchain/agents/agent_toolkits/openapi/planner.py +2 -2
  26. langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
  27. langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
  28. langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
  29. langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
  30. langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
  31. langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
  32. langchain/agents/agent_toolkits/powerbi/base.py +1 -1
  33. langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
  34. langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
  35. langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
  36. langchain/agents/agent_toolkits/python/__init__.py +4 -2
  37. langchain/agents/agent_toolkits/spark/__init__.py +4 -2
  38. langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
  39. langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
  40. langchain/agents/agent_toolkits/sql/prompt.py +1 -1
  41. langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
  42. langchain/agents/agent_toolkits/vectorstore/base.py +2 -2
  43. langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
  44. langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
  45. langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
  46. langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
  47. langchain/agents/agent_types.py +7 -7
  48. langchain/agents/chat/base.py +6 -12
  49. langchain/agents/chat/output_parser.py +9 -6
  50. langchain/agents/chat/prompt.py +3 -4
  51. langchain/agents/conversational/base.py +9 -5
  52. langchain/agents/conversational/output_parser.py +4 -2
  53. langchain/agents/conversational/prompt.py +2 -3
  54. langchain/agents/conversational_chat/base.py +7 -5
  55. langchain/agents/conversational_chat/output_parser.py +9 -11
  56. langchain/agents/conversational_chat/prompt.py +5 -6
  57. langchain/agents/format_scratchpad/__init__.py +3 -3
  58. langchain/agents/format_scratchpad/log_to_messages.py +1 -1
  59. langchain/agents/format_scratchpad/openai_functions.py +8 -6
  60. langchain/agents/format_scratchpad/tools.py +5 -3
  61. langchain/agents/format_scratchpad/xml.py +33 -2
  62. langchain/agents/initialize.py +18 -9
  63. langchain/agents/json_chat/base.py +18 -18
  64. langchain/agents/json_chat/prompt.py +2 -3
  65. langchain/agents/load_tools.py +2 -1
  66. langchain/agents/loading.py +28 -18
  67. langchain/agents/mrkl/base.py +9 -4
  68. langchain/agents/mrkl/output_parser.py +17 -13
  69. langchain/agents/mrkl/prompt.py +1 -2
  70. langchain/agents/openai_assistant/base.py +80 -70
  71. langchain/agents/openai_functions_agent/base.py +47 -38
  72. langchain/agents/openai_functions_multi_agent/base.py +40 -27
  73. langchain/agents/openai_tools/base.py +8 -8
  74. langchain/agents/output_parsers/__init__.py +3 -3
  75. langchain/agents/output_parsers/json.py +7 -7
  76. langchain/agents/output_parsers/openai_functions.py +15 -7
  77. langchain/agents/output_parsers/openai_tools.py +9 -4
  78. langchain/agents/output_parsers/react_json_single_input.py +10 -5
  79. langchain/agents/output_parsers/react_single_input.py +15 -11
  80. langchain/agents/output_parsers/self_ask.py +3 -2
  81. langchain/agents/output_parsers/tools.py +18 -13
  82. langchain/agents/output_parsers/xml.py +99 -28
  83. langchain/agents/react/agent.py +4 -4
  84. langchain/agents/react/base.py +22 -17
  85. langchain/agents/react/output_parser.py +5 -6
  86. langchain/agents/react/textworld_prompt.py +0 -1
  87. langchain/agents/react/wiki_prompt.py +14 -15
  88. langchain/agents/schema.py +3 -2
  89. langchain/agents/self_ask_with_search/base.py +19 -15
  90. langchain/agents/self_ask_with_search/prompt.py +0 -1
  91. langchain/agents/structured_chat/base.py +14 -11
  92. langchain/agents/structured_chat/output_parser.py +16 -18
  93. langchain/agents/structured_chat/prompt.py +3 -4
  94. langchain/agents/tool_calling_agent/base.py +7 -6
  95. langchain/agents/tools.py +2 -2
  96. langchain/agents/utils.py +2 -3
  97. langchain/agents/xml/base.py +5 -5
  98. langchain/agents/xml/prompt.py +1 -2
  99. langchain/cache.py +12 -12
  100. langchain/callbacks/__init__.py +11 -11
  101. langchain/callbacks/aim_callback.py +2 -2
  102. langchain/callbacks/argilla_callback.py +1 -1
  103. langchain/callbacks/arize_callback.py +1 -1
  104. langchain/callbacks/arthur_callback.py +1 -1
  105. langchain/callbacks/base.py +7 -7
  106. langchain/callbacks/clearml_callback.py +1 -1
  107. langchain/callbacks/comet_ml_callback.py +1 -1
  108. langchain/callbacks/confident_callback.py +1 -1
  109. langchain/callbacks/context_callback.py +1 -1
  110. langchain/callbacks/flyte_callback.py +1 -1
  111. langchain/callbacks/human.py +2 -2
  112. langchain/callbacks/infino_callback.py +1 -1
  113. langchain/callbacks/labelstudio_callback.py +1 -1
  114. langchain/callbacks/llmonitor_callback.py +1 -1
  115. langchain/callbacks/manager.py +6 -6
  116. langchain/callbacks/mlflow_callback.py +2 -2
  117. langchain/callbacks/openai_info.py +1 -1
  118. langchain/callbacks/promptlayer_callback.py +1 -1
  119. langchain/callbacks/sagemaker_callback.py +1 -1
  120. langchain/callbacks/streaming_aiter.py +4 -1
  121. langchain/callbacks/streaming_aiter_final_only.py +5 -3
  122. langchain/callbacks/streaming_stdout_final_only.py +5 -3
  123. langchain/callbacks/streamlit/__init__.py +3 -2
  124. langchain/callbacks/streamlit/mutable_expander.py +1 -1
  125. langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
  126. langchain/callbacks/tracers/__init__.py +1 -1
  127. langchain/callbacks/tracers/base.py +2 -1
  128. langchain/callbacks/tracers/comet.py +1 -1
  129. langchain/callbacks/tracers/evaluation.py +1 -1
  130. langchain/callbacks/tracers/log_stream.py +1 -1
  131. langchain/callbacks/tracers/logging.py +1 -1
  132. langchain/callbacks/tracers/stdout.py +1 -1
  133. langchain/callbacks/trubrics_callback.py +1 -1
  134. langchain/callbacks/utils.py +4 -4
  135. langchain/callbacks/wandb_callback.py +1 -1
  136. langchain/callbacks/whylabs_callback.py +1 -1
  137. langchain/chains/api/base.py +36 -22
  138. langchain/chains/api/news_docs.py +1 -2
  139. langchain/chains/api/open_meteo_docs.py +1 -2
  140. langchain/chains/api/openapi/requests_chain.py +1 -1
  141. langchain/chains/api/openapi/response_chain.py +1 -1
  142. langchain/chains/api/podcast_docs.py +1 -2
  143. langchain/chains/api/prompt.py +1 -2
  144. langchain/chains/api/tmdb_docs.py +1 -2
  145. langchain/chains/base.py +89 -55
  146. langchain/chains/chat_vector_db/prompts.py +2 -3
  147. langchain/chains/combine_documents/__init__.py +1 -1
  148. langchain/chains/combine_documents/base.py +24 -11
  149. langchain/chains/combine_documents/map_reduce.py +39 -31
  150. langchain/chains/combine_documents/map_rerank.py +34 -21
  151. langchain/chains/combine_documents/reduce.py +47 -26
  152. langchain/chains/combine_documents/refine.py +26 -17
  153. langchain/chains/combine_documents/stuff.py +19 -12
  154. langchain/chains/constitutional_ai/base.py +4 -4
  155. langchain/chains/constitutional_ai/principles.py +22 -25
  156. langchain/chains/constitutional_ai/prompts.py +25 -28
  157. langchain/chains/conversation/base.py +6 -7
  158. langchain/chains/conversation/memory.py +5 -5
  159. langchain/chains/conversation/prompt.py +5 -5
  160. langchain/chains/conversational_retrieval/base.py +41 -20
  161. langchain/chains/conversational_retrieval/prompts.py +2 -3
  162. langchain/chains/elasticsearch_database/base.py +8 -9
  163. langchain/chains/elasticsearch_database/prompts.py +2 -3
  164. langchain/chains/ernie_functions/__init__.py +2 -2
  165. langchain/chains/example_generator.py +3 -1
  166. langchain/chains/flare/base.py +26 -12
  167. langchain/chains/graph_qa/cypher.py +2 -2
  168. langchain/chains/graph_qa/falkordb.py +1 -1
  169. langchain/chains/graph_qa/gremlin.py +1 -1
  170. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  171. langchain/chains/graph_qa/prompts.py +2 -2
  172. langchain/chains/history_aware_retriever.py +2 -1
  173. langchain/chains/hyde/base.py +6 -5
  174. langchain/chains/hyde/prompts.py +5 -6
  175. langchain/chains/llm.py +77 -61
  176. langchain/chains/llm_bash/__init__.py +2 -1
  177. langchain/chains/llm_checker/base.py +7 -5
  178. langchain/chains/llm_checker/prompt.py +3 -4
  179. langchain/chains/llm_math/base.py +16 -9
  180. langchain/chains/llm_math/prompt.py +1 -2
  181. langchain/chains/llm_summarization_checker/base.py +9 -6
  182. langchain/chains/llm_symbolic_math/__init__.py +2 -1
  183. langchain/chains/loading.py +170 -153
  184. langchain/chains/mapreduce.py +4 -3
  185. langchain/chains/moderation.py +8 -9
  186. langchain/chains/natbot/base.py +8 -8
  187. langchain/chains/natbot/crawler.py +73 -76
  188. langchain/chains/natbot/prompt.py +2 -3
  189. langchain/chains/openai_functions/__init__.py +7 -7
  190. langchain/chains/openai_functions/base.py +13 -10
  191. langchain/chains/openai_functions/citation_fuzzy_match.py +12 -11
  192. langchain/chains/openai_functions/extraction.py +19 -19
  193. langchain/chains/openai_functions/openapi.py +35 -35
  194. langchain/chains/openai_functions/qa_with_structure.py +19 -12
  195. langchain/chains/openai_functions/tagging.py +2 -4
  196. langchain/chains/openai_tools/extraction.py +7 -8
  197. langchain/chains/qa_generation/base.py +4 -3
  198. langchain/chains/qa_generation/prompt.py +5 -5
  199. langchain/chains/qa_with_sources/base.py +14 -6
  200. langchain/chains/qa_with_sources/loading.py +16 -8
  201. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  202. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  203. langchain/chains/qa_with_sources/retrieval.py +14 -5
  204. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  205. langchain/chains/qa_with_sources/vector_db.py +17 -6
  206. langchain/chains/query_constructor/base.py +34 -33
  207. langchain/chains/query_constructor/ir.py +4 -4
  208. langchain/chains/query_constructor/parser.py +37 -32
  209. langchain/chains/query_constructor/prompt.py +5 -6
  210. langchain/chains/question_answering/chain.py +21 -10
  211. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  212. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  213. langchain/chains/question_answering/refine_prompts.py +2 -5
  214. langchain/chains/question_answering/stuff_prompt.py +5 -5
  215. langchain/chains/retrieval.py +1 -3
  216. langchain/chains/retrieval_qa/base.py +34 -27
  217. langchain/chains/retrieval_qa/prompt.py +1 -2
  218. langchain/chains/router/__init__.py +3 -3
  219. langchain/chains/router/base.py +24 -20
  220. langchain/chains/router/embedding_router.py +12 -8
  221. langchain/chains/router/llm_router.py +17 -16
  222. langchain/chains/router/multi_prompt.py +2 -2
  223. langchain/chains/router/multi_retrieval_qa.py +10 -5
  224. langchain/chains/sequential.py +30 -18
  225. langchain/chains/sql_database/prompt.py +14 -16
  226. langchain/chains/sql_database/query.py +6 -5
  227. langchain/chains/structured_output/__init__.py +1 -1
  228. langchain/chains/structured_output/base.py +75 -67
  229. langchain/chains/summarize/chain.py +11 -5
  230. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  231. langchain/chains/summarize/stuff_prompt.py +0 -1
  232. langchain/chains/transform.py +5 -6
  233. langchain/chat_loaders/facebook_messenger.py +1 -1
  234. langchain/chat_loaders/langsmith.py +1 -1
  235. langchain/chat_loaders/utils.py +3 -3
  236. langchain/chat_models/__init__.py +20 -19
  237. langchain/chat_models/anthropic.py +1 -1
  238. langchain/chat_models/azureml_endpoint.py +1 -1
  239. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  240. langchain/chat_models/base.py +160 -123
  241. langchain/chat_models/bedrock.py +1 -1
  242. langchain/chat_models/fake.py +1 -1
  243. langchain/chat_models/meta.py +1 -1
  244. langchain/chat_models/pai_eas_endpoint.py +1 -1
  245. langchain/chat_models/promptlayer_openai.py +1 -1
  246. langchain/chat_models/volcengine_maas.py +1 -1
  247. langchain/docstore/base.py +1 -1
  248. langchain/document_loaders/__init__.py +9 -9
  249. langchain/document_loaders/airbyte.py +3 -3
  250. langchain/document_loaders/assemblyai.py +1 -1
  251. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  252. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  253. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  254. langchain/document_loaders/base.py +1 -1
  255. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  256. langchain/document_loaders/blockchain.py +1 -1
  257. langchain/document_loaders/chatgpt.py +1 -1
  258. langchain/document_loaders/college_confidential.py +1 -1
  259. langchain/document_loaders/confluence.py +1 -1
  260. langchain/document_loaders/email.py +1 -1
  261. langchain/document_loaders/facebook_chat.py +1 -1
  262. langchain/document_loaders/markdown.py +1 -1
  263. langchain/document_loaders/notebook.py +1 -1
  264. langchain/document_loaders/org_mode.py +1 -1
  265. langchain/document_loaders/parsers/__init__.py +1 -1
  266. langchain/document_loaders/parsers/docai.py +1 -1
  267. langchain/document_loaders/parsers/generic.py +1 -1
  268. langchain/document_loaders/parsers/html/__init__.py +1 -1
  269. langchain/document_loaders/parsers/html/bs4.py +1 -1
  270. langchain/document_loaders/parsers/language/cobol.py +1 -1
  271. langchain/document_loaders/parsers/language/python.py +1 -1
  272. langchain/document_loaders/parsers/msword.py +1 -1
  273. langchain/document_loaders/parsers/pdf.py +5 -5
  274. langchain/document_loaders/parsers/registry.py +1 -1
  275. langchain/document_loaders/pdf.py +8 -8
  276. langchain/document_loaders/powerpoint.py +1 -1
  277. langchain/document_loaders/pyspark_dataframe.py +1 -1
  278. langchain/document_loaders/telegram.py +2 -2
  279. langchain/document_loaders/tencent_cos_directory.py +1 -1
  280. langchain/document_loaders/unstructured.py +5 -5
  281. langchain/document_loaders/url_playwright.py +1 -1
  282. langchain/document_loaders/whatsapp_chat.py +1 -1
  283. langchain/document_loaders/youtube.py +2 -2
  284. langchain/document_transformers/__init__.py +3 -3
  285. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  286. langchain/document_transformers/doctran_text_extract.py +1 -1
  287. langchain/document_transformers/doctran_text_qa.py +1 -1
  288. langchain/document_transformers/doctran_text_translate.py +1 -1
  289. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  290. langchain/document_transformers/google_translate.py +1 -1
  291. langchain/document_transformers/html2text.py +1 -1
  292. langchain/document_transformers/nuclia_text_transform.py +1 -1
  293. langchain/embeddings/__init__.py +5 -5
  294. langchain/embeddings/base.py +33 -24
  295. langchain/embeddings/cache.py +117 -26
  296. langchain/embeddings/fake.py +1 -1
  297. langchain/embeddings/huggingface.py +2 -2
  298. langchain/evaluation/__init__.py +22 -22
  299. langchain/evaluation/agents/trajectory_eval_chain.py +24 -24
  300. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  301. langchain/evaluation/comparison/__init__.py +1 -1
  302. langchain/evaluation/comparison/eval_chain.py +21 -14
  303. langchain/evaluation/comparison/prompt.py +1 -2
  304. langchain/evaluation/criteria/__init__.py +1 -1
  305. langchain/evaluation/criteria/eval_chain.py +21 -12
  306. langchain/evaluation/criteria/prompt.py +2 -3
  307. langchain/evaluation/embedding_distance/base.py +24 -21
  308. langchain/evaluation/loading.py +15 -11
  309. langchain/evaluation/parsing/base.py +4 -1
  310. langchain/evaluation/parsing/json_distance.py +5 -2
  311. langchain/evaluation/parsing/json_schema.py +12 -8
  312. langchain/evaluation/qa/__init__.py +1 -1
  313. langchain/evaluation/qa/eval_chain.py +13 -6
  314. langchain/evaluation/qa/eval_prompt.py +7 -8
  315. langchain/evaluation/qa/generate_chain.py +2 -1
  316. langchain/evaluation/qa/generate_prompt.py +2 -4
  317. langchain/evaluation/schema.py +38 -30
  318. langchain/evaluation/scoring/__init__.py +1 -1
  319. langchain/evaluation/scoring/eval_chain.py +23 -16
  320. langchain/evaluation/scoring/prompt.py +0 -1
  321. langchain/evaluation/string_distance/base.py +15 -10
  322. langchain/globals.py +12 -11
  323. langchain/graphs/__init__.py +6 -6
  324. langchain/graphs/graph_document.py +1 -1
  325. langchain/graphs/networkx_graph.py +2 -2
  326. langchain/hub.py +9 -11
  327. langchain/indexes/__init__.py +3 -3
  328. langchain/indexes/_sql_record_manager.py +63 -46
  329. langchain/indexes/prompts/entity_extraction.py +1 -2
  330. langchain/indexes/prompts/entity_summarization.py +1 -2
  331. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  332. langchain/indexes/vectorstore.py +35 -19
  333. langchain/llms/__init__.py +13 -13
  334. langchain/llms/ai21.py +1 -1
  335. langchain/llms/azureml_endpoint.py +4 -4
  336. langchain/llms/base.py +15 -7
  337. langchain/llms/bedrock.py +1 -1
  338. langchain/llms/cloudflare_workersai.py +1 -1
  339. langchain/llms/gradient_ai.py +1 -1
  340. langchain/llms/loading.py +1 -1
  341. langchain/llms/openai.py +1 -1
  342. langchain/llms/sagemaker_endpoint.py +1 -1
  343. langchain/load/dump.py +1 -1
  344. langchain/load/load.py +1 -1
  345. langchain/load/serializable.py +3 -3
  346. langchain/memory/__init__.py +3 -3
  347. langchain/memory/buffer.py +11 -8
  348. langchain/memory/chat_memory.py +14 -8
  349. langchain/memory/chat_message_histories/__init__.py +1 -1
  350. langchain/memory/chat_message_histories/astradb.py +1 -1
  351. langchain/memory/chat_message_histories/cassandra.py +1 -1
  352. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  353. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  354. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  355. langchain/memory/chat_message_histories/file.py +1 -1
  356. langchain/memory/chat_message_histories/firestore.py +1 -1
  357. langchain/memory/chat_message_histories/momento.py +1 -1
  358. langchain/memory/chat_message_histories/mongodb.py +1 -1
  359. langchain/memory/chat_message_histories/neo4j.py +1 -1
  360. langchain/memory/chat_message_histories/postgres.py +1 -1
  361. langchain/memory/chat_message_histories/redis.py +1 -1
  362. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  363. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  364. langchain/memory/chat_message_histories/streamlit.py +1 -1
  365. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  366. langchain/memory/chat_message_histories/xata.py +1 -1
  367. langchain/memory/chat_message_histories/zep.py +1 -1
  368. langchain/memory/combined.py +13 -12
  369. langchain/memory/entity.py +84 -61
  370. langchain/memory/prompt.py +10 -11
  371. langchain/memory/readonly.py +0 -2
  372. langchain/memory/simple.py +1 -3
  373. langchain/memory/summary.py +13 -11
  374. langchain/memory/summary_buffer.py +17 -8
  375. langchain/memory/utils.py +3 -2
  376. langchain/memory/vectorstore.py +13 -6
  377. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  378. langchain/model_laboratory.py +12 -11
  379. langchain/output_parsers/__init__.py +4 -4
  380. langchain/output_parsers/boolean.py +7 -4
  381. langchain/output_parsers/combining.py +10 -5
  382. langchain/output_parsers/datetime.py +32 -31
  383. langchain/output_parsers/enum.py +5 -3
  384. langchain/output_parsers/fix.py +52 -52
  385. langchain/output_parsers/format_instructions.py +6 -8
  386. langchain/output_parsers/json.py +2 -2
  387. langchain/output_parsers/list.py +2 -2
  388. langchain/output_parsers/loading.py +9 -9
  389. langchain/output_parsers/openai_functions.py +3 -3
  390. langchain/output_parsers/openai_tools.py +1 -1
  391. langchain/output_parsers/pandas_dataframe.py +43 -47
  392. langchain/output_parsers/prompts.py +1 -2
  393. langchain/output_parsers/rail_parser.py +1 -1
  394. langchain/output_parsers/regex.py +7 -8
  395. langchain/output_parsers/regex_dict.py +7 -10
  396. langchain/output_parsers/retry.py +77 -78
  397. langchain/output_parsers/structured.py +11 -6
  398. langchain/output_parsers/yaml.py +15 -11
  399. langchain/prompts/__init__.py +5 -3
  400. langchain/prompts/base.py +5 -5
  401. langchain/prompts/chat.py +10 -9
  402. langchain/prompts/example_selector/__init__.py +3 -1
  403. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  404. langchain/prompts/few_shot.py +1 -1
  405. langchain/prompts/loading.py +3 -3
  406. langchain/prompts/prompt.py +1 -1
  407. langchain/retrievers/__init__.py +5 -5
  408. langchain/retrievers/bedrock.py +2 -2
  409. langchain/retrievers/bm25.py +1 -1
  410. langchain/retrievers/contextual_compression.py +15 -13
  411. langchain/retrievers/docarray.py +1 -1
  412. langchain/retrievers/document_compressors/__init__.py +7 -5
  413. langchain/retrievers/document_compressors/base.py +13 -7
  414. langchain/retrievers/document_compressors/chain_extract.py +4 -5
  415. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  416. langchain/retrievers/document_compressors/chain_filter.py +11 -12
  417. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  418. langchain/retrievers/document_compressors/cohere_rerank.py +17 -19
  419. langchain/retrievers/document_compressors/embeddings_filter.py +23 -23
  420. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  421. langchain/retrievers/document_compressors/listwise_rerank.py +11 -6
  422. langchain/retrievers/ensemble.py +28 -25
  423. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  424. langchain/retrievers/google_vertex_ai_search.py +2 -2
  425. langchain/retrievers/kendra.py +10 -10
  426. langchain/retrievers/llama_index.py +1 -1
  427. langchain/retrievers/merger_retriever.py +11 -11
  428. langchain/retrievers/milvus.py +1 -1
  429. langchain/retrievers/multi_query.py +32 -26
  430. langchain/retrievers/multi_vector.py +20 -8
  431. langchain/retrievers/parent_document_retriever.py +18 -9
  432. langchain/retrievers/re_phraser.py +6 -5
  433. langchain/retrievers/self_query/base.py +138 -119
  434. langchain/retrievers/time_weighted_retriever.py +18 -7
  435. langchain/retrievers/zilliz.py +1 -1
  436. langchain/runnables/hub.py +2 -1
  437. langchain/runnables/openai_functions.py +6 -2
  438. langchain/schema/__init__.py +23 -23
  439. langchain/schema/cache.py +1 -1
  440. langchain/schema/callbacks/base.py +7 -7
  441. langchain/schema/callbacks/manager.py +19 -19
  442. langchain/schema/callbacks/tracers/base.py +3 -2
  443. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  444. langchain/schema/callbacks/tracers/langchain.py +1 -1
  445. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  446. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  447. langchain/schema/callbacks/tracers/schemas.py +8 -8
  448. langchain/schema/callbacks/tracers/stdout.py +3 -3
  449. langchain/schema/document.py +1 -1
  450. langchain/schema/language_model.py +2 -2
  451. langchain/schema/messages.py +12 -12
  452. langchain/schema/output.py +3 -3
  453. langchain/schema/output_parser.py +3 -3
  454. langchain/schema/runnable/__init__.py +3 -3
  455. langchain/schema/runnable/base.py +9 -9
  456. langchain/schema/runnable/config.py +5 -5
  457. langchain/schema/runnable/configurable.py +1 -1
  458. langchain/schema/runnable/history.py +1 -1
  459. langchain/schema/runnable/passthrough.py +1 -1
  460. langchain/schema/runnable/utils.py +16 -16
  461. langchain/schema/vectorstore.py +1 -1
  462. langchain/smith/__init__.py +1 -1
  463. langchain/smith/evaluation/__init__.py +2 -2
  464. langchain/smith/evaluation/config.py +10 -7
  465. langchain/smith/evaluation/name_generation.py +3 -3
  466. langchain/smith/evaluation/progress.py +11 -2
  467. langchain/smith/evaluation/runner_utils.py +181 -129
  468. langchain/smith/evaluation/string_run_evaluator.py +75 -68
  469. langchain/storage/__init__.py +2 -2
  470. langchain/storage/_lc_store.py +4 -2
  471. langchain/storage/encoder_backed.py +6 -2
  472. langchain/storage/file_system.py +19 -16
  473. langchain/storage/in_memory.py +1 -1
  474. langchain/storage/upstash_redis.py +1 -1
  475. langchain/text_splitter.py +15 -15
  476. langchain/tools/__init__.py +28 -26
  477. langchain/tools/ainetwork/app.py +1 -1
  478. langchain/tools/ainetwork/base.py +1 -1
  479. langchain/tools/ainetwork/owner.py +1 -1
  480. langchain/tools/ainetwork/rule.py +1 -1
  481. langchain/tools/ainetwork/transfer.py +1 -1
  482. langchain/tools/ainetwork/value.py +1 -1
  483. langchain/tools/amadeus/closest_airport.py +1 -1
  484. langchain/tools/amadeus/flight_search.py +1 -1
  485. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  486. langchain/tools/base.py +4 -4
  487. langchain/tools/bearly/tool.py +1 -1
  488. langchain/tools/bing_search/__init__.py +1 -1
  489. langchain/tools/bing_search/tool.py +1 -1
  490. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  491. langchain/tools/dataforseo_api_search/tool.py +1 -1
  492. langchain/tools/ddg_search/tool.py +1 -1
  493. langchain/tools/e2b_data_analysis/tool.py +2 -2
  494. langchain/tools/edenai/__init__.py +1 -1
  495. langchain/tools/file_management/__init__.py +1 -1
  496. langchain/tools/file_management/copy.py +1 -1
  497. langchain/tools/file_management/delete.py +1 -1
  498. langchain/tools/gmail/__init__.py +2 -2
  499. langchain/tools/gmail/get_message.py +1 -1
  500. langchain/tools/gmail/search.py +1 -1
  501. langchain/tools/gmail/send_message.py +1 -1
  502. langchain/tools/google_finance/__init__.py +1 -1
  503. langchain/tools/google_finance/tool.py +1 -1
  504. langchain/tools/google_scholar/__init__.py +1 -1
  505. langchain/tools/google_scholar/tool.py +1 -1
  506. langchain/tools/google_search/__init__.py +1 -1
  507. langchain/tools/google_search/tool.py +1 -1
  508. langchain/tools/google_serper/__init__.py +1 -1
  509. langchain/tools/google_serper/tool.py +1 -1
  510. langchain/tools/google_trends/__init__.py +1 -1
  511. langchain/tools/google_trends/tool.py +1 -1
  512. langchain/tools/jira/tool.py +20 -1
  513. langchain/tools/json/tool.py +25 -3
  514. langchain/tools/memorize/tool.py +1 -1
  515. langchain/tools/multion/__init__.py +1 -1
  516. langchain/tools/multion/update_session.py +1 -1
  517. langchain/tools/office365/__init__.py +2 -2
  518. langchain/tools/office365/events_search.py +1 -1
  519. langchain/tools/office365/messages_search.py +1 -1
  520. langchain/tools/office365/send_event.py +1 -1
  521. langchain/tools/office365/send_message.py +1 -1
  522. langchain/tools/openapi/utils/api_models.py +6 -6
  523. langchain/tools/playwright/__init__.py +5 -5
  524. langchain/tools/playwright/click.py +1 -1
  525. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  526. langchain/tools/playwright/get_elements.py +1 -1
  527. langchain/tools/playwright/navigate.py +1 -1
  528. langchain/tools/plugin.py +2 -2
  529. langchain/tools/powerbi/tool.py +1 -1
  530. langchain/tools/python/__init__.py +2 -1
  531. langchain/tools/reddit_search/tool.py +1 -1
  532. langchain/tools/render.py +2 -2
  533. langchain/tools/requests/tool.py +2 -2
  534. langchain/tools/searchapi/tool.py +1 -1
  535. langchain/tools/searx_search/tool.py +1 -1
  536. langchain/tools/slack/get_message.py +1 -1
  537. langchain/tools/spark_sql/tool.py +1 -1
  538. langchain/tools/sql_database/tool.py +1 -1
  539. langchain/tools/tavily_search/__init__.py +1 -1
  540. langchain/tools/tavily_search/tool.py +1 -1
  541. langchain/tools/zapier/__init__.py +1 -1
  542. langchain/tools/zapier/tool.py +24 -2
  543. langchain/utilities/__init__.py +4 -4
  544. langchain/utilities/arcee.py +4 -4
  545. langchain/utilities/clickup.py +4 -4
  546. langchain/utilities/dalle_image_generator.py +1 -1
  547. langchain/utilities/dataforseo_api_search.py +1 -1
  548. langchain/utilities/opaqueprompts.py +1 -1
  549. langchain/utilities/reddit_search.py +1 -1
  550. langchain/utilities/sql_database.py +1 -1
  551. langchain/utilities/tavily_search.py +1 -1
  552. langchain/utilities/vertexai.py +2 -2
  553. langchain/utils/__init__.py +1 -1
  554. langchain/utils/aiter.py +1 -1
  555. langchain/utils/html.py +3 -3
  556. langchain/utils/input.py +1 -1
  557. langchain/utils/iter.py +1 -1
  558. langchain/utils/json_schema.py +1 -3
  559. langchain/utils/strings.py +1 -1
  560. langchain/utils/utils.py +6 -6
  561. langchain/vectorstores/__init__.py +5 -5
  562. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  563. langchain/vectorstores/azure_cosmos_db.py +1 -1
  564. langchain/vectorstores/clickhouse.py +1 -1
  565. langchain/vectorstores/elastic_vector_search.py +1 -1
  566. langchain/vectorstores/elasticsearch.py +2 -2
  567. langchain/vectorstores/myscale.py +1 -1
  568. langchain/vectorstores/neo4j_vector.py +1 -1
  569. langchain/vectorstores/pgembedding.py +1 -1
  570. langchain/vectorstores/qdrant.py +1 -1
  571. langchain/vectorstores/redis/__init__.py +1 -1
  572. langchain/vectorstores/redis/base.py +1 -1
  573. langchain/vectorstores/redis/filters.py +4 -4
  574. langchain/vectorstores/redis/schema.py +6 -6
  575. langchain/vectorstores/sklearn.py +2 -2
  576. langchain/vectorstores/starrocks.py +1 -1
  577. langchain/vectorstores/utils.py +1 -1
  578. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/METADATA +5 -5
  579. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/RECORD +582 -582
  580. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
  581. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
  582. {langchain-0.3.25.dist-info → langchain-0.3.27.dist-info}/licenses/LICENSE +0 -0
@@ -47,8 +47,8 @@ def _check_in_allowed_domain(url: str, limit_to_domains: Sequence[str]) -> bool:
47
47
  scheme, domain = _extract_scheme_and_domain(url)
48
48
 
49
49
  for allowed_domain in limit_to_domains:
50
- allowed_scheme, allowed_domain = _extract_scheme_and_domain(allowed_domain)
51
- if scheme == allowed_scheme and domain == allowed_domain:
50
+ allowed_scheme, allowed_domain_ = _extract_scheme_and_domain(allowed_domain)
51
+ if scheme == allowed_scheme and domain == allowed_domain_:
52
52
  return True
53
53
  return False
54
54
 
@@ -61,7 +61,7 @@ try:
61
61
  message=(
62
62
  "This class is deprecated and will be removed in langchain 1.0. "
63
63
  "See API reference for replacement: "
64
- "https://api.python.langchain.com/en/latest/chains/langchain.chains.api.base.APIChain.html" # noqa: E501
64
+ "https://api.python.langchain.com/en/latest/chains/langchain.chains.api.base.APIChain.html"
65
65
  ),
66
66
  removal="1.0",
67
67
  )
@@ -201,10 +201,10 @@ try:
201
201
  output_key: str = "output" #: :meta private:
202
202
  limit_to_domains: Optional[Sequence[str]] = Field(default_factory=list) # type: ignore[arg-type]
203
203
  """Use to limit the domains that can be accessed by the API chain.
204
-
204
+
205
205
  * For example, to limit to just the domain `https://www.example.com`, set
206
206
  `limit_to_domains=["https://www.example.com"]`.
207
-
207
+
208
208
  * The default value is an empty tuple, which means that no domains are
209
209
  allowed by default. By design this will raise an error on instantiation.
210
210
  * Use a None if you want to allow all domains by default -- this is not
@@ -235,9 +235,8 @@ try:
235
235
  input_vars = self.api_request_chain.prompt.input_variables
236
236
  expected_vars = {"question", "api_docs"}
237
237
  if set(input_vars) != expected_vars:
238
- raise ValueError(
239
- f"Input variables should be {expected_vars}, got {input_vars}"
240
- )
238
+ msg = f"Input variables should be {expected_vars}, got {input_vars}"
239
+ raise ValueError(msg)
241
240
  return self
242
241
 
243
242
  @model_validator(mode="before")
@@ -247,18 +246,20 @@ try:
247
246
  # This check must be a pre=True check, so that a default of None
248
247
  # won't be set to limit_to_domains if it's not provided.
249
248
  if "limit_to_domains" not in values:
250
- raise ValueError(
249
+ msg = (
251
250
  "You must specify a list of domains to limit access using "
252
251
  "`limit_to_domains`"
253
252
  )
253
+ raise ValueError(msg)
254
254
  if (
255
255
  not values["limit_to_domains"]
256
256
  and values["limit_to_domains"] is not None
257
257
  ):
258
- raise ValueError(
258
+ msg = (
259
259
  "Please provide a list of domains to limit access using "
260
260
  "`limit_to_domains`."
261
261
  )
262
+ raise ValueError(msg)
262
263
  return values
263
264
 
264
265
  @model_validator(mode="after")
@@ -267,9 +268,8 @@ try:
267
268
  input_vars = self.api_answer_chain.prompt.input_variables
268
269
  expected_vars = {"question", "api_docs", "api_url", "api_response"}
269
270
  if set(input_vars) != expected_vars:
270
- raise ValueError(
271
- f"Input variables should be {expected_vars}, got {input_vars}"
272
- )
271
+ msg = f"Input variables should be {expected_vars}, got {input_vars}"
272
+ raise ValueError(msg)
273
273
  return self
274
274
 
275
275
  def _call(
@@ -287,14 +287,19 @@ try:
287
287
  _run_manager.on_text(api_url, color="green", end="\n", verbose=self.verbose)
288
288
  api_url = api_url.strip()
289
289
  if self.limit_to_domains and not _check_in_allowed_domain(
290
- api_url, self.limit_to_domains
290
+ api_url,
291
+ self.limit_to_domains,
291
292
  ):
292
- raise ValueError(
293
+ msg = (
293
294
  f"{api_url} is not in the allowed domains: {self.limit_to_domains}"
294
295
  )
296
+ raise ValueError(msg)
295
297
  api_response = self.requests_wrapper.get(api_url)
296
298
  _run_manager.on_text(
297
- str(api_response), color="yellow", end="\n", verbose=self.verbose
299
+ str(api_response),
300
+ color="yellow",
301
+ end="\n",
302
+ verbose=self.verbose,
298
303
  )
299
304
  answer = self.api_answer_chain.predict(
300
305
  question=question,
@@ -320,18 +325,26 @@ try:
320
325
  callbacks=_run_manager.get_child(),
321
326
  )
322
327
  await _run_manager.on_text(
323
- api_url, color="green", end="\n", verbose=self.verbose
328
+ api_url,
329
+ color="green",
330
+ end="\n",
331
+ verbose=self.verbose,
324
332
  )
325
333
  api_url = api_url.strip()
326
334
  if self.limit_to_domains and not _check_in_allowed_domain(
327
- api_url, self.limit_to_domains
335
+ api_url,
336
+ self.limit_to_domains,
328
337
  ):
329
- raise ValueError(
338
+ msg = (
330
339
  f"{api_url} is not in the allowed domains: {self.limit_to_domains}"
331
340
  )
341
+ raise ValueError(msg)
332
342
  api_response = await self.requests_wrapper.aget(api_url)
333
343
  await _run_manager.on_text(
334
- str(api_response), color="yellow", end="\n", verbose=self.verbose
344
+ str(api_response),
345
+ color="yellow",
346
+ end="\n",
347
+ verbose=self.verbose,
335
348
  )
336
349
  answer = await self.api_answer_chain.apredict(
337
350
  question=question,
@@ -350,7 +363,7 @@ try:
350
363
  headers: Optional[dict] = None,
351
364
  api_url_prompt: BasePromptTemplate = API_URL_PROMPT,
352
365
  api_response_prompt: BasePromptTemplate = API_RESPONSE_PROMPT,
353
- limit_to_domains: Optional[Sequence[str]] = tuple(),
366
+ limit_to_domains: Optional[Sequence[str]] = (),
354
367
  **kwargs: Any,
355
368
  ) -> APIChain:
356
369
  """Load chain from just an LLM and the api docs."""
@@ -374,7 +387,8 @@ except ImportError:
374
387
 
375
388
  class APIChain: # type: ignore[no-redef]
376
389
  def __init__(self, *args: Any, **kwargs: Any) -> None:
377
- raise ImportError(
390
+ msg = (
378
391
  "To use the APIChain, you must install the langchain_community package."
379
392
  "pip install langchain_community"
380
393
  )
394
+ raise ImportError(msg)
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  NEWS_DOCS = """API documentation:
3
2
  Endpoint: https://newsapi.org
4
3
  Top headlines /v2/top-headlines
@@ -29,4 +28,4 @@ Response object
29
28
  content | string | The unformatted content of the article, where available. This is truncated to 200 chars.
30
29
 
31
30
  Use page size: 2
32
- """
31
+ """ # noqa: E501
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  OPEN_METEO_DOCS = """BASE URL: https://api.open-meteo.com/
3
2
 
4
3
  API Documentation
@@ -30,4 +29,4 @@ showers Preceding hour sum mm (inch) Showers from convective precipitation in mi
30
29
  weathercode Instant WMO code Weather condition as a numeric code. Follow WMO weather interpretation codes. See table below for details.
31
30
  snow_depth Instant meters Snow depth on the ground
32
31
  freezinglevel_height Instant meters Altitude above sea level of the 0°C level
33
- visibility Instant meters Viewing distance in meters. Influenced by low clouds, humidity and aerosols. Maximum visibility is approximately 24 km."""
32
+ visibility Instant meters Viewing distance in meters. Influenced by low clouds, humidity and aerosols. Maximum visibility is approximately 24 km.""" # noqa: E501
@@ -26,4 +26,4 @@ def __getattr__(name: str) -> Any:
26
26
  return _import_attribute(name)
27
27
 
28
28
 
29
- __all__ = ["APIRequesterChain", "APIRequesterOutputParser", "REQUEST_TEMPLATE"]
29
+ __all__ = ["REQUEST_TEMPLATE", "APIRequesterChain", "APIRequesterOutputParser"]
@@ -26,4 +26,4 @@ def __getattr__(name: str) -> Any:
26
26
  return _import_attribute(name)
27
27
 
28
28
 
29
- __all__ = ["APIResponderChain", "APIResponderOutputParser", "RESPONSE_TEMPLATE"]
29
+ __all__ = ["RESPONSE_TEMPLATE", "APIResponderChain", "APIResponderOutputParser"]
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  PODCAST_DOCS = """API documentation:
3
2
  Endpoint: https://listen-api.listennotes.com/api/v2
4
3
  GET /search
@@ -25,4 +24,4 @@ id | integer | optional
25
24
  title_highlighted | string | optional
26
25
 
27
26
  Use page_size: 3
28
- """
27
+ """ # noqa: E501
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  API_URL_PROMPT_TEMPLATE = """You are given the below API Documentation:
@@ -7,7 +6,7 @@ Using this documentation, generate the full API url to call for answering the us
7
6
  You should build the API url in order to get a response that is as short as possible, while still getting the necessary information to answer the question. Pay attention to deliberately exclude any unnecessary pieces of data in the API call.
8
7
 
9
8
  Question:{question}
10
- API url:"""
9
+ API url:""" # noqa: E501
11
10
 
12
11
  API_URL_PROMPT = PromptTemplate(
13
12
  input_variables=[
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  TMDB_DOCS = """API documentation:
3
2
  Endpoint: https://api.themoviedb.org/3
4
3
  GET /search/movie
@@ -34,4 +33,4 @@ backdrop_path | string or null | optional
34
33
  popularity | number | optional
35
34
  vote_count | integer | optional
36
35
  video | boolean | optional
37
- vote_average | number | optional"""
36
+ vote_average | number | optional""" # noqa: E501
langchain/chains/base.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """Base interface that all chains should implement."""
2
2
 
3
3
  import builtins
4
+ import contextlib
4
5
  import inspect
5
6
  import json
6
7
  import logging
@@ -27,7 +28,7 @@ from langchain_core.runnables import (
27
28
  ensure_config,
28
29
  run_in_executor,
29
30
  )
30
- from langchain_core.runnables.utils import create_model
31
+ from langchain_core.utils.pydantic import create_model
31
32
  from pydantic import (
32
33
  BaseModel,
33
34
  ConfigDict,
@@ -35,6 +36,7 @@ from pydantic import (
35
36
  field_validator,
36
37
  model_validator,
37
38
  )
39
+ from typing_extensions import override
38
40
 
39
41
  from langchain.schema import RUN_KEY
40
42
 
@@ -107,17 +109,23 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
107
109
  )
108
110
 
109
111
  def get_input_schema(
110
- self, config: Optional[RunnableConfig] = None
112
+ self,
113
+ config: Optional[RunnableConfig] = None,
111
114
  ) -> type[BaseModel]:
112
115
  # This is correct, but pydantic typings/mypy don't think so.
113
- return create_model("ChainInput", **{k: (Any, None) for k in self.input_keys})
116
+ return create_model("ChainInput", **dict.fromkeys(self.input_keys, (Any, None)))
114
117
 
115
118
  def get_output_schema(
116
- self, config: Optional[RunnableConfig] = None
119
+ self,
120
+ config: Optional[RunnableConfig] = None,
117
121
  ) -> type[BaseModel]:
118
122
  # This is correct, but pydantic typings/mypy don't think so.
119
- return create_model("ChainOutput", **{k: (Any, None) for k in self.output_keys})
123
+ return create_model(
124
+ "ChainOutput",
125
+ **dict.fromkeys(self.output_keys, (Any, None)),
126
+ )
120
127
 
128
+ @override
121
129
  def invoke(
122
130
  self,
123
131
  input: dict[str, Any],
@@ -160,17 +168,20 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
160
168
  )
161
169
 
162
170
  final_outputs: dict[str, Any] = self.prep_outputs(
163
- inputs, outputs, return_only_outputs
171
+ inputs,
172
+ outputs,
173
+ return_only_outputs,
164
174
  )
165
175
  except BaseException as e:
166
176
  run_manager.on_chain_error(e)
167
- raise e
177
+ raise
168
178
  run_manager.on_chain_end(outputs)
169
179
 
170
180
  if include_run_info:
171
181
  final_outputs[RUN_KEY] = RunInfo(run_id=run_manager.run_id)
172
182
  return final_outputs
173
183
 
184
+ @override
174
185
  async def ainvoke(
175
186
  self,
176
187
  input: dict[str, Any],
@@ -211,11 +222,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
211
222
  else await self._acall(inputs)
212
223
  )
213
224
  final_outputs: dict[str, Any] = await self.aprep_outputs(
214
- inputs, outputs, return_only_outputs
225
+ inputs,
226
+ outputs,
227
+ return_only_outputs,
215
228
  )
216
229
  except BaseException as e:
217
230
  await run_manager.on_chain_error(e)
218
- raise e
231
+ raise
219
232
  await run_manager.on_chain_end(outputs)
220
233
 
221
234
  if include_run_info:
@@ -224,7 +237,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
224
237
 
225
238
  @property
226
239
  def _chain_type(self) -> str:
227
- raise NotImplementedError("Saving not supported for this chain type.")
240
+ msg = "Saving not supported for this chain type."
241
+ raise NotImplementedError(msg)
228
242
 
229
243
  @model_validator(mode="before")
230
244
  @classmethod
@@ -232,29 +246,33 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
232
246
  """Raise deprecation warning if callback_manager is used."""
233
247
  if values.get("callback_manager") is not None:
234
248
  if values.get("callbacks") is not None:
235
- raise ValueError(
249
+ msg = (
236
250
  "Cannot specify both callback_manager and callbacks. "
237
251
  "callback_manager is deprecated, callbacks is the preferred "
238
252
  "parameter to pass in."
239
253
  )
254
+ raise ValueError(msg)
240
255
  warnings.warn(
241
256
  "callback_manager is deprecated. Please use callbacks instead.",
242
257
  DeprecationWarning,
258
+ stacklevel=4,
243
259
  )
244
260
  values["callbacks"] = values.pop("callback_manager", None)
245
261
  return values
246
262
 
247
263
  @field_validator("verbose", mode="before")
248
264
  @classmethod
249
- def set_verbose(cls, verbose: Optional[bool]) -> bool:
265
+ def set_verbose(
266
+ cls,
267
+ verbose: Optional[bool], # noqa: FBT001
268
+ ) -> bool:
250
269
  """Set the chain verbosity.
251
270
 
252
271
  Defaults to the global setting if not specified by the user.
253
272
  """
254
273
  if verbose is None:
255
274
  return _get_verbosity()
256
- else:
257
- return verbose
275
+ return verbose
258
276
 
259
277
  @property
260
278
  @abstractmethod
@@ -275,21 +293,24 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
275
293
  # only one is not set, we can still figure out which key it is.
276
294
  _input_keys = _input_keys.difference(self.memory.memory_variables)
277
295
  if len(_input_keys) != 1:
278
- raise ValueError(
296
+ msg = (
279
297
  f"A single string input was passed in, but this chain expects "
280
298
  f"multiple inputs ({_input_keys}). When a chain expects "
281
299
  f"multiple inputs, please call it by passing in a dictionary, "
282
300
  "eg `chain({'foo': 1, 'bar': 2})`"
283
301
  )
302
+ raise ValueError(msg)
284
303
 
285
304
  missing_keys = set(self.input_keys).difference(inputs)
286
305
  if missing_keys:
287
- raise ValueError(f"Missing some input keys: {missing_keys}")
306
+ msg = f"Missing some input keys: {missing_keys}"
307
+ raise ValueError(msg)
288
308
 
289
309
  def _validate_outputs(self, outputs: dict[str, Any]) -> None:
290
310
  missing_keys = set(self.output_keys).difference(outputs)
291
311
  if missing_keys:
292
- raise ValueError(f"Missing some output keys: {missing_keys}")
312
+ msg = f"Missing some output keys: {missing_keys}"
313
+ raise ValueError(msg)
293
314
 
294
315
  @abstractmethod
295
316
  def _call(
@@ -336,14 +357,17 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
336
357
  `Chain.output_keys`.
337
358
  """
338
359
  return await run_in_executor(
339
- None, self._call, inputs, run_manager.get_sync() if run_manager else None
360
+ None,
361
+ self._call,
362
+ inputs,
363
+ run_manager.get_sync() if run_manager else None,
340
364
  )
341
365
 
342
366
  @deprecated("0.1.0", alternative="invoke", removal="1.0")
343
367
  def __call__(
344
368
  self,
345
369
  inputs: Union[dict[str, Any], Any],
346
- return_only_outputs: bool = False,
370
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
347
371
  callbacks: Callbacks = None,
348
372
  *,
349
373
  tags: Optional[list[str]] = None,
@@ -394,7 +418,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
394
418
  async def acall(
395
419
  self,
396
420
  inputs: Union[dict[str, Any], Any],
397
- return_only_outputs: bool = False,
421
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
398
422
  callbacks: Callbacks = None,
399
423
  *,
400
424
  tags: Optional[list[str]] = None,
@@ -444,7 +468,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
444
468
  self,
445
469
  inputs: dict[str, str],
446
470
  outputs: dict[str, str],
447
- return_only_outputs: bool = False,
471
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
448
472
  ) -> dict[str, str]:
449
473
  """Validate and prepare chain outputs, and save info about this run to memory.
450
474
 
@@ -463,14 +487,13 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
463
487
  self.memory.save_context(inputs, outputs)
464
488
  if return_only_outputs:
465
489
  return outputs
466
- else:
467
- return {**inputs, **outputs}
490
+ return {**inputs, **outputs}
468
491
 
469
492
  async def aprep_outputs(
470
493
  self,
471
494
  inputs: dict[str, str],
472
495
  outputs: dict[str, str],
473
- return_only_outputs: bool = False,
496
+ return_only_outputs: bool = False, # noqa: FBT001,FBT002
474
497
  ) -> dict[str, str]:
475
498
  """Validate and prepare chain outputs, and save info about this run to memory.
476
499
 
@@ -489,8 +512,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
489
512
  await self.memory.asave_context(inputs, outputs)
490
513
  if return_only_outputs:
491
514
  return outputs
492
- else:
493
- return {**inputs, **outputs}
515
+ return {**inputs, **outputs}
494
516
 
495
517
  def prep_inputs(self, inputs: Union[dict[str, Any], Any]) -> dict[str, str]:
496
518
  """Prepare chain inputs, including adding inputs from memory.
@@ -510,7 +532,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
510
532
  # If there are multiple input keys, but some get set by memory so that
511
533
  # only one is not set, we can still figure out which key it is.
512
534
  _input_keys = _input_keys.difference(self.memory.memory_variables)
513
- inputs = {list(_input_keys)[0]: inputs}
535
+ inputs = {next(iter(_input_keys)): inputs}
514
536
  if self.memory is not None:
515
537
  external_context = self.memory.load_memory_variables(inputs)
516
538
  inputs = dict(inputs, **external_context)
@@ -534,7 +556,7 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
534
556
  # If there are multiple input keys, but some get set by memory so that
535
557
  # only one is not set, we can still figure out which key it is.
536
558
  _input_keys = _input_keys.difference(self.memory.memory_variables)
537
- inputs = {list(_input_keys)[0]: inputs}
559
+ inputs = {next(iter(_input_keys)): inputs}
538
560
  if self.memory is not None:
539
561
  external_context = await self.memory.aload_memory_variables(inputs)
540
562
  inputs = dict(inputs, **external_context)
@@ -543,10 +565,11 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
543
565
  @property
544
566
  def _run_output_key(self) -> str:
545
567
  if len(self.output_keys) != 1:
546
- raise ValueError(
568
+ msg = (
547
569
  f"`run` not supported when there is not exactly "
548
570
  f"one output key. Got {self.output_keys}."
549
571
  )
572
+ raise ValueError(msg)
550
573
  return self.output_keys[0]
551
574
 
552
575
  @deprecated("0.1.0", alternative="invoke", removal="1.0")
@@ -599,7 +622,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
599
622
 
600
623
  if args and not kwargs:
601
624
  if len(args) != 1:
602
- raise ValueError("`run` supports only one positional argument.")
625
+ msg = "`run` supports only one positional argument."
626
+ raise ValueError(msg)
603
627
  return self(args[0], callbacks=callbacks, tags=tags, metadata=metadata)[
604
628
  _output_key
605
629
  ]
@@ -610,15 +634,16 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
610
634
  ]
611
635
 
612
636
  if not kwargs and not args:
613
- raise ValueError(
637
+ msg = (
614
638
  "`run` supported with either positional arguments or keyword arguments,"
615
639
  " but none were provided."
616
640
  )
617
- else:
618
- raise ValueError(
619
- f"`run` supported with either positional arguments or keyword arguments"
620
- f" but not both. Got args: {args} and kwargs: {kwargs}."
621
- )
641
+ raise ValueError(msg)
642
+ msg = (
643
+ f"`run` supported with either positional arguments or keyword arguments"
644
+ f" but not both. Got args: {args} and kwargs: {kwargs}."
645
+ )
646
+ raise ValueError(msg)
622
647
 
623
648
  @deprecated("0.1.0", alternative="ainvoke", removal="1.0")
624
649
  async def arun(
@@ -667,30 +692,39 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
667
692
  # -> "The temperature in Boise is..."
668
693
  """
669
694
  if len(self.output_keys) != 1:
670
- raise ValueError(
695
+ msg = (
671
696
  f"`run` not supported when there is not exactly "
672
697
  f"one output key. Got {self.output_keys}."
673
698
  )
674
- elif args and not kwargs:
699
+ raise ValueError(msg)
700
+ if args and not kwargs:
675
701
  if len(args) != 1:
676
- raise ValueError("`run` supports only one positional argument.")
702
+ msg = "`run` supports only one positional argument."
703
+ raise ValueError(msg)
677
704
  return (
678
705
  await self.acall(
679
- args[0], callbacks=callbacks, tags=tags, metadata=metadata
706
+ args[0],
707
+ callbacks=callbacks,
708
+ tags=tags,
709
+ metadata=metadata,
680
710
  )
681
711
  )[self.output_keys[0]]
682
712
 
683
713
  if kwargs and not args:
684
714
  return (
685
715
  await self.acall(
686
- kwargs, callbacks=callbacks, tags=tags, metadata=metadata
716
+ kwargs,
717
+ callbacks=callbacks,
718
+ tags=tags,
719
+ metadata=metadata,
687
720
  )
688
721
  )[self.output_keys[0]]
689
722
 
690
- raise ValueError(
723
+ msg = (
691
724
  f"`run` supported with either positional arguments or keyword arguments"
692
725
  f" but not both. Got args: {args} and kwargs: {kwargs}."
693
726
  )
727
+ raise ValueError(msg)
694
728
 
695
729
  def dict(self, **kwargs: Any) -> dict:
696
730
  """Dictionary representation of chain.
@@ -712,10 +746,8 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
712
746
  # -> {"_type": "foo", "verbose": False, ...}
713
747
  """
714
748
  _dict = super().dict(**kwargs)
715
- try:
749
+ with contextlib.suppress(NotImplementedError):
716
750
  _dict["_type"] = self._chain_type
717
- except NotImplementedError:
718
- pass
719
751
  return _dict
720
752
 
721
753
  def save(self, file_path: Union[Path, str]) -> None:
@@ -733,34 +765,36 @@ class Chain(RunnableSerializable[dict[str, Any], dict[str, Any]], ABC):
733
765
  chain.save(file_path="path/chain.yaml")
734
766
  """
735
767
  if self.memory is not None:
736
- raise ValueError("Saving of memory is not yet supported.")
768
+ msg = "Saving of memory is not yet supported."
769
+ raise ValueError(msg)
737
770
 
738
771
  # Fetch dictionary to save
739
772
  chain_dict = self.dict()
740
773
  if "_type" not in chain_dict:
741
- raise NotImplementedError(f"Chain {self} does not support saving.")
774
+ msg = f"Chain {self} does not support saving."
775
+ raise NotImplementedError(msg)
742
776
 
743
777
  # Convert file to Path object.
744
- if isinstance(file_path, str):
745
- save_path = Path(file_path)
746
- else:
747
- save_path = file_path
778
+ save_path = Path(file_path) if isinstance(file_path, str) else file_path
748
779
 
749
780
  directory_path = save_path.parent
750
781
  directory_path.mkdir(parents=True, exist_ok=True)
751
782
 
752
783
  if save_path.suffix == ".json":
753
- with open(file_path, "w") as f:
784
+ with save_path.open("w") as f:
754
785
  json.dump(chain_dict, f, indent=4)
755
786
  elif save_path.suffix.endswith((".yaml", ".yml")):
756
- with open(file_path, "w") as f:
787
+ with save_path.open("w") as f:
757
788
  yaml.dump(chain_dict, f, default_flow_style=False)
758
789
  else:
759
- raise ValueError(f"{save_path} must be json or yaml")
790
+ msg = f"{save_path} must be json or yaml"
791
+ raise ValueError(msg)
760
792
 
761
793
  @deprecated("0.1.0", alternative="batch", removal="1.0")
762
794
  def apply(
763
- self, input_list: list[builtins.dict[str, Any]], callbacks: Callbacks = None
795
+ self,
796
+ input_list: list[builtins.dict[str, Any]],
797
+ callbacks: Callbacks = None,
764
798
  ) -> list[builtins.dict[str, str]]:
765
799
  """Call the chain on all inputs in the list."""
766
800
  return [self(inputs, callbacks=callbacks) for inputs in input_list]
@@ -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.
@@ -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
  )
@@ -10,6 +10,6 @@ from langchain.chains.combine_documents.stuff import create_stuff_documents_chai
10
10
  __all__ = [
11
11
  "acollapse_docs",
12
12
  "collapse_docs",
13
- "split_list_of_docs",
14
13
  "create_stuff_documents_chain",
14
+ "split_list_of_docs",
15
15
  ]