langchain 0.3.26__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 (580) 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 +6 -6
  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 +16 -8
  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 +46 -37
  72. langchain/agents/openai_functions_multi_agent/base.py +39 -26
  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 +6 -6
  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 +5 -5
  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/comet.py +1 -1
  128. langchain/callbacks/tracers/evaluation.py +1 -1
  129. langchain/callbacks/tracers/log_stream.py +1 -1
  130. langchain/callbacks/tracers/logging.py +1 -1
  131. langchain/callbacks/tracers/stdout.py +1 -1
  132. langchain/callbacks/trubrics_callback.py +1 -1
  133. langchain/callbacks/utils.py +4 -4
  134. langchain/callbacks/wandb_callback.py +1 -1
  135. langchain/callbacks/whylabs_callback.py +1 -1
  136. langchain/chains/api/base.py +36 -22
  137. langchain/chains/api/news_docs.py +1 -2
  138. langchain/chains/api/open_meteo_docs.py +1 -2
  139. langchain/chains/api/openapi/requests_chain.py +1 -1
  140. langchain/chains/api/openapi/response_chain.py +1 -1
  141. langchain/chains/api/podcast_docs.py +1 -2
  142. langchain/chains/api/prompt.py +1 -2
  143. langchain/chains/api/tmdb_docs.py +1 -2
  144. langchain/chains/base.py +88 -54
  145. langchain/chains/chat_vector_db/prompts.py +2 -3
  146. langchain/chains/combine_documents/__init__.py +1 -1
  147. langchain/chains/combine_documents/base.py +23 -10
  148. langchain/chains/combine_documents/map_reduce.py +38 -30
  149. langchain/chains/combine_documents/map_rerank.py +33 -20
  150. langchain/chains/combine_documents/reduce.py +47 -26
  151. langchain/chains/combine_documents/refine.py +26 -17
  152. langchain/chains/combine_documents/stuff.py +19 -12
  153. langchain/chains/constitutional_ai/base.py +4 -4
  154. langchain/chains/constitutional_ai/principles.py +22 -25
  155. langchain/chains/constitutional_ai/prompts.py +25 -28
  156. langchain/chains/conversation/base.py +5 -3
  157. langchain/chains/conversation/memory.py +5 -5
  158. langchain/chains/conversation/prompt.py +5 -5
  159. langchain/chains/conversational_retrieval/base.py +41 -20
  160. langchain/chains/conversational_retrieval/prompts.py +2 -3
  161. langchain/chains/elasticsearch_database/base.py +8 -9
  162. langchain/chains/elasticsearch_database/prompts.py +2 -3
  163. langchain/chains/ernie_functions/__init__.py +2 -2
  164. langchain/chains/example_generator.py +3 -1
  165. langchain/chains/flare/base.py +26 -12
  166. langchain/chains/graph_qa/cypher.py +2 -2
  167. langchain/chains/graph_qa/falkordb.py +1 -1
  168. langchain/chains/graph_qa/gremlin.py +1 -1
  169. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  170. langchain/chains/graph_qa/prompts.py +2 -2
  171. langchain/chains/history_aware_retriever.py +2 -1
  172. langchain/chains/hyde/base.py +6 -5
  173. langchain/chains/hyde/prompts.py +5 -6
  174. langchain/chains/llm.py +77 -61
  175. langchain/chains/llm_bash/__init__.py +2 -1
  176. langchain/chains/llm_checker/base.py +7 -5
  177. langchain/chains/llm_checker/prompt.py +3 -4
  178. langchain/chains/llm_math/base.py +16 -9
  179. langchain/chains/llm_math/prompt.py +1 -2
  180. langchain/chains/llm_summarization_checker/base.py +9 -6
  181. langchain/chains/llm_symbolic_math/__init__.py +2 -1
  182. langchain/chains/loading.py +151 -95
  183. langchain/chains/mapreduce.py +4 -3
  184. langchain/chains/moderation.py +8 -9
  185. langchain/chains/natbot/base.py +8 -8
  186. langchain/chains/natbot/crawler.py +73 -76
  187. langchain/chains/natbot/prompt.py +2 -3
  188. langchain/chains/openai_functions/__init__.py +7 -7
  189. langchain/chains/openai_functions/base.py +13 -10
  190. langchain/chains/openai_functions/citation_fuzzy_match.py +12 -11
  191. langchain/chains/openai_functions/extraction.py +19 -19
  192. langchain/chains/openai_functions/openapi.py +35 -35
  193. langchain/chains/openai_functions/qa_with_structure.py +19 -12
  194. langchain/chains/openai_functions/tagging.py +2 -4
  195. langchain/chains/openai_tools/extraction.py +7 -8
  196. langchain/chains/qa_generation/base.py +4 -3
  197. langchain/chains/qa_generation/prompt.py +5 -5
  198. langchain/chains/qa_with_sources/base.py +14 -6
  199. langchain/chains/qa_with_sources/loading.py +16 -8
  200. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  201. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  202. langchain/chains/qa_with_sources/retrieval.py +14 -5
  203. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  204. langchain/chains/qa_with_sources/vector_db.py +17 -6
  205. langchain/chains/query_constructor/base.py +34 -33
  206. langchain/chains/query_constructor/ir.py +4 -4
  207. langchain/chains/query_constructor/parser.py +37 -32
  208. langchain/chains/query_constructor/prompt.py +5 -6
  209. langchain/chains/question_answering/chain.py +21 -10
  210. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  211. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  212. langchain/chains/question_answering/refine_prompts.py +2 -5
  213. langchain/chains/question_answering/stuff_prompt.py +5 -5
  214. langchain/chains/retrieval.py +1 -3
  215. langchain/chains/retrieval_qa/base.py +34 -27
  216. langchain/chains/retrieval_qa/prompt.py +1 -2
  217. langchain/chains/router/__init__.py +3 -3
  218. langchain/chains/router/base.py +24 -20
  219. langchain/chains/router/embedding_router.py +12 -8
  220. langchain/chains/router/llm_router.py +17 -16
  221. langchain/chains/router/multi_prompt.py +2 -2
  222. langchain/chains/router/multi_retrieval_qa.py +10 -5
  223. langchain/chains/sequential.py +30 -18
  224. langchain/chains/sql_database/prompt.py +14 -16
  225. langchain/chains/sql_database/query.py +6 -5
  226. langchain/chains/structured_output/__init__.py +1 -1
  227. langchain/chains/structured_output/base.py +75 -67
  228. langchain/chains/summarize/chain.py +11 -5
  229. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  230. langchain/chains/summarize/stuff_prompt.py +0 -1
  231. langchain/chains/transform.py +5 -6
  232. langchain/chat_loaders/facebook_messenger.py +1 -1
  233. langchain/chat_loaders/langsmith.py +1 -1
  234. langchain/chat_loaders/utils.py +3 -3
  235. langchain/chat_models/__init__.py +20 -19
  236. langchain/chat_models/anthropic.py +1 -1
  237. langchain/chat_models/azureml_endpoint.py +1 -1
  238. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  239. langchain/chat_models/base.py +160 -123
  240. langchain/chat_models/bedrock.py +1 -1
  241. langchain/chat_models/fake.py +1 -1
  242. langchain/chat_models/meta.py +1 -1
  243. langchain/chat_models/pai_eas_endpoint.py +1 -1
  244. langchain/chat_models/promptlayer_openai.py +1 -1
  245. langchain/chat_models/volcengine_maas.py +1 -1
  246. langchain/docstore/base.py +1 -1
  247. langchain/document_loaders/__init__.py +9 -9
  248. langchain/document_loaders/airbyte.py +3 -3
  249. langchain/document_loaders/assemblyai.py +1 -1
  250. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  251. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  252. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  253. langchain/document_loaders/base.py +1 -1
  254. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  255. langchain/document_loaders/blockchain.py +1 -1
  256. langchain/document_loaders/chatgpt.py +1 -1
  257. langchain/document_loaders/college_confidential.py +1 -1
  258. langchain/document_loaders/confluence.py +1 -1
  259. langchain/document_loaders/email.py +1 -1
  260. langchain/document_loaders/facebook_chat.py +1 -1
  261. langchain/document_loaders/markdown.py +1 -1
  262. langchain/document_loaders/notebook.py +1 -1
  263. langchain/document_loaders/org_mode.py +1 -1
  264. langchain/document_loaders/parsers/__init__.py +1 -1
  265. langchain/document_loaders/parsers/docai.py +1 -1
  266. langchain/document_loaders/parsers/generic.py +1 -1
  267. langchain/document_loaders/parsers/html/__init__.py +1 -1
  268. langchain/document_loaders/parsers/html/bs4.py +1 -1
  269. langchain/document_loaders/parsers/language/cobol.py +1 -1
  270. langchain/document_loaders/parsers/language/python.py +1 -1
  271. langchain/document_loaders/parsers/msword.py +1 -1
  272. langchain/document_loaders/parsers/pdf.py +5 -5
  273. langchain/document_loaders/parsers/registry.py +1 -1
  274. langchain/document_loaders/pdf.py +8 -8
  275. langchain/document_loaders/powerpoint.py +1 -1
  276. langchain/document_loaders/pyspark_dataframe.py +1 -1
  277. langchain/document_loaders/telegram.py +2 -2
  278. langchain/document_loaders/tencent_cos_directory.py +1 -1
  279. langchain/document_loaders/unstructured.py +5 -5
  280. langchain/document_loaders/url_playwright.py +1 -1
  281. langchain/document_loaders/whatsapp_chat.py +1 -1
  282. langchain/document_loaders/youtube.py +2 -2
  283. langchain/document_transformers/__init__.py +3 -3
  284. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  285. langchain/document_transformers/doctran_text_extract.py +1 -1
  286. langchain/document_transformers/doctran_text_qa.py +1 -1
  287. langchain/document_transformers/doctran_text_translate.py +1 -1
  288. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  289. langchain/document_transformers/google_translate.py +1 -1
  290. langchain/document_transformers/html2text.py +1 -1
  291. langchain/document_transformers/nuclia_text_transform.py +1 -1
  292. langchain/embeddings/__init__.py +5 -5
  293. langchain/embeddings/base.py +33 -24
  294. langchain/embeddings/cache.py +36 -31
  295. langchain/embeddings/fake.py +1 -1
  296. langchain/embeddings/huggingface.py +2 -2
  297. langchain/evaluation/__init__.py +22 -22
  298. langchain/evaluation/agents/trajectory_eval_chain.py +23 -23
  299. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  300. langchain/evaluation/comparison/__init__.py +1 -1
  301. langchain/evaluation/comparison/eval_chain.py +20 -13
  302. langchain/evaluation/comparison/prompt.py +1 -2
  303. langchain/evaluation/criteria/__init__.py +1 -1
  304. langchain/evaluation/criteria/eval_chain.py +20 -11
  305. langchain/evaluation/criteria/prompt.py +2 -3
  306. langchain/evaluation/embedding_distance/base.py +23 -20
  307. langchain/evaluation/loading.py +15 -11
  308. langchain/evaluation/parsing/base.py +4 -1
  309. langchain/evaluation/parsing/json_distance.py +5 -2
  310. langchain/evaluation/parsing/json_schema.py +12 -8
  311. langchain/evaluation/qa/__init__.py +1 -1
  312. langchain/evaluation/qa/eval_chain.py +12 -5
  313. langchain/evaluation/qa/eval_prompt.py +7 -8
  314. langchain/evaluation/qa/generate_chain.py +2 -1
  315. langchain/evaluation/qa/generate_prompt.py +2 -4
  316. langchain/evaluation/schema.py +38 -30
  317. langchain/evaluation/scoring/__init__.py +1 -1
  318. langchain/evaluation/scoring/eval_chain.py +22 -15
  319. langchain/evaluation/scoring/prompt.py +0 -1
  320. langchain/evaluation/string_distance/base.py +14 -9
  321. langchain/globals.py +12 -11
  322. langchain/graphs/__init__.py +6 -6
  323. langchain/graphs/graph_document.py +1 -1
  324. langchain/graphs/networkx_graph.py +2 -2
  325. langchain/hub.py +9 -11
  326. langchain/indexes/__init__.py +3 -3
  327. langchain/indexes/_sql_record_manager.py +63 -46
  328. langchain/indexes/prompts/entity_extraction.py +1 -2
  329. langchain/indexes/prompts/entity_summarization.py +1 -2
  330. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  331. langchain/indexes/vectorstore.py +35 -19
  332. langchain/llms/__init__.py +13 -13
  333. langchain/llms/ai21.py +1 -1
  334. langchain/llms/azureml_endpoint.py +4 -4
  335. langchain/llms/base.py +15 -7
  336. langchain/llms/bedrock.py +1 -1
  337. langchain/llms/cloudflare_workersai.py +1 -1
  338. langchain/llms/gradient_ai.py +1 -1
  339. langchain/llms/loading.py +1 -1
  340. langchain/llms/openai.py +1 -1
  341. langchain/llms/sagemaker_endpoint.py +1 -1
  342. langchain/load/dump.py +1 -1
  343. langchain/load/load.py +1 -1
  344. langchain/load/serializable.py +3 -3
  345. langchain/memory/__init__.py +3 -3
  346. langchain/memory/buffer.py +9 -7
  347. langchain/memory/chat_memory.py +14 -8
  348. langchain/memory/chat_message_histories/__init__.py +1 -1
  349. langchain/memory/chat_message_histories/astradb.py +1 -1
  350. langchain/memory/chat_message_histories/cassandra.py +1 -1
  351. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  352. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  353. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  354. langchain/memory/chat_message_histories/file.py +1 -1
  355. langchain/memory/chat_message_histories/firestore.py +1 -1
  356. langchain/memory/chat_message_histories/momento.py +1 -1
  357. langchain/memory/chat_message_histories/mongodb.py +1 -1
  358. langchain/memory/chat_message_histories/neo4j.py +1 -1
  359. langchain/memory/chat_message_histories/postgres.py +1 -1
  360. langchain/memory/chat_message_histories/redis.py +1 -1
  361. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  362. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  363. langchain/memory/chat_message_histories/streamlit.py +1 -1
  364. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  365. langchain/memory/chat_message_histories/xata.py +1 -1
  366. langchain/memory/chat_message_histories/zep.py +1 -1
  367. langchain/memory/combined.py +13 -12
  368. langchain/memory/entity.py +84 -61
  369. langchain/memory/prompt.py +10 -11
  370. langchain/memory/readonly.py +0 -2
  371. langchain/memory/simple.py +1 -3
  372. langchain/memory/summary.py +13 -11
  373. langchain/memory/summary_buffer.py +17 -8
  374. langchain/memory/utils.py +3 -2
  375. langchain/memory/vectorstore.py +12 -5
  376. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  377. langchain/model_laboratory.py +12 -11
  378. langchain/output_parsers/__init__.py +4 -4
  379. langchain/output_parsers/boolean.py +7 -4
  380. langchain/output_parsers/combining.py +10 -5
  381. langchain/output_parsers/datetime.py +32 -31
  382. langchain/output_parsers/enum.py +5 -3
  383. langchain/output_parsers/fix.py +52 -52
  384. langchain/output_parsers/format_instructions.py +6 -8
  385. langchain/output_parsers/json.py +2 -2
  386. langchain/output_parsers/list.py +2 -2
  387. langchain/output_parsers/loading.py +9 -9
  388. langchain/output_parsers/openai_functions.py +3 -3
  389. langchain/output_parsers/openai_tools.py +1 -1
  390. langchain/output_parsers/pandas_dataframe.py +43 -47
  391. langchain/output_parsers/prompts.py +1 -2
  392. langchain/output_parsers/rail_parser.py +1 -1
  393. langchain/output_parsers/regex.py +7 -8
  394. langchain/output_parsers/regex_dict.py +7 -10
  395. langchain/output_parsers/retry.py +77 -78
  396. langchain/output_parsers/structured.py +11 -6
  397. langchain/output_parsers/yaml.py +15 -11
  398. langchain/prompts/__init__.py +5 -3
  399. langchain/prompts/base.py +5 -5
  400. langchain/prompts/chat.py +8 -8
  401. langchain/prompts/example_selector/__init__.py +3 -1
  402. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  403. langchain/prompts/few_shot.py +1 -1
  404. langchain/prompts/loading.py +3 -3
  405. langchain/prompts/prompt.py +1 -1
  406. langchain/retrievers/__init__.py +5 -5
  407. langchain/retrievers/bedrock.py +2 -2
  408. langchain/retrievers/bm25.py +1 -1
  409. langchain/retrievers/contextual_compression.py +14 -8
  410. langchain/retrievers/docarray.py +1 -1
  411. langchain/retrievers/document_compressors/__init__.py +5 -4
  412. langchain/retrievers/document_compressors/base.py +12 -6
  413. langchain/retrievers/document_compressors/chain_extract.py +2 -2
  414. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  415. langchain/retrievers/document_compressors/chain_filter.py +9 -9
  416. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  417. langchain/retrievers/document_compressors/cohere_rerank.py +15 -15
  418. langchain/retrievers/document_compressors/embeddings_filter.py +21 -17
  419. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  420. langchain/retrievers/document_compressors/listwise_rerank.py +7 -5
  421. langchain/retrievers/ensemble.py +28 -25
  422. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  423. langchain/retrievers/google_vertex_ai_search.py +2 -2
  424. langchain/retrievers/kendra.py +10 -10
  425. langchain/retrievers/llama_index.py +1 -1
  426. langchain/retrievers/merger_retriever.py +11 -11
  427. langchain/retrievers/milvus.py +1 -1
  428. langchain/retrievers/multi_query.py +32 -26
  429. langchain/retrievers/multi_vector.py +20 -8
  430. langchain/retrievers/parent_document_retriever.py +18 -9
  431. langchain/retrievers/re_phraser.py +6 -5
  432. langchain/retrievers/self_query/base.py +138 -127
  433. langchain/retrievers/time_weighted_retriever.py +18 -7
  434. langchain/retrievers/zilliz.py +1 -1
  435. langchain/runnables/openai_functions.py +6 -2
  436. langchain/schema/__init__.py +23 -23
  437. langchain/schema/cache.py +1 -1
  438. langchain/schema/callbacks/base.py +7 -7
  439. langchain/schema/callbacks/manager.py +19 -19
  440. langchain/schema/callbacks/tracers/base.py +1 -1
  441. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  442. langchain/schema/callbacks/tracers/langchain.py +1 -1
  443. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  444. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  445. langchain/schema/callbacks/tracers/schemas.py +8 -8
  446. langchain/schema/callbacks/tracers/stdout.py +3 -3
  447. langchain/schema/document.py +1 -1
  448. langchain/schema/language_model.py +2 -2
  449. langchain/schema/messages.py +12 -12
  450. langchain/schema/output.py +3 -3
  451. langchain/schema/output_parser.py +3 -3
  452. langchain/schema/runnable/__init__.py +3 -3
  453. langchain/schema/runnable/base.py +9 -9
  454. langchain/schema/runnable/config.py +5 -5
  455. langchain/schema/runnable/configurable.py +1 -1
  456. langchain/schema/runnable/history.py +1 -1
  457. langchain/schema/runnable/passthrough.py +1 -1
  458. langchain/schema/runnable/utils.py +16 -16
  459. langchain/schema/vectorstore.py +1 -1
  460. langchain/smith/__init__.py +1 -1
  461. langchain/smith/evaluation/__init__.py +2 -2
  462. langchain/smith/evaluation/config.py +10 -7
  463. langchain/smith/evaluation/name_generation.py +3 -3
  464. langchain/smith/evaluation/progress.py +11 -2
  465. langchain/smith/evaluation/runner_utils.py +179 -127
  466. langchain/smith/evaluation/string_run_evaluator.py +75 -68
  467. langchain/storage/__init__.py +2 -2
  468. langchain/storage/_lc_store.py +4 -2
  469. langchain/storage/encoder_backed.py +6 -2
  470. langchain/storage/file_system.py +19 -16
  471. langchain/storage/in_memory.py +1 -1
  472. langchain/storage/upstash_redis.py +1 -1
  473. langchain/text_splitter.py +15 -15
  474. langchain/tools/__init__.py +28 -26
  475. langchain/tools/ainetwork/app.py +1 -1
  476. langchain/tools/ainetwork/base.py +1 -1
  477. langchain/tools/ainetwork/owner.py +1 -1
  478. langchain/tools/ainetwork/rule.py +1 -1
  479. langchain/tools/ainetwork/transfer.py +1 -1
  480. langchain/tools/ainetwork/value.py +1 -1
  481. langchain/tools/amadeus/closest_airport.py +1 -1
  482. langchain/tools/amadeus/flight_search.py +1 -1
  483. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  484. langchain/tools/base.py +4 -4
  485. langchain/tools/bearly/tool.py +1 -1
  486. langchain/tools/bing_search/__init__.py +1 -1
  487. langchain/tools/bing_search/tool.py +1 -1
  488. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  489. langchain/tools/dataforseo_api_search/tool.py +1 -1
  490. langchain/tools/ddg_search/tool.py +1 -1
  491. langchain/tools/e2b_data_analysis/tool.py +2 -2
  492. langchain/tools/edenai/__init__.py +1 -1
  493. langchain/tools/file_management/__init__.py +1 -1
  494. langchain/tools/file_management/copy.py +1 -1
  495. langchain/tools/file_management/delete.py +1 -1
  496. langchain/tools/gmail/__init__.py +2 -2
  497. langchain/tools/gmail/get_message.py +1 -1
  498. langchain/tools/gmail/search.py +1 -1
  499. langchain/tools/gmail/send_message.py +1 -1
  500. langchain/tools/google_finance/__init__.py +1 -1
  501. langchain/tools/google_finance/tool.py +1 -1
  502. langchain/tools/google_scholar/__init__.py +1 -1
  503. langchain/tools/google_scholar/tool.py +1 -1
  504. langchain/tools/google_search/__init__.py +1 -1
  505. langchain/tools/google_search/tool.py +1 -1
  506. langchain/tools/google_serper/__init__.py +1 -1
  507. langchain/tools/google_serper/tool.py +1 -1
  508. langchain/tools/google_trends/__init__.py +1 -1
  509. langchain/tools/google_trends/tool.py +1 -1
  510. langchain/tools/jira/tool.py +20 -1
  511. langchain/tools/json/tool.py +25 -3
  512. langchain/tools/memorize/tool.py +1 -1
  513. langchain/tools/multion/__init__.py +1 -1
  514. langchain/tools/multion/update_session.py +1 -1
  515. langchain/tools/office365/__init__.py +2 -2
  516. langchain/tools/office365/events_search.py +1 -1
  517. langchain/tools/office365/messages_search.py +1 -1
  518. langchain/tools/office365/send_event.py +1 -1
  519. langchain/tools/office365/send_message.py +1 -1
  520. langchain/tools/openapi/utils/api_models.py +6 -6
  521. langchain/tools/playwright/__init__.py +5 -5
  522. langchain/tools/playwright/click.py +1 -1
  523. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  524. langchain/tools/playwright/get_elements.py +1 -1
  525. langchain/tools/playwright/navigate.py +1 -1
  526. langchain/tools/plugin.py +2 -2
  527. langchain/tools/powerbi/tool.py +1 -1
  528. langchain/tools/python/__init__.py +2 -1
  529. langchain/tools/reddit_search/tool.py +1 -1
  530. langchain/tools/render.py +2 -2
  531. langchain/tools/requests/tool.py +2 -2
  532. langchain/tools/searchapi/tool.py +1 -1
  533. langchain/tools/searx_search/tool.py +1 -1
  534. langchain/tools/slack/get_message.py +1 -1
  535. langchain/tools/spark_sql/tool.py +1 -1
  536. langchain/tools/sql_database/tool.py +1 -1
  537. langchain/tools/tavily_search/__init__.py +1 -1
  538. langchain/tools/tavily_search/tool.py +1 -1
  539. langchain/tools/zapier/__init__.py +1 -1
  540. langchain/tools/zapier/tool.py +24 -2
  541. langchain/utilities/__init__.py +4 -4
  542. langchain/utilities/arcee.py +4 -4
  543. langchain/utilities/clickup.py +4 -4
  544. langchain/utilities/dalle_image_generator.py +1 -1
  545. langchain/utilities/dataforseo_api_search.py +1 -1
  546. langchain/utilities/opaqueprompts.py +1 -1
  547. langchain/utilities/reddit_search.py +1 -1
  548. langchain/utilities/sql_database.py +1 -1
  549. langchain/utilities/tavily_search.py +1 -1
  550. langchain/utilities/vertexai.py +2 -2
  551. langchain/utils/__init__.py +1 -1
  552. langchain/utils/aiter.py +1 -1
  553. langchain/utils/html.py +3 -3
  554. langchain/utils/input.py +1 -1
  555. langchain/utils/iter.py +1 -1
  556. langchain/utils/json_schema.py +1 -3
  557. langchain/utils/strings.py +1 -1
  558. langchain/utils/utils.py +6 -6
  559. langchain/vectorstores/__init__.py +5 -5
  560. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  561. langchain/vectorstores/azure_cosmos_db.py +1 -1
  562. langchain/vectorstores/clickhouse.py +1 -1
  563. langchain/vectorstores/elastic_vector_search.py +1 -1
  564. langchain/vectorstores/elasticsearch.py +2 -2
  565. langchain/vectorstores/myscale.py +1 -1
  566. langchain/vectorstores/neo4j_vector.py +1 -1
  567. langchain/vectorstores/pgembedding.py +1 -1
  568. langchain/vectorstores/qdrant.py +1 -1
  569. langchain/vectorstores/redis/__init__.py +1 -1
  570. langchain/vectorstores/redis/base.py +1 -1
  571. langchain/vectorstores/redis/filters.py +4 -4
  572. langchain/vectorstores/redis/schema.py +6 -6
  573. langchain/vectorstores/sklearn.py +2 -2
  574. langchain/vectorstores/starrocks.py +1 -1
  575. langchain/vectorstores/utils.py +1 -1
  576. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/METADATA +4 -4
  577. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/RECORD +580 -580
  578. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
  579. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
  580. {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/licenses/LICENSE +0 -0
@@ -69,7 +69,8 @@ def _low_confidence_spans(
69
69
  "NumPy not found in the current Python environment. FlareChain will use a "
70
70
  "pure Python implementation for internal calculations, which may "
71
71
  "significantly impact performance, especially for large datasets. For "
72
- "optimal speed and efficiency, consider installing NumPy: pip install numpy"
72
+ "optimal speed and efficiency, consider installing NumPy: pip install "
73
+ "numpy",
73
74
  )
74
75
  import math
75
76
 
@@ -171,7 +172,8 @@ class FlareChain(Chain):
171
172
  callbacks = _run_manager.get_child()
172
173
  if isinstance(self.question_generator_chain, LLMChain):
173
174
  question_gen_outputs = self.question_generator_chain.apply(
174
- question_gen_inputs, callbacks=callbacks
175
+ question_gen_inputs,
176
+ callbacks=callbacks,
175
177
  )
176
178
  questions = [
177
179
  output[self.question_generator_chain.output_keys[0]]
@@ -179,10 +181,13 @@ class FlareChain(Chain):
179
181
  ]
180
182
  else:
181
183
  questions = self.question_generator_chain.batch(
182
- question_gen_inputs, config={"callbacks": callbacks}
184
+ question_gen_inputs,
185
+ config={"callbacks": callbacks},
183
186
  )
184
187
  _run_manager.on_text(
185
- f"Generated Questions: {questions}", color="yellow", end="\n"
188
+ f"Generated Questions: {questions}",
189
+ color="yellow",
190
+ end="\n",
186
191
  )
187
192
  return self._do_generation(questions, user_input, response, _run_manager)
188
193
 
@@ -197,15 +202,18 @@ class FlareChain(Chain):
197
202
 
198
203
  response = ""
199
204
 
200
- for i in range(self.max_iter):
205
+ for _i in range(self.max_iter):
201
206
  _run_manager.on_text(
202
- f"Current Response: {response}", color="blue", end="\n"
207
+ f"Current Response: {response}",
208
+ color="blue",
209
+ end="\n",
203
210
  )
204
211
  _input = {"user_input": user_input, "context": "", "response": response}
205
212
  tokens, log_probs = _extract_tokens_and_log_probs(
206
213
  self.response_chain.invoke(
207
- _input, {"callbacks": _run_manager.get_child()}
208
- )
214
+ _input,
215
+ {"callbacks": _run_manager.get_child()},
216
+ ),
209
217
  )
210
218
  low_confidence_spans = _low_confidence_spans(
211
219
  tokens,
@@ -236,7 +244,10 @@ class FlareChain(Chain):
236
244
 
237
245
  @classmethod
238
246
  def from_llm(
239
- cls, llm: BaseLanguageModel, max_generation_len: int = 32, **kwargs: Any
247
+ cls,
248
+ llm: BaseLanguageModel,
249
+ max_generation_len: int = 32,
250
+ **kwargs: Any,
240
251
  ) -> FlareChain:
241
252
  """Creates a FlareChain from a language model.
242
253
 
@@ -250,14 +261,17 @@ class FlareChain(Chain):
250
261
  """
251
262
  try:
252
263
  from langchain_openai import ChatOpenAI
253
- except ImportError:
254
- raise ImportError(
264
+ except ImportError as e:
265
+ msg = (
255
266
  "OpenAI is required for FlareChain. "
256
267
  "Please install langchain-openai."
257
268
  "pip install langchain-openai"
258
269
  )
270
+ raise ImportError(msg) from e
259
271
  llm = ChatOpenAI(
260
- max_completion_tokens=max_generation_len, logprobs=True, temperature=0
272
+ max_completion_tokens=max_generation_len,
273
+ logprobs=True,
274
+ temperature=0,
261
275
  )
262
276
  response_chain = PROMPT | llm
263
277
  question_gen_chain = QUESTION_GENERATOR_PROMPT | llm | StrOutputParser()
@@ -31,9 +31,9 @@ def __getattr__(name: str) -> Any:
31
31
 
32
32
 
33
33
  __all__ = [
34
- "GraphCypherQAChain",
34
+ "CYPHER_GENERATION_PROMPT",
35
35
  "INTERMEDIATE_STEPS_KEY",
36
+ "GraphCypherQAChain",
36
37
  "construct_schema",
37
38
  "extract_cypher",
38
- "CYPHER_GENERATION_PROMPT",
39
39
  ]
@@ -26,4 +26,4 @@ def __getattr__(name: str) -> Any:
26
26
  return _import_attribute(name)
27
27
 
28
28
 
29
- __all__ = ["FalkorDBQAChain", "INTERMEDIATE_STEPS_KEY", "extract_cypher"]
29
+ __all__ = ["INTERMEDIATE_STEPS_KEY", "FalkorDBQAChain", "extract_cypher"]
@@ -30,7 +30,7 @@ def __getattr__(name: str) -> Any:
30
30
 
31
31
  __all__ = [
32
32
  "GRAPHDB_SPARQL_FIX_TEMPLATE",
33
- "GremlinQAChain",
34
33
  "INTERMEDIATE_STEPS_KEY",
34
+ "GremlinQAChain",
35
35
  "extract_gremlin",
36
36
  ]
@@ -30,7 +30,7 @@ def __getattr__(name: str) -> Any:
30
30
 
31
31
  __all__ = [
32
32
  "INTERMEDIATE_STEPS_KEY",
33
- "NeptuneSparqlQAChain",
34
33
  "SPARQL_GENERATION_TEMPLATE",
34
+ "NeptuneSparqlQAChain",
35
35
  "extract_sparql",
36
36
  ]
@@ -74,7 +74,9 @@ __all__ = [
74
74
  "AQL_FIX_TEMPLATE",
75
75
  "AQL_GENERATION_TEMPLATE",
76
76
  "AQL_QA_TEMPLATE",
77
+ "CYPHER_GENERATION_PROMPT",
77
78
  "CYPHER_GENERATION_TEMPLATE",
79
+ "CYPHER_QA_PROMPT",
78
80
  "CYPHER_QA_TEMPLATE",
79
81
  "GRAPHDB_QA_TEMPLATE",
80
82
  "GRAPHDB_SPARQL_FIX_TEMPLATE",
@@ -91,6 +93,4 @@ __all__ = [
91
93
  "SPARQL_GENERATION_UPDATE_TEMPLATE",
92
94
  "SPARQL_INTENT_TEMPLATE",
93
95
  "SPARQL_QA_TEMPLATE",
94
- "CYPHER_QA_PROMPT",
95
- "CYPHER_GENERATION_PROMPT",
96
96
  ]
@@ -49,10 +49,11 @@ def create_history_aware_retriever(
49
49
 
50
50
  """
51
51
  if "input" not in prompt.input_variables:
52
- raise ValueError(
52
+ msg = (
53
53
  "Expected `input` to be a prompt variable, "
54
54
  f"but got {prompt.input_variables}"
55
55
  )
56
+ raise ValueError(msg)
56
57
 
57
58
  retrieve_documents: RetrieverOutputLike = RunnableBranch(
58
59
  (
@@ -47,8 +47,7 @@ class HypotheticalDocumentEmbedder(Chain, Embeddings):
47
47
  """Output keys for Hyde's LLM chain."""
48
48
  if isinstance(self.llm_chain, LLMChain):
49
49
  return self.llm_chain.output_keys
50
- else:
51
- return ["text"]
50
+ return ["text"]
52
51
 
53
52
  def embed_documents(self, texts: list[str]) -> list[list[float]]:
54
53
  """Call the base embeddings."""
@@ -66,7 +65,7 @@ class HypotheticalDocumentEmbedder(Chain, Embeddings):
66
65
  "HypotheticalDocumentEmbedder will use a pure Python implementation "
67
66
  "for internal calculations, which may significantly impact "
68
67
  "performance, especially for large datasets. For optimal speed and "
69
- "efficiency, consider installing NumPy: pip install numpy"
68
+ "efficiency, consider installing NumPy: pip install numpy",
70
69
  )
71
70
  if not embeddings:
72
71
  return []
@@ -92,7 +91,8 @@ class HypotheticalDocumentEmbedder(Chain, Embeddings):
92
91
  """Call the internal llm chain."""
93
92
  _run_manager = run_manager or CallbackManagerForChainRun.get_noop_manager()
94
93
  return self.llm_chain.invoke(
95
- inputs, config={"callbacks": _run_manager.get_child()}
94
+ inputs,
95
+ config={"callbacks": _run_manager.get_child()},
96
96
  )
97
97
 
98
98
  @classmethod
@@ -110,10 +110,11 @@ class HypotheticalDocumentEmbedder(Chain, Embeddings):
110
110
  elif prompt_key is not None and prompt_key in PROMPT_MAP:
111
111
  prompt = PROMPT_MAP[prompt_key]
112
112
  else:
113
- raise ValueError(
113
+ msg = (
114
114
  f"Must specify prompt_key if custom_prompt not provided. Should be one "
115
115
  f"of {list(PROMPT_MAP.keys())}."
116
116
  )
117
+ raise ValueError(msg)
117
118
 
118
119
  llm_chain = prompt | llm | StrOutputParser()
119
120
  return cls(base_embeddings=base_embeddings, llm_chain=llm_chain, **kwargs)
@@ -1,15 +1,14 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
- web_search_template = """Please write a passage to answer the question
3
+ web_search_template = """Please write a passage to answer the question
5
4
  Question: {QUESTION}
6
5
  Passage:"""
7
6
  web_search = PromptTemplate(template=web_search_template, input_variables=["QUESTION"])
8
- sci_fact_template = """Please write a scientific paper passage to support/refute the claim
7
+ sci_fact_template = """Please write a scientific paper passage to support/refute the claim
9
8
  Claim: {Claim}
10
- Passage:"""
9
+ Passage:""" # noqa: E501
11
10
  sci_fact = PromptTemplate(template=sci_fact_template, input_variables=["Claim"])
12
- arguana_template = """Please write a counter argument for the passage
11
+ arguana_template = """Please write a counter argument for the passage
13
12
  Passage: {PASSAGE}
14
13
  Counter Argument:"""
15
14
  arguana = PromptTemplate(template=arguana_template, input_variables=["PASSAGE"])
@@ -33,7 +32,7 @@ Passage:"""
33
32
  trec_news = PromptTemplate(template=trec_news_template, input_variables=["TOPIC"])
34
33
  mr_tydi_template = """Please write a passage in Swahili/Korean/Japanese/Bengali to answer the question in detail.
35
34
  Question: {QUESTION}
36
- Passage:"""
35
+ Passage:""" # noqa: E501
37
36
  mr_tydi = PromptTemplate(template=mr_tydi_template, input_variables=["QUESTION"])
38
37
  PROMPT_MAP = {
39
38
  "web_search": web_search,
langchain/chains/llm.py CHANGED
@@ -82,13 +82,14 @@ class LLMChain(Chain):
82
82
  prompt: BasePromptTemplate
83
83
  """Prompt object to use."""
84
84
  llm: Union[
85
- Runnable[LanguageModelInput, str], Runnable[LanguageModelInput, BaseMessage]
85
+ Runnable[LanguageModelInput, str],
86
+ Runnable[LanguageModelInput, BaseMessage],
86
87
  ]
87
88
  """Language model to call."""
88
89
  output_key: str = "text" #: :meta private:
89
90
  output_parser: BaseLLMOutputParser = Field(default_factory=StrOutputParser)
90
91
  """Output parser to use.
91
- Defaults to one that takes the most likely string but does not change it
92
+ Defaults to one that takes the most likely string but does not change it
92
93
  otherwise."""
93
94
  return_final_only: bool = True
94
95
  """Whether to return only the final parsed result. Defaults to True.
@@ -116,8 +117,7 @@ class LLMChain(Chain):
116
117
  """
117
118
  if self.return_final_only:
118
119
  return [self.output_key]
119
- else:
120
- return [self.output_key, "full_generation"]
120
+ return [self.output_key, "full_generation"]
121
121
 
122
122
  def _call(
123
123
  self,
@@ -142,17 +142,17 @@ class LLMChain(Chain):
142
142
  callbacks=callbacks,
143
143
  **self.llm_kwargs,
144
144
  )
145
- else:
146
- results = self.llm.bind(stop=stop, **self.llm_kwargs).batch(
147
- cast(list, prompts), {"callbacks": callbacks}
148
- )
149
- generations: list[list[Generation]] = []
150
- for res in results:
151
- if isinstance(res, BaseMessage):
152
- generations.append([ChatGeneration(message=res)])
153
- else:
154
- generations.append([Generation(text=res)])
155
- return LLMResult(generations=generations)
145
+ results = self.llm.bind(stop=stop, **self.llm_kwargs).batch(
146
+ cast(list, prompts),
147
+ {"callbacks": callbacks},
148
+ )
149
+ generations: list[list[Generation]] = []
150
+ for res in results:
151
+ if isinstance(res, BaseMessage):
152
+ generations.append([ChatGeneration(message=res)])
153
+ else:
154
+ generations.append([Generation(text=res)])
155
+ return LLMResult(generations=generations)
156
156
 
157
157
  async def agenerate(
158
158
  self,
@@ -169,17 +169,17 @@ class LLMChain(Chain):
169
169
  callbacks=callbacks,
170
170
  **self.llm_kwargs,
171
171
  )
172
- else:
173
- results = await self.llm.bind(stop=stop, **self.llm_kwargs).abatch(
174
- cast(list, prompts), {"callbacks": callbacks}
175
- )
176
- generations: list[list[Generation]] = []
177
- for res in results:
178
- if isinstance(res, BaseMessage):
179
- generations.append([ChatGeneration(message=res)])
180
- else:
181
- generations.append([Generation(text=res)])
182
- return LLMResult(generations=generations)
172
+ results = await self.llm.bind(stop=stop, **self.llm_kwargs).abatch(
173
+ cast(list, prompts),
174
+ {"callbacks": callbacks},
175
+ )
176
+ generations: list[list[Generation]] = []
177
+ for res in results:
178
+ if isinstance(res, BaseMessage):
179
+ generations.append([ChatGeneration(message=res)])
180
+ else:
181
+ generations.append([Generation(text=res)])
182
+ return LLMResult(generations=generations)
183
183
 
184
184
  def prep_prompts(
185
185
  self,
@@ -201,9 +201,8 @@ class LLMChain(Chain):
201
201
  if run_manager:
202
202
  run_manager.on_text(_text, end="\n", verbose=self.verbose)
203
203
  if "stop" in inputs and inputs["stop"] != stop:
204
- raise ValueError(
205
- "If `stop` is present in any inputs, should be present in all."
206
- )
204
+ msg = "If `stop` is present in any inputs, should be present in all."
205
+ raise ValueError(msg)
207
206
  prompts.append(prompt)
208
207
  return prompts, stop
209
208
 
@@ -227,18 +226,21 @@ class LLMChain(Chain):
227
226
  if run_manager:
228
227
  await run_manager.on_text(_text, end="\n", verbose=self.verbose)
229
228
  if "stop" in inputs and inputs["stop"] != stop:
230
- raise ValueError(
231
- "If `stop` is present in any inputs, should be present in all."
232
- )
229
+ msg = "If `stop` is present in any inputs, should be present in all."
230
+ raise ValueError(msg)
233
231
  prompts.append(prompt)
234
232
  return prompts, stop
235
233
 
236
234
  def apply(
237
- self, input_list: list[dict[str, Any]], callbacks: Callbacks = None
235
+ self,
236
+ input_list: list[dict[str, Any]],
237
+ callbacks: Callbacks = None,
238
238
  ) -> list[dict[str, str]]:
239
239
  """Utilize the LLM generate method for speed gains."""
240
240
  callback_manager = CallbackManager.configure(
241
- callbacks, self.callbacks, self.verbose
241
+ callbacks,
242
+ self.callbacks,
243
+ self.verbose,
242
244
  )
243
245
  run_manager = callback_manager.on_chain_start(
244
246
  None,
@@ -249,17 +251,21 @@ class LLMChain(Chain):
249
251
  response = self.generate(input_list, run_manager=run_manager)
250
252
  except BaseException as e:
251
253
  run_manager.on_chain_error(e)
252
- raise e
254
+ raise
253
255
  outputs = self.create_outputs(response)
254
256
  run_manager.on_chain_end({"outputs": outputs})
255
257
  return outputs
256
258
 
257
259
  async def aapply(
258
- self, input_list: list[dict[str, Any]], callbacks: Callbacks = None
260
+ self,
261
+ input_list: list[dict[str, Any]],
262
+ callbacks: Callbacks = None,
259
263
  ) -> list[dict[str, str]]:
260
264
  """Utilize the LLM generate method for speed gains."""
261
265
  callback_manager = AsyncCallbackManager.configure(
262
- callbacks, self.callbacks, self.verbose
266
+ callbacks,
267
+ self.callbacks,
268
+ self.verbose,
263
269
  )
264
270
  run_manager = await callback_manager.on_chain_start(
265
271
  None,
@@ -270,7 +276,7 @@ class LLMChain(Chain):
270
276
  response = await self.agenerate(input_list, run_manager=run_manager)
271
277
  except BaseException as e:
272
278
  await run_manager.on_chain_error(e)
273
- raise e
279
+ raise
274
280
  outputs = self.create_outputs(response)
275
281
  await run_manager.on_chain_end({"outputs": outputs})
276
282
  return outputs
@@ -336,62 +342,72 @@ class LLMChain(Chain):
336
342
  return (await self.acall(kwargs, callbacks=callbacks))[self.output_key]
337
343
 
338
344
  def predict_and_parse(
339
- self, callbacks: Callbacks = None, **kwargs: Any
345
+ self,
346
+ callbacks: Callbacks = None,
347
+ **kwargs: Any,
340
348
  ) -> Union[str, list[str], dict[str, Any]]:
341
349
  """Call predict and then parse the results."""
342
350
  warnings.warn(
343
351
  "The predict_and_parse method is deprecated, "
344
- "instead pass an output parser directly to LLMChain."
352
+ "instead pass an output parser directly to LLMChain.",
353
+ stacklevel=2,
345
354
  )
346
355
  result = self.predict(callbacks=callbacks, **kwargs)
347
356
  if self.prompt.output_parser is not None:
348
357
  return self.prompt.output_parser.parse(result)
349
- else:
350
- return result
358
+ return result
351
359
 
352
360
  async def apredict_and_parse(
353
- self, callbacks: Callbacks = None, **kwargs: Any
361
+ self,
362
+ callbacks: Callbacks = None,
363
+ **kwargs: Any,
354
364
  ) -> Union[str, list[str], dict[str, str]]:
355
365
  """Call apredict and then parse the results."""
356
366
  warnings.warn(
357
367
  "The apredict_and_parse method is deprecated, "
358
- "instead pass an output parser directly to LLMChain."
368
+ "instead pass an output parser directly to LLMChain.",
369
+ stacklevel=2,
359
370
  )
360
371
  result = await self.apredict(callbacks=callbacks, **kwargs)
361
372
  if self.prompt.output_parser is not None:
362
373
  return self.prompt.output_parser.parse(result)
363
- else:
364
- return result
374
+ return result
365
375
 
366
376
  def apply_and_parse(
367
- self, input_list: list[dict[str, Any]], callbacks: Callbacks = None
377
+ self,
378
+ input_list: list[dict[str, Any]],
379
+ callbacks: Callbacks = None,
368
380
  ) -> Sequence[Union[str, list[str], dict[str, str]]]:
369
381
  """Call apply and then parse the results."""
370
382
  warnings.warn(
371
383
  "The apply_and_parse method is deprecated, "
372
- "instead pass an output parser directly to LLMChain."
384
+ "instead pass an output parser directly to LLMChain.",
385
+ stacklevel=2,
373
386
  )
374
387
  result = self.apply(input_list, callbacks=callbacks)
375
388
  return self._parse_generation(result)
376
389
 
377
390
  def _parse_generation(
378
- self, generation: list[dict[str, str]]
391
+ self,
392
+ generation: list[dict[str, str]],
379
393
  ) -> Sequence[Union[str, list[str], dict[str, str]]]:
380
394
  if self.prompt.output_parser is not None:
381
395
  return [
382
396
  self.prompt.output_parser.parse(res[self.output_key])
383
397
  for res in generation
384
398
  ]
385
- else:
386
- return generation
399
+ return generation
387
400
 
388
401
  async def aapply_and_parse(
389
- self, input_list: list[dict[str, Any]], callbacks: Callbacks = None
402
+ self,
403
+ input_list: list[dict[str, Any]],
404
+ callbacks: Callbacks = None,
390
405
  ) -> Sequence[Union[str, list[str], dict[str, str]]]:
391
406
  """Call apply and then parse the results."""
392
407
  warnings.warn(
393
408
  "The aapply_and_parse method is deprecated, "
394
- "instead pass an output parser directly to LLMChain."
409
+ "instead pass an output parser directly to LLMChain.",
410
+ stacklevel=2,
395
411
  )
396
412
  result = await self.aapply(input_list, callbacks=callbacks)
397
413
  return self._parse_generation(result)
@@ -413,14 +429,14 @@ class LLMChain(Chain):
413
429
  def _get_language_model(llm_like: Runnable) -> BaseLanguageModel:
414
430
  if isinstance(llm_like, BaseLanguageModel):
415
431
  return llm_like
416
- elif isinstance(llm_like, RunnableBinding):
432
+ if isinstance(llm_like, RunnableBinding):
417
433
  return _get_language_model(llm_like.bound)
418
- elif isinstance(llm_like, RunnableWithFallbacks):
434
+ if isinstance(llm_like, RunnableWithFallbacks):
419
435
  return _get_language_model(llm_like.runnable)
420
- elif isinstance(llm_like, (RunnableBranch, DynamicRunnable)):
436
+ if isinstance(llm_like, (RunnableBranch, DynamicRunnable)):
421
437
  return _get_language_model(llm_like.default)
422
- else:
423
- raise ValueError(
424
- f"Unable to extract BaseLanguageModel from llm_like object of type "
425
- f"{type(llm_like)}"
426
- )
438
+ msg = (
439
+ f"Unable to extract BaseLanguageModel from llm_like object of type "
440
+ f"{type(llm_like)}"
441
+ )
442
+ raise ValueError(msg)
@@ -1,9 +1,10 @@
1
1
  def __getattr__(name: str = "") -> None:
2
2
  """Raise an error on import since is deprecated."""
3
- raise AttributeError(
3
+ msg = (
4
4
  "This module has been moved to langchain-experimental. "
5
5
  "For more details: https://github.com/langchain-ai/langchain/discussions/11352."
6
6
  "To access this code, install it with `pip install langchain-experimental`."
7
7
  "`from langchain_experimental.llm_bash.base "
8
8
  "import LLMBashChain`"
9
9
  )
10
+ raise AttributeError(msg)
@@ -55,13 +55,12 @@ def _load_question_to_checked_assertions_chain(
55
55
  check_assertions_chain,
56
56
  revised_answer_chain,
57
57
  ]
58
- question_to_checked_assertions_chain = SequentialChain(
58
+ return SequentialChain(
59
59
  chains=chains, # type: ignore[arg-type]
60
60
  input_variables=["question"],
61
61
  output_variables=["revised_statement"],
62
62
  verbose=True,
63
63
  )
64
- return question_to_checked_assertions_chain
65
64
 
66
65
 
67
66
  @deprecated(
@@ -112,7 +111,8 @@ class LLMCheckerChain(Chain):
112
111
  warnings.warn(
113
112
  "Directly instantiating an LLMCheckerChain with an llm is deprecated. "
114
113
  "Please instantiate with question_to_checked_assertions_chain "
115
- "or using the from_llm class method."
114
+ "or using the from_llm class method.",
115
+ stacklevel=5,
116
116
  )
117
117
  if (
118
118
  "question_to_checked_assertions_chain" not in values
@@ -122,7 +122,8 @@ class LLMCheckerChain(Chain):
122
122
  _load_question_to_checked_assertions_chain(
123
123
  values["llm"],
124
124
  values.get(
125
- "create_draft_answer_prompt", CREATE_DRAFT_ANSWER_PROMPT
125
+ "create_draft_answer_prompt",
126
+ CREATE_DRAFT_ANSWER_PROMPT,
126
127
  ),
127
128
  values.get("list_assertions_prompt", LIST_ASSERTIONS_PROMPT),
128
129
  values.get("check_assertions_prompt", CHECK_ASSERTIONS_PROMPT),
@@ -159,7 +160,8 @@ class LLMCheckerChain(Chain):
159
160
  question = inputs[self.input_key]
160
161
 
161
162
  output = self.question_to_checked_assertions_chain(
162
- {"question": question}, callbacks=_run_manager.get_child()
163
+ {"question": question},
164
+ callbacks=_run_manager.get_child(),
163
165
  )
164
166
  return {self.output_key: output["revised_statement"]}
165
167
 
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  _CREATE_DRAFT_ANSWER_TEMPLATE = """{question}\n\n"""
@@ -8,14 +7,14 @@ CREATE_DRAFT_ANSWER_PROMPT = PromptTemplate(
8
7
 
9
8
  _LIST_ASSERTIONS_TEMPLATE = """Here is a statement:
10
9
  {statement}
11
- Make a bullet point list of the assumptions you made when producing the above statement.\n\n"""
10
+ Make a bullet point list of the assumptions you made when producing the above statement.\n\n""" # noqa: E501
12
11
  LIST_ASSERTIONS_PROMPT = PromptTemplate(
13
12
  input_variables=["statement"], template=_LIST_ASSERTIONS_TEMPLATE
14
13
  )
15
14
 
16
15
  _CHECK_ASSERTIONS_TEMPLATE = """Here is a bullet point list of assertions:
17
16
  {assertions}
18
- For each assertion, determine whether it is true or false. If it is false, explain why.\n\n"""
17
+ For each assertion, determine whether it is true or false. If it is false, explain why.\n\n""" # noqa: E501
19
18
  CHECK_ASSERTIONS_PROMPT = PromptTemplate(
20
19
  input_variables=["assertions"], template=_CHECK_ASSERTIONS_TEMPLATE
21
20
  )
@@ -24,7 +23,7 @@ _REVISED_ANSWER_TEMPLATE = """{checked_assertions}
24
23
 
25
24
  Question: In light of the above assertions and checks, how would you answer the question '{question}'?
26
25
 
27
- Answer:"""
26
+ Answer:""" # noqa: E501
28
27
  REVISED_ANSWER_PROMPT = PromptTemplate(
29
28
  input_variables=["checked_assertions", "question"],
30
29
  template=_REVISED_ANSWER_TEMPLATE,
@@ -26,7 +26,7 @@ from langchain.chains.llm_math.prompt import PROMPT
26
26
  message=(
27
27
  "This class is deprecated and will be removed in langchain 1.0. "
28
28
  "See API reference for replacement: "
29
- "https://api.python.langchain.com/en/latest/chains/langchain.chains.llm_math.base.LLMMathChain.html" # noqa: E501
29
+ "https://api.python.langchain.com/en/latest/chains/langchain.chains.llm_math.base.LLMMathChain.html"
30
30
  ),
31
31
  removal="1.0",
32
32
  )
@@ -166,16 +166,18 @@ class LLMMathChain(Chain):
166
166
  def raise_deprecation(cls, values: dict) -> Any:
167
167
  try:
168
168
  import numexpr # noqa: F401
169
- except ImportError:
170
- raise ImportError(
169
+ except ImportError as e:
170
+ msg = (
171
171
  "LLMMathChain requires the numexpr package. "
172
172
  "Please install it with `pip install numexpr`."
173
173
  )
174
+ raise ImportError(msg) from e
174
175
  if "llm" in values:
175
176
  warnings.warn(
176
177
  "Directly instantiating an LLMMathChain with an llm is deprecated. "
177
178
  "Please instantiate with llm_chain argument or using the from_llm "
178
- "class method."
179
+ "class method.",
180
+ stacklevel=5,
179
181
  )
180
182
  if "llm_chain" not in values and values["llm"] is not None:
181
183
  prompt = values.get("prompt", PROMPT)
@@ -208,19 +210,22 @@ class LLMMathChain(Chain):
208
210
  expression.strip(),
209
211
  global_dict={}, # restrict access to globals
210
212
  local_dict=local_dict, # add common mathematical functions
211
- )
213
+ ),
212
214
  )
213
215
  except Exception as e:
214
- raise ValueError(
216
+ msg = (
215
217
  f'LLMMathChain._evaluate("{expression}") raised error: {e}.'
216
218
  " Please try again with a valid numerical expression"
217
219
  )
220
+ raise ValueError(msg) from e
218
221
 
219
222
  # Remove any leading and trailing brackets from the output
220
223
  return re.sub(r"^\[|\]$", "", output)
221
224
 
222
225
  def _process_llm_result(
223
- self, llm_output: str, run_manager: CallbackManagerForChainRun
226
+ self,
227
+ llm_output: str,
228
+ run_manager: CallbackManagerForChainRun,
224
229
  ) -> dict[str, str]:
225
230
  run_manager.on_text(llm_output, color="green", verbose=self.verbose)
226
231
  llm_output = llm_output.strip()
@@ -236,7 +241,8 @@ class LLMMathChain(Chain):
236
241
  elif "Answer:" in llm_output:
237
242
  answer = "Answer: " + llm_output.split("Answer:")[-1]
238
243
  else:
239
- raise ValueError(f"unknown format from LLM: {llm_output}")
244
+ msg = f"unknown format from LLM: {llm_output}"
245
+ raise ValueError(msg)
240
246
  return {self.output_key: answer}
241
247
 
242
248
  async def _aprocess_llm_result(
@@ -258,7 +264,8 @@ class LLMMathChain(Chain):
258
264
  elif "Answer:" in llm_output:
259
265
  answer = "Answer: " + llm_output.split("Answer:")[-1]
260
266
  else:
261
- raise ValueError(f"unknown format from LLM: {llm_output}")
267
+ msg = f"unknown format from LLM: {llm_output}"
268
+ raise ValueError(msg)
262
269
  return {self.output_key: answer}
263
270
 
264
271
  def _call(