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
@@ -45,7 +45,9 @@ class OpenAIModerationChain(Chain):
45
45
  def validate_environment(cls, values: dict) -> Any:
46
46
  """Validate that api key and python package exists in environment."""
47
47
  openai_api_key = get_from_dict_or_env(
48
- values, "openai_api_key", "OPENAI_API_KEY"
48
+ values,
49
+ "openai_api_key",
50
+ "OPENAI_API_KEY",
49
51
  )
50
52
  openai_organization = get_from_dict_or_env(
51
53
  values,
@@ -70,11 +72,12 @@ class OpenAIModerationChain(Chain):
70
72
  values["client"] = openai.OpenAI(api_key=openai_api_key)
71
73
  values["async_client"] = openai.AsyncOpenAI(api_key=openai_api_key)
72
74
 
73
- except ImportError:
74
- raise ImportError(
75
+ except ImportError as e:
76
+ msg = (
75
77
  "Could not import openai python package. "
76
78
  "Please install it with `pip install openai`."
77
79
  )
80
+ raise ImportError(msg) from e
78
81
  return values
79
82
 
80
83
  @property
@@ -94,16 +97,12 @@ class OpenAIModerationChain(Chain):
94
97
  return [self.output_key]
95
98
 
96
99
  def _moderate(self, text: str, results: Any) -> str:
97
- if self.openai_pre_1_0:
98
- condition = results["flagged"]
99
- else:
100
- condition = results.flagged
100
+ condition = results["flagged"] if self.openai_pre_1_0 else results.flagged
101
101
  if condition:
102
102
  error_str = "Text was found that violates OpenAI's content policy."
103
103
  if self.error:
104
104
  raise ValueError(error_str)
105
- else:
106
- return error_str
105
+ return error_str
107
106
  return text
108
107
 
109
108
  def _call(
@@ -6,9 +6,7 @@ import warnings
6
6
  from typing import Any, Optional
7
7
 
8
8
  from langchain_core._api import deprecated
9
- from langchain_core.caches import BaseCache as BaseCache
10
9
  from langchain_core.callbacks import CallbackManagerForChainRun
11
- from langchain_core.callbacks import Callbacks as Callbacks
12
10
  from langchain_core.language_models import BaseLanguageModel
13
11
  from langchain_core.output_parsers import StrOutputParser
14
12
  from langchain_core.runnables import Runnable
@@ -73,7 +71,8 @@ class NatBotChain(Chain):
73
71
  warnings.warn(
74
72
  "Directly instantiating an NatBotChain with an llm is deprecated. "
75
73
  "Please instantiate with llm_chain argument or using the from_llm "
76
- "class method."
74
+ "class method.",
75
+ stacklevel=5,
77
76
  )
78
77
  if "llm_chain" not in values and values["llm"] is not None:
79
78
  values["llm_chain"] = PROMPT | values["llm"] | StrOutputParser()
@@ -82,15 +81,19 @@ class NatBotChain(Chain):
82
81
  @classmethod
83
82
  def from_default(cls, objective: str, **kwargs: Any) -> NatBotChain:
84
83
  """Load with default LLMChain."""
85
- raise NotImplementedError(
84
+ msg = (
86
85
  "This method is no longer implemented. Please use from_llm."
87
86
  "llm = OpenAI(temperature=0.5, best_of=10, n=3, max_tokens=50)"
88
87
  "For example, NatBotChain.from_llm(llm, objective)"
89
88
  )
89
+ raise NotImplementedError(msg)
90
90
 
91
91
  @classmethod
92
92
  def from_llm(
93
- cls, llm: BaseLanguageModel, objective: str, **kwargs: Any
93
+ cls,
94
+ llm: BaseLanguageModel,
95
+ objective: str,
96
+ **kwargs: Any,
94
97
  ) -> NatBotChain:
95
98
  """Load from LLM."""
96
99
  llm_chain = PROMPT | llm | StrOutputParser()
@@ -158,6 +161,3 @@ class NatBotChain(Chain):
158
161
  @property
159
162
  def _chain_type(self) -> str:
160
163
  return "nat_bot_chain"
161
-
162
-
163
- NatBotChain.model_rebuild()
@@ -1,23 +1,17 @@
1
- # flake8: noqa
2
1
  import time
3
2
  from sys import platform
4
3
  from typing import (
5
4
  TYPE_CHECKING,
6
5
  Any,
7
- Dict,
8
- Iterable,
9
- List,
10
6
  Optional,
11
- Set,
12
- Tuple,
13
7
  TypedDict,
14
8
  Union,
15
9
  )
16
10
 
17
11
  if TYPE_CHECKING:
18
- from playwright.sync_api import Browser, CDPSession, Page, sync_playwright
12
+ from playwright.sync_api import Browser, CDPSession, Page
19
13
 
20
- black_listed_elements: Set[str] = {
14
+ black_listed_elements: set[str] = {
21
15
  "html",
22
16
  "head",
23
17
  "title",
@@ -40,7 +34,7 @@ class ElementInViewPort(TypedDict):
40
34
  backend_node_id: int
41
35
  node_name: Optional[str]
42
36
  node_value: Optional[str]
43
- node_meta: List[str]
37
+ node_meta: list[str]
44
38
  is_clickable: bool
45
39
  origin_x: int
46
40
  origin_y: int
@@ -69,17 +63,18 @@ class Crawler:
69
63
  def __init__(self) -> None:
70
64
  try:
71
65
  from playwright.sync_api import sync_playwright
72
- except ImportError:
73
- raise ImportError(
66
+ except ImportError as e:
67
+ msg = (
74
68
  "Could not import playwright python package. "
75
69
  "Please install it with `pip install playwright`."
76
70
  )
71
+ raise ImportError(msg) from e
77
72
  self.browser: Browser = (
78
73
  sync_playwright().start().chromium.launch(headless=False)
79
74
  )
80
75
  self.page: Page = self.browser.new_page()
81
76
  self.page.set_viewport_size({"width": 1280, "height": 1080})
82
- self.page_element_buffer: Dict[int, ElementInViewPort]
77
+ self.page_element_buffer: dict[int, ElementInViewPort]
83
78
  self.client: CDPSession
84
79
 
85
80
  def go_to_page(self, url: str) -> None:
@@ -90,15 +85,15 @@ class Crawler:
90
85
  def scroll(self, direction: str) -> None:
91
86
  if direction == "up":
92
87
  self.page.evaluate(
93
- "(document.scrollingElement || document.body).scrollTop = (document.scrollingElement || document.body).scrollTop - window.innerHeight;"
88
+ "(document.scrollingElement || document.body).scrollTop = (document.scrollingElement || document.body).scrollTop - window.innerHeight;" # noqa: E501
94
89
  )
95
90
  elif direction == "down":
96
91
  self.page.evaluate(
97
- "(document.scrollingElement || document.body).scrollTop = (document.scrollingElement || document.body).scrollTop + window.innerHeight;"
92
+ "(document.scrollingElement || document.body).scrollTop = (document.scrollingElement || document.body).scrollTop + window.innerHeight;" # noqa: E501
98
93
  )
99
94
 
100
- def click(self, id: Union[str, int]) -> None:
101
- # Inject javascript into the page which removes the target= attribute from all links
95
+ def click(self, id_: Union[str, int]) -> None:
96
+ # Inject javascript into the page which removes the target= attribute from links
102
97
  js = """
103
98
  links = document.getElementsByTagName("a");
104
99
  for (var i = 0; i < links.length; i++) {
@@ -107,7 +102,7 @@ class Crawler:
107
102
  """
108
103
  self.page.evaluate(js)
109
104
 
110
- element = self.page_element_buffer.get(int(id))
105
+ element = self.page_element_buffer.get(int(id_))
111
106
  if element:
112
107
  x: float = element["center_x"]
113
108
  y: float = element["center_y"]
@@ -116,14 +111,14 @@ class Crawler:
116
111
  else:
117
112
  print("Could not find element") # noqa: T201
118
113
 
119
- def type(self, id: Union[str, int], text: str) -> None:
120
- self.click(id)
114
+ def type(self, id_: Union[str, int], text: str) -> None:
115
+ self.click(id_)
121
116
  self.page.keyboard.type(text)
122
117
 
123
118
  def enter(self) -> None:
124
119
  self.page.keyboard.press("Enter")
125
120
 
126
- def crawl(self) -> List[str]:
121
+ def crawl(self) -> list[str]:
127
122
  page = self.page
128
123
  page_element_buffer = self.page_element_buffer
129
124
  start = time.time()
@@ -141,10 +136,10 @@ class Crawler:
141
136
  win_right_bound: float = win_left_bound + win_width
142
137
  win_lower_bound: float = win_upper_bound + win_height
143
138
 
144
- # percentage_progress_start = (win_upper_bound / document_scroll_height) * 100
145
- # percentage_progress_end = (
146
- # (win_height + win_upper_bound) / document_scroll_height
147
- # ) * 100
139
+ # percentage_progress_start = (win_upper_bound / document_scroll_height) * 100
140
+ # percentage_progress_end = (
141
+ # (win_height + win_upper_bound) / document_scroll_height
142
+ # ) * 100
148
143
  percentage_progress_start = 1
149
144
  percentage_progress_end = 2
150
145
 
@@ -152,9 +147,7 @@ class Crawler:
152
147
  {
153
148
  "x": 0,
154
149
  "y": 0,
155
- "text": "[scrollbar {:0.2f}-{:0.2f}%]".format(
156
- round(percentage_progress_start, 2), round(percentage_progress_end)
157
- ),
150
+ "text": f"[scrollbar {percentage_progress_start:0.2f}-{percentage_progress_end:0.2f}%]", # noqa: E501
158
151
  }
159
152
  )
160
153
 
@@ -162,34 +155,35 @@ class Crawler:
162
155
  "DOMSnapshot.captureSnapshot",
163
156
  {"computedStyles": [], "includeDOMRects": True, "includePaintOrder": True},
164
157
  )
165
- strings: Dict[int, str] = tree["strings"]
166
- document: Dict[str, Any] = tree["documents"][0]
167
- nodes: Dict[str, Any] = document["nodes"]
168
- backend_node_id: Dict[int, int] = nodes["backendNodeId"]
169
- attributes: Dict[int, Dict[int, Any]] = nodes["attributes"]
170
- node_value: Dict[int, int] = nodes["nodeValue"]
171
- parent: Dict[int, int] = nodes["parentIndex"]
172
- node_names: Dict[int, int] = nodes["nodeName"]
173
- is_clickable: Set[int] = set(nodes["isClickable"]["index"])
174
-
175
- input_value: Dict[str, Any] = nodes["inputValue"]
176
- input_value_index: List[int] = input_value["index"]
177
- input_value_values: List[int] = input_value["value"]
178
-
179
- layout: Dict[str, Any] = document["layout"]
180
- layout_node_index: List[int] = layout["nodeIndex"]
181
- bounds: Dict[int, List[float]] = layout["bounds"]
158
+ strings: dict[int, str] = tree["strings"]
159
+ document: dict[str, Any] = tree["documents"][0]
160
+ nodes: dict[str, Any] = document["nodes"]
161
+ backend_node_id: dict[int, int] = nodes["backendNodeId"]
162
+ attributes: dict[int, dict[int, Any]] = nodes["attributes"]
163
+ node_value: dict[int, int] = nodes["nodeValue"]
164
+ parent: dict[int, int] = nodes["parentIndex"]
165
+ node_names: dict[int, int] = nodes["nodeName"]
166
+ is_clickable: set[int] = set(nodes["isClickable"]["index"])
167
+
168
+ input_value: dict[str, Any] = nodes["inputValue"]
169
+ input_value_index: list[int] = input_value["index"]
170
+ input_value_values: list[int] = input_value["value"]
171
+
172
+ layout: dict[str, Any] = document["layout"]
173
+ layout_node_index: list[int] = layout["nodeIndex"]
174
+ bounds: dict[int, list[float]] = layout["bounds"]
182
175
 
183
176
  cursor: int = 0
184
177
 
185
- child_nodes: Dict[str, List[Dict[str, Any]]] = {}
186
- elements_in_view_port: List[ElementInViewPort] = []
178
+ child_nodes: dict[str, list[dict[str, Any]]] = {}
179
+ elements_in_view_port: list[ElementInViewPort] = []
187
180
 
188
- anchor_ancestry: Dict[str, Tuple[bool, Optional[int]]] = {"-1": (False, None)}
189
- button_ancestry: Dict[str, Tuple[bool, Optional[int]]] = {"-1": (False, None)}
181
+ anchor_ancestry: dict[str, tuple[bool, Optional[int]]] = {"-1": (False, None)}
182
+ button_ancestry: dict[str, tuple[bool, Optional[int]]] = {"-1": (False, None)}
190
183
 
191
184
  def convert_name(
192
- node_name: Optional[str], has_click_handler: Optional[bool]
185
+ node_name: Optional[str],
186
+ has_click_handler: Optional[bool], # noqa: FBT001
193
187
  ) -> str:
194
188
  if node_name == "a":
195
189
  return "link"
@@ -201,12 +195,11 @@ class Crawler:
201
195
  node_name == "button" or has_click_handler
202
196
  ): # found pages that needed this quirk
203
197
  return "button"
204
- else:
205
- return "text"
198
+ return "text"
206
199
 
207
200
  def find_attributes(
208
- attributes: Dict[int, Any], keys: List[str]
209
- ) -> Dict[str, str]:
201
+ attributes: dict[int, Any], keys: list[str]
202
+ ) -> dict[str, str]:
210
203
  values = {}
211
204
 
212
205
  for [key_index, value_index] in zip(*(iter(attributes),) * 2):
@@ -225,14 +218,14 @@ class Crawler:
225
218
  return values
226
219
 
227
220
  def add_to_hash_tree(
228
- hash_tree: Dict[str, Tuple[bool, Optional[int]]],
221
+ hash_tree: dict[str, tuple[bool, Optional[int]]],
229
222
  tag: str,
230
223
  node_id: int,
231
224
  node_name: Optional[str],
232
225
  parent_id: int,
233
- ) -> Tuple[bool, Optional[int]]:
226
+ ) -> tuple[bool, Optional[int]]:
234
227
  parent_id_str = str(parent_id)
235
- if not parent_id_str in hash_tree:
228
+ if parent_id_str not in hash_tree:
236
229
  parent_name = strings[node_names[parent_id]].lower()
237
230
  grand_parent_id = parent[parent_id]
238
231
 
@@ -242,9 +235,10 @@ class Crawler:
242
235
 
243
236
  is_parent_desc_anchor, anchor_id = hash_tree[parent_id_str]
244
237
 
245
- # even if the anchor is nested in another anchor, we set the "root" for all descendants to be ::Self
238
+ # even if the anchor is nested in another anchor, we set the "root" for all
239
+ # descendants to be ::Self
246
240
  if node_name == tag:
247
- value: Tuple[bool, Optional[int]] = (True, node_id)
241
+ value: tuple[bool, Optional[int]] = (True, node_id)
248
242
  elif (
249
243
  is_parent_desc_anchor
250
244
  ): # reuse the parent's anchor_id (which could be much higher in the tree)
@@ -253,7 +247,9 @@ class Crawler:
253
247
  value = (
254
248
  False,
255
249
  None,
256
- ) # not a descendant of an anchor, most likely it will become text, an interactive element or discarded
250
+ )
251
+ # not a descendant of an anchor, most likely it will become text, an
252
+ # interactive element or discarded
257
253
 
258
254
  hash_tree[str(node_id)] = value
259
255
 
@@ -272,10 +268,10 @@ class Crawler:
272
268
  )
273
269
 
274
270
  try:
275
- cursor = layout_node_index.index(
276
- index
277
- ) # todo replace this with proper cursoring, ignoring the fact this is O(n^2) for the moment
278
- except:
271
+ cursor = layout_node_index.index(index)
272
+ # TODO replace this with proper cursoring, ignoring the fact this is
273
+ # O(n^2) for the moment
274
+ except ValueError:
279
275
  continue
280
276
 
281
277
  if node_name in black_listed_elements:
@@ -302,9 +298,10 @@ class Crawler:
302
298
  if not partially_is_in_viewport:
303
299
  continue
304
300
 
305
- meta_data: List[str] = []
301
+ meta_data: list[str] = []
306
302
 
307
- # inefficient to grab the same set of keys for kinds of objects, but it's fine for now
303
+ # inefficient to grab the same set of keys for kinds of objects, but it's
304
+ # fine for now
308
305
  element_attributes = find_attributes(
309
306
  attributes[index], ["type", "placeholder", "aria-label", "title", "alt"]
310
307
  )
@@ -325,7 +322,7 @@ class Crawler:
325
322
 
326
323
  if node_name == "#text" and ancestor_exception and ancestor_node:
327
324
  text = strings[node_value[index]]
328
- if text == "|" or text == "•":
325
+ if text in {"|", "•"}:
329
326
  continue
330
327
  ancestor_node.append({"type": "type", "value": text})
331
328
  else:
@@ -355,7 +352,9 @@ class Crawler:
355
352
  element_node_value = strings[node_value[index]]
356
353
  if (
357
354
  element_node_value == "|"
358
- ): # commonly used as a separator, does not add much context - lets save ourselves some token space
355
+ # commonly used as a separator, does not add much context - lets
356
+ # save ourselves some token space
357
+ ):
359
358
  continue
360
359
  elif (
361
360
  node_name == "input"
@@ -368,7 +367,7 @@ class Crawler:
368
367
  element_node_value = strings[text_index]
369
368
 
370
369
  # remove redundant elements
371
- if ancestor_exception and (node_name != "a" and node_name != "button"):
370
+ if ancestor_exception and (node_name not in {"a", "button"}):
372
371
  continue
373
372
 
374
373
  elements_in_view_port.append(
@@ -386,7 +385,8 @@ class Crawler:
386
385
  }
387
386
  )
388
387
 
389
- # lets filter further to remove anything that does not hold any text nor has click handlers + merge text from leaf#text nodes with the parent
388
+ # lets filter further to remove anything that does not hold any text nor has
389
+ # click handlers + merge text from leaf#text nodes with the parent
390
390
  elements_of_interest = []
391
391
  id_counter = 0
392
392
 
@@ -395,7 +395,7 @@ class Crawler:
395
395
  node_name = element.get("node_name")
396
396
  element_node_value = element.get("node_value")
397
397
  node_is_clickable = element.get("is_clickable")
398
- node_meta_data: Optional[List[str]] = element.get("node_meta")
398
+ node_meta_data: Optional[list[str]] = element.get("node_meta")
399
399
 
400
400
  inner_text = f"{element_node_value} " if element_node_value else ""
401
401
  meta = ""
@@ -423,10 +423,7 @@ class Crawler:
423
423
  # not very elegant, more like a placeholder
424
424
  if (
425
425
  (converted_node_name != "button" or meta == "")
426
- and converted_node_name != "link"
427
- and converted_node_name != "input"
428
- and converted_node_name != "img"
429
- and converted_node_name != "textarea"
426
+ and converted_node_name not in {"link", "input", "img", "textarea"}
430
427
  ) and inner_text.strip() == "":
431
428
  continue
432
429
 
@@ -434,7 +431,7 @@ class Crawler:
434
431
 
435
432
  if inner_text != "":
436
433
  elements_of_interest.append(
437
- f"""<{converted_node_name} id={id_counter}{meta}>{inner_text}</{converted_node_name}>"""
434
+ f"""<{converted_node_name} id={id_counter}{meta}>{inner_text}</{converted_node_name}>""" # noqa: E501
438
435
  )
439
436
  else:
440
437
  elements_of_interest.append(
@@ -442,5 +439,5 @@ class Crawler:
442
439
  )
443
440
  id_counter += 1
444
441
 
445
- print("Parsing time: {:0.2f} seconds".format(time.time() - start)) # noqa: T201
442
+ print(f"Parsing time: {time.time() - start:0.2f} seconds") # noqa: T201
446
443
  return elements_of_interest
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  from langchain_core.prompts.prompt import PromptTemplate
3
2
 
4
3
  _PROMPT_TEMPLATE = """
@@ -115,7 +114,7 @@ CURRENT BROWSER CONTENT:
115
114
  <text id=10>7:00 PM</text>
116
115
  <text id=11>2 people</text>
117
116
  <input id=12 alt="Location, Restaurant, or Cuisine"></input>
118
- <button id=13>Lets go</button>
117
+ <button id=13>Let's go</button>
119
118
  <text id=14>It looks like you're in Peninsula. Not correct?</text>
120
119
  <button id=15>Get current location</button>
121
120
  <button id=16>Next</button>
@@ -137,7 +136,7 @@ OBJECTIVE: {objective}
137
136
  CURRENT URL: {url}
138
137
  PREVIOUS COMMAND: {previous_command}
139
138
  YOUR COMMAND:
140
- """
139
+ """ # noqa: E501
141
140
  PROMPT = PromptTemplate(
142
141
  input_variables=["browser_content", "url", "previous_command", "objective"],
143
142
  template=_PROMPT_TEMPLATE,
@@ -28,17 +28,17 @@ from langchain.chains.structured_output.base import (
28
28
 
29
29
  __all__ = [
30
30
  "convert_to_openai_function",
31
- "create_tagging_chain",
32
- "create_tagging_chain_pydantic",
33
- "create_extraction_chain_pydantic",
34
- "create_extraction_chain",
35
31
  "create_citation_fuzzy_match_chain",
36
32
  "create_citation_fuzzy_match_runnable",
37
- "create_qa_with_structure_chain",
33
+ "create_extraction_chain",
34
+ "create_extraction_chain_pydantic",
35
+ "create_openai_fn_chain",
36
+ "create_openai_fn_runnable", # backwards compatibility
38
37
  "create_qa_with_sources_chain",
38
+ "create_qa_with_structure_chain",
39
39
  "create_structured_output_chain",
40
- "create_openai_fn_chain",
41
40
  "create_structured_output_runnable", # backwards compatibility
42
- "create_openai_fn_runnable", # backwards compatibility
41
+ "create_tagging_chain",
42
+ "create_tagging_chain_pydantic",
43
43
  "get_openai_output_parser", # backwards compatibility
44
44
  ]
@@ -31,13 +31,13 @@ from langchain.chains.structured_output.base import (
31
31
  )
32
32
 
33
33
  __all__ = [
34
- "get_openai_output_parser",
35
- "create_openai_fn_runnable",
36
- "create_structured_output_runnable", # deprecated
37
- "create_openai_fn_chain", # deprecated
38
- "create_structured_output_chain", # deprecated
39
34
  "PYTHON_TO_JSON_TYPES", # backwards compatibility
40
35
  "convert_to_openai_function", # backwards compatibility
36
+ "create_openai_fn_chain", # deprecated
37
+ "create_openai_fn_runnable",
38
+ "create_structured_output_chain", # deprecated
39
+ "create_structured_output_runnable", # deprecated
40
+ "get_openai_output_parser",
41
41
  ]
42
42
 
43
43
 
@@ -123,7 +123,8 @@ def create_openai_fn_chain(
123
123
  # -> RecordDog(name="Harry", color="brown", fav_food="chicken")
124
124
  """ # noqa: E501
125
125
  if not functions:
126
- raise ValueError("Need to pass in at least one function. Received zero.")
126
+ msg = "Need to pass in at least one function. Received zero."
127
+ raise ValueError(msg)
127
128
  openai_functions = [convert_to_openai_function(f) for f in functions]
128
129
  output_parser = output_parser or get_openai_output_parser(functions)
129
130
  llm_kwargs: dict[str, Any] = {
@@ -131,7 +132,7 @@ def create_openai_fn_chain(
131
132
  }
132
133
  if len(openai_functions) == 1 and enforce_single_function_usage:
133
134
  llm_kwargs["function_call"] = {"name": openai_functions[0]["name"]}
134
- llm_chain = LLMChain(
135
+ return LLMChain(
135
136
  llm=llm,
136
137
  prompt=prompt,
137
138
  output_parser=output_parser,
@@ -139,11 +140,12 @@ def create_openai_fn_chain(
139
140
  output_key=output_key,
140
141
  **kwargs,
141
142
  )
142
- return llm_chain
143
143
 
144
144
 
145
145
  @deprecated(
146
- since="0.1.1", removal="1.0", alternative="ChatOpenAI.with_structured_output"
146
+ since="0.1.1",
147
+ removal="1.0",
148
+ alternative="ChatOpenAI.with_structured_output",
147
149
  )
148
150
  def create_structured_output_chain(
149
151
  output_schema: Union[dict[str, Any], type[BaseModel]],
@@ -220,7 +222,8 @@ def create_structured_output_chain(
220
222
 
221
223
  function = _OutputFormatter
222
224
  output_parser = output_parser or PydanticAttrOutputFunctionsParser(
223
- pydantic_schema=_OutputFormatter, attr_name="output"
225
+ pydantic_schema=_OutputFormatter,
226
+ attr_name="output",
224
227
  )
225
228
  return create_openai_fn_chain(
226
229
  [function],
@@ -88,23 +88,22 @@ def create_citation_fuzzy_match_runnable(llm: BaseChatModel) -> Runnable:
88
88
  Runnable that can be used to answer questions with citations.
89
89
  """
90
90
  if llm.bind_tools is BaseChatModel.bind_tools:
91
- raise ValueError(
92
- "Language model must implement bind_tools to use this function."
93
- )
91
+ msg = "Language model must implement bind_tools to use this function."
92
+ raise ValueError(msg)
94
93
  prompt = ChatPromptTemplate(
95
94
  [
96
95
  SystemMessage(
97
96
  "You are a world class algorithm to answer "
98
- "questions with correct and exact citations."
97
+ "questions with correct and exact citations.",
99
98
  ),
100
99
  HumanMessagePromptTemplate.from_template(
101
100
  "Answer question using the following context."
102
101
  "\n\n{context}"
103
102
  "\n\nQuestion: {question}"
104
103
  "\n\nTips: Make sure to cite your sources, "
105
- "and use the exact words from the context."
104
+ "and use the exact words from the context.",
106
105
  ),
107
- ]
106
+ ],
108
107
  )
109
108
  return prompt | llm.with_structured_output(QuestionAnswer)
110
109
 
@@ -124,7 +123,10 @@ def create_citation_fuzzy_match_chain(llm: BaseLanguageModel) -> LLMChain:
124
123
  Chain (LLMChain) that can be used to answer questions with citations.
125
124
  """
126
125
  output_parser = PydanticOutputFunctionsParser(pydantic_schema=QuestionAnswer)
127
- schema = QuestionAnswer.schema()
126
+ if hasattr(QuestionAnswer, "model_json_schema"):
127
+ schema = QuestionAnswer.model_json_schema()
128
+ else:
129
+ schema = QuestionAnswer.schema()
128
130
  function = {
129
131
  "name": schema["title"],
130
132
  "description": schema["description"],
@@ -136,7 +138,7 @@ def create_citation_fuzzy_match_chain(llm: BaseLanguageModel) -> LLMChain:
136
138
  content=(
137
139
  "You are a world class algorithm to answer "
138
140
  "questions with correct and exact citations."
139
- )
141
+ ),
140
142
  ),
141
143
  HumanMessage(content="Answer question using the following context"),
142
144
  HumanMessagePromptTemplate.from_template("{context}"),
@@ -145,15 +147,14 @@ def create_citation_fuzzy_match_chain(llm: BaseLanguageModel) -> LLMChain:
145
147
  content=(
146
148
  "Tips: Make sure to cite your sources, "
147
149
  "and use the exact words from the context."
148
- )
150
+ ),
149
151
  ),
150
152
  ]
151
153
  prompt = ChatPromptTemplate(messages=messages) # type: ignore[arg-type]
152
154
 
153
- chain = LLMChain(
155
+ return LLMChain(
154
156
  llm=llm,
155
157
  prompt=prompt,
156
158
  llm_kwargs=llm_kwargs,
157
159
  output_parser=output_parser,
158
160
  )
159
- return chain