langchain-core 1.0.0a5__py3-none-any.whl → 1.0.3__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 (165) hide show
  1. langchain_core/__init__.py +1 -1
  2. langchain_core/_api/__init__.py +3 -4
  3. langchain_core/_api/beta_decorator.py +23 -26
  4. langchain_core/_api/deprecation.py +51 -64
  5. langchain_core/_api/path.py +3 -6
  6. langchain_core/_import_utils.py +3 -4
  7. langchain_core/agents.py +20 -22
  8. langchain_core/caches.py +65 -66
  9. langchain_core/callbacks/__init__.py +1 -8
  10. langchain_core/callbacks/base.py +321 -336
  11. langchain_core/callbacks/file.py +44 -44
  12. langchain_core/callbacks/manager.py +436 -513
  13. langchain_core/callbacks/stdout.py +29 -30
  14. langchain_core/callbacks/streaming_stdout.py +32 -32
  15. langchain_core/callbacks/usage.py +60 -57
  16. langchain_core/chat_history.py +53 -68
  17. langchain_core/document_loaders/base.py +27 -25
  18. langchain_core/document_loaders/blob_loaders.py +1 -1
  19. langchain_core/document_loaders/langsmith.py +44 -48
  20. langchain_core/documents/__init__.py +23 -3
  21. langchain_core/documents/base.py +98 -90
  22. langchain_core/documents/compressor.py +10 -10
  23. langchain_core/documents/transformers.py +34 -35
  24. langchain_core/embeddings/fake.py +50 -54
  25. langchain_core/example_selectors/length_based.py +1 -1
  26. langchain_core/example_selectors/semantic_similarity.py +28 -32
  27. langchain_core/exceptions.py +21 -20
  28. langchain_core/globals.py +3 -151
  29. langchain_core/indexing/__init__.py +1 -1
  30. langchain_core/indexing/api.py +121 -126
  31. langchain_core/indexing/base.py +73 -75
  32. langchain_core/indexing/in_memory.py +4 -6
  33. langchain_core/language_models/__init__.py +14 -29
  34. langchain_core/language_models/_utils.py +58 -61
  35. langchain_core/language_models/base.py +53 -162
  36. langchain_core/language_models/chat_models.py +298 -387
  37. langchain_core/language_models/fake.py +11 -11
  38. langchain_core/language_models/fake_chat_models.py +42 -36
  39. langchain_core/language_models/llms.py +125 -235
  40. langchain_core/load/dump.py +9 -12
  41. langchain_core/load/load.py +18 -28
  42. langchain_core/load/mapping.py +2 -4
  43. langchain_core/load/serializable.py +42 -40
  44. langchain_core/messages/__init__.py +10 -16
  45. langchain_core/messages/ai.py +148 -148
  46. langchain_core/messages/base.py +58 -52
  47. langchain_core/messages/block_translators/__init__.py +27 -17
  48. langchain_core/messages/block_translators/anthropic.py +6 -6
  49. langchain_core/messages/block_translators/bedrock_converse.py +5 -5
  50. langchain_core/messages/block_translators/google_genai.py +505 -20
  51. langchain_core/messages/block_translators/google_vertexai.py +4 -32
  52. langchain_core/messages/block_translators/groq.py +117 -21
  53. langchain_core/messages/block_translators/langchain_v0.py +5 -5
  54. langchain_core/messages/block_translators/openai.py +11 -11
  55. langchain_core/messages/chat.py +2 -6
  56. langchain_core/messages/content.py +337 -328
  57. langchain_core/messages/function.py +6 -10
  58. langchain_core/messages/human.py +24 -31
  59. langchain_core/messages/modifier.py +2 -2
  60. langchain_core/messages/system.py +19 -29
  61. langchain_core/messages/tool.py +74 -90
  62. langchain_core/messages/utils.py +474 -504
  63. langchain_core/output_parsers/__init__.py +13 -10
  64. langchain_core/output_parsers/base.py +61 -61
  65. langchain_core/output_parsers/format_instructions.py +9 -4
  66. langchain_core/output_parsers/json.py +12 -10
  67. langchain_core/output_parsers/list.py +21 -23
  68. langchain_core/output_parsers/openai_functions.py +49 -47
  69. langchain_core/output_parsers/openai_tools.py +16 -21
  70. langchain_core/output_parsers/pydantic.py +13 -14
  71. langchain_core/output_parsers/string.py +5 -5
  72. langchain_core/output_parsers/transform.py +15 -17
  73. langchain_core/output_parsers/xml.py +35 -34
  74. langchain_core/outputs/__init__.py +1 -1
  75. langchain_core/outputs/chat_generation.py +18 -18
  76. langchain_core/outputs/chat_result.py +1 -3
  77. langchain_core/outputs/generation.py +10 -11
  78. langchain_core/outputs/llm_result.py +10 -10
  79. langchain_core/prompt_values.py +11 -17
  80. langchain_core/prompts/__init__.py +3 -27
  81. langchain_core/prompts/base.py +48 -56
  82. langchain_core/prompts/chat.py +275 -325
  83. langchain_core/prompts/dict.py +5 -5
  84. langchain_core/prompts/few_shot.py +81 -88
  85. langchain_core/prompts/few_shot_with_templates.py +11 -13
  86. langchain_core/prompts/image.py +12 -14
  87. langchain_core/prompts/loading.py +4 -6
  88. langchain_core/prompts/message.py +3 -3
  89. langchain_core/prompts/prompt.py +24 -39
  90. langchain_core/prompts/string.py +26 -10
  91. langchain_core/prompts/structured.py +49 -53
  92. langchain_core/rate_limiters.py +51 -60
  93. langchain_core/retrievers.py +61 -198
  94. langchain_core/runnables/base.py +1478 -1630
  95. langchain_core/runnables/branch.py +53 -57
  96. langchain_core/runnables/config.py +72 -89
  97. langchain_core/runnables/configurable.py +120 -137
  98. langchain_core/runnables/fallbacks.py +83 -79
  99. langchain_core/runnables/graph.py +91 -97
  100. langchain_core/runnables/graph_ascii.py +27 -28
  101. langchain_core/runnables/graph_mermaid.py +38 -50
  102. langchain_core/runnables/graph_png.py +15 -16
  103. langchain_core/runnables/history.py +135 -148
  104. langchain_core/runnables/passthrough.py +124 -150
  105. langchain_core/runnables/retry.py +46 -51
  106. langchain_core/runnables/router.py +25 -30
  107. langchain_core/runnables/schema.py +75 -80
  108. langchain_core/runnables/utils.py +60 -67
  109. langchain_core/stores.py +85 -121
  110. langchain_core/structured_query.py +8 -8
  111. langchain_core/sys_info.py +27 -29
  112. langchain_core/tools/__init__.py +1 -14
  113. langchain_core/tools/base.py +285 -229
  114. langchain_core/tools/convert.py +160 -155
  115. langchain_core/tools/render.py +10 -10
  116. langchain_core/tools/retriever.py +12 -11
  117. langchain_core/tools/simple.py +19 -24
  118. langchain_core/tools/structured.py +32 -39
  119. langchain_core/tracers/__init__.py +1 -9
  120. langchain_core/tracers/base.py +97 -99
  121. langchain_core/tracers/context.py +29 -52
  122. langchain_core/tracers/core.py +49 -53
  123. langchain_core/tracers/evaluation.py +11 -11
  124. langchain_core/tracers/event_stream.py +65 -64
  125. langchain_core/tracers/langchain.py +21 -21
  126. langchain_core/tracers/log_stream.py +45 -45
  127. langchain_core/tracers/memory_stream.py +3 -3
  128. langchain_core/tracers/root_listeners.py +16 -16
  129. langchain_core/tracers/run_collector.py +2 -4
  130. langchain_core/tracers/schemas.py +0 -129
  131. langchain_core/tracers/stdout.py +3 -3
  132. langchain_core/utils/__init__.py +1 -4
  133. langchain_core/utils/_merge.py +2 -2
  134. langchain_core/utils/aiter.py +57 -61
  135. langchain_core/utils/env.py +9 -9
  136. langchain_core/utils/function_calling.py +89 -186
  137. langchain_core/utils/html.py +7 -8
  138. langchain_core/utils/input.py +6 -6
  139. langchain_core/utils/interactive_env.py +1 -1
  140. langchain_core/utils/iter.py +36 -40
  141. langchain_core/utils/json.py +4 -3
  142. langchain_core/utils/json_schema.py +9 -9
  143. langchain_core/utils/mustache.py +8 -10
  144. langchain_core/utils/pydantic.py +33 -35
  145. langchain_core/utils/strings.py +6 -9
  146. langchain_core/utils/usage.py +1 -1
  147. langchain_core/utils/utils.py +66 -62
  148. langchain_core/vectorstores/base.py +182 -216
  149. langchain_core/vectorstores/in_memory.py +101 -176
  150. langchain_core/vectorstores/utils.py +5 -5
  151. langchain_core/version.py +1 -1
  152. langchain_core-1.0.3.dist-info/METADATA +69 -0
  153. langchain_core-1.0.3.dist-info/RECORD +172 -0
  154. {langchain_core-1.0.0a5.dist-info → langchain_core-1.0.3.dist-info}/WHEEL +1 -1
  155. langchain_core/memory.py +0 -120
  156. langchain_core/messages/block_translators/ollama.py +0 -47
  157. langchain_core/prompts/pipeline.py +0 -138
  158. langchain_core/pydantic_v1/__init__.py +0 -30
  159. langchain_core/pydantic_v1/dataclasses.py +0 -23
  160. langchain_core/pydantic_v1/main.py +0 -23
  161. langchain_core/tracers/langchain_v1.py +0 -31
  162. langchain_core/utils/loading.py +0 -35
  163. langchain_core-1.0.0a5.dist-info/METADATA +0 -77
  164. langchain_core-1.0.0a5.dist-info/RECORD +0 -181
  165. langchain_core-1.0.0a5.dist-info/entry_points.txt +0 -4
@@ -15,11 +15,11 @@ from langchain_core.utils._merge import merge_dicts
15
15
  class FunctionMessage(BaseMessage):
16
16
  """Message for passing the result of executing a tool back to a model.
17
17
 
18
- ``FunctionMessage`` are an older version of the ``ToolMessage`` schema, and
19
- do not contain the ``tool_call_id`` field.
18
+ `FunctionMessage` are an older version of the `ToolMessage` schema, and
19
+ do not contain the `tool_call_id` field.
20
20
 
21
- The ``tool_call_id`` field is used to associate the tool call request with the
22
- tool call response. This is useful in situations where a chat model is able
21
+ The `tool_call_id` field is used to associate the tool call request with the
22
+ tool call response. Useful in situations where a chat model is able
23
23
  to request multiple tool calls in parallel.
24
24
 
25
25
  """
@@ -28,7 +28,7 @@ class FunctionMessage(BaseMessage):
28
28
  """The name of the function that was executed."""
29
29
 
30
30
  type: Literal["function"] = "function"
31
- """The type of the message (used for serialization). Defaults to ``'function'``."""
31
+ """The type of the message (used for serialization)."""
32
32
 
33
33
 
34
34
  class FunctionMessageChunk(FunctionMessage, BaseMessageChunk):
@@ -38,11 +38,7 @@ class FunctionMessageChunk(FunctionMessage, BaseMessageChunk):
38
38
  # to make sure that the chunk variant can be discriminated from the
39
39
  # non-chunk variant.
40
40
  type: Literal["FunctionMessageChunk"] = "FunctionMessageChunk" # type: ignore[assignment]
41
- """The type of the message (used for serialization).
42
-
43
- Defaults to ``'FunctionMessageChunk'``.
44
-
45
- """
41
+ """The type of the message (used for serialization)."""
46
42
 
47
43
  @override
48
44
  def __add__(self, other: Any) -> BaseMessageChunk: # type: ignore[override]
@@ -1,65 +1,59 @@
1
1
  """Human message."""
2
2
 
3
- from typing import Any, Literal, Optional, Union, cast, overload
3
+ from typing import Any, Literal, cast, overload
4
4
 
5
5
  from langchain_core.messages import content as types
6
6
  from langchain_core.messages.base import BaseMessage, BaseMessageChunk
7
7
 
8
8
 
9
9
  class HumanMessage(BaseMessage):
10
- """Message from a human.
10
+ """Message from the user.
11
11
 
12
- ``HumanMessage``s are messages that are passed in from a human to the model.
12
+ A `HumanMessage` is a message that is passed in from a user to the model.
13
13
 
14
14
  Example:
15
-
16
- .. code-block:: python
17
-
18
- from langchain_core.messages import HumanMessage, SystemMessage
19
-
20
- messages = [
21
- SystemMessage(content="You are a helpful assistant! Your name is Bob."),
22
- HumanMessage(content="What is your name?"),
23
- ]
24
-
25
- # Instantiate a chat model and invoke it with the messages
26
- model = ...
27
- print(model.invoke(messages))
28
-
15
+ ```python
16
+ from langchain_core.messages import HumanMessage, SystemMessage
17
+
18
+ messages = [
19
+ SystemMessage(content="You are a helpful assistant! Your name is Bob."),
20
+ HumanMessage(content="What is your name?"),
21
+ ]
22
+
23
+ # Instantiate a chat model and invoke it with the messages
24
+ model = ...
25
+ print(model.invoke(messages))
26
+ ```
29
27
  """
30
28
 
31
29
  type: Literal["human"] = "human"
32
- """The type of the message (used for serialization).
33
-
34
- Defaults to ``'human'``.
35
-
36
- """
30
+ """The type of the message (used for serialization)."""
37
31
 
38
32
  @overload
39
33
  def __init__(
40
34
  self,
41
- content: Union[str, list[Union[str, dict]]],
35
+ content: str | list[str | dict],
42
36
  **kwargs: Any,
43
37
  ) -> None: ...
44
38
 
45
39
  @overload
46
40
  def __init__(
47
41
  self,
48
- content: Optional[Union[str, list[Union[str, dict]]]] = None,
49
- content_blocks: Optional[list[types.ContentBlock]] = None,
42
+ content: str | list[str | dict] | None = None,
43
+ content_blocks: list[types.ContentBlock] | None = None,
50
44
  **kwargs: Any,
51
45
  ) -> None: ...
52
46
 
53
47
  def __init__(
54
48
  self,
55
- content: Optional[Union[str, list[Union[str, dict]]]] = None,
56
- content_blocks: Optional[list[types.ContentBlock]] = None,
49
+ content: str | list[str | dict] | None = None,
50
+ content_blocks: list[types.ContentBlock] | None = None,
57
51
  **kwargs: Any,
58
52
  ) -> None:
59
- """Specify ``content`` as positional arg or ``content_blocks`` for typing."""
53
+ """Specify `content` as positional arg or `content_blocks` for typing."""
60
54
  if content_blocks is not None:
61
55
  super().__init__(
62
- content=cast("Union[str, list[Union[str, dict]]]", content_blocks),
56
+ content=cast("str | list[str | dict]", content_blocks),
63
57
  **kwargs,
64
58
  )
65
59
  else:
@@ -73,5 +67,4 @@ class HumanMessageChunk(HumanMessage, BaseMessageChunk):
73
67
  # to make sure that the chunk variant can be discriminated from the
74
68
  # non-chunk variant.
75
69
  type: Literal["HumanMessageChunk"] = "HumanMessageChunk" # type: ignore[assignment]
76
- """The type of the message (used for serialization).
77
- Defaults to "HumanMessageChunk"."""
70
+ """The type of the message (used for serialization)."""
@@ -9,7 +9,7 @@ class RemoveMessage(BaseMessage):
9
9
  """Message responsible for deleting other messages."""
10
10
 
11
11
  type: Literal["remove"] = "remove"
12
- """The type of the message (used for serialization). Defaults to "remove"."""
12
+ """The type of the message (used for serialization)."""
13
13
 
14
14
  def __init__(
15
15
  self,
@@ -20,7 +20,7 @@ class RemoveMessage(BaseMessage):
20
20
 
21
21
  Args:
22
22
  id: The ID of the message to remove.
23
- kwargs: Additional fields to pass to the message.
23
+ **kwargs: Additional fields to pass to the message.
24
24
 
25
25
  Raises:
26
26
  ValueError: If the 'content' field is passed in kwargs.
@@ -1,6 +1,6 @@
1
1
  """System message."""
2
2
 
3
- from typing import Any, Literal, Optional, Union, cast, overload
3
+ from typing import Any, Literal, cast, overload
4
4
 
5
5
  from langchain_core.messages import content as types
6
6
  from langchain_core.messages.base import BaseMessage, BaseMessageChunk
@@ -13,53 +13,47 @@ class SystemMessage(BaseMessage):
13
13
  of input messages.
14
14
 
15
15
  Example:
16
+ ```python
17
+ from langchain_core.messages import HumanMessage, SystemMessage
16
18
 
17
- .. code-block:: python
18
-
19
- from langchain_core.messages import HumanMessage, SystemMessage
20
-
21
- messages = [
22
- SystemMessage(content="You are a helpful assistant! Your name is Bob."),
23
- HumanMessage(content="What is your name?"),
24
- ]
25
-
26
- # Define a chat model and invoke it with the messages
27
- print(model.invoke(messages))
19
+ messages = [
20
+ SystemMessage(content="You are a helpful assistant! Your name is Bob."),
21
+ HumanMessage(content="What is your name?"),
22
+ ]
28
23
 
24
+ # Define a chat model and invoke it with the messages
25
+ print(model.invoke(messages))
26
+ ```
29
27
  """
30
28
 
31
29
  type: Literal["system"] = "system"
32
- """The type of the message (used for serialization).
33
-
34
- Defaults to ``'system'``.
35
-
36
- """
30
+ """The type of the message (used for serialization)."""
37
31
 
38
32
  @overload
39
33
  def __init__(
40
34
  self,
41
- content: Union[str, list[Union[str, dict]]],
35
+ content: str | list[str | dict],
42
36
  **kwargs: Any,
43
37
  ) -> None: ...
44
38
 
45
39
  @overload
46
40
  def __init__(
47
41
  self,
48
- content: Optional[Union[str, list[Union[str, dict]]]] = None,
49
- content_blocks: Optional[list[types.ContentBlock]] = None,
42
+ content: str | list[str | dict] | None = None,
43
+ content_blocks: list[types.ContentBlock] | None = None,
50
44
  **kwargs: Any,
51
45
  ) -> None: ...
52
46
 
53
47
  def __init__(
54
48
  self,
55
- content: Optional[Union[str, list[Union[str, dict]]]] = None,
56
- content_blocks: Optional[list[types.ContentBlock]] = None,
49
+ content: str | list[str | dict] | None = None,
50
+ content_blocks: list[types.ContentBlock] | None = None,
57
51
  **kwargs: Any,
58
52
  ) -> None:
59
- """Specify ``content`` as positional arg or ``content_blocks`` for typing."""
53
+ """Specify `content` as positional arg or `content_blocks` for typing."""
60
54
  if content_blocks is not None:
61
55
  super().__init__(
62
- content=cast("Union[str, list[Union[str, dict]]]", content_blocks),
56
+ content=cast("str | list[str | dict]", content_blocks),
63
57
  **kwargs,
64
58
  )
65
59
  else:
@@ -73,8 +67,4 @@ class SystemMessageChunk(SystemMessage, BaseMessageChunk):
73
67
  # to make sure that the chunk variant can be discriminated from the
74
68
  # non-chunk variant.
75
69
  type: Literal["SystemMessageChunk"] = "SystemMessageChunk" # type: ignore[assignment]
76
- """The type of the message (used for serialization).
77
-
78
- Defaults to ``'SystemMessageChunk'``.
79
-
80
- """
70
+ """The type of the message (used for serialization)."""
@@ -1,7 +1,7 @@
1
1
  """Messages for tools."""
2
2
 
3
3
  import json
4
- from typing import Any, Literal, Optional, Union, cast, overload
4
+ from typing import Any, Literal, cast, overload
5
5
  from uuid import UUID
6
6
 
7
7
  from pydantic import Field, model_validator
@@ -16,9 +16,9 @@ from langchain_core.utils._merge import merge_dicts, merge_obj
16
16
  class ToolOutputMixin:
17
17
  """Mixin for objects that tools can return directly.
18
18
 
19
- If a custom BaseTool is invoked with a ``ToolCall`` and the output of custom code is
20
- not an instance of ``ToolOutputMixin``, the output will automatically be coerced to
21
- a string and wrapped in a ``ToolMessage``.
19
+ If a custom BaseTool is invoked with a `ToolCall` and the output of custom code is
20
+ not an instance of `ToolOutputMixin`, the output will automatically be coerced to
21
+ a string and wrapped in a `ToolMessage`.
22
22
 
23
23
  """
24
24
 
@@ -26,42 +26,39 @@ class ToolOutputMixin:
26
26
  class ToolMessage(BaseMessage, ToolOutputMixin):
27
27
  """Message for passing the result of executing a tool back to a model.
28
28
 
29
- ``ToolMessage``s contain the result of a tool invocation. Typically, the result
30
- is encoded inside the ``content`` field.
29
+ `ToolMessage` objects contain the result of a tool invocation. Typically, the result
30
+ is encoded inside the `content` field.
31
31
 
32
- Example: A ``ToolMessage`` representing a result of ``42`` from a tool call with id
32
+ Example: A `ToolMessage` representing a result of `42` from a tool call with id
33
33
 
34
- .. code-block:: python
34
+ ```python
35
+ from langchain_core.messages import ToolMessage
35
36
 
36
- from langchain_core.messages import ToolMessage
37
+ ToolMessage(content="42", tool_call_id="call_Jja7J89XsjrOLA5r!MEOW!SL")
38
+ ```
37
39
 
38
- ToolMessage(content="42", tool_call_id="call_Jja7J89XsjrOLA5r!MEOW!SL")
40
+ Example: A `ToolMessage` where only part of the tool output is sent to the model
41
+ and the full output is passed in to artifact.
39
42
 
43
+ ```python
44
+ from langchain_core.messages import ToolMessage
40
45
 
41
- Example: A ``ToolMessage`` where only part of the tool output is sent to the model
42
- and the full output is passed in to artifact.
46
+ tool_output = {
47
+ "stdout": "From the graph we can see that the correlation between "
48
+ "x and y is ...",
49
+ "stderr": None,
50
+ "artifacts": {"type": "image", "base64_data": "/9j/4gIcSU..."},
51
+ }
43
52
 
44
- .. versionadded:: 0.2.17
45
-
46
- .. code-block:: python
47
-
48
- from langchain_core.messages import ToolMessage
49
-
50
- tool_output = {
51
- "stdout": "From the graph we can see that the correlation between "
52
- "x and y is ...",
53
- "stderr": None,
54
- "artifacts": {"type": "image", "base64_data": "/9j/4gIcSU..."},
55
- }
56
-
57
- ToolMessage(
58
- content=tool_output["stdout"],
59
- artifact=tool_output,
60
- tool_call_id="call_Jja7J89XsjrOLA5r!MEOW!SL",
61
- )
53
+ ToolMessage(
54
+ content=tool_output["stdout"],
55
+ artifact=tool_output,
56
+ tool_call_id="call_Jja7J89XsjrOLA5r!MEOW!SL",
57
+ )
58
+ ```
62
59
 
63
- The ``tool_call_id`` field is used to associate the tool call request with the
64
- tool call response. This is useful in situations where a chat model is able
60
+ The `tool_call_id` field is used to associate the tool call request with the
61
+ tool call response. Useful in situations where a chat model is able
65
62
  to request multiple tool calls in parallel.
66
63
 
67
64
  """
@@ -70,11 +67,7 @@ class ToolMessage(BaseMessage, ToolOutputMixin):
70
67
  """Tool call that this message is responding to."""
71
68
 
72
69
  type: Literal["tool"] = "tool"
73
- """The type of the message (used for serialization).
74
-
75
- Defaults to ``'tool'``.
76
-
77
- """
70
+ """The type of the message (used for serialization)."""
78
71
 
79
72
  artifact: Any = None
80
73
  """Artifact of the Tool execution which is not meant to be sent to the model.
@@ -83,21 +76,15 @@ class ToolMessage(BaseMessage, ToolOutputMixin):
83
76
  a subset of the full tool output is being passed as message content but the full
84
77
  output is needed in other parts of the code.
85
78
 
86
- .. versionadded:: 0.2.17
87
-
88
79
  """
89
80
 
90
81
  status: Literal["success", "error"] = "success"
91
- """Status of the tool invocation.
92
-
93
- .. versionadded:: 0.2.24
94
-
95
- """
82
+ """Status of the tool invocation."""
96
83
 
97
84
  additional_kwargs: dict = Field(default_factory=dict, repr=False)
98
- """Currently inherited from BaseMessage, but not used."""
85
+ """Currently inherited from `BaseMessage`, but not used."""
99
86
  response_metadata: dict = Field(default_factory=dict, repr=False)
100
- """Currently inherited from BaseMessage, but not used."""
87
+ """Currently inherited from `BaseMessage`, but not used."""
101
88
 
102
89
  @model_validator(mode="before")
103
90
  @classmethod
@@ -147,36 +134,36 @@ class ToolMessage(BaseMessage, ToolOutputMixin):
147
134
  @overload
148
135
  def __init__(
149
136
  self,
150
- content: Union[str, list[Union[str, dict]]],
137
+ content: str | list[str | dict],
151
138
  **kwargs: Any,
152
139
  ) -> None: ...
153
140
 
154
141
  @overload
155
142
  def __init__(
156
143
  self,
157
- content: Optional[Union[str, list[Union[str, dict]]]] = None,
158
- content_blocks: Optional[list[types.ContentBlock]] = None,
144
+ content: str | list[str | dict] | None = None,
145
+ content_blocks: list[types.ContentBlock] | None = None,
159
146
  **kwargs: Any,
160
147
  ) -> None: ...
161
148
 
162
149
  def __init__(
163
150
  self,
164
- content: Optional[Union[str, list[Union[str, dict]]]] = None,
165
- content_blocks: Optional[list[types.ContentBlock]] = None,
151
+ content: str | list[str | dict] | None = None,
152
+ content_blocks: list[types.ContentBlock] | None = None,
166
153
  **kwargs: Any,
167
154
  ) -> None:
168
- """Initialize ``ToolMessage``.
155
+ """Initialize a `ToolMessage`.
169
156
 
170
- Specify ``content`` as positional arg or ``content_blocks`` for typing.
157
+ Specify `content` as positional arg or `content_blocks` for typing.
171
158
 
172
159
  Args:
173
- content: The string contents of the message.
160
+ content: The contents of the message.
174
161
  content_blocks: Typed standard content.
175
162
  **kwargs: Additional fields.
176
163
  """
177
164
  if content_blocks is not None:
178
165
  super().__init__(
179
- content=cast("Union[str, list[Union[str, dict]]]", content_blocks),
166
+ content=cast("str | list[str | dict]", content_blocks),
180
167
  **kwargs,
181
168
  )
182
169
  else:
@@ -216,16 +203,15 @@ class ToolMessageChunk(ToolMessage, BaseMessageChunk):
216
203
 
217
204
 
218
205
  class ToolCall(TypedDict):
219
- """Represents a request to call a tool.
206
+ """Represents an AI's request to call a tool.
220
207
 
221
208
  Example:
209
+ ```python
210
+ {"name": "foo", "args": {"a": 1}, "id": "123"}
211
+ ```
222
212
 
223
- .. code-block:: python
224
-
225
- {"name": "foo", "args": {"a": 1}, "id": "123"}
226
-
227
- This represents a request to call the tool named ``'foo'`` with arguments
228
- ``{"a": 1}`` and an identifier of ``'123'``.
213
+ This represents a request to call the tool named `'foo'` with arguments
214
+ `{"a": 1}` and an identifier of `'123'`.
229
215
 
230
216
  """
231
217
 
@@ -233,7 +219,7 @@ class ToolCall(TypedDict):
233
219
  """The name of the tool to be called."""
234
220
  args: dict[str, Any]
235
221
  """The arguments to the tool call."""
236
- id: Optional[str]
222
+ id: str | None
237
223
  """An identifier associated with the tool call.
238
224
 
239
225
  An identifier is needed to associate a tool call request with a tool
@@ -247,7 +233,7 @@ def tool_call(
247
233
  *,
248
234
  name: str,
249
235
  args: dict[str, Any],
250
- id: Optional[str],
236
+ id: str | None,
251
237
  ) -> ToolCall:
252
238
  """Create a tool call.
253
239
 
@@ -263,43 +249,41 @@ def tool_call(
263
249
 
264
250
 
265
251
  class ToolCallChunk(TypedDict):
266
- """A chunk of a tool call (e.g., as part of a stream).
252
+ """A chunk of a tool call (yielded when streaming).
267
253
 
268
- When merging ``ToolCallChunk``s (e.g., via ``AIMessageChunk.__add__``),
254
+ When merging `ToolCallChunk`s (e.g., via `AIMessageChunk.__add__`),
269
255
  all string attributes are concatenated. Chunks are only merged if their
270
- values of ``index`` are equal and not None.
256
+ values of `index` are equal and not None.
271
257
 
272
258
  Example:
273
-
274
- .. code-block:: python
275
-
276
- left_chunks = [ToolCallChunk(name="foo", args='{"a":', index=0)]
277
- right_chunks = [ToolCallChunk(name=None, args="1}", index=0)]
278
-
279
- (
280
- AIMessageChunk(content="", tool_call_chunks=left_chunks)
281
- + AIMessageChunk(content="", tool_call_chunks=right_chunks)
282
- ).tool_call_chunks == [ToolCallChunk(name="foo", args='{"a":1}', index=0)]
283
-
259
+ ```python
260
+ left_chunks = [ToolCallChunk(name="foo", args='{"a":', index=0)]
261
+ right_chunks = [ToolCallChunk(name=None, args="1}", index=0)]
262
+
263
+ (
264
+ AIMessageChunk(content="", tool_call_chunks=left_chunks)
265
+ + AIMessageChunk(content="", tool_call_chunks=right_chunks)
266
+ ).tool_call_chunks == [ToolCallChunk(name="foo", args='{"a":1}', index=0)]
267
+ ```
284
268
  """
285
269
 
286
- name: Optional[str]
270
+ name: str | None
287
271
  """The name of the tool to be called."""
288
- args: Optional[str]
272
+ args: str | None
289
273
  """The arguments to the tool call."""
290
- id: Optional[str]
274
+ id: str | None
291
275
  """An identifier associated with the tool call."""
292
- index: Optional[int]
276
+ index: int | None
293
277
  """The index of the tool call in a sequence."""
294
278
  type: NotRequired[Literal["tool_call_chunk"]]
295
279
 
296
280
 
297
281
  def tool_call_chunk(
298
282
  *,
299
- name: Optional[str] = None,
300
- args: Optional[str] = None,
301
- id: Optional[str] = None,
302
- index: Optional[int] = None,
283
+ name: str | None = None,
284
+ args: str | None = None,
285
+ id: str | None = None,
286
+ index: int | None = None,
303
287
  ) -> ToolCallChunk:
304
288
  """Create a tool call chunk.
305
289
 
@@ -319,10 +303,10 @@ def tool_call_chunk(
319
303
 
320
304
  def invalid_tool_call(
321
305
  *,
322
- name: Optional[str] = None,
323
- args: Optional[str] = None,
324
- id: Optional[str] = None,
325
- error: Optional[str] = None,
306
+ name: str | None = None,
307
+ args: str | None = None,
308
+ id: str | None = None,
309
+ error: str | None = None,
326
310
  ) -> InvalidToolCall:
327
311
  """Create an invalid tool call.
328
312