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
@@ -11,6 +11,7 @@ from langchain_core.language_models import BaseLanguageModel
11
11
  from langchain_core.output_parsers import BaseOutputParser
12
12
  from langchain_core.prompts.prompt import PromptTemplate
13
13
  from pydantic import ConfigDict, Field
14
+ from typing_extensions import override
14
15
 
15
16
  from langchain.chains.constitutional_ai.models import ConstitutionalPrinciple
16
17
  from langchain.chains.llm import LLMChain
@@ -69,7 +70,7 @@ def resolve_pairwise_criteria(
69
70
  Criteria.DEPTH,
70
71
  ]
71
72
  return {k.value: _SUPPORTED_CRITERIA[k] for k in _default_criteria}
72
- elif isinstance(criteria, Criteria):
73
+ if isinstance(criteria, Criteria):
73
74
  criteria_ = {criteria.value: _SUPPORTED_CRITERIA[criteria]}
74
75
  elif isinstance(criteria, str):
75
76
  if criteria in _SUPPORTED_CRITERIA:
@@ -86,11 +87,12 @@ def resolve_pairwise_criteria(
86
87
  }
87
88
  else:
88
89
  if not criteria:
89
- raise ValueError(
90
+ msg = (
90
91
  "Criteria cannot be empty. "
91
92
  "Please provide a criterion name or a mapping of the criterion name"
92
93
  " to its description."
93
94
  )
95
+ raise ValueError(msg)
94
96
  criteria_ = dict(criteria)
95
97
  return criteria_
96
98
 
@@ -132,11 +134,12 @@ class PairwiseStringResultOutputParser(BaseOutputParser[dict]):
132
134
  verdict = match.group(1)
133
135
 
134
136
  if not match or verdict not in {"A", "B", "C"}:
135
- raise ValueError(
137
+ msg = (
136
138
  f"Invalid output: {text}. "
137
139
  "Output must contain a double bracketed string\
138
140
  with the verdict 'A', 'B', or 'C'."
139
141
  )
142
+ raise ValueError(msg)
140
143
  # C means the models are tied. Return 'None' meaning no preference
141
144
  verdict_ = None if verdict == "C" else verdict
142
145
  score = {
@@ -184,7 +187,7 @@ class PairwiseStringEvalChain(PairwiseStringEvaluator, LLMEvalChain, LLMChain):
184
187
 
185
188
  output_key: str = "results" #: :meta private:
186
189
  output_parser: BaseOutputParser = Field(
187
- default_factory=PairwiseStringResultOutputParser
190
+ default_factory=PairwiseStringResultOutputParser,
188
191
  )
189
192
 
190
193
  @classmethod
@@ -256,16 +259,17 @@ class PairwiseStringEvalChain(PairwiseStringEvaluator, LLMEvalChain, LLMChain):
256
259
  if not hasattr(llm, "model_name") or not llm.model_name.startswith("gpt-4"):
257
260
  logger.warning(
258
261
  "This chain was only tested with GPT-4. \
259
- Performance may be significantly worse with other models."
262
+ Performance may be significantly worse with other models.",
260
263
  )
261
264
 
262
265
  expected_input_vars = {"prediction", "prediction_b", "input", "criteria"}
263
266
  prompt_ = prompt or COMPARISON_TEMPLATE.partial(reference="")
264
267
  if expected_input_vars != set(prompt_.input_variables):
265
- raise ValueError(
268
+ msg = (
266
269
  f"Input variables should be {expected_input_vars}, "
267
270
  f"but got {prompt_.input_variables}"
268
271
  )
272
+ raise ValueError(msg)
269
273
  criteria_ = resolve_pairwise_criteria(criteria)
270
274
  criteria_str = "\n".join(f"{k}: {v}" if v else k for k, v in criteria_.items())
271
275
  criteria_str = CRITERIA_INSTRUCTIONS + criteria_str if criteria_str else ""
@@ -275,7 +279,7 @@ Performance may be significantly worse with other models."
275
279
  self,
276
280
  prediction: str,
277
281
  prediction_b: str,
278
- input: Optional[str],
282
+ input_: Optional[str],
279
283
  reference: Optional[str],
280
284
  ) -> dict:
281
285
  """Prepare the input for the chain.
@@ -283,21 +287,21 @@ Performance may be significantly worse with other models."
283
287
  Args:
284
288
  prediction (str): The output string from the first model.
285
289
  prediction_b (str): The output string from the second model.
286
- input (str, optional): The input or task string.
290
+ input_ (str, optional): The input or task string.
287
291
  reference (str, optional): The reference string, if any.
288
292
 
289
293
  Returns:
290
294
  dict: The prepared input for the chain.
291
295
 
292
296
  """
293
- input_ = {
297
+ input_dict = {
294
298
  "prediction": prediction,
295
299
  "prediction_b": prediction_b,
296
- "input": input,
300
+ "input": input_,
297
301
  }
298
302
  if self.requires_reference:
299
- input_["reference"] = reference
300
- return input_
303
+ input_dict["reference"] = reference
304
+ return input_dict
301
305
 
302
306
  def _prepare_output(self, result: dict) -> dict:
303
307
  """Prepare the output."""
@@ -306,6 +310,7 @@ Performance may be significantly worse with other models."
306
310
  parsed[RUN_KEY] = result[RUN_KEY]
307
311
  return parsed
308
312
 
313
+ @override
309
314
  def _evaluate_string_pairs(
310
315
  self,
311
316
  *,
@@ -348,6 +353,7 @@ Performance may be significantly worse with other models."
348
353
  )
349
354
  return self._prepare_output(result)
350
355
 
356
+ @override
351
357
  async def _aevaluate_string_pairs(
352
358
  self,
353
359
  *,
@@ -444,10 +450,11 @@ class LabeledPairwiseStringEvalChain(PairwiseStringEvalChain):
444
450
  }
445
451
  prompt_ = prompt or COMPARISON_TEMPLATE_WITH_REFERENCE
446
452
  if expected_input_vars != set(prompt_.input_variables):
447
- raise ValueError(
453
+ msg = (
448
454
  f"Input variables should be {expected_input_vars}, "
449
455
  f"but got {prompt_.input_variables}"
450
456
  )
457
+ raise ValueError(msg)
451
458
  criteria_ = resolve_pairwise_criteria(criteria)
452
459
  criteria_str = "\n".join(f"{k}: {v}" for k, v in criteria_.items())
453
460
  criteria_str = CRITERIA_INSTRUCTIONS + criteria_str if criteria_str else ""
@@ -3,9 +3,8 @@
3
3
  This prompt is used to compare two responses and evaluate which one best follows the instructions
4
4
  and answers the question. The prompt is based on the paper from
5
5
  Zheng, et. al. https://arxiv.org/abs/2306.05685
6
- """
6
+ """ # noqa: E501
7
7
 
8
- # flake8: noqa
9
8
  from langchain_core.prompts.chat import ChatPromptTemplate
10
9
 
11
10
  SYSTEM_MESSAGE = 'Please act as an impartial judge and evaluate the quality \
@@ -53,4 +53,4 @@ from langchain.evaluation.criteria.eval_chain import (
53
53
  LabeledCriteriaEvalChain,
54
54
  )
55
55
 
56
- __all__ = ["CriteriaEvalChain", "LabeledCriteriaEvalChain", "Criteria"]
56
+ __all__ = ["Criteria", "CriteriaEvalChain", "LabeledCriteriaEvalChain"]
@@ -10,6 +10,7 @@ from langchain_core.language_models import BaseLanguageModel
10
10
  from langchain_core.output_parsers import BaseOutputParser
11
11
  from langchain_core.prompts import BasePromptTemplate
12
12
  from pydantic import ConfigDict, Field
13
+ from typing_extensions import override
13
14
 
14
15
  from langchain.chains.constitutional_ai.models import ConstitutionalPrinciple
15
16
  from langchain.chains.llm import LLMChain
@@ -156,11 +157,12 @@ def resolve_criteria(
156
157
  criteria_ = {criteria.name: criteria.critique_request}
157
158
  else:
158
159
  if not criteria:
159
- raise ValueError(
160
+ msg = (
160
161
  "Criteria cannot be empty. "
161
162
  "Please provide a criterion name or a mapping of the criterion name"
162
163
  " to its description."
163
164
  )
165
+ raise ValueError(msg)
164
166
  criteria_ = dict(criteria)
165
167
  return criteria_
166
168
 
@@ -271,15 +273,17 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
271
273
 
272
274
  @classmethod
273
275
  def _resolve_prompt(
274
- cls, prompt: Optional[BasePromptTemplate] = None
276
+ cls,
277
+ prompt: Optional[BasePromptTemplate] = None,
275
278
  ) -> BasePromptTemplate:
276
279
  expected_input_vars = {"input", "output", "criteria"}
277
280
  prompt_ = prompt or PROMPT
278
281
  if expected_input_vars != set(prompt_.input_variables):
279
- raise ValueError(
282
+ msg = (
280
283
  f"Input variables should be {expected_input_vars}, "
281
284
  f"but got {prompt_.input_variables}"
282
285
  )
286
+ raise ValueError(msg)
283
287
  return prompt_
284
288
 
285
289
  @classmethod
@@ -360,12 +364,13 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
360
364
  """
361
365
  prompt_ = cls._resolve_prompt(prompt)
362
366
  if criteria == Criteria.CORRECTNESS:
363
- raise ValueError(
367
+ msg = (
364
368
  "Correctness should not be used in the reference-free"
365
369
  " 'criteria' evaluator (CriteriaEvalChain)."
366
370
  " Please use the 'labeled_criteria' evaluator"
367
371
  " (LabeledCriteriaEvalChain) instead."
368
372
  )
373
+ raise ValueError(msg)
369
374
  criteria_ = cls.resolve_criteria(criteria)
370
375
  criteria_str = "\n".join(f"{k}: {v}" for k, v in criteria_.items())
371
376
  prompt_ = prompt_.partial(criteria=criteria_str)
@@ -380,16 +385,16 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
380
385
  self,
381
386
  prediction: str,
382
387
  reference: Optional[str],
383
- input: Optional[str],
388
+ input_: Optional[str],
384
389
  ) -> dict:
385
390
  """Get the evaluation input."""
386
- input_ = {
387
- "input": input,
391
+ input_dict = {
392
+ "input": input_,
388
393
  "output": prediction,
389
394
  }
390
395
  if self.requires_reference:
391
- input_["reference"] = reference
392
- return input_
396
+ input_dict["reference"] = reference
397
+ return input_dict
393
398
 
394
399
  def _prepare_output(self, result: dict) -> dict:
395
400
  """Prepare the output."""
@@ -398,6 +403,7 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
398
403
  parsed[RUN_KEY] = result[RUN_KEY]
399
404
  return parsed
400
405
 
406
+ @override
401
407
  def _evaluate_strings(
402
408
  self,
403
409
  *,
@@ -453,6 +459,7 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
453
459
  )
454
460
  return self._prepare_output(result)
455
461
 
462
+ @override
456
463
  async def _aevaluate_strings(
457
464
  self,
458
465
  *,
@@ -523,15 +530,17 @@ class LabeledCriteriaEvalChain(CriteriaEvalChain):
523
530
 
524
531
  @classmethod
525
532
  def _resolve_prompt(
526
- cls, prompt: Optional[BasePromptTemplate] = None
533
+ cls,
534
+ prompt: Optional[BasePromptTemplate] = None,
527
535
  ) -> BasePromptTemplate:
528
536
  expected_input_vars = {"input", "output", "criteria", "reference"}
529
537
  prompt_ = prompt or PROMPT_WITH_REFERENCES
530
538
  if expected_input_vars != set(prompt_.input_variables):
531
- raise ValueError(
539
+ msg = (
532
540
  f"Input variables should be {expected_input_vars}, "
533
541
  f"but got {prompt_.input_variables}"
534
542
  )
543
+ raise ValueError(msg)
535
544
  return prompt_
536
545
 
537
546
  @classmethod
@@ -1,4 +1,3 @@
1
- # flake8: noqa
2
1
  # Credit to https://github.com/openai/evals/tree/main
3
2
 
4
3
  from langchain_core.prompts import PromptTemplate
@@ -13,7 +12,7 @@ template = """You are assessing a submitted answer on a given task or input base
13
12
  [Criteria]: {criteria}
14
13
  ***
15
14
  [END DATA]
16
- Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line."""
15
+ Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line.""" # noqa: E501
17
16
 
18
17
  PROMPT = PromptTemplate(
19
18
  input_variables=["input", "output", "criteria"], template=template
@@ -31,7 +30,7 @@ template = """You are assessing a submitted answer on a given task or input base
31
30
  [Reference]: {reference}
32
31
  ***
33
32
  [END DATA]
34
- Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line."""
33
+ Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line.""" # noqa: E501
35
34
 
36
35
  PROMPT_WITH_REFERENCES = PromptTemplate(
37
36
  input_variables=["input", "output", "criteria", "reference"], template=template
@@ -23,12 +23,10 @@ from langchain.schema import RUN_KEY
23
23
  def _import_numpy() -> Any:
24
24
  try:
25
25
  import numpy as np
26
-
27
- return np
28
26
  except ImportError as e:
29
- raise ImportError(
30
- "Could not import numpy, please install with `pip install numpy`."
31
- ) from e
27
+ msg = "Could not import numpy, please install with `pip install numpy`."
28
+ raise ImportError(msg) from e
29
+ return np
32
30
 
33
31
 
34
32
  logger = logging.getLogger(__name__)
@@ -43,7 +41,7 @@ def _check_numpy() -> bool:
43
41
  "langchain will use a pure Python implementation for embedding distance "
44
42
  "operations, which may significantly impact performance, especially for large "
45
43
  "datasets. For optimal speed and efficiency, consider installing NumPy: "
46
- "pip install numpy"
44
+ "pip install numpy",
47
45
  )
48
46
  return False
49
47
 
@@ -63,11 +61,12 @@ def _embedding_factory() -> Embeddings:
63
61
  from langchain_community.embeddings.openai import ( # type: ignore[no-redef]
64
62
  OpenAIEmbeddings,
65
63
  )
66
- except ImportError:
67
- raise ImportError(
64
+ except ImportError as e:
65
+ msg = (
68
66
  "Could not import OpenAIEmbeddings. Please install the "
69
67
  "OpenAIEmbeddings package using `pip install langchain-openai`."
70
68
  )
69
+ raise ImportError(msg) from e
71
70
  return OpenAIEmbeddings()
72
71
 
73
72
 
@@ -130,21 +129,23 @@ class _EmbeddingDistanceChainMixin(Chain):
130
129
  pass
131
130
 
132
131
  if not types_:
133
- raise ImportError(
132
+ msg = (
134
133
  "Could not import OpenAIEmbeddings. Please install the "
135
134
  "OpenAIEmbeddings package using `pip install langchain-openai`."
136
135
  )
136
+ raise ImportError(msg)
137
137
 
138
138
  if isinstance(embeddings, tuple(types_)):
139
139
  try:
140
140
  import tiktoken # noqa: F401
141
- except ImportError:
142
- raise ImportError(
141
+ except ImportError as e:
142
+ msg = (
143
143
  "The tiktoken library is required to use the default "
144
144
  "OpenAI embeddings with embedding distance evaluators."
145
145
  " Please either manually select a different Embeddings object"
146
146
  " or install tiktoken using `pip install tiktoken`."
147
147
  )
148
+ raise ImportError(msg) from e
148
149
  return values
149
150
 
150
151
  model_config = ConfigDict(
@@ -184,8 +185,8 @@ class _EmbeddingDistanceChainMixin(Chain):
184
185
  }
185
186
  if metric in metrics:
186
187
  return metrics[metric]
187
- else:
188
- raise ValueError(f"Invalid metric: {metric}")
188
+ msg = f"Invalid metric: {metric}"
189
+ raise ValueError(msg)
189
190
 
190
191
  @staticmethod
191
192
  def _cosine_distance(a: Any, b: Any) -> Any:
@@ -200,12 +201,13 @@ class _EmbeddingDistanceChainMixin(Chain):
200
201
  """
201
202
  try:
202
203
  from langchain_community.utils.math import cosine_similarity
203
- except ImportError:
204
- raise ImportError(
204
+ except ImportError as e:
205
+ msg = (
205
206
  "The cosine_similarity function is required to compute cosine distance."
206
207
  " Please install the langchain-community package using"
207
208
  " `pip install langchain-community`."
208
209
  )
210
+ raise ImportError(msg) from e
209
211
  return 1.0 - cosine_similarity(a, b)
210
212
 
211
213
  @staticmethod
@@ -343,7 +345,7 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
343
345
  Dict[str, Any]: The computed score.
344
346
  """
345
347
  vectors = self.embeddings.embed_documents(
346
- [inputs["prediction"], inputs["reference"]]
348
+ [inputs["prediction"], inputs["reference"]],
347
349
  )
348
350
  if _check_numpy():
349
351
  np = _import_numpy()
@@ -370,7 +372,7 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
370
372
  [
371
373
  inputs["prediction"],
372
374
  inputs["reference"],
373
- ]
375
+ ],
374
376
  )
375
377
  if _check_numpy():
376
378
  np = _import_numpy()
@@ -448,7 +450,8 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
448
450
 
449
451
 
450
452
  class PairwiseEmbeddingDistanceEvalChain(
451
- _EmbeddingDistanceChainMixin, PairwiseStringEvaluator
453
+ _EmbeddingDistanceChainMixin,
454
+ PairwiseStringEvaluator,
452
455
  ):
453
456
  """Use embedding distances to score semantic difference between two predictions.
454
457
 
@@ -491,7 +494,7 @@ class PairwiseEmbeddingDistanceEvalChain(
491
494
  [
492
495
  inputs["prediction"],
493
496
  inputs["prediction_b"],
494
- ]
497
+ ],
495
498
  )
496
499
  if _check_numpy():
497
500
  np = _import_numpy()
@@ -518,7 +521,7 @@ class PairwiseEmbeddingDistanceEvalChain(
518
521
  [
519
522
  inputs["prediction"],
520
523
  inputs["prediction_b"],
521
- ]
524
+ ],
522
525
  )
523
526
  if _check_numpy():
524
527
  np = _import_numpy()
@@ -61,18 +61,20 @@ def load_dataset(uri: str) -> list[dict]:
61
61
  """
62
62
  try:
63
63
  from datasets import load_dataset
64
- except ImportError:
65
- raise ImportError(
64
+ except ImportError as e:
65
+ msg = (
66
66
  "load_dataset requires the `datasets` package."
67
67
  " Please install with `pip install datasets`"
68
68
  )
69
+ raise ImportError(msg) from e
69
70
 
70
71
  dataset = load_dataset(f"LangChainDatasets/{uri}")
71
- return [d for d in dataset["train"]]
72
+ return list(dataset["train"])
72
73
 
73
74
 
74
75
  _EVALUATOR_MAP: dict[
75
- EvaluatorType, Union[type[LLMEvalChain], type[Chain], type[StringEvaluator]]
76
+ EvaluatorType,
77
+ Union[type[LLMEvalChain], type[Chain], type[StringEvaluator]],
76
78
  ] = {
77
79
  EvaluatorType.QA: QAEvalChain,
78
80
  EvaluatorType.COT_QA: CotQAEvalChain,
@@ -125,10 +127,11 @@ def load_evaluator(
125
127
  >>> evaluator = load_evaluator(EvaluatorType.QA)
126
128
  """
127
129
  if evaluator not in _EVALUATOR_MAP:
128
- raise ValueError(
130
+ msg = (
129
131
  f"Unknown evaluator type: {evaluator}"
130
132
  f"\nValid types are: {list(_EVALUATOR_MAP.keys())}"
131
133
  )
134
+ raise ValueError(msg)
132
135
  evaluator_cls = _EVALUATOR_MAP[evaluator]
133
136
  if issubclass(evaluator_cls, LLMEvalChain):
134
137
  try:
@@ -139,27 +142,28 @@ def load_evaluator(
139
142
  from langchain_community.chat_models.openai import ( # type: ignore[no-redef]
140
143
  ChatOpenAI,
141
144
  )
142
- except ImportError:
143
- raise ImportError(
145
+ except ImportError as e:
146
+ msg = (
144
147
  "Could not import langchain_openai or fallback onto "
145
148
  "langchain_community. Please install langchain_openai "
146
149
  "or specify a language model explicitly. "
147
150
  "It's recommended to install langchain_openai AND "
148
151
  "specify a language model explicitly."
149
152
  )
153
+ raise ImportError(msg) from e
150
154
 
151
155
  llm = llm or ChatOpenAI(model="gpt-4", seed=42, temperature=0)
152
156
  except Exception as e:
153
- raise ValueError(
157
+ msg = (
154
158
  f"Evaluation with the {evaluator_cls} requires a "
155
159
  "language model to function."
156
160
  " Failed to create the default 'gpt-4' model."
157
161
  " Please manually provide an evaluation LLM"
158
162
  " or check your openai credentials."
159
- ) from e
163
+ )
164
+ raise ValueError(msg) from e
160
165
  return evaluator_cls.from_llm(llm=llm, **kwargs)
161
- else:
162
- return evaluator_cls(**kwargs)
166
+ return evaluator_cls(**kwargs)
163
167
 
164
168
 
165
169
  def load_evaluators(
@@ -5,6 +5,7 @@ from operator import eq
5
5
  from typing import Any, Callable, Optional, Union, cast
6
6
 
7
7
  from langchain_core.utils.json import parse_json_markdown
8
+ from typing_extensions import override
8
9
 
9
10
  from langchain.evaluation.schema import StringEvaluator
10
11
 
@@ -49,6 +50,7 @@ class JsonValidityEvaluator(StringEvaluator):
49
50
  def evaluation_name(self) -> str:
50
51
  return "json_validity"
51
52
 
53
+ @override
52
54
  def _evaluate_strings(
53
55
  self,
54
56
  prediction: str,
@@ -72,9 +74,9 @@ class JsonValidityEvaluator(StringEvaluator):
72
74
  """
73
75
  try:
74
76
  parse_json_markdown(prediction, parser=json.loads)
75
- return {"score": 1}
76
77
  except Exception as e:
77
78
  return {"score": 0, "reasoning": str(e)}
79
+ return {"score": 1}
78
80
 
79
81
 
80
82
  class JsonEqualityEvaluator(StringEvaluator):
@@ -132,6 +134,7 @@ class JsonEqualityEvaluator(StringEvaluator):
132
134
  return parse_json_markdown(string)
133
135
  return string
134
136
 
137
+ @override
135
138
  def _evaluate_strings(
136
139
  self,
137
140
  prediction: str,
@@ -2,6 +2,7 @@ import json
2
2
  from typing import Any, Callable, Optional, Union
3
3
 
4
4
  from langchain_core.utils.json import parse_json_markdown
5
+ from typing_extensions import override
5
6
 
6
7
  from langchain.evaluation.schema import StringEvaluator
7
8
 
@@ -47,13 +48,14 @@ class JsonEditDistanceEvaluator(StringEvaluator):
47
48
  else:
48
49
  try:
49
50
  from rapidfuzz import distance as rfd
50
- except ImportError:
51
- raise ImportError(
51
+ except ImportError as e:
52
+ msg = (
52
53
  "The default string_distance operator for the "
53
54
  " JsonEditDistanceEvaluator requires installation of "
54
55
  "the rapidfuzz package. "
55
56
  "Please install it with `pip install rapidfuzz`."
56
57
  )
58
+ raise ImportError(msg) from e
57
59
  self._string_distance = rfd.DamerauLevenshtein.normalized_distance
58
60
  if canonicalize is not None:
59
61
  self._canonicalize = canonicalize
@@ -81,6 +83,7 @@ class JsonEditDistanceEvaluator(StringEvaluator):
81
83
  return parse_json_markdown(node)
82
84
  return node
83
85
 
86
+ @override
84
87
  def _evaluate_strings(
85
88
  self,
86
89
  prediction: str,
@@ -1,6 +1,7 @@
1
1
  from typing import Any, Union
2
2
 
3
3
  from langchain_core.utils.json import parse_json_markdown
4
+ from typing_extensions import override
4
5
 
5
6
  from langchain.evaluation.schema import StringEvaluator
6
7
 
@@ -44,11 +45,12 @@ class JsonSchemaEvaluator(StringEvaluator):
44
45
  super().__init__()
45
46
  try:
46
47
  import jsonschema # noqa: F401
47
- except ImportError:
48
- raise ImportError(
48
+ except ImportError as e:
49
+ msg = (
49
50
  "The JsonSchemaEvaluator requires the jsonschema package."
50
51
  " Please install it with `pip install jsonschema`."
51
52
  )
53
+ raise ImportError(msg) from e
52
54
 
53
55
  @property
54
56
  def requires_input(self) -> bool:
@@ -68,9 +70,12 @@ class JsonSchemaEvaluator(StringEvaluator):
68
70
  def _parse_json(self, node: Any) -> Union[dict, list, None, float, bool, int, str]:
69
71
  if isinstance(node, str):
70
72
  return parse_json_markdown(node)
71
- elif hasattr(node, "schema") and callable(getattr(node, "schema")):
72
- # Pydantic model
73
- return getattr(node, "schema")()
73
+ if hasattr(node, "model_json_schema") and callable(node.model_json_schema):
74
+ # Pydantic v2 model
75
+ return node.model_json_schema()
76
+ if hasattr(node, "schema") and callable(node.schema):
77
+ # Pydantic v1 model
78
+ return node.schema()
74
79
  return node
75
80
 
76
81
  def _validate(self, prediction: Any, schema: Any) -> dict:
@@ -78,12 +83,11 @@ class JsonSchemaEvaluator(StringEvaluator):
78
83
 
79
84
  try:
80
85
  validate(instance=prediction, schema=schema)
81
- return {
82
- "score": True,
83
- }
84
86
  except ValidationError as e:
85
87
  return {"score": False, "reasoning": repr(e)}
88
+ return {"score": True}
86
89
 
90
+ @override
87
91
  def _evaluate_strings(
88
92
  self,
89
93
  prediction: Union[str, Any],
@@ -7,4 +7,4 @@ from langchain.evaluation.qa.eval_chain import (
7
7
  )
8
8
  from langchain.evaluation.qa.generate_chain import QAGenerateChain
9
9
 
10
- __all__ = ["QAEvalChain", "QAGenerateChain", "ContextQAEvalChain", "CotQAEvalChain"]
10
+ __all__ = ["ContextQAEvalChain", "CotQAEvalChain", "QAEvalChain", "QAGenerateChain"]