langchain 0.3.23__py3-none-any.whl → 0.3.24__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 (170) hide show
  1. langchain/_api/module_import.py +3 -3
  2. langchain/agents/agent.py +104 -109
  3. langchain/agents/agent_iterator.py +11 -15
  4. langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +2 -2
  5. langchain/agents/agent_toolkits/vectorstore/base.py +3 -3
  6. langchain/agents/agent_toolkits/vectorstore/toolkit.py +4 -6
  7. langchain/agents/chat/base.py +7 -6
  8. langchain/agents/chat/output_parser.py +2 -1
  9. langchain/agents/conversational/base.py +5 -4
  10. langchain/agents/conversational_chat/base.py +9 -8
  11. langchain/agents/format_scratchpad/log.py +1 -3
  12. langchain/agents/format_scratchpad/log_to_messages.py +3 -5
  13. langchain/agents/format_scratchpad/openai_functions.py +4 -4
  14. langchain/agents/format_scratchpad/tools.py +3 -3
  15. langchain/agents/format_scratchpad/xml.py +1 -3
  16. langchain/agents/initialize.py +2 -1
  17. langchain/agents/json_chat/base.py +3 -2
  18. langchain/agents/loading.py +5 -5
  19. langchain/agents/mrkl/base.py +6 -5
  20. langchain/agents/openai_assistant/base.py +13 -17
  21. langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +6 -6
  22. langchain/agents/openai_functions_agent/base.py +13 -12
  23. langchain/agents/openai_functions_multi_agent/base.py +15 -14
  24. langchain/agents/openai_tools/base.py +2 -1
  25. langchain/agents/output_parsers/openai_functions.py +2 -2
  26. langchain/agents/output_parsers/openai_tools.py +6 -6
  27. langchain/agents/output_parsers/react_json_single_input.py +2 -1
  28. langchain/agents/output_parsers/self_ask.py +2 -1
  29. langchain/agents/output_parsers/tools.py +7 -7
  30. langchain/agents/react/agent.py +3 -2
  31. langchain/agents/react/base.py +4 -3
  32. langchain/agents/schema.py +3 -3
  33. langchain/agents/self_ask_with_search/base.py +2 -1
  34. langchain/agents/structured_chat/base.py +9 -8
  35. langchain/agents/structured_chat/output_parser.py +2 -1
  36. langchain/agents/tool_calling_agent/base.py +3 -2
  37. langchain/agents/tools.py +4 -4
  38. langchain/agents/types.py +3 -3
  39. langchain/agents/utils.py +1 -1
  40. langchain/agents/xml/base.py +7 -6
  41. langchain/callbacks/streaming_aiter.py +3 -2
  42. langchain/callbacks/streaming_aiter_final_only.py +3 -3
  43. langchain/callbacks/streaming_stdout_final_only.py +3 -3
  44. langchain/chains/api/base.py +11 -12
  45. langchain/chains/base.py +47 -50
  46. langchain/chains/combine_documents/base.py +23 -23
  47. langchain/chains/combine_documents/map_reduce.py +12 -12
  48. langchain/chains/combine_documents/map_rerank.py +16 -15
  49. langchain/chains/combine_documents/reduce.py +17 -17
  50. langchain/chains/combine_documents/refine.py +12 -12
  51. langchain/chains/combine_documents/stuff.py +10 -10
  52. langchain/chains/constitutional_ai/base.py +9 -9
  53. langchain/chains/conversation/base.py +2 -4
  54. langchain/chains/conversational_retrieval/base.py +30 -30
  55. langchain/chains/elasticsearch_database/base.py +13 -13
  56. langchain/chains/example_generator.py +1 -3
  57. langchain/chains/flare/base.py +13 -12
  58. langchain/chains/flare/prompts.py +2 -4
  59. langchain/chains/hyde/base.py +8 -8
  60. langchain/chains/llm.py +31 -30
  61. langchain/chains/llm_checker/base.py +6 -6
  62. langchain/chains/llm_math/base.py +10 -10
  63. langchain/chains/llm_summarization_checker/base.py +6 -6
  64. langchain/chains/loading.py +12 -14
  65. langchain/chains/mapreduce.py +7 -6
  66. langchain/chains/moderation.py +8 -8
  67. langchain/chains/natbot/base.py +6 -6
  68. langchain/chains/openai_functions/base.py +8 -10
  69. langchain/chains/openai_functions/citation_fuzzy_match.py +4 -4
  70. langchain/chains/openai_functions/extraction.py +3 -3
  71. langchain/chains/openai_functions/openapi.py +12 -12
  72. langchain/chains/openai_functions/qa_with_structure.py +4 -4
  73. langchain/chains/openai_functions/utils.py +2 -2
  74. langchain/chains/openai_tools/extraction.py +2 -2
  75. langchain/chains/prompt_selector.py +3 -3
  76. langchain/chains/qa_generation/base.py +5 -5
  77. langchain/chains/qa_with_sources/base.py +21 -21
  78. langchain/chains/qa_with_sources/loading.py +2 -1
  79. langchain/chains/qa_with_sources/retrieval.py +6 -6
  80. langchain/chains/qa_with_sources/vector_db.py +8 -8
  81. langchain/chains/query_constructor/base.py +4 -3
  82. langchain/chains/query_constructor/parser.py +5 -4
  83. langchain/chains/question_answering/chain.py +3 -2
  84. langchain/chains/retrieval.py +2 -2
  85. langchain/chains/retrieval_qa/base.py +16 -16
  86. langchain/chains/router/base.py +12 -11
  87. langchain/chains/router/embedding_router.py +12 -11
  88. langchain/chains/router/llm_router.py +12 -12
  89. langchain/chains/router/multi_prompt.py +3 -3
  90. langchain/chains/router/multi_retrieval_qa.py +5 -4
  91. langchain/chains/sequential.py +18 -18
  92. langchain/chains/sql_database/query.py +4 -4
  93. langchain/chains/structured_output/base.py +14 -13
  94. langchain/chains/summarize/chain.py +4 -3
  95. langchain/chains/transform.py +12 -11
  96. langchain/chat_models/base.py +27 -31
  97. langchain/embeddings/__init__.py +1 -1
  98. langchain/embeddings/base.py +4 -4
  99. langchain/embeddings/cache.py +19 -18
  100. langchain/evaluation/agents/trajectory_eval_chain.py +16 -19
  101. langchain/evaluation/comparison/eval_chain.py +10 -10
  102. langchain/evaluation/criteria/eval_chain.py +11 -10
  103. langchain/evaluation/embedding_distance/base.py +21 -21
  104. langchain/evaluation/exact_match/base.py +3 -3
  105. langchain/evaluation/loading.py +7 -8
  106. langchain/evaluation/qa/eval_chain.py +7 -6
  107. langchain/evaluation/regex_match/base.py +3 -3
  108. langchain/evaluation/schema.py +6 -5
  109. langchain/evaluation/scoring/eval_chain.py +9 -9
  110. langchain/evaluation/string_distance/base.py +23 -23
  111. langchain/hub.py +2 -1
  112. langchain/indexes/_sql_record_manager.py +8 -7
  113. langchain/indexes/vectorstore.py +11 -11
  114. langchain/llms/__init__.py +3 -3
  115. langchain/memory/buffer.py +13 -13
  116. langchain/memory/buffer_window.py +5 -5
  117. langchain/memory/chat_memory.py +5 -5
  118. langchain/memory/combined.py +10 -10
  119. langchain/memory/entity.py +8 -7
  120. langchain/memory/readonly.py +4 -4
  121. langchain/memory/simple.py +5 -5
  122. langchain/memory/summary.py +8 -8
  123. langchain/memory/summary_buffer.py +11 -11
  124. langchain/memory/token_buffer.py +5 -5
  125. langchain/memory/utils.py +2 -2
  126. langchain/memory/vectorstore.py +15 -14
  127. langchain/memory/vectorstore_token_buffer_memory.py +7 -7
  128. langchain/model_laboratory.py +4 -3
  129. langchain/output_parsers/combining.py +5 -5
  130. langchain/output_parsers/datetime.py +1 -2
  131. langchain/output_parsers/enum.py +4 -5
  132. langchain/output_parsers/pandas_dataframe.py +5 -5
  133. langchain/output_parsers/regex.py +4 -4
  134. langchain/output_parsers/regex_dict.py +4 -4
  135. langchain/output_parsers/retry.py +2 -2
  136. langchain/output_parsers/structured.py +5 -5
  137. langchain/output_parsers/yaml.py +3 -3
  138. langchain/pydantic_v1/__init__.py +1 -6
  139. langchain/pydantic_v1/dataclasses.py +1 -5
  140. langchain/pydantic_v1/main.py +1 -5
  141. langchain/retrievers/contextual_compression.py +3 -3
  142. langchain/retrievers/document_compressors/base.py +3 -2
  143. langchain/retrievers/document_compressors/chain_extract.py +4 -3
  144. langchain/retrievers/document_compressors/chain_filter.py +3 -2
  145. langchain/retrievers/document_compressors/cohere_rerank.py +4 -3
  146. langchain/retrievers/document_compressors/cross_encoder.py +1 -2
  147. langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -1
  148. langchain/retrievers/document_compressors/embeddings_filter.py +3 -2
  149. langchain/retrievers/document_compressors/listwise_rerank.py +6 -5
  150. langchain/retrievers/ensemble.py +15 -19
  151. langchain/retrievers/merger_retriever.py +7 -12
  152. langchain/retrievers/multi_query.py +14 -13
  153. langchain/retrievers/multi_vector.py +4 -4
  154. langchain/retrievers/parent_document_retriever.py +9 -8
  155. langchain/retrievers/re_phraser.py +2 -3
  156. langchain/retrievers/self_query/base.py +13 -12
  157. langchain/retrievers/time_weighted_retriever.py +14 -14
  158. langchain/runnables/openai_functions.py +4 -3
  159. langchain/smith/evaluation/config.py +7 -6
  160. langchain/smith/evaluation/progress.py +3 -2
  161. langchain/smith/evaluation/runner_utils.py +58 -61
  162. langchain/smith/evaluation/string_run_evaluator.py +29 -29
  163. langchain/storage/encoder_backed.py +7 -11
  164. langchain/storage/file_system.py +5 -4
  165. {langchain-0.3.23.dist-info → langchain-0.3.24.dist-info}/METADATA +2 -2
  166. {langchain-0.3.23.dist-info → langchain-0.3.24.dist-info}/RECORD +169 -169
  167. {langchain-0.3.23.dist-info → langchain-0.3.24.dist-info}/WHEEL +1 -1
  168. langchain-0.3.24.dist-info/entry_points.txt +4 -0
  169. langchain-0.3.23.dist-info/entry_points.txt +0 -5
  170. {langchain-0.3.23.dist-info → langchain-0.3.24.dist-info}/licenses/LICENSE +0 -0
@@ -4,7 +4,7 @@ import functools
4
4
  import logging
5
5
  from enum import Enum
6
6
  from importlib import util
7
- from typing import Any, Dict, List, Optional
7
+ from typing import Any, Optional
8
8
 
9
9
  from langchain_core.callbacks.manager import (
10
10
  AsyncCallbackManagerForChainRun,
@@ -102,7 +102,7 @@ class _EmbeddingDistanceChainMixin(Chain):
102
102
  distance_metric: EmbeddingDistance = Field(default=EmbeddingDistance.COSINE)
103
103
 
104
104
  @pre_init
105
- def _validate_tiktoken_installed(cls, values: Dict[str, Any]) -> Dict[str, Any]:
105
+ def _validate_tiktoken_installed(cls, values: dict[str, Any]) -> dict[str, Any]:
106
106
  """Validate that the TikTok library is installed.
107
107
 
108
108
  Args:
@@ -152,7 +152,7 @@ class _EmbeddingDistanceChainMixin(Chain):
152
152
  )
153
153
 
154
154
  @property
155
- def output_keys(self) -> List[str]:
155
+ def output_keys(self) -> list[str]:
156
156
  """Return the output keys of the chain.
157
157
 
158
158
  Returns:
@@ -319,7 +319,7 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
319
319
  return f"embedding_{self.distance_metric.value}_distance"
320
320
 
321
321
  @property
322
- def input_keys(self) -> List[str]:
322
+ def input_keys(self) -> list[str]:
323
323
  """Return the input keys of the chain.
324
324
 
325
325
  Returns:
@@ -329,9 +329,9 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
329
329
 
330
330
  def _call(
331
331
  self,
332
- inputs: Dict[str, Any],
332
+ inputs: dict[str, Any],
333
333
  run_manager: Optional[CallbackManagerForChainRun] = None,
334
- ) -> Dict[str, Any]:
334
+ ) -> dict[str, Any]:
335
335
  """Compute the score for a prediction and reference.
336
336
 
337
337
  Args:
@@ -353,9 +353,9 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
353
353
 
354
354
  async def _acall(
355
355
  self,
356
- inputs: Dict[str, Any],
356
+ inputs: dict[str, Any],
357
357
  run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
358
- ) -> Dict[str, Any]:
358
+ ) -> dict[str, Any]:
359
359
  """Asynchronously compute the score for a prediction and reference.
360
360
 
361
361
  Args:
@@ -384,8 +384,8 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
384
384
  prediction: str,
385
385
  reference: Optional[str] = None,
386
386
  callbacks: Callbacks = None,
387
- tags: Optional[List[str]] = None,
388
- metadata: Optional[Dict[str, Any]] = None,
387
+ tags: Optional[list[str]] = None,
388
+ metadata: Optional[dict[str, Any]] = None,
389
389
  include_run_info: bool = False,
390
390
  **kwargs: Any,
391
391
  ) -> dict:
@@ -418,8 +418,8 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
418
418
  prediction: str,
419
419
  reference: Optional[str] = None,
420
420
  callbacks: Callbacks = None,
421
- tags: Optional[List[str]] = None,
422
- metadata: Optional[Dict[str, Any]] = None,
421
+ tags: Optional[list[str]] = None,
422
+ metadata: Optional[dict[str, Any]] = None,
423
423
  include_run_info: bool = False,
424
424
  **kwargs: Any,
425
425
  ) -> dict:
@@ -460,7 +460,7 @@ class PairwiseEmbeddingDistanceEvalChain(
460
460
  """
461
461
 
462
462
  @property
463
- def input_keys(self) -> List[str]:
463
+ def input_keys(self) -> list[str]:
464
464
  """Return the input keys of the chain.
465
465
 
466
466
  Returns:
@@ -474,9 +474,9 @@ class PairwiseEmbeddingDistanceEvalChain(
474
474
 
475
475
  def _call(
476
476
  self,
477
- inputs: Dict[str, Any],
477
+ inputs: dict[str, Any],
478
478
  run_manager: Optional[CallbackManagerForChainRun] = None,
479
- ) -> Dict[str, Any]:
479
+ ) -> dict[str, Any]:
480
480
  """Compute the score for two predictions.
481
481
 
482
482
  Args:
@@ -501,9 +501,9 @@ class PairwiseEmbeddingDistanceEvalChain(
501
501
 
502
502
  async def _acall(
503
503
  self,
504
- inputs: Dict[str, Any],
504
+ inputs: dict[str, Any],
505
505
  run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
506
- ) -> Dict[str, Any]:
506
+ ) -> dict[str, Any]:
507
507
  """Asynchronously compute the score for two predictions.
508
508
 
509
509
  Args:
@@ -532,8 +532,8 @@ class PairwiseEmbeddingDistanceEvalChain(
532
532
  prediction: str,
533
533
  prediction_b: str,
534
534
  callbacks: Callbacks = None,
535
- tags: Optional[List[str]] = None,
536
- metadata: Optional[Dict[str, Any]] = None,
535
+ tags: Optional[list[str]] = None,
536
+ metadata: Optional[dict[str, Any]] = None,
537
537
  include_run_info: bool = False,
538
538
  **kwargs: Any,
539
539
  ) -> dict:
@@ -567,8 +567,8 @@ class PairwiseEmbeddingDistanceEvalChain(
567
567
  prediction: str,
568
568
  prediction_b: str,
569
569
  callbacks: Callbacks = None,
570
- tags: Optional[List[str]] = None,
571
- metadata: Optional[Dict[str, Any]] = None,
570
+ tags: Optional[list[str]] = None,
571
+ metadata: Optional[dict[str, Any]] = None,
572
572
  include_run_info: bool = False,
573
573
  **kwargs: Any,
574
574
  ) -> dict:
@@ -1,5 +1,5 @@
1
1
  import string
2
- from typing import Any, List
2
+ from typing import Any
3
3
 
4
4
  from langchain.evaluation.schema import StringEvaluator
5
5
 
@@ -49,7 +49,7 @@ class ExactMatchStringEvaluator(StringEvaluator):
49
49
  return True
50
50
 
51
51
  @property
52
- def input_keys(self) -> List[str]:
52
+ def input_keys(self) -> list[str]:
53
53
  """
54
54
  Get the input keys.
55
55
 
@@ -68,7 +68,7 @@ class ExactMatchStringEvaluator(StringEvaluator):
68
68
  """
69
69
  return "exact_match"
70
70
 
71
- def _evaluate_strings( # type: ignore[arg-type,override]
71
+ def _evaluate_strings( # type: ignore[override]
72
72
  self,
73
73
  *,
74
74
  prediction: str,
@@ -1,6 +1,7 @@
1
1
  """Loading datasets and evaluators."""
2
2
 
3
- from typing import Any, Dict, List, Optional, Sequence, Type, Union
3
+ from collections.abc import Sequence
4
+ from typing import Any, Optional, Union
4
5
 
5
6
  from langchain_core.language_models import BaseLanguageModel
6
7
 
@@ -36,7 +37,7 @@ from langchain.evaluation.string_distance.base import (
36
37
  )
37
38
 
38
39
 
39
- def load_dataset(uri: str) -> List[Dict]:
40
+ def load_dataset(uri: str) -> list[dict]:
40
41
  """Load a dataset from the `LangChainDatasets on HuggingFace <https://huggingface.co/LangChainDatasets>`_.
41
42
 
42
43
  Args:
@@ -70,8 +71,8 @@ def load_dataset(uri: str) -> List[Dict]:
70
71
  return [d for d in dataset["train"]]
71
72
 
72
73
 
73
- _EVALUATOR_MAP: Dict[
74
- EvaluatorType, Union[Type[LLMEvalChain], Type[Chain], Type[StringEvaluator]]
74
+ _EVALUATOR_MAP: dict[
75
+ EvaluatorType, Union[type[LLMEvalChain], type[Chain], type[StringEvaluator]]
75
76
  ] = {
76
77
  EvaluatorType.QA: QAEvalChain,
77
78
  EvaluatorType.COT_QA: CotQAEvalChain,
@@ -147,9 +148,7 @@ def load_evaluator(
147
148
  "specify a language model explicitly."
148
149
  )
149
150
 
150
- llm = llm or ChatOpenAI( # type: ignore[call-arg]
151
- model="gpt-4", seed=42, temperature=0
152
- )
151
+ llm = llm or ChatOpenAI(model="gpt-4", seed=42, temperature=0)
153
152
  except Exception as e:
154
153
  raise ValueError(
155
154
  f"Evaluation with the {evaluator_cls} requires a "
@@ -169,7 +168,7 @@ def load_evaluators(
169
168
  llm: Optional[BaseLanguageModel] = None,
170
169
  config: Optional[dict] = None,
171
170
  **kwargs: Any,
172
- ) -> List[Union[Chain, StringEvaluator]]:
171
+ ) -> list[Union[Chain, StringEvaluator]]:
173
172
  """Load evaluators specified by a list of evaluator types.
174
173
 
175
174
  Parameters
@@ -4,7 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  import re
6
6
  import string
7
- from typing import Any, List, Optional, Sequence, Tuple
7
+ from collections.abc import Sequence
8
+ from typing import Any, Optional
8
9
 
9
10
  from langchain_core.callbacks.manager import Callbacks
10
11
  from langchain_core.language_models import BaseLanguageModel
@@ -17,7 +18,7 @@ from langchain.evaluation.schema import LLMEvalChain, StringEvaluator
17
18
  from langchain.schema import RUN_KEY
18
19
 
19
20
 
20
- def _get_score(text: str) -> Optional[Tuple[str, int]]:
21
+ def _get_score(text: str) -> Optional[tuple[str, int]]:
21
22
  match = re.search(r"grade:\s*(correct|incorrect)", text.strip(), re.IGNORECASE)
22
23
  if match:
23
24
  if match.group(1).upper() == "CORRECT":
@@ -133,7 +134,7 @@ class QAEvalChain(LLMChain, StringEvaluator, LLMEvalChain):
133
134
  prediction_key: str = "result",
134
135
  *,
135
136
  callbacks: Callbacks = None,
136
- ) -> List[dict]:
137
+ ) -> list[dict]:
137
138
  """Evaluate question answering examples and predictions."""
138
139
  inputs = [
139
140
  {
@@ -267,14 +268,14 @@ class ContextQAEvalChain(LLMChain, StringEvaluator, LLMEvalChain):
267
268
 
268
269
  def evaluate(
269
270
  self,
270
- examples: List[dict],
271
- predictions: List[dict],
271
+ examples: list[dict],
272
+ predictions: list[dict],
272
273
  question_key: str = "query",
273
274
  context_key: str = "context",
274
275
  prediction_key: str = "result",
275
276
  *,
276
277
  callbacks: Callbacks = None,
277
- ) -> List[dict]:
278
+ ) -> list[dict]:
278
279
  """Evaluate question answering examples and predictions."""
279
280
  inputs = [
280
281
  {
@@ -1,5 +1,5 @@
1
1
  import re
2
- from typing import Any, List
2
+ from typing import Any
3
3
 
4
4
  from langchain.evaluation.schema import StringEvaluator
5
5
 
@@ -46,7 +46,7 @@ class RegexMatchStringEvaluator(StringEvaluator):
46
46
  return True
47
47
 
48
48
  @property
49
- def input_keys(self) -> List[str]:
49
+ def input_keys(self) -> list[str]:
50
50
  """
51
51
  Get the input keys.
52
52
 
@@ -65,7 +65,7 @@ class RegexMatchStringEvaluator(StringEvaluator):
65
65
  """
66
66
  return "regex_match"
67
67
 
68
- def _evaluate_strings( # type: ignore[arg-type,override]
68
+ def _evaluate_strings( # type: ignore[override]
69
69
  self,
70
70
  *,
71
71
  prediction: str,
@@ -4,8 +4,9 @@ from __future__ import annotations
4
4
 
5
5
  import logging
6
6
  from abc import ABC, abstractmethod
7
+ from collections.abc import Sequence
7
8
  from enum import Enum
8
- from typing import Any, Optional, Sequence, Tuple, Union
9
+ from typing import Any, Optional, Union
9
10
  from warnings import warn
10
11
 
11
12
  from langchain_core.agents import AgentAction
@@ -372,7 +373,7 @@ class AgentTrajectoryEvaluator(_EvalArgsMixin, ABC):
372
373
  self,
373
374
  *,
374
375
  prediction: str,
375
- agent_trajectory: Sequence[Tuple[AgentAction, str]],
376
+ agent_trajectory: Sequence[tuple[AgentAction, str]],
376
377
  input: str,
377
378
  reference: Optional[str] = None,
378
379
  **kwargs: Any,
@@ -394,7 +395,7 @@ class AgentTrajectoryEvaluator(_EvalArgsMixin, ABC):
394
395
  self,
395
396
  *,
396
397
  prediction: str,
397
- agent_trajectory: Sequence[Tuple[AgentAction, str]],
398
+ agent_trajectory: Sequence[tuple[AgentAction, str]],
398
399
  input: str,
399
400
  reference: Optional[str] = None,
400
401
  **kwargs: Any,
@@ -425,7 +426,7 @@ class AgentTrajectoryEvaluator(_EvalArgsMixin, ABC):
425
426
  self,
426
427
  *,
427
428
  prediction: str,
428
- agent_trajectory: Sequence[Tuple[AgentAction, str]],
429
+ agent_trajectory: Sequence[tuple[AgentAction, str]],
429
430
  input: str,
430
431
  reference: Optional[str] = None,
431
432
  **kwargs: Any,
@@ -455,7 +456,7 @@ class AgentTrajectoryEvaluator(_EvalArgsMixin, ABC):
455
456
  self,
456
457
  *,
457
458
  prediction: str,
458
- agent_trajectory: Sequence[Tuple[AgentAction, str]],
459
+ agent_trajectory: Sequence[tuple[AgentAction, str]],
459
460
  input: str,
460
461
  reference: Optional[str] = None,
461
462
  **kwargs: Any,
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import logging
6
6
  import re
7
- from typing import Any, Dict, List, Optional, Union
7
+ from typing import Any, Optional, Union
8
8
 
9
9
  from langchain_core.callbacks.manager import Callbacks
10
10
  from langchain_core.language_models import BaseLanguageModel
@@ -50,7 +50,7 @@ _SUPPORTED_CRITERIA = {
50
50
 
51
51
 
52
52
  def resolve_criteria(
53
- criteria: Optional[Union[CRITERIA_TYPE, str, List[CRITERIA_TYPE]]],
53
+ criteria: Optional[Union[CRITERIA_TYPE, str, list[CRITERIA_TYPE]]],
54
54
  ) -> dict:
55
55
  """Resolve the criteria for the pairwise evaluator.
56
56
 
@@ -113,7 +113,7 @@ class ScoreStringResultOutputParser(BaseOutputParser[dict]):
113
113
  """
114
114
  return "pairwise_string_result"
115
115
 
116
- def parse(self, text: str) -> Dict[str, Any]:
116
+ def parse(self, text: str) -> dict[str, Any]:
117
117
  """Parse the output text.
118
118
 
119
119
  Args:
@@ -144,7 +144,7 @@ class ScoreStringResultOutputParser(BaseOutputParser[dict]):
144
144
  }
145
145
 
146
146
 
147
- class ScoreStringEvalChain(StringEvaluator, LLMEvalChain, LLMChain): # type: ignore[override]
147
+ class ScoreStringEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
148
148
  """A chain for scoring on a scale of 1-10 the output of a model.
149
149
 
150
150
  Attributes:
@@ -328,8 +328,8 @@ Performance may be significantly worse with other models."
328
328
  input: Optional[str] = None,
329
329
  reference: Optional[str] = None,
330
330
  callbacks: Callbacks = None,
331
- tags: Optional[List[str]] = None,
332
- metadata: Optional[Dict[str, Any]] = None,
331
+ tags: Optional[list[str]] = None,
332
+ metadata: Optional[dict[str, Any]] = None,
333
333
  include_run_info: bool = False,
334
334
  **kwargs: Any,
335
335
  ) -> dict:
@@ -365,8 +365,8 @@ Performance may be significantly worse with other models."
365
365
  reference: Optional[str] = None,
366
366
  input: Optional[str] = None,
367
367
  callbacks: Callbacks = None,
368
- tags: Optional[List[str]] = None,
369
- metadata: Optional[Dict[str, Any]] = None,
368
+ tags: Optional[list[str]] = None,
369
+ metadata: Optional[dict[str, Any]] = None,
370
370
  include_run_info: bool = False,
371
371
  **kwargs: Any,
372
372
  ) -> dict:
@@ -396,7 +396,7 @@ Performance may be significantly worse with other models."
396
396
  return self._prepare_output(result)
397
397
 
398
398
 
399
- class LabeledScoreStringEvalChain(ScoreStringEvalChain): # type: ignore[override]
399
+ class LabeledScoreStringEvalChain(ScoreStringEvalChain):
400
400
  """A chain for scoring the output of a model on a scale of 1-10.
401
401
 
402
402
  Attributes:
@@ -1,7 +1,7 @@
1
1
  """String distance evaluators based on the RapidFuzz library."""
2
2
 
3
3
  from enum import Enum
4
- from typing import Any, Callable, Dict, List, Optional
4
+ from typing import Any, Callable, Optional
5
5
 
6
6
  from langchain_core.callbacks.manager import (
7
7
  AsyncCallbackManagerForChainRun,
@@ -65,7 +65,7 @@ class _RapidFuzzChainMixin(Chain):
65
65
  Applies only to the Levenshtein and Damerau-Levenshtein distances."""
66
66
 
67
67
  @pre_init
68
- def validate_dependencies(cls, values: Dict[str, Any]) -> Dict[str, Any]:
68
+ def validate_dependencies(cls, values: dict[str, Any]) -> dict[str, Any]:
69
69
  """
70
70
  Validate that the rapidfuzz library is installed.
71
71
 
@@ -79,7 +79,7 @@ class _RapidFuzzChainMixin(Chain):
79
79
  return values
80
80
 
81
81
  @property
82
- def output_keys(self) -> List[str]:
82
+ def output_keys(self) -> list[str]:
83
83
  """
84
84
  Get the output keys.
85
85
 
@@ -88,7 +88,7 @@ class _RapidFuzzChainMixin(Chain):
88
88
  """
89
89
  return ["score"]
90
90
 
91
- def _prepare_output(self, result: Dict[str, Any]) -> Dict[str, Any]:
91
+ def _prepare_output(self, result: dict[str, Any]) -> dict[str, Any]:
92
92
  """
93
93
  Prepare the output dictionary.
94
94
 
@@ -119,7 +119,7 @@ class _RapidFuzzChainMixin(Chain):
119
119
  """
120
120
  from rapidfuzz import distance as rf_distance
121
121
 
122
- module_map: Dict[str, Any] = {
122
+ module_map: dict[str, Any] = {
123
123
  StringDistance.DAMERAU_LEVENSHTEIN: rf_distance.DamerauLevenshtein,
124
124
  StringDistance.LEVENSHTEIN: rf_distance.Levenshtein,
125
125
  StringDistance.JARO: rf_distance.Jaro,
@@ -202,7 +202,7 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
202
202
  return True
203
203
 
204
204
  @property
205
- def input_keys(self) -> List[str]:
205
+ def input_keys(self) -> list[str]:
206
206
  """
207
207
  Get the input keys.
208
208
 
@@ -223,9 +223,9 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
223
223
 
224
224
  def _call(
225
225
  self,
226
- inputs: Dict[str, Any],
226
+ inputs: dict[str, Any],
227
227
  run_manager: Optional[CallbackManagerForChainRun] = None,
228
- ) -> Dict[str, Any]:
228
+ ) -> dict[str, Any]:
229
229
  """
230
230
  Compute the string distance between the prediction and the reference.
231
231
 
@@ -241,9 +241,9 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
241
241
 
242
242
  async def _acall(
243
243
  self,
244
- inputs: Dict[str, Any],
244
+ inputs: dict[str, Any],
245
245
  run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
246
- ) -> Dict[str, Any]:
246
+ ) -> dict[str, Any]:
247
247
  """
248
248
  Asynchronously compute the string distance between the prediction
249
249
  and the reference.
@@ -265,8 +265,8 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
265
265
  reference: Optional[str] = None,
266
266
  input: Optional[str] = None,
267
267
  callbacks: Callbacks = None,
268
- tags: Optional[List[str]] = None,
269
- metadata: Optional[Dict[str, Any]] = None,
268
+ tags: Optional[list[str]] = None,
269
+ metadata: Optional[dict[str, Any]] = None,
270
270
  include_run_info: bool = False,
271
271
  **kwargs: Any,
272
272
  ) -> dict:
@@ -300,8 +300,8 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
300
300
  reference: Optional[str] = None,
301
301
  input: Optional[str] = None,
302
302
  callbacks: Callbacks = None,
303
- tags: Optional[List[str]] = None,
304
- metadata: Optional[Dict[str, Any]] = None,
303
+ tags: Optional[list[str]] = None,
304
+ metadata: Optional[dict[str, Any]] = None,
305
305
  include_run_info: bool = False,
306
306
  **kwargs: Any,
307
307
  ) -> dict:
@@ -333,7 +333,7 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
333
333
  """Compute string edit distances between two predictions."""
334
334
 
335
335
  @property
336
- def input_keys(self) -> List[str]:
336
+ def input_keys(self) -> list[str]:
337
337
  """
338
338
  Get the input keys.
339
339
 
@@ -354,9 +354,9 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
354
354
 
355
355
  def _call(
356
356
  self,
357
- inputs: Dict[str, Any],
357
+ inputs: dict[str, Any],
358
358
  run_manager: Optional[CallbackManagerForChainRun] = None,
359
- ) -> Dict[str, Any]:
359
+ ) -> dict[str, Any]:
360
360
  """
361
361
  Compute the string distance between two predictions.
362
362
 
@@ -374,9 +374,9 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
374
374
 
375
375
  async def _acall(
376
376
  self,
377
- inputs: Dict[str, Any],
377
+ inputs: dict[str, Any],
378
378
  run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
379
- ) -> Dict[str, Any]:
379
+ ) -> dict[str, Any]:
380
380
  """
381
381
  Asynchronously compute the string distance between two predictions.
382
382
 
@@ -398,8 +398,8 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
398
398
  prediction: str,
399
399
  prediction_b: str,
400
400
  callbacks: Callbacks = None,
401
- tags: Optional[List[str]] = None,
402
- metadata: Optional[Dict[str, Any]] = None,
401
+ tags: Optional[list[str]] = None,
402
+ metadata: Optional[dict[str, Any]] = None,
403
403
  include_run_info: bool = False,
404
404
  **kwargs: Any,
405
405
  ) -> dict:
@@ -432,8 +432,8 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
432
432
  prediction: str,
433
433
  prediction_b: str,
434
434
  callbacks: Callbacks = None,
435
- tags: Optional[List[str]] = None,
436
- metadata: Optional[Dict[str, Any]] = None,
435
+ tags: Optional[list[str]] = None,
436
+ metadata: Optional[dict[str, Any]] = None,
437
437
  include_run_info: bool = False,
438
438
  **kwargs: Any,
439
439
  ) -> dict:
langchain/hub.py CHANGED
@@ -3,7 +3,8 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import json
6
- from typing import Any, Optional, Sequence
6
+ from collections.abc import Sequence
7
+ from typing import Any, Optional
7
8
 
8
9
  from langchain_core.load.dump import dumps
9
10
  from langchain_core.load.load import loads
@@ -17,7 +17,8 @@ allow it to work with a variety of SQL as a backend.
17
17
  import contextlib
18
18
  import decimal
19
19
  import uuid
20
- from typing import Any, AsyncGenerator, Dict, Generator, List, Optional, Sequence, Union
20
+ from collections.abc import AsyncGenerator, Generator, Sequence
21
+ from typing import Any, Optional, Union
21
22
 
22
23
  from langchain_core.indexing import RecordManager
23
24
  from sqlalchemy import (
@@ -44,7 +45,7 @@ try:
44
45
  from sqlalchemy.ext.asyncio import async_sessionmaker
45
46
  except ImportError:
46
47
  # dummy for sqlalchemy < 2
47
- async_sessionmaker = type("async_sessionmaker", (type,), {}) # type: ignore
48
+ async_sessionmaker = type("async_sessionmaker", (type,), {}) # type: ignore[assignment,misc]
48
49
 
49
50
  Base = declarative_base()
50
51
 
@@ -90,7 +91,7 @@ class SQLRecordManager(RecordManager):
90
91
  *,
91
92
  engine: Optional[Union[Engine, AsyncEngine]] = None,
92
93
  db_url: Union[None, str, URL] = None,
93
- engine_kwargs: Optional[Dict[str, Any]] = None,
94
+ engine_kwargs: Optional[dict[str, Any]] = None,
94
95
  async_mode: bool = False,
95
96
  ) -> None:
96
97
  """Initialize the SQLRecordManager.
@@ -403,7 +404,7 @@ class SQLRecordManager(RecordManager):
403
404
  await session.execute(stmt)
404
405
  await session.commit()
405
406
 
406
- def exists(self, keys: Sequence[str]) -> List[bool]:
407
+ def exists(self, keys: Sequence[str]) -> list[bool]:
407
408
  """Check if the given keys exist in the SQLite database."""
408
409
  session: Session
409
410
  with self._make_session() as session:
@@ -417,7 +418,7 @@ class SQLRecordManager(RecordManager):
417
418
  found_keys = set(r.key for r in records)
418
419
  return [k in found_keys for k in keys]
419
420
 
420
- async def aexists(self, keys: Sequence[str]) -> List[bool]:
421
+ async def aexists(self, keys: Sequence[str]) -> list[bool]:
421
422
  """Check if the given keys exist in the SQLite database."""
422
423
  async with self._amake_session() as session:
423
424
  records = (
@@ -444,7 +445,7 @@ class SQLRecordManager(RecordManager):
444
445
  after: Optional[float] = None,
445
446
  group_ids: Optional[Sequence[str]] = None,
446
447
  limit: Optional[int] = None,
447
- ) -> List[str]:
448
+ ) -> list[str]:
448
449
  """List records in the SQLite database based on the provided date range."""
449
450
  session: Session
450
451
  with self._make_session() as session:
@@ -471,7 +472,7 @@ class SQLRecordManager(RecordManager):
471
472
  after: Optional[float] = None,
472
473
  group_ids: Optional[Sequence[str]] = None,
473
474
  limit: Optional[int] = None,
474
- ) -> List[str]:
475
+ ) -> list[str]:
475
476
  """List records in the SQLite database based on the provided date range."""
476
477
  session: AsyncSession
477
478
  async with self._amake_session() as session: