langchain 0.3.26__py3-none-any.whl → 0.4.0.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. langchain/__init__.py +110 -96
  2. langchain/_api/__init__.py +2 -2
  3. langchain/_api/deprecation.py +3 -3
  4. langchain/_api/module_import.py +51 -46
  5. langchain/_api/path.py +1 -1
  6. langchain/adapters/openai.py +8 -8
  7. langchain/agents/__init__.py +15 -12
  8. langchain/agents/agent.py +174 -151
  9. langchain/agents/agent_iterator.py +50 -26
  10. langchain/agents/agent_toolkits/__init__.py +7 -6
  11. langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
  12. langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
  13. langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
  14. langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
  15. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
  16. langchain/agents/agent_toolkits/csv/__init__.py +4 -2
  17. langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
  18. langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
  19. langchain/agents/agent_toolkits/github/toolkit.py +9 -9
  20. langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
  21. langchain/agents/agent_toolkits/json/base.py +1 -1
  22. langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
  23. langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
  24. langchain/agents/agent_toolkits/openapi/base.py +1 -1
  25. langchain/agents/agent_toolkits/openapi/planner.py +2 -2
  26. langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
  27. langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
  28. langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
  29. langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
  30. langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
  31. langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
  32. langchain/agents/agent_toolkits/powerbi/base.py +1 -1
  33. langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
  34. langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
  35. langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
  36. langchain/agents/agent_toolkits/python/__init__.py +4 -2
  37. langchain/agents/agent_toolkits/spark/__init__.py +4 -2
  38. langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
  39. langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
  40. langchain/agents/agent_toolkits/sql/prompt.py +1 -1
  41. langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
  42. langchain/agents/agent_toolkits/vectorstore/base.py +4 -2
  43. langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
  44. langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
  45. langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
  46. langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
  47. langchain/agents/agent_types.py +6 -6
  48. langchain/agents/chat/base.py +8 -12
  49. langchain/agents/chat/output_parser.py +9 -6
  50. langchain/agents/chat/prompt.py +3 -4
  51. langchain/agents/conversational/base.py +11 -5
  52. langchain/agents/conversational/output_parser.py +4 -2
  53. langchain/agents/conversational/prompt.py +2 -3
  54. langchain/agents/conversational_chat/base.py +9 -5
  55. langchain/agents/conversational_chat/output_parser.py +9 -11
  56. langchain/agents/conversational_chat/prompt.py +5 -6
  57. langchain/agents/format_scratchpad/__init__.py +3 -3
  58. langchain/agents/format_scratchpad/log_to_messages.py +1 -1
  59. langchain/agents/format_scratchpad/openai_functions.py +8 -6
  60. langchain/agents/format_scratchpad/tools.py +5 -3
  61. langchain/agents/format_scratchpad/xml.py +33 -2
  62. langchain/agents/initialize.py +17 -9
  63. langchain/agents/json_chat/base.py +19 -18
  64. langchain/agents/json_chat/prompt.py +2 -3
  65. langchain/agents/load_tools.py +2 -1
  66. langchain/agents/loading.py +28 -18
  67. langchain/agents/mrkl/base.py +11 -4
  68. langchain/agents/mrkl/output_parser.py +17 -13
  69. langchain/agents/mrkl/prompt.py +1 -2
  70. langchain/agents/openai_assistant/base.py +81 -71
  71. langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +2 -0
  72. langchain/agents/openai_functions_agent/base.py +47 -37
  73. langchain/agents/openai_functions_multi_agent/base.py +40 -27
  74. langchain/agents/openai_tools/base.py +9 -8
  75. langchain/agents/output_parsers/__init__.py +3 -3
  76. langchain/agents/output_parsers/json.py +8 -6
  77. langchain/agents/output_parsers/openai_functions.py +24 -9
  78. langchain/agents/output_parsers/openai_tools.py +16 -4
  79. langchain/agents/output_parsers/react_json_single_input.py +13 -5
  80. langchain/agents/output_parsers/react_single_input.py +18 -11
  81. langchain/agents/output_parsers/self_ask.py +5 -2
  82. langchain/agents/output_parsers/tools.py +32 -13
  83. langchain/agents/output_parsers/xml.py +102 -28
  84. langchain/agents/react/agent.py +5 -4
  85. langchain/agents/react/base.py +26 -17
  86. langchain/agents/react/output_parser.py +7 -6
  87. langchain/agents/react/textworld_prompt.py +0 -1
  88. langchain/agents/react/wiki_prompt.py +14 -15
  89. langchain/agents/schema.py +5 -2
  90. langchain/agents/self_ask_with_search/base.py +23 -15
  91. langchain/agents/self_ask_with_search/prompt.py +0 -1
  92. langchain/agents/structured_chat/base.py +19 -11
  93. langchain/agents/structured_chat/output_parser.py +29 -18
  94. langchain/agents/structured_chat/prompt.py +3 -4
  95. langchain/agents/tool_calling_agent/base.py +8 -6
  96. langchain/agents/tools.py +5 -2
  97. langchain/agents/utils.py +2 -3
  98. langchain/agents/xml/base.py +12 -6
  99. langchain/agents/xml/prompt.py +1 -2
  100. langchain/cache.py +12 -12
  101. langchain/callbacks/__init__.py +11 -11
  102. langchain/callbacks/aim_callback.py +2 -2
  103. langchain/callbacks/argilla_callback.py +1 -1
  104. langchain/callbacks/arize_callback.py +1 -1
  105. langchain/callbacks/arthur_callback.py +1 -1
  106. langchain/callbacks/base.py +7 -7
  107. langchain/callbacks/clearml_callback.py +1 -1
  108. langchain/callbacks/comet_ml_callback.py +1 -1
  109. langchain/callbacks/confident_callback.py +1 -1
  110. langchain/callbacks/context_callback.py +1 -1
  111. langchain/callbacks/flyte_callback.py +1 -1
  112. langchain/callbacks/human.py +2 -2
  113. langchain/callbacks/infino_callback.py +1 -1
  114. langchain/callbacks/labelstudio_callback.py +1 -1
  115. langchain/callbacks/llmonitor_callback.py +1 -1
  116. langchain/callbacks/manager.py +5 -5
  117. langchain/callbacks/mlflow_callback.py +2 -2
  118. langchain/callbacks/openai_info.py +1 -1
  119. langchain/callbacks/promptlayer_callback.py +1 -1
  120. langchain/callbacks/sagemaker_callback.py +1 -1
  121. langchain/callbacks/streaming_aiter.py +17 -3
  122. langchain/callbacks/streaming_aiter_final_only.py +16 -5
  123. langchain/callbacks/streaming_stdout_final_only.py +10 -3
  124. langchain/callbacks/streamlit/__init__.py +3 -2
  125. langchain/callbacks/streamlit/mutable_expander.py +1 -1
  126. langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
  127. langchain/callbacks/tracers/__init__.py +1 -1
  128. langchain/callbacks/tracers/comet.py +1 -1
  129. langchain/callbacks/tracers/evaluation.py +1 -1
  130. langchain/callbacks/tracers/log_stream.py +1 -1
  131. langchain/callbacks/tracers/logging.py +12 -1
  132. langchain/callbacks/tracers/stdout.py +1 -1
  133. langchain/callbacks/trubrics_callback.py +1 -1
  134. langchain/callbacks/utils.py +4 -4
  135. langchain/callbacks/wandb_callback.py +1 -1
  136. langchain/callbacks/whylabs_callback.py +1 -1
  137. langchain/chains/api/base.py +41 -23
  138. langchain/chains/api/news_docs.py +1 -2
  139. langchain/chains/api/open_meteo_docs.py +1 -2
  140. langchain/chains/api/openapi/requests_chain.py +1 -1
  141. langchain/chains/api/openapi/response_chain.py +1 -1
  142. langchain/chains/api/podcast_docs.py +1 -2
  143. langchain/chains/api/prompt.py +1 -2
  144. langchain/chains/api/tmdb_docs.py +1 -2
  145. langchain/chains/base.py +96 -56
  146. langchain/chains/chat_vector_db/prompts.py +2 -3
  147. langchain/chains/combine_documents/__init__.py +1 -1
  148. langchain/chains/combine_documents/base.py +30 -11
  149. langchain/chains/combine_documents/map_reduce.py +41 -30
  150. langchain/chains/combine_documents/map_rerank.py +39 -24
  151. langchain/chains/combine_documents/reduce.py +48 -26
  152. langchain/chains/combine_documents/refine.py +27 -17
  153. langchain/chains/combine_documents/stuff.py +24 -13
  154. langchain/chains/constitutional_ai/base.py +11 -4
  155. langchain/chains/constitutional_ai/principles.py +22 -25
  156. langchain/chains/constitutional_ai/prompts.py +25 -28
  157. langchain/chains/conversation/base.py +9 -4
  158. langchain/chains/conversation/memory.py +5 -5
  159. langchain/chains/conversation/prompt.py +5 -5
  160. langchain/chains/conversational_retrieval/base.py +108 -79
  161. langchain/chains/conversational_retrieval/prompts.py +2 -3
  162. langchain/chains/elasticsearch_database/base.py +10 -10
  163. langchain/chains/elasticsearch_database/prompts.py +2 -3
  164. langchain/chains/ernie_functions/__init__.py +2 -2
  165. langchain/chains/example_generator.py +3 -1
  166. langchain/chains/flare/base.py +28 -12
  167. langchain/chains/flare/prompts.py +2 -0
  168. langchain/chains/graph_qa/cypher.py +2 -2
  169. langchain/chains/graph_qa/falkordb.py +1 -1
  170. langchain/chains/graph_qa/gremlin.py +1 -1
  171. langchain/chains/graph_qa/neptune_sparql.py +1 -1
  172. langchain/chains/graph_qa/prompts.py +2 -2
  173. langchain/chains/history_aware_retriever.py +2 -1
  174. langchain/chains/hyde/base.py +6 -5
  175. langchain/chains/hyde/prompts.py +5 -6
  176. langchain/chains/llm.py +82 -61
  177. langchain/chains/llm_bash/__init__.py +3 -2
  178. langchain/chains/llm_checker/base.py +19 -6
  179. langchain/chains/llm_checker/prompt.py +3 -4
  180. langchain/chains/llm_math/base.py +25 -10
  181. langchain/chains/llm_math/prompt.py +1 -2
  182. langchain/chains/llm_summarization_checker/base.py +22 -7
  183. langchain/chains/llm_symbolic_math/__init__.py +3 -2
  184. langchain/chains/loading.py +155 -97
  185. langchain/chains/mapreduce.py +4 -3
  186. langchain/chains/moderation.py +11 -9
  187. langchain/chains/natbot/base.py +11 -9
  188. langchain/chains/natbot/crawler.py +102 -76
  189. langchain/chains/natbot/prompt.py +2 -3
  190. langchain/chains/openai_functions/__init__.py +7 -7
  191. langchain/chains/openai_functions/base.py +15 -10
  192. langchain/chains/openai_functions/citation_fuzzy_match.py +21 -11
  193. langchain/chains/openai_functions/extraction.py +19 -19
  194. langchain/chains/openai_functions/openapi.py +39 -35
  195. langchain/chains/openai_functions/qa_with_structure.py +22 -15
  196. langchain/chains/openai_functions/tagging.py +4 -4
  197. langchain/chains/openai_tools/extraction.py +7 -8
  198. langchain/chains/qa_generation/base.py +8 -3
  199. langchain/chains/qa_generation/prompt.py +5 -5
  200. langchain/chains/qa_with_sources/base.py +17 -6
  201. langchain/chains/qa_with_sources/loading.py +16 -8
  202. langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
  203. langchain/chains/qa_with_sources/refine_prompts.py +0 -1
  204. langchain/chains/qa_with_sources/retrieval.py +15 -6
  205. langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
  206. langchain/chains/qa_with_sources/vector_db.py +21 -8
  207. langchain/chains/query_constructor/base.py +37 -34
  208. langchain/chains/query_constructor/ir.py +4 -4
  209. langchain/chains/query_constructor/parser.py +101 -34
  210. langchain/chains/query_constructor/prompt.py +5 -6
  211. langchain/chains/question_answering/chain.py +21 -10
  212. langchain/chains/question_answering/map_reduce_prompt.py +14 -14
  213. langchain/chains/question_answering/map_rerank_prompt.py +3 -3
  214. langchain/chains/question_answering/refine_prompts.py +2 -5
  215. langchain/chains/question_answering/stuff_prompt.py +5 -5
  216. langchain/chains/retrieval.py +1 -3
  217. langchain/chains/retrieval_qa/base.py +38 -27
  218. langchain/chains/retrieval_qa/prompt.py +1 -2
  219. langchain/chains/router/__init__.py +3 -3
  220. langchain/chains/router/base.py +38 -22
  221. langchain/chains/router/embedding_router.py +15 -8
  222. langchain/chains/router/llm_router.py +23 -20
  223. langchain/chains/router/multi_prompt.py +5 -2
  224. langchain/chains/router/multi_retrieval_qa.py +28 -5
  225. langchain/chains/sequential.py +30 -18
  226. langchain/chains/sql_database/prompt.py +14 -16
  227. langchain/chains/sql_database/query.py +7 -5
  228. langchain/chains/structured_output/__init__.py +1 -1
  229. langchain/chains/structured_output/base.py +77 -67
  230. langchain/chains/summarize/chain.py +11 -5
  231. langchain/chains/summarize/map_reduce_prompt.py +0 -1
  232. langchain/chains/summarize/stuff_prompt.py +0 -1
  233. langchain/chains/transform.py +9 -6
  234. langchain/chat_loaders/facebook_messenger.py +1 -1
  235. langchain/chat_loaders/langsmith.py +1 -1
  236. langchain/chat_loaders/utils.py +3 -3
  237. langchain/chat_models/__init__.py +20 -19
  238. langchain/chat_models/anthropic.py +1 -1
  239. langchain/chat_models/azureml_endpoint.py +1 -1
  240. langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
  241. langchain/chat_models/base.py +213 -139
  242. langchain/chat_models/bedrock.py +1 -1
  243. langchain/chat_models/fake.py +1 -1
  244. langchain/chat_models/meta.py +1 -1
  245. langchain/chat_models/pai_eas_endpoint.py +1 -1
  246. langchain/chat_models/promptlayer_openai.py +1 -1
  247. langchain/chat_models/volcengine_maas.py +1 -1
  248. langchain/docstore/base.py +1 -1
  249. langchain/document_loaders/__init__.py +9 -9
  250. langchain/document_loaders/airbyte.py +3 -3
  251. langchain/document_loaders/assemblyai.py +1 -1
  252. langchain/document_loaders/azure_blob_storage_container.py +1 -1
  253. langchain/document_loaders/azure_blob_storage_file.py +1 -1
  254. langchain/document_loaders/baiducloud_bos_file.py +1 -1
  255. langchain/document_loaders/base.py +1 -1
  256. langchain/document_loaders/blob_loaders/__init__.py +1 -1
  257. langchain/document_loaders/blob_loaders/schema.py +1 -4
  258. langchain/document_loaders/blockchain.py +1 -1
  259. langchain/document_loaders/chatgpt.py +1 -1
  260. langchain/document_loaders/college_confidential.py +1 -1
  261. langchain/document_loaders/confluence.py +1 -1
  262. langchain/document_loaders/email.py +1 -1
  263. langchain/document_loaders/facebook_chat.py +1 -1
  264. langchain/document_loaders/markdown.py +1 -1
  265. langchain/document_loaders/notebook.py +1 -1
  266. langchain/document_loaders/org_mode.py +1 -1
  267. langchain/document_loaders/parsers/__init__.py +1 -1
  268. langchain/document_loaders/parsers/docai.py +1 -1
  269. langchain/document_loaders/parsers/generic.py +1 -1
  270. langchain/document_loaders/parsers/html/__init__.py +1 -1
  271. langchain/document_loaders/parsers/html/bs4.py +1 -1
  272. langchain/document_loaders/parsers/language/cobol.py +1 -1
  273. langchain/document_loaders/parsers/language/python.py +1 -1
  274. langchain/document_loaders/parsers/msword.py +1 -1
  275. langchain/document_loaders/parsers/pdf.py +5 -5
  276. langchain/document_loaders/parsers/registry.py +1 -1
  277. langchain/document_loaders/pdf.py +8 -8
  278. langchain/document_loaders/powerpoint.py +1 -1
  279. langchain/document_loaders/pyspark_dataframe.py +1 -1
  280. langchain/document_loaders/telegram.py +2 -2
  281. langchain/document_loaders/tencent_cos_directory.py +1 -1
  282. langchain/document_loaders/unstructured.py +5 -5
  283. langchain/document_loaders/url_playwright.py +1 -1
  284. langchain/document_loaders/whatsapp_chat.py +1 -1
  285. langchain/document_loaders/youtube.py +2 -2
  286. langchain/document_transformers/__init__.py +3 -3
  287. langchain/document_transformers/beautiful_soup_transformer.py +1 -1
  288. langchain/document_transformers/doctran_text_extract.py +1 -1
  289. langchain/document_transformers/doctran_text_qa.py +1 -1
  290. langchain/document_transformers/doctran_text_translate.py +1 -1
  291. langchain/document_transformers/embeddings_redundant_filter.py +3 -3
  292. langchain/document_transformers/google_translate.py +1 -1
  293. langchain/document_transformers/html2text.py +1 -1
  294. langchain/document_transformers/nuclia_text_transform.py +1 -1
  295. langchain/embeddings/__init__.py +5 -5
  296. langchain/embeddings/base.py +35 -24
  297. langchain/embeddings/cache.py +37 -32
  298. langchain/embeddings/fake.py +1 -1
  299. langchain/embeddings/huggingface.py +2 -2
  300. langchain/evaluation/__init__.py +22 -22
  301. langchain/evaluation/agents/trajectory_eval_chain.py +26 -25
  302. langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
  303. langchain/evaluation/comparison/__init__.py +1 -1
  304. langchain/evaluation/comparison/eval_chain.py +21 -13
  305. langchain/evaluation/comparison/prompt.py +1 -2
  306. langchain/evaluation/criteria/__init__.py +1 -1
  307. langchain/evaluation/criteria/eval_chain.py +23 -11
  308. langchain/evaluation/criteria/prompt.py +2 -3
  309. langchain/evaluation/embedding_distance/base.py +34 -20
  310. langchain/evaluation/exact_match/base.py +14 -1
  311. langchain/evaluation/loading.py +16 -11
  312. langchain/evaluation/parsing/base.py +20 -4
  313. langchain/evaluation/parsing/json_distance.py +24 -10
  314. langchain/evaluation/parsing/json_schema.py +13 -12
  315. langchain/evaluation/qa/__init__.py +1 -1
  316. langchain/evaluation/qa/eval_chain.py +20 -5
  317. langchain/evaluation/qa/eval_prompt.py +7 -8
  318. langchain/evaluation/qa/generate_chain.py +4 -1
  319. langchain/evaluation/qa/generate_prompt.py +2 -4
  320. langchain/evaluation/regex_match/base.py +9 -1
  321. langchain/evaluation/schema.py +38 -30
  322. langchain/evaluation/scoring/__init__.py +1 -1
  323. langchain/evaluation/scoring/eval_chain.py +23 -15
  324. langchain/evaluation/scoring/prompt.py +0 -1
  325. langchain/evaluation/string_distance/base.py +20 -9
  326. langchain/globals.py +12 -11
  327. langchain/graphs/__init__.py +6 -6
  328. langchain/graphs/graph_document.py +1 -1
  329. langchain/graphs/networkx_graph.py +2 -2
  330. langchain/hub.py +9 -11
  331. langchain/indexes/__init__.py +3 -3
  332. langchain/indexes/_sql_record_manager.py +63 -46
  333. langchain/indexes/prompts/entity_extraction.py +1 -2
  334. langchain/indexes/prompts/entity_summarization.py +1 -2
  335. langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
  336. langchain/indexes/vectorstore.py +35 -19
  337. langchain/llms/__init__.py +13 -13
  338. langchain/llms/ai21.py +1 -1
  339. langchain/llms/azureml_endpoint.py +4 -4
  340. langchain/llms/base.py +15 -7
  341. langchain/llms/bedrock.py +1 -1
  342. langchain/llms/cloudflare_workersai.py +1 -1
  343. langchain/llms/gradient_ai.py +1 -1
  344. langchain/llms/loading.py +1 -1
  345. langchain/llms/openai.py +1 -1
  346. langchain/llms/sagemaker_endpoint.py +1 -1
  347. langchain/load/dump.py +1 -1
  348. langchain/load/load.py +1 -1
  349. langchain/load/serializable.py +3 -3
  350. langchain/memory/__init__.py +3 -3
  351. langchain/memory/buffer.py +14 -7
  352. langchain/memory/buffer_window.py +2 -0
  353. langchain/memory/chat_memory.py +14 -8
  354. langchain/memory/chat_message_histories/__init__.py +1 -1
  355. langchain/memory/chat_message_histories/astradb.py +1 -1
  356. langchain/memory/chat_message_histories/cassandra.py +1 -1
  357. langchain/memory/chat_message_histories/cosmos_db.py +1 -1
  358. langchain/memory/chat_message_histories/dynamodb.py +1 -1
  359. langchain/memory/chat_message_histories/elasticsearch.py +1 -1
  360. langchain/memory/chat_message_histories/file.py +1 -1
  361. langchain/memory/chat_message_histories/firestore.py +1 -1
  362. langchain/memory/chat_message_histories/momento.py +1 -1
  363. langchain/memory/chat_message_histories/mongodb.py +1 -1
  364. langchain/memory/chat_message_histories/neo4j.py +1 -1
  365. langchain/memory/chat_message_histories/postgres.py +1 -1
  366. langchain/memory/chat_message_histories/redis.py +1 -1
  367. langchain/memory/chat_message_histories/rocksetdb.py +1 -1
  368. langchain/memory/chat_message_histories/singlestoredb.py +1 -1
  369. langchain/memory/chat_message_histories/streamlit.py +1 -1
  370. langchain/memory/chat_message_histories/upstash_redis.py +1 -1
  371. langchain/memory/chat_message_histories/xata.py +1 -1
  372. langchain/memory/chat_message_histories/zep.py +1 -1
  373. langchain/memory/combined.py +14 -13
  374. langchain/memory/entity.py +131 -61
  375. langchain/memory/prompt.py +10 -11
  376. langchain/memory/readonly.py +0 -2
  377. langchain/memory/simple.py +4 -3
  378. langchain/memory/summary.py +43 -11
  379. langchain/memory/summary_buffer.py +20 -8
  380. langchain/memory/token_buffer.py +2 -0
  381. langchain/memory/utils.py +3 -2
  382. langchain/memory/vectorstore.py +12 -5
  383. langchain/memory/vectorstore_token_buffer_memory.py +5 -5
  384. langchain/model_laboratory.py +12 -11
  385. langchain/output_parsers/__init__.py +4 -4
  386. langchain/output_parsers/boolean.py +7 -4
  387. langchain/output_parsers/combining.py +14 -7
  388. langchain/output_parsers/datetime.py +32 -31
  389. langchain/output_parsers/enum.py +10 -4
  390. langchain/output_parsers/fix.py +60 -53
  391. langchain/output_parsers/format_instructions.py +6 -8
  392. langchain/output_parsers/json.py +2 -2
  393. langchain/output_parsers/list.py +2 -2
  394. langchain/output_parsers/loading.py +9 -9
  395. langchain/output_parsers/openai_functions.py +3 -3
  396. langchain/output_parsers/openai_tools.py +1 -1
  397. langchain/output_parsers/pandas_dataframe.py +59 -48
  398. langchain/output_parsers/prompts.py +1 -2
  399. langchain/output_parsers/rail_parser.py +1 -1
  400. langchain/output_parsers/regex.py +9 -8
  401. langchain/output_parsers/regex_dict.py +7 -10
  402. langchain/output_parsers/retry.py +99 -80
  403. langchain/output_parsers/structured.py +21 -6
  404. langchain/output_parsers/yaml.py +19 -11
  405. langchain/prompts/__init__.py +5 -3
  406. langchain/prompts/base.py +5 -5
  407. langchain/prompts/chat.py +8 -8
  408. langchain/prompts/example_selector/__init__.py +3 -1
  409. langchain/prompts/example_selector/semantic_similarity.py +2 -2
  410. langchain/prompts/few_shot.py +1 -1
  411. langchain/prompts/loading.py +3 -3
  412. langchain/prompts/prompt.py +1 -1
  413. langchain/pydantic_v1/__init__.py +1 -1
  414. langchain/retrievers/__init__.py +5 -5
  415. langchain/retrievers/bedrock.py +2 -2
  416. langchain/retrievers/bm25.py +1 -1
  417. langchain/retrievers/contextual_compression.py +14 -8
  418. langchain/retrievers/docarray.py +1 -1
  419. langchain/retrievers/document_compressors/__init__.py +5 -4
  420. langchain/retrievers/document_compressors/base.py +12 -6
  421. langchain/retrievers/document_compressors/chain_extract.py +5 -3
  422. langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
  423. langchain/retrievers/document_compressors/chain_filter.py +9 -9
  424. langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
  425. langchain/retrievers/document_compressors/cohere_rerank.py +17 -15
  426. langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -0
  427. langchain/retrievers/document_compressors/embeddings_filter.py +24 -17
  428. langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
  429. langchain/retrievers/document_compressors/listwise_rerank.py +8 -5
  430. langchain/retrievers/ensemble.py +30 -27
  431. langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
  432. langchain/retrievers/google_vertex_ai_search.py +2 -2
  433. langchain/retrievers/kendra.py +10 -10
  434. langchain/retrievers/llama_index.py +1 -1
  435. langchain/retrievers/merger_retriever.py +11 -11
  436. langchain/retrievers/milvus.py +1 -1
  437. langchain/retrievers/multi_query.py +35 -27
  438. langchain/retrievers/multi_vector.py +24 -9
  439. langchain/retrievers/parent_document_retriever.py +33 -9
  440. langchain/retrievers/re_phraser.py +6 -5
  441. langchain/retrievers/self_query/base.py +157 -127
  442. langchain/retrievers/time_weighted_retriever.py +21 -7
  443. langchain/retrievers/zilliz.py +1 -1
  444. langchain/runnables/hub.py +12 -0
  445. langchain/runnables/openai_functions.py +12 -2
  446. langchain/schema/__init__.py +23 -23
  447. langchain/schema/cache.py +1 -1
  448. langchain/schema/callbacks/base.py +7 -7
  449. langchain/schema/callbacks/manager.py +19 -19
  450. langchain/schema/callbacks/tracers/base.py +1 -1
  451. langchain/schema/callbacks/tracers/evaluation.py +1 -1
  452. langchain/schema/callbacks/tracers/langchain.py +1 -1
  453. langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
  454. langchain/schema/callbacks/tracers/log_stream.py +1 -1
  455. langchain/schema/callbacks/tracers/schemas.py +8 -8
  456. langchain/schema/callbacks/tracers/stdout.py +3 -3
  457. langchain/schema/document.py +1 -1
  458. langchain/schema/language_model.py +2 -2
  459. langchain/schema/messages.py +12 -12
  460. langchain/schema/output.py +3 -3
  461. langchain/schema/output_parser.py +3 -3
  462. langchain/schema/runnable/__init__.py +3 -3
  463. langchain/schema/runnable/base.py +9 -9
  464. langchain/schema/runnable/config.py +5 -5
  465. langchain/schema/runnable/configurable.py +1 -1
  466. langchain/schema/runnable/history.py +1 -1
  467. langchain/schema/runnable/passthrough.py +1 -1
  468. langchain/schema/runnable/utils.py +16 -16
  469. langchain/schema/vectorstore.py +1 -1
  470. langchain/smith/__init__.py +2 -1
  471. langchain/smith/evaluation/__init__.py +2 -2
  472. langchain/smith/evaluation/config.py +9 -23
  473. langchain/smith/evaluation/name_generation.py +3 -3
  474. langchain/smith/evaluation/progress.py +22 -4
  475. langchain/smith/evaluation/runner_utils.py +416 -247
  476. langchain/smith/evaluation/string_run_evaluator.py +102 -68
  477. langchain/storage/__init__.py +2 -2
  478. langchain/storage/_lc_store.py +4 -2
  479. langchain/storage/encoder_backed.py +7 -2
  480. langchain/storage/file_system.py +19 -16
  481. langchain/storage/in_memory.py +1 -1
  482. langchain/storage/upstash_redis.py +1 -1
  483. langchain/text_splitter.py +15 -15
  484. langchain/tools/__init__.py +28 -26
  485. langchain/tools/ainetwork/app.py +1 -1
  486. langchain/tools/ainetwork/base.py +1 -1
  487. langchain/tools/ainetwork/owner.py +1 -1
  488. langchain/tools/ainetwork/rule.py +1 -1
  489. langchain/tools/ainetwork/transfer.py +1 -1
  490. langchain/tools/ainetwork/value.py +1 -1
  491. langchain/tools/amadeus/closest_airport.py +1 -1
  492. langchain/tools/amadeus/flight_search.py +1 -1
  493. langchain/tools/azure_cognitive_services/__init__.py +1 -1
  494. langchain/tools/base.py +4 -4
  495. langchain/tools/bearly/tool.py +1 -1
  496. langchain/tools/bing_search/__init__.py +1 -1
  497. langchain/tools/bing_search/tool.py +1 -1
  498. langchain/tools/dataforseo_api_search/__init__.py +1 -1
  499. langchain/tools/dataforseo_api_search/tool.py +1 -1
  500. langchain/tools/ddg_search/tool.py +1 -1
  501. langchain/tools/e2b_data_analysis/tool.py +2 -2
  502. langchain/tools/edenai/__init__.py +1 -1
  503. langchain/tools/file_management/__init__.py +1 -1
  504. langchain/tools/file_management/copy.py +1 -1
  505. langchain/tools/file_management/delete.py +1 -1
  506. langchain/tools/gmail/__init__.py +2 -2
  507. langchain/tools/gmail/get_message.py +1 -1
  508. langchain/tools/gmail/search.py +1 -1
  509. langchain/tools/gmail/send_message.py +1 -1
  510. langchain/tools/google_finance/__init__.py +1 -1
  511. langchain/tools/google_finance/tool.py +1 -1
  512. langchain/tools/google_scholar/__init__.py +1 -1
  513. langchain/tools/google_scholar/tool.py +1 -1
  514. langchain/tools/google_search/__init__.py +1 -1
  515. langchain/tools/google_search/tool.py +1 -1
  516. langchain/tools/google_serper/__init__.py +1 -1
  517. langchain/tools/google_serper/tool.py +1 -1
  518. langchain/tools/google_trends/__init__.py +1 -1
  519. langchain/tools/google_trends/tool.py +1 -1
  520. langchain/tools/jira/tool.py +20 -1
  521. langchain/tools/json/tool.py +25 -3
  522. langchain/tools/memorize/tool.py +1 -1
  523. langchain/tools/multion/__init__.py +1 -1
  524. langchain/tools/multion/update_session.py +1 -1
  525. langchain/tools/office365/__init__.py +2 -2
  526. langchain/tools/office365/events_search.py +1 -1
  527. langchain/tools/office365/messages_search.py +1 -1
  528. langchain/tools/office365/send_event.py +1 -1
  529. langchain/tools/office365/send_message.py +1 -1
  530. langchain/tools/openapi/utils/api_models.py +6 -6
  531. langchain/tools/playwright/__init__.py +5 -5
  532. langchain/tools/playwright/click.py +1 -1
  533. langchain/tools/playwright/extract_hyperlinks.py +1 -1
  534. langchain/tools/playwright/get_elements.py +1 -1
  535. langchain/tools/playwright/navigate.py +1 -1
  536. langchain/tools/plugin.py +2 -2
  537. langchain/tools/powerbi/tool.py +1 -1
  538. langchain/tools/python/__init__.py +3 -2
  539. langchain/tools/reddit_search/tool.py +1 -1
  540. langchain/tools/render.py +2 -2
  541. langchain/tools/requests/tool.py +2 -2
  542. langchain/tools/searchapi/tool.py +1 -1
  543. langchain/tools/searx_search/tool.py +1 -1
  544. langchain/tools/slack/get_message.py +1 -1
  545. langchain/tools/spark_sql/tool.py +1 -1
  546. langchain/tools/sql_database/tool.py +1 -1
  547. langchain/tools/tavily_search/__init__.py +1 -1
  548. langchain/tools/tavily_search/tool.py +1 -1
  549. langchain/tools/zapier/__init__.py +1 -1
  550. langchain/tools/zapier/tool.py +24 -2
  551. langchain/utilities/__init__.py +4 -4
  552. langchain/utilities/arcee.py +4 -4
  553. langchain/utilities/clickup.py +4 -4
  554. langchain/utilities/dalle_image_generator.py +1 -1
  555. langchain/utilities/dataforseo_api_search.py +1 -1
  556. langchain/utilities/opaqueprompts.py +1 -1
  557. langchain/utilities/reddit_search.py +1 -1
  558. langchain/utilities/sql_database.py +1 -1
  559. langchain/utilities/tavily_search.py +1 -1
  560. langchain/utilities/vertexai.py +2 -2
  561. langchain/utils/__init__.py +1 -1
  562. langchain/utils/aiter.py +1 -1
  563. langchain/utils/html.py +3 -3
  564. langchain/utils/input.py +1 -1
  565. langchain/utils/iter.py +1 -1
  566. langchain/utils/json_schema.py +1 -3
  567. langchain/utils/strings.py +1 -1
  568. langchain/utils/utils.py +6 -6
  569. langchain/vectorstores/__init__.py +5 -5
  570. langchain/vectorstores/alibabacloud_opensearch.py +1 -1
  571. langchain/vectorstores/azure_cosmos_db.py +1 -1
  572. langchain/vectorstores/clickhouse.py +1 -1
  573. langchain/vectorstores/elastic_vector_search.py +1 -1
  574. langchain/vectorstores/elasticsearch.py +2 -2
  575. langchain/vectorstores/myscale.py +1 -1
  576. langchain/vectorstores/neo4j_vector.py +1 -1
  577. langchain/vectorstores/pgembedding.py +1 -1
  578. langchain/vectorstores/qdrant.py +1 -1
  579. langchain/vectorstores/redis/__init__.py +1 -1
  580. langchain/vectorstores/redis/base.py +1 -1
  581. langchain/vectorstores/redis/filters.py +4 -4
  582. langchain/vectorstores/redis/schema.py +6 -6
  583. langchain/vectorstores/sklearn.py +2 -2
  584. langchain/vectorstores/starrocks.py +1 -1
  585. langchain/vectorstores/utils.py +1 -1
  586. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/METADATA +4 -14
  587. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/RECORD +590 -591
  588. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/WHEEL +1 -1
  589. langchain/smith/evaluation/utils.py +0 -0
  590. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/entry_points.txt +0 -0
  591. {langchain-0.3.26.dist-info → langchain-0.4.0.dev0.dist-info}/licenses/LICENSE +0 -0
@@ -16,6 +16,7 @@ from langchain_core.load.serializable import Serializable
16
16
  from langchain_core.messages import BaseMessage, get_buffer_string, messages_from_dict
17
17
  from langsmith import EvaluationResult, RunEvaluator
18
18
  from langsmith.schemas import DataType, Example, Run
19
+ from typing_extensions import override
19
20
 
20
21
  from langchain.chains.base import Chain
21
22
  from langchain.evaluation.schema import StringEvaluator
@@ -28,8 +29,7 @@ def _get_messages_from_run_dict(messages: list[dict]) -> list[BaseMessage]:
28
29
  first_message = messages[0]
29
30
  if "lc" in first_message:
30
31
  return [load(dumpd(message)) for message in messages]
31
- else:
32
- return messages_from_dict(messages)
32
+ return messages_from_dict(messages)
33
33
 
34
34
 
35
35
  class StringRunMapper(Serializable):
@@ -47,7 +47,8 @@ class StringRunMapper(Serializable):
47
47
  def __call__(self, run: Run) -> dict[str, str]:
48
48
  """Maps the Run to a dictionary."""
49
49
  if not run.outputs:
50
- raise ValueError(f"Run {run.id} has no outputs to evaluate.")
50
+ msg = f"Run {run.id} has no outputs to evaluate."
51
+ raise ValueError(msg)
51
52
  return self.map(run)
52
53
 
53
54
 
@@ -63,11 +64,22 @@ class LLMStringRunMapper(StringRunMapper):
63
64
  # Runs from Tracer have messages as a list of lists of dicts
64
65
  chat_messages = _get_messages_from_run_dict(messages[0])
65
66
  else:
66
- raise ValueError(f"Could not extract messages to evaluate {messages}")
67
+ msg = f"Could not extract messages to evaluate {messages}"
68
+ raise ValueError(msg)
67
69
  return get_buffer_string(chat_messages)
68
- raise ValueError(f"Could not extract messages to evaluate {messages}")
70
+ msg = f"Could not extract messages to evaluate {messages}"
71
+ raise ValueError(msg)
69
72
 
70
73
  def serialize_inputs(self, inputs: dict) -> str:
74
+ """Serialize inputs.
75
+
76
+ Args:
77
+ inputs: The inputs from the run, expected to contain prompts or messages.
78
+ Returns:
79
+ The serialized input text from the prompts or messages.
80
+ Raises:
81
+ ValueError: If neither prompts nor messages are found in the inputs.
82
+ """
71
83
  if "prompts" in inputs: # Should we even accept this?
72
84
  input_ = "\n\n".join(inputs["prompts"])
73
85
  elif "prompt" in inputs:
@@ -75,15 +87,30 @@ class LLMStringRunMapper(StringRunMapper):
75
87
  elif "messages" in inputs:
76
88
  input_ = self.serialize_chat_messages(inputs["messages"])
77
89
  else:
78
- raise ValueError("LLM Run must have either messages or prompts as inputs.")
90
+ msg = "LLM Run must have either messages or prompts as inputs."
91
+ raise ValueError(msg)
79
92
  return input_
80
93
 
81
94
  def serialize_outputs(self, outputs: dict) -> str:
95
+ """Serialize outputs.
96
+
97
+ Args:
98
+ outputs: The outputs from the run, expected to contain generations.
99
+
100
+ Returns:
101
+ The serialized output text from the first generation.
102
+
103
+ Raises:
104
+ ValueError: If no generations are found in the outputs,
105
+ or if the generations are empty.
106
+ """
82
107
  if not outputs.get("generations"):
83
- raise ValueError("Cannot evaluate LLM Run without generations.")
108
+ msg = "Cannot evaluate LLM Run without generations."
109
+ raise ValueError(msg)
84
110
  generations: list[dict] = outputs["generations"]
85
111
  if not generations:
86
- raise ValueError("Cannot evaluate LLM run with empty generations.")
112
+ msg = "Cannot evaluate LLM run with empty generations."
113
+ raise ValueError(msg)
87
114
  first_generation: dict = generations[0]
88
115
  if isinstance(first_generation, list):
89
116
  # Runs from Tracer have generations as a list of lists of dicts
@@ -98,30 +125,25 @@ class LLMStringRunMapper(StringRunMapper):
98
125
  def map(self, run: Run) -> dict[str, str]:
99
126
  """Maps the Run to a dictionary."""
100
127
  if run.run_type != "llm":
101
- raise ValueError("LLM RunMapper only supports LLM runs.")
102
- elif not run.outputs:
128
+ msg = "LLM RunMapper only supports LLM runs."
129
+ raise ValueError(msg)
130
+ if not run.outputs:
103
131
  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_}
132
+ msg = f"Cannot evaluate errored LLM run {run.id}: {run.error}"
133
+ raise ValueError(msg)
134
+ msg = f"Run {run.id} has no outputs. Cannot evaluate this run."
135
+ raise ValueError(msg)
136
+ try:
137
+ inputs = self.serialize_inputs(run.inputs)
138
+ except Exception as e:
139
+ msg = f"Could not parse LM input from run inputs {run.inputs}"
140
+ raise ValueError(msg) from e
141
+ try:
142
+ output_ = self.serialize_outputs(run.outputs)
143
+ except Exception as e:
144
+ msg = f"Could not parse LM prediction from run outputs {run.outputs}"
145
+ raise ValueError(msg) from e
146
+ return {"input": inputs, "prediction": output_}
125
147
 
126
148
 
127
149
  class ChainStringRunMapper(StringRunMapper):
@@ -139,53 +161,57 @@ class ChainStringRunMapper(StringRunMapper):
139
161
  def _get_key(self, source: dict, key: Optional[str], which: str) -> str:
140
162
  if key is not None:
141
163
  return source[key]
142
- elif len(source) == 1:
164
+ if len(source) == 1:
143
165
  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
- )
166
+ msg = (
167
+ f"Could not map run {which} with multiple keys: "
168
+ f"{source}\nPlease manually specify a {which}_key"
169
+ )
170
+ raise ValueError(msg)
149
171
 
150
172
  def map(self, run: Run) -> dict[str, str]:
151
173
  """Maps the Run to a dictionary."""
152
174
  if not run.outputs:
153
- raise ValueError(
175
+ msg = (
154
176
  f"Run with ID {run.id} lacks outputs required for evaluation."
155
177
  " Ensure the Run has valid outputs."
156
178
  )
179
+ raise ValueError(msg)
157
180
  if self.input_key is not None and self.input_key not in run.inputs:
158
- raise ValueError(
181
+ msg = (
159
182
  f"Run with ID {run.id} is missing the expected input key"
160
183
  f" '{self.input_key}'.\nAvailable input keys in this Run"
161
184
  f" are: {run.inputs.keys()}.\nAdjust the evaluator's"
162
185
  f" input_key or ensure your input data includes key"
163
186
  f" '{self.input_key}'."
164
187
  )
165
- elif self.prediction_key is not None and self.prediction_key not in run.outputs:
188
+ raise ValueError(msg)
189
+ if self.prediction_key is not None and self.prediction_key not in run.outputs:
166
190
  available_keys = ", ".join(run.outputs.keys())
167
- raise ValueError(
191
+ msg = (
168
192
  f"Run with ID {run.id} doesn't have the expected prediction key"
169
193
  f" '{self.prediction_key}'. Available prediction keys in this Run are:"
170
194
  f" {available_keys}. Adjust the evaluator's prediction_key or"
171
195
  " ensure the Run object's outputs the expected key."
172
196
  )
197
+ raise ValueError(msg)
173
198
 
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
- }
199
+ input_ = self._get_key(run.inputs, self.input_key, "input")
200
+ prediction = self._get_key(run.outputs, self.prediction_key, "prediction")
201
+ return {
202
+ "input": input_,
203
+ "prediction": prediction,
204
+ }
181
205
 
182
206
 
183
207
  class ToolStringRunMapper(StringRunMapper):
184
208
  """Map an input to the tool."""
185
209
 
210
+ @override
186
211
  def map(self, run: Run) -> dict[str, str]:
187
212
  if not run.outputs:
188
- raise ValueError(f"Run {run.id} has no outputs to evaluate.")
213
+ msg = f"Run {run.id} has no outputs to evaluate."
214
+ raise ValueError(msg)
189
215
  return {"input": run.inputs["input"], "prediction": run.outputs["output"]}
190
216
 
191
217
 
@@ -207,36 +233,35 @@ class StringExampleMapper(Serializable):
207
233
  def map(self, example: Example) -> dict[str, str]:
208
234
  """Maps the Example, or dataset row to a dictionary."""
209
235
  if not example.outputs:
210
- raise ValueError(
211
- f"Example {example.id} has no outputs to use as a reference."
212
- )
236
+ msg = f"Example {example.id} has no outputs to use as a reference."
237
+ raise ValueError(msg)
213
238
  if self.reference_key is None:
214
239
  if len(example.outputs) > 1:
215
- raise ValueError(
240
+ msg = (
216
241
  f"Example {example.id} has multiple outputs, so you must"
217
242
  " specify a reference_key."
218
243
  )
219
- else:
220
- output = list(example.outputs.values())[0]
244
+ raise ValueError(msg)
245
+ output = next(iter(example.outputs.values()))
221
246
  elif self.reference_key not in example.outputs:
222
- raise ValueError(
247
+ msg = (
223
248
  f"Example {example.id} does not have reference key"
224
249
  f" {self.reference_key}."
225
250
  )
251
+ raise ValueError(msg)
226
252
  else:
227
253
  output = example.outputs[self.reference_key]
228
254
  return {
229
255
  "reference": self.serialize_chat_messages([output])
230
256
  if isinstance(output, dict) and output.get("type") and output.get("data")
231
- else output
257
+ else output,
232
258
  }
233
259
 
234
260
  def __call__(self, example: Example) -> dict[str, str]:
235
261
  """Maps the Run and Example to a dictionary."""
236
262
  if not example.outputs:
237
- raise ValueError(
238
- f"Example {example.id} has no outputs to use as areference label."
239
- )
263
+ msg = f"Example {example.id} has no outputs to use as areference label."
264
+ raise ValueError(msg)
240
265
  return self.map(example)
241
266
 
242
267
 
@@ -254,10 +279,12 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
254
279
  """The evaluation chain."""
255
280
 
256
281
  @property
282
+ @override
257
283
  def input_keys(self) -> list[str]:
258
284
  return ["run", "example"]
259
285
 
260
286
  @property
287
+ @override
261
288
  def output_keys(self) -> list[str]:
262
289
  return ["feedback"]
263
290
 
@@ -271,16 +298,19 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
271
298
  if example and self.example_mapper and self.string_evaluator.requires_reference:
272
299
  evaluate_strings_inputs.update(self.example_mapper(example))
273
300
  elif self.string_evaluator.requires_reference:
274
- raise ValueError(
301
+ msg = (
275
302
  f"Evaluator {self.name} requires an reference"
276
303
  " example from the dataset,"
277
304
  f" but none was provided for run {run.id}."
278
305
  )
306
+ raise ValueError(msg)
279
307
  return evaluate_strings_inputs
280
308
 
281
309
  def _prepare_output(self, output: dict[str, Any]) -> dict[str, Any]:
282
310
  evaluation_result = EvaluationResult(
283
- key=self.name, comment=output.get("reasoning"), **output
311
+ key=self.name,
312
+ comment=output.get("reasoning"),
313
+ **output,
284
314
  )
285
315
  if RUN_KEY in output:
286
316
  # TODO: Not currently surfaced. Update
@@ -325,6 +355,7 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
325
355
  feedback.evaluator_info[RUN_KEY] = output[RUN_KEY]
326
356
  return feedback
327
357
 
358
+ @override
328
359
  def evaluate_run(
329
360
  self,
330
361
  run: Run,
@@ -342,6 +373,7 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
342
373
  # TODO: Add run ID once we can declare it via callbacks
343
374
  )
344
375
 
376
+ @override
345
377
  async def aevaluate_run(
346
378
  self,
347
379
  run: Run,
@@ -351,7 +383,8 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
351
383
  """Evaluate an example."""
352
384
  try:
353
385
  result = await self.acall(
354
- {"run": run, "example": example}, include_run_info=True
386
+ {"run": run, "example": example},
387
+ include_run_info=True,
355
388
  )
356
389
  return self._prepare_evaluator_output(result)
357
390
  except Exception as e:
@@ -402,12 +435,12 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
402
435
  run_mapper: StringRunMapper = LLMStringRunMapper()
403
436
  elif run_type == "chain":
404
437
  run_mapper = ChainStringRunMapper(
405
- input_key=input_key, prediction_key=prediction_key
438
+ input_key=input_key,
439
+ prediction_key=prediction_key,
406
440
  )
407
441
  else:
408
- raise ValueError(
409
- f"Unsupported run type {run_type}. Expected one of 'llm' or 'chain'."
410
- )
442
+ msg = f"Unsupported run type {run_type}. Expected one of 'llm' or 'chain'."
443
+ raise ValueError(msg)
411
444
 
412
445
  # Configure how example rows are fed as a reference string to the evaluator
413
446
  if (
@@ -417,11 +450,12 @@ class StringRunEvaluatorChain(Chain, RunEvaluator):
417
450
  ):
418
451
  example_mapper = StringExampleMapper(reference_key=reference_key)
419
452
  elif evaluator.requires_reference:
420
- raise ValueError(
453
+ msg = (
421
454
  f"Evaluator {evaluator.evaluation_name} requires a reference"
422
455
  " example from the dataset. Please specify the reference key from"
423
456
  " amongst the dataset outputs keys."
424
457
  )
458
+ raise ValueError(msg)
425
459
  else:
426
460
  example_mapper = None
427
461
  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
 
@@ -46,6 +46,7 @@ class EncoderBackedStore(BaseStore[K, V]):
46
46
  store.mset([(1, 3.14), (2, 2.718)])
47
47
  values = store.mget([1, 2]) # Retrieves [3.14, 2.718]
48
48
  store.mdelete([1, 2]) # Deletes the keys 1 and 2
49
+
49
50
  """
50
51
 
51
52
  def __init__(
@@ -106,7 +107,9 @@ class EncoderBackedStore(BaseStore[K, V]):
106
107
  await self.store.amdelete(encoded_keys)
107
108
 
108
109
  def yield_keys(
109
- self, *, prefix: Optional[str] = None
110
+ self,
111
+ *,
112
+ prefix: Optional[str] = None,
110
113
  ) -> Union[Iterator[K], Iterator[str]]:
111
114
  """Get an iterator over keys that match the given prefix."""
112
115
  # For the time being this does not return K, but str
@@ -114,7 +117,9 @@ class EncoderBackedStore(BaseStore[K, V]):
114
117
  yield from self.store.yield_keys(prefix=prefix)
115
118
 
116
119
  async def ayield_keys(
117
- self, *, prefix: Optional[str] = None
120
+ self,
121
+ *,
122
+ prefix: Optional[str] = None,
118
123
  ) -> Union[AsyncIterator[K], AsyncIterator[str]]:
119
124
  """Get an iterator over keys that match the given prefix."""
120
125
  # 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
  ]