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
@@ -28,8 +28,7 @@ def _get_messages_from_run_dict(messages: list[dict]) -> list[BaseMessage]:
28
28
  first_message = messages[0]
29
29
  if "lc" in first_message:
30
30
  return [load(dumpd(message)) for message in messages]
31
- else:
32
- return messages_from_dict(messages)
31
+ return messages_from_dict(messages)
33
32
 
34
33
 
35
34
  class StringRunMapper(Serializable):
@@ -47,7 +46,8 @@ class StringRunMapper(Serializable):
47
46
  def __call__(self, run: Run) -> dict[str, str]:
48
47
  """Maps the Run to a dictionary."""
49
48
  if not run.outputs:
50
- raise ValueError(f"Run {run.id} has no outputs to evaluate.")
49
+ msg = f"Run {run.id} has no outputs to evaluate."
50
+ raise ValueError(msg)
51
51
  return self.map(run)
52
52
 
53
53
 
@@ -63,9 +63,11 @@ class LLMStringRunMapper(StringRunMapper):
63
63
  # Runs from Tracer have messages as a list of lists of dicts
64
64
  chat_messages = _get_messages_from_run_dict(messages[0])
65
65
  else:
66
- raise ValueError(f"Could not extract messages to evaluate {messages}")
66
+ msg = f"Could not extract messages to evaluate {messages}"
67
+ raise ValueError(msg)
67
68
  return get_buffer_string(chat_messages)
68
- raise ValueError(f"Could not extract messages to evaluate {messages}")
69
+ msg = f"Could not extract messages to evaluate {messages}"
70
+ raise ValueError(msg)
69
71
 
70
72
  def serialize_inputs(self, inputs: dict) -> str:
71
73
  if "prompts" in inputs: # Should we even accept this?
@@ -75,15 +77,18 @@ class LLMStringRunMapper(StringRunMapper):
75
77
  elif "messages" in inputs:
76
78
  input_ = self.serialize_chat_messages(inputs["messages"])
77
79
  else:
78
- raise ValueError("LLM Run must have either messages or prompts as inputs.")
80
+ msg = "LLM Run must have either messages or prompts as inputs."
81
+ raise ValueError(msg)
79
82
  return input_
80
83
 
81
84
  def serialize_outputs(self, outputs: dict) -> str:
82
85
  if not outputs.get("generations"):
83
- raise ValueError("Cannot evaluate LLM Run without generations.")
86
+ msg = "Cannot evaluate LLM Run without generations."
87
+ raise ValueError(msg)
84
88
  generations: list[dict] = outputs["generations"]
85
89
  if not generations:
86
- raise ValueError("Cannot evaluate LLM run with empty generations.")
90
+ msg = "Cannot evaluate LLM run with empty generations."
91
+ raise ValueError(msg)
87
92
  first_generation: dict = generations[0]
88
93
  if isinstance(first_generation, list):
89
94
  # Runs from Tracer have generations as a list of lists of dicts
@@ -98,30 +103,25 @@ class LLMStringRunMapper(StringRunMapper):
98
103
  def map(self, run: Run) -> dict[str, str]:
99
104
  """Maps the Run to a dictionary."""
100
105
  if run.run_type != "llm":
101
- raise ValueError("LLM RunMapper only supports LLM runs.")
102
- elif not run.outputs:
106
+ msg = "LLM RunMapper only supports LLM runs."
107
+ raise ValueError(msg)
108
+ if not run.outputs:
103
109
  if run.error:
104
- raise ValueError(
105
- f"Cannot evaluate errored LLM run {run.id}: {run.error}"
106
- )
107
- else:
108
- raise ValueError(
109
- f"Run {run.id} has no outputs. Cannot evaluate this run."
110
- )
111
- else:
112
- try:
113
- inputs = self.serialize_inputs(run.inputs)
114
- except Exception as e:
115
- raise ValueError(
116
- f"Could not parse LM input from run inputs {run.inputs}"
117
- ) from e
118
- try:
119
- output_ = self.serialize_outputs(run.outputs)
120
- except Exception as e:
121
- raise ValueError(
122
- f"Could not parse LM prediction from run outputs {run.outputs}"
123
- ) from e
124
- return {"input": inputs, "prediction": output_}
110
+ msg = f"Cannot evaluate errored LLM run {run.id}: {run.error}"
111
+ raise ValueError(msg)
112
+ msg = f"Run {run.id} has no outputs. Cannot evaluate this run."
113
+ raise ValueError(msg)
114
+ try:
115
+ inputs = self.serialize_inputs(run.inputs)
116
+ except Exception as e:
117
+ msg = f"Could not parse LM input from run inputs {run.inputs}"
118
+ raise ValueError(msg) from e
119
+ try:
120
+ output_ = self.serialize_outputs(run.outputs)
121
+ except Exception as e:
122
+ msg = f"Could not parse LM prediction from run outputs {run.outputs}"
123
+ raise ValueError(msg) from e
124
+ return {"input": inputs, "prediction": output_}
125
125
 
126
126
 
127
127
  class ChainStringRunMapper(StringRunMapper):
@@ -139,45 +139,47 @@ class ChainStringRunMapper(StringRunMapper):
139
139
  def _get_key(self, source: dict, key: Optional[str], which: str) -> str:
140
140
  if key is not None:
141
141
  return source[key]
142
- elif len(source) == 1:
142
+ if len(source) == 1:
143
143
  return next(iter(source.values()))
144
- else:
145
- raise ValueError(
146
- f"Could not map run {which} with multiple keys: "
147
- f"{source}\nPlease manually specify a {which}_key"
148
- )
144
+ msg = (
145
+ f"Could not map run {which} with multiple keys: "
146
+ f"{source}\nPlease manually specify a {which}_key"
147
+ )
148
+ raise ValueError(msg)
149
149
 
150
150
  def map(self, run: Run) -> dict[str, str]:
151
151
  """Maps the Run to a dictionary."""
152
152
  if not run.outputs:
153
- raise ValueError(
153
+ msg = (
154
154
  f"Run with ID {run.id} lacks outputs required for evaluation."
155
155
  " Ensure the Run has valid outputs."
156
156
  )
157
+ raise ValueError(msg)
157
158
  if self.input_key is not None and self.input_key not in run.inputs:
158
- raise ValueError(
159
+ msg = (
159
160
  f"Run with ID {run.id} is missing the expected input key"
160
161
  f" '{self.input_key}'.\nAvailable input keys in this Run"
161
162
  f" are: {run.inputs.keys()}.\nAdjust the evaluator's"
162
163
  f" input_key or ensure your input data includes key"
163
164
  f" '{self.input_key}'."
164
165
  )
165
- elif self.prediction_key is not None and self.prediction_key not in run.outputs:
166
+ raise ValueError(msg)
167
+ if self.prediction_key is not None and self.prediction_key not in run.outputs:
166
168
  available_keys = ", ".join(run.outputs.keys())
167
- raise ValueError(
169
+ msg = (
168
170
  f"Run with ID {run.id} doesn't have the expected prediction key"
169
171
  f" '{self.prediction_key}'. Available prediction keys in this Run are:"
170
172
  f" {available_keys}. Adjust the evaluator's prediction_key or"
171
173
  " ensure the Run object's outputs the expected key."
172
174
  )
175
+ raise ValueError(msg)
173
176
 
174
- else:
175
- input_ = self._get_key(run.inputs, self.input_key, "input")
176
- prediction = self._get_key(run.outputs, self.prediction_key, "prediction")
177
- return {
178
- "input": input_,
179
- "prediction": prediction,
180
- }
177
+ input_ = self._get_key(run.inputs, self.input_key, "input")
178
+ prediction = self._get_key(run.outputs, self.prediction_key, "prediction")
179
+ return {
180
+ "input": input_,
181
+ "prediction": prediction,
182
+ }
181
183
 
182
184
 
183
185
  class ToolStringRunMapper(StringRunMapper):
@@ -185,7 +187,8 @@ class ToolStringRunMapper(StringRunMapper):
185
187
 
186
188
  def map(self, run: Run) -> dict[str, str]:
187
189
  if not run.outputs:
188
- raise ValueError(f"Run {run.id} has no outputs to evaluate.")
190
+ msg = f"Run {run.id} has no outputs to evaluate."
191
+ raise ValueError(msg)
189
192
  return {"input": run.inputs["input"], "prediction": run.outputs["output"]}
190
193
 
191
194
 
@@ -207,36 +210,35 @@ class StringExampleMapper(Serializable):
207
210
  def map(self, example: Example) -> dict[str, str]:
208
211
  """Maps the Example, or dataset row to a dictionary."""
209
212
  if not example.outputs:
210
- raise ValueError(
211
- f"Example {example.id} has no outputs to use as a reference."
212
- )
213
+ msg = f"Example {example.id} has no outputs to use as a reference."
214
+ raise ValueError(msg)
213
215
  if self.reference_key is None:
214
216
  if len(example.outputs) > 1:
215
- raise ValueError(
217
+ msg = (
216
218
  f"Example {example.id} has multiple outputs, so you must"
217
219
  " specify a reference_key."
218
220
  )
219
- else:
220
- output = list(example.outputs.values())[0]
221
+ raise ValueError(msg)
222
+ output = next(iter(example.outputs.values()))
221
223
  elif self.reference_key not in example.outputs:
222
- raise ValueError(
224
+ msg = (
223
225
  f"Example {example.id} does not have reference key"
224
226
  f" {self.reference_key}."
225
227
  )
228
+ raise ValueError(msg)
226
229
  else:
227
230
  output = example.outputs[self.reference_key]
228
231
  return {
229
232
  "reference": self.serialize_chat_messages([output])
230
233
  if isinstance(output, dict) and output.get("type") and output.get("data")
231
- else output
234
+ else output,
232
235
  }
233
236
 
234
237
  def __call__(self, example: Example) -> dict[str, str]:
235
238
  """Maps the Run and Example to a dictionary."""
236
239
  if not example.outputs:
237
- raise ValueError(
238
- f"Example {example.id} has no outputs to use as areference label."
239
- )
240
+ msg = f"Example {example.id} has no outputs to use as areference label."
241
+ raise ValueError(msg)
240
242
  return self.map(example)
241
243
 
242
244
 
@@ -271,16 +273,19 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
271
273
  if example and self.example_mapper and self.string_evaluator.requires_reference:
272
274
  evaluate_strings_inputs.update(self.example_mapper(example))
273
275
  elif self.string_evaluator.requires_reference:
274
- raise ValueError(
276
+ msg = (
275
277
  f"Evaluator {self.name} requires an reference"
276
278
  " example from the dataset,"
277
279
  f" but none was provided for run {run.id}."
278
280
  )
281
+ raise ValueError(msg)
279
282
  return evaluate_strings_inputs
280
283
 
281
284
  def _prepare_output(self, output: dict[str, Any]) -> dict[str, Any]:
282
285
  evaluation_result = EvaluationResult(
283
- key=self.name, comment=output.get("reasoning"), **output
286
+ key=self.name,
287
+ comment=output.get("reasoning"),
288
+ **output,
284
289
  )
285
290
  if RUN_KEY in output:
286
291
  # TODO: Not currently surfaced. Update
@@ -351,7 +356,8 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
351
356
  """Evaluate an example."""
352
357
  try:
353
358
  result = await self.acall(
354
- {"run": run, "example": example}, include_run_info=True
359
+ {"run": run, "example": example},
360
+ include_run_info=True,
355
361
  )
356
362
  return self._prepare_evaluator_output(result)
357
363
  except Exception as e:
@@ -402,12 +408,12 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
402
408
  run_mapper: StringRunMapper = LLMStringRunMapper()
403
409
  elif run_type == "chain":
404
410
  run_mapper = ChainStringRunMapper(
405
- input_key=input_key, prediction_key=prediction_key
411
+ input_key=input_key,
412
+ prediction_key=prediction_key,
406
413
  )
407
414
  else:
408
- raise ValueError(
409
- f"Unsupported run type {run_type}. Expected one of 'llm' or 'chain'."
410
- )
415
+ msg = f"Unsupported run type {run_type}. Expected one of 'llm' or 'chain'."
416
+ raise ValueError(msg)
411
417
 
412
418
  # Configure how example rows are fed as a reference string to the evaluator
413
419
  if (
@@ -417,11 +423,12 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
417
423
  ):
418
424
  example_mapper = StringExampleMapper(reference_key=reference_key)
419
425
  elif evaluator.requires_reference:
420
- raise ValueError(
426
+ msg = (
421
427
  f"Evaluator {evaluator.evaluation_name} requires a reference"
422
428
  " example from the dataset. Please specify the reference key from"
423
429
  " amongst the dataset outputs keys."
424
430
  )
431
+ raise ValueError(msg)
425
432
  else:
426
433
  example_mapper = None
427
434
  return cls(
@@ -44,8 +44,6 @@ def __getattr__(name: str) -> Any:
44
44
 
45
45
 
46
46
  __all__ = [
47
- "create_kv_docstore",
48
- "create_lc_store",
49
47
  "EncoderBackedStore",
50
48
  "InMemoryByteStore",
51
49
  "InMemoryStore",
@@ -54,4 +52,6 @@ __all__ = [
54
52
  "RedisStore",
55
53
  "UpstashRedisByteStore",
56
54
  "UpstashRedisStore",
55
+ "create_kv_docstore",
56
+ "create_lc_store",
57
57
  ]
@@ -17,7 +17,8 @@ def _dump_as_bytes(obj: Serializable) -> bytes:
17
17
  def _dump_document_as_bytes(obj: Document) -> bytes:
18
18
  """Return a bytes representation of a document."""
19
19
  if not isinstance(obj, Document):
20
- raise TypeError("Expected a Document instance")
20
+ msg = "Expected a Document instance"
21
+ raise TypeError(msg)
21
22
  return dumps(obj).encode("utf-8")
22
23
 
23
24
 
@@ -25,7 +26,8 @@ def _load_document_from_bytes(serialized: bytes) -> Document:
25
26
  """Return a document from a bytes representation."""
26
27
  obj = loads(serialized.decode("utf-8"))
27
28
  if not isinstance(obj, Document):
28
- raise TypeError(f"Expected a Document instance. Got {type(obj)}")
29
+ msg = f"Expected a Document instance. Got {type(obj)}"
30
+ raise TypeError(msg)
29
31
  return obj
30
32
 
31
33
 
@@ -106,7 +106,9 @@ class EncoderBackedStore(BaseStore[K, V]):
106
106
  await self.store.amdelete(encoded_keys)
107
107
 
108
108
  def yield_keys(
109
- self, *, prefix: Optional[str] = None
109
+ self,
110
+ *,
111
+ prefix: Optional[str] = None,
110
112
  ) -> Union[Iterator[K], Iterator[str]]:
111
113
  """Get an iterator over keys that match the given prefix."""
112
114
  # For the time being this does not return K, but str
@@ -114,7 +116,9 @@ class EncoderBackedStore(BaseStore[K, V]):
114
116
  yield from self.store.yield_keys(prefix=prefix)
115
117
 
116
118
  async def ayield_keys(
117
- self, *, prefix: Optional[str] = None
119
+ self,
120
+ *,
121
+ prefix: Optional[str] = None,
118
122
  ) -> Union[AsyncIterator[K], AsyncIterator[str]]:
119
123
  """Get an iterator over keys that match the given prefix."""
120
124
  # For the time being this does not return K, but str
@@ -75,34 +75,37 @@ class LocalFileStore(ByteStore):
75
75
  Path: The full path for the given key.
76
76
  """
77
77
  if not re.match(r"^[a-zA-Z0-9_.\-/]+$", key):
78
- raise InvalidKeyException(f"Invalid characters in key: {key}")
79
- full_path = os.path.abspath(self.root_path / key)
80
- common_path = os.path.commonpath([str(self.root_path), full_path])
81
- if common_path != str(self.root_path):
82
- raise InvalidKeyException(
83
- f"Invalid key: {key}. Key should be relative to the full path."
84
- f"{self.root_path} vs. {common_path} and full path of {full_path}"
78
+ msg = f"Invalid characters in key: {key}"
79
+ raise InvalidKeyException(msg)
80
+ full_path = (self.root_path / key).resolve()
81
+ root_path = self.root_path.resolve()
82
+ common_path = os.path.commonpath([root_path, full_path])
83
+ if common_path != str(root_path):
84
+ msg = (
85
+ f"Invalid key: {key}. Key should be relative to the full path. "
86
+ f"{root_path} vs. {common_path} and full path of {full_path}"
85
87
  )
88
+ raise InvalidKeyException(msg)
86
89
 
87
- return Path(full_path)
90
+ return full_path
88
91
 
89
- def _mkdir_for_store(self, dir: Path) -> None:
92
+ def _mkdir_for_store(self, dir_path: Path) -> None:
90
93
  """Makes a store directory path (including parents) with specified permissions
91
94
 
92
95
  This is needed because `Path.mkdir()` is restricted by the current `umask`,
93
96
  whereas the explicit `os.chmod()` used here is not.
94
97
 
95
98
  Args:
96
- dir: (Path) The store directory to make
99
+ dir_path: (Path) The store directory to make
97
100
 
98
101
  Returns:
99
102
  None
100
103
  """
101
- if not dir.exists():
102
- self._mkdir_for_store(dir.parent)
103
- dir.mkdir(exist_ok=True)
104
+ if not dir_path.exists():
105
+ self._mkdir_for_store(dir_path.parent)
106
+ dir_path.mkdir(exist_ok=True)
104
107
  if self.chmod_dir is not None:
105
- os.chmod(dir, self.chmod_dir)
108
+ dir_path.chmod(self.chmod_dir)
106
109
 
107
110
  def mget(self, keys: Sequence[str]) -> list[Optional[bytes]]:
108
111
  """Get the values associated with the given keys.
@@ -122,7 +125,7 @@ class LocalFileStore(ByteStore):
122
125
  values.append(value)
123
126
  if self.update_atime:
124
127
  # update access time only; preserve modified time
125
- os.utime(full_path, (time.time(), os.stat(full_path).st_mtime))
128
+ os.utime(full_path, (time.time(), full_path.stat().st_mtime))
126
129
  else:
127
130
  values.append(None)
128
131
  return values
@@ -141,7 +144,7 @@ class LocalFileStore(ByteStore):
141
144
  self._mkdir_for_store(full_path.parent)
142
145
  full_path.write_bytes(value)
143
146
  if self.chmod_file is not None:
144
- os.chmod(full_path, self.chmod_file)
147
+ full_path.chmod(self.chmod_file)
145
148
 
146
149
  def mdelete(self, keys: Sequence[str]) -> None:
147
150
  """Delete the given keys and their associated values.
@@ -7,7 +7,7 @@ primarily for unit testing purposes.
7
7
  from langchain_core.stores import InMemoryBaseStore, InMemoryByteStore, InMemoryStore
8
8
 
9
9
  __all__ = [
10
- "InMemoryStore",
11
10
  "InMemoryBaseStore",
12
11
  "InMemoryByteStore",
12
+ "InMemoryStore",
13
13
  ]
@@ -22,6 +22,6 @@ def __getattr__(name: str) -> Any:
22
22
 
23
23
 
24
24
  __all__ = [
25
- "UpstashRedisStore",
26
25
  "UpstashRedisByteStore",
26
+ "UpstashRedisStore",
27
27
  ]
@@ -27,24 +27,24 @@ from langchain_text_splitters.sentence_transformers import (
27
27
  from langchain_text_splitters.spacy import SpacyTextSplitter
28
28
 
29
29
  __all__ = [
30
- "TokenTextSplitter",
31
- "TextSplitter",
32
- "Tokenizer",
33
- "Language",
34
- "RecursiveCharacterTextSplitter",
35
- "RecursiveJsonSplitter",
36
- "LatexTextSplitter",
37
- "PythonCodeTextSplitter",
38
- "KonlpyTextSplitter",
39
- "SpacyTextSplitter",
40
- "NLTKTextSplitter",
41
- "split_text_on_tokens",
42
- "SentenceTransformersTokenTextSplitter",
30
+ "CharacterTextSplitter",
43
31
  "ElementType",
32
+ "HTMLHeaderTextSplitter",
44
33
  "HeaderType",
34
+ "KonlpyTextSplitter",
35
+ "Language",
36
+ "LatexTextSplitter",
45
37
  "LineType",
46
- "HTMLHeaderTextSplitter",
47
38
  "MarkdownHeaderTextSplitter",
48
39
  "MarkdownTextSplitter",
49
- "CharacterTextSplitter",
40
+ "NLTKTextSplitter",
41
+ "PythonCodeTextSplitter",
42
+ "RecursiveCharacterTextSplitter",
43
+ "RecursiveJsonSplitter",
44
+ "SentenceTransformersTokenTextSplitter",
45
+ "SpacyTextSplitter",
46
+ "TextSplitter",
47
+ "TokenTextSplitter",
48
+ "Tokenizer",
49
+ "split_text_on_tokens",
50
50
  ]
@@ -39,7 +39,7 @@ _DEPRECATED_TOOLS = {"PythonAstREPLTool", "PythonREPLTool"}
39
39
 
40
40
 
41
41
  def _import_python_tool_PythonAstREPLTool() -> Any:
42
- raise ImportError(
42
+ msg = (
43
43
  "This tool has been moved to langchain experiment. "
44
44
  "This tool has access to a python REPL. "
45
45
  "For best practices make sure to sandbox this tool. "
@@ -47,10 +47,11 @@ def _import_python_tool_PythonAstREPLTool() -> Any:
47
47
  "To keep using this code as is, install langchain experimental and "
48
48
  "update relevant imports replacing 'langchain' with 'langchain_experimental'"
49
49
  )
50
+ raise ImportError(msg)
50
51
 
51
52
 
52
53
  def _import_python_tool_PythonREPLTool() -> Any:
53
- raise ImportError(
54
+ msg = (
54
55
  "This tool has been moved to langchain experiment. "
55
56
  "This tool has access to a python REPL. "
56
57
  "For best practices make sure to sandbox this tool. "
@@ -58,36 +59,33 @@ def _import_python_tool_PythonREPLTool() -> Any:
58
59
  "To keep using this code as is, install langchain experimental and "
59
60
  "update relevant imports replacing 'langchain' with 'langchain_experimental'"
60
61
  )
62
+ raise ImportError(msg)
61
63
 
62
64
 
63
65
  def __getattr__(name: str) -> Any:
64
66
  if name == "PythonAstREPLTool":
65
67
  return _import_python_tool_PythonAstREPLTool()
66
- elif name == "PythonREPLTool":
68
+ if name == "PythonREPLTool":
67
69
  return _import_python_tool_PythonREPLTool()
68
- else:
69
- from langchain_community import tools
70
+ from langchain_community import tools
70
71
 
71
- # If not in interactive env, raise warning.
72
- if not is_interactive_env():
73
- warnings.warn(
74
- "Importing tools from langchain is deprecated. Importing from "
75
- "langchain will no longer be supported as of langchain==0.2.0. "
76
- "Please import from langchain-community instead:\n\n"
77
- f"`from langchain_community.tools import {name}`.\n\n"
78
- "To install langchain-community run "
79
- "`pip install -U langchain-community`.",
80
- category=LangChainDeprecationWarning,
81
- )
72
+ # If not in interactive env, raise warning.
73
+ if not is_interactive_env():
74
+ warnings.warn(
75
+ "Importing tools from langchain is deprecated. Importing from "
76
+ "langchain will no longer be supported as of langchain==0.2.0. "
77
+ "Please import from langchain-community instead:\n\n"
78
+ f"`from langchain_community.tools import {name}`.\n\n"
79
+ "To install langchain-community run "
80
+ "`pip install -U langchain-community`.",
81
+ stacklevel=2,
82
+ category=LangChainDeprecationWarning,
83
+ )
82
84
 
83
- return getattr(tools, name)
85
+ return getattr(tools, name)
84
86
 
85
87
 
86
88
  __all__ = [
87
- "StructuredTool",
88
- "BaseTool",
89
- "tool",
90
- "Tool",
91
89
  "AINAppOps",
92
90
  "AINOwnerOps",
93
91
  "AINRuleOps",
@@ -105,6 +103,7 @@ __all__ = [
105
103
  "BaseRequestsTool",
106
104
  "BaseSQLDatabaseTool",
107
105
  "BaseSparkSQLTool",
106
+ "BaseTool",
108
107
  "BearlyInterpreterTool",
109
108
  "BingSearchResults",
110
109
  "BingSearchRun",
@@ -140,8 +139,6 @@ __all__ = [
140
139
  "GoogleSearchRun",
141
140
  "GoogleSerperResults",
142
141
  "GoogleSerperRun",
143
- "SearchAPIResults",
144
- "SearchAPIRun",
145
142
  "HumanInputRun",
146
143
  "IFTTTWebhook",
147
144
  "InfoPowerBITool",
@@ -168,20 +165,21 @@ __all__ = [
168
165
  "OpenAPISpec",
169
166
  "OpenWeatherMapQueryRun",
170
167
  "PubmedQueryRun",
171
- "RedditSearchRun",
172
168
  "QueryCheckerTool",
173
169
  "QueryPowerBITool",
174
170
  "QuerySQLCheckerTool",
175
171
  "QuerySQLDataBaseTool",
176
172
  "QuerySparkSQLTool",
177
173
  "ReadFileTool",
174
+ "RedditSearchRun",
178
175
  "RequestsDeleteTool",
179
176
  "RequestsGetTool",
180
177
  "RequestsPatchTool",
181
178
  "RequestsPostTool",
182
179
  "RequestsPutTool",
183
- "SteamWebAPIQueryRun",
184
180
  "SceneXplainTool",
181
+ "SearchAPIResults",
182
+ "SearchAPIRun",
185
183
  "SearxSearchResults",
186
184
  "SearxSearchRun",
187
185
  "ShellTool",
@@ -190,9 +188,12 @@ __all__ = [
190
188
  "SlackScheduleMessage",
191
189
  "SlackSendMessage",
192
190
  "SleepTool",
193
- "StdInInquireTool",
194
191
  "StackExchangeTool",
192
+ "StdInInquireTool",
193
+ "SteamWebAPIQueryRun",
195
194
  "SteamshipImageGenerationTool",
195
+ "StructuredTool",
196
+ "Tool",
196
197
  "VectorStoreQATool",
197
198
  "VectorStoreQAWithSourcesTool",
198
199
  "WikipediaQueryRun",
@@ -203,4 +204,5 @@ __all__ = [
203
204
  "ZapierNLAListActions",
204
205
  "ZapierNLARunAction",
205
206
  "format_tool_to_openai_function",
207
+ "tool",
206
208
  ]
@@ -24,7 +24,7 @@ def __getattr__(name: str) -> Any:
24
24
 
25
25
 
26
26
  __all__ = [
27
+ "AINAppOps",
27
28
  "AppOperationType",
28
29
  "AppSchema",
29
- "AINAppOps",
30
30
  ]
@@ -22,6 +22,6 @@ def __getattr__(name: str) -> Any:
22
22
 
23
23
 
24
24
  __all__ = [
25
- "OperationType",
26
25
  "AINBaseTool",
26
+ "OperationType",
27
27
  ]
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "RuleSchema",
27
26
  "AINOwnerOps",
27
+ "RuleSchema",
28
28
  ]
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "RuleSchema",
27
26
  "AINRuleOps",
27
+ "RuleSchema",
28
28
  ]
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "TransferSchema",
27
26
  "AINTransfer",
27
+ "TransferSchema",
28
28
  ]
@@ -23,6 +23,6 @@ def __getattr__(name: str) -> Any:
23
23
 
24
24
 
25
25
  __all__ = [
26
- "ValueSchema",
27
26
  "AINValueOps",
27
+ "ValueSchema",
28
28
  ]