diff --git a/libs/community/langchain_community/chat_models/deepinfra.py b/libs/community/langchain_community/chat_models/deepinfra.py
index 788324d895fb6..1a9941f386510 100644
--- a/libs/community/langchain_community/chat_models/deepinfra.py
+++ b/libs/community/langchain_community/chat_models/deepinfra.py
@@ -48,6 +48,7 @@
     ToolMessage,
 )
 from langchain_core.messages.tool import ToolCall
+from langchain_core.messages.tool import tool_call as create_tool_call
 from langchain_core.outputs import (
     ChatGeneration,
     ChatGenerationChunk,
@@ -96,7 +97,7 @@ def _parse_tool_calling(tool_call: dict) -> ToolCall:
     name = tool_call["function"].get("name", "")
     args = json.loads(tool_call["function"]["arguments"])
     id = tool_call.get("id")
-    return ToolCall(name=name, args=args, id=id)
+    return create_tool_call(name=name, args=args, id=id)
 
 
 def _convert_to_tool_calling(tool_call: ToolCall) -> Dict[str, Any]:
diff --git a/libs/community/langchain_community/chat_models/edenai.py b/libs/community/langchain_community/chat_models/edenai.py
index 0f16b0937bafa..d2adfc8925e25 100644
--- a/libs/community/langchain_community/chat_models/edenai.py
+++ b/libs/community/langchain_community/chat_models/edenai.py
@@ -36,9 +36,11 @@
     InvalidToolCall,
     SystemMessage,
     ToolCall,
-    ToolCallChunk,
     ToolMessage,
 )
+from langchain_core.messages.tool import invalid_tool_call as create_invalid_tool_call
+from langchain_core.messages.tool import tool_call as create_tool_call
+from langchain_core.messages.tool import tool_call_chunk as create_tool_call_chunk
 from langchain_core.output_parsers.base import OutputParserLike
 from langchain_core.output_parsers.openai_tools import (
     JsonOutputKeyToolsParser,
@@ -63,7 +65,7 @@ def _result_to_chunked_message(generated_result: ChatResult) -> ChatGenerationCh
     message = generated_result.generations[0].message
     if isinstance(message, AIMessage) and message.tool_calls is not None:
         tool_call_chunks = [
-            ToolCallChunk(
+            create_tool_call_chunk(
                 name=tool_call["name"],
                 args=json.dumps(tool_call["args"]),
                 id=tool_call["id"],
@@ -189,7 +191,7 @@ def _extract_tool_calls_from_edenai_response(
         for raw_tool_call in raw_tool_calls:
             try:
                 tool_calls.append(
-                    ToolCall(
+                    create_tool_call(
                         name=raw_tool_call["name"],
                         args=json.loads(raw_tool_call["arguments"]),
                         id=raw_tool_call["id"],
@@ -197,7 +199,7 @@ def _extract_tool_calls_from_edenai_response(
                 )
             except json.JSONDecodeError as exc:
                 invalid_tool_calls.append(
-                    InvalidToolCall(
+                    create_invalid_tool_call(
                         name=raw_tool_call.get("name"),
                         args=raw_tool_call.get("arguments"),
                         id=raw_tool_call.get("id"),
diff --git a/libs/core/langchain_core/messages/ai.py b/libs/core/langchain_core/messages/ai.py
index f0e7f6f7ee06b..ade80f7f37998 100644
--- a/libs/core/langchain_core/messages/ai.py
+++ b/libs/core/langchain_core/messages/ai.py
@@ -15,11 +15,18 @@
     default_tool_chunk_parser,
     default_tool_parser,
 )
+from langchain_core.messages.tool import (
+    invalid_tool_call as create_invalid_tool_call,
+)
+from langchain_core.messages.tool import (
+    tool_call as create_tool_call,
+)
+from langchain_core.messages.tool import (
+    tool_call_chunk as create_tool_call_chunk,
+)
 from langchain_core.pydantic_v1 import root_validator
 from langchain_core.utils._merge import merge_dicts, merge_lists
-from langchain_core.utils.json import (
-    parse_partial_json,
-)
+from langchain_core.utils.json import parse_partial_json
 
 
 class UsageMetadata(TypedDict):
@@ -106,24 +113,55 @@ def lc_attributes(self) -> Dict:
 
     @root_validator(pre=True)
     def _backwards_compat_tool_calls(cls, values: dict) -> dict:
-        raw_tool_calls = values.get("additional_kwargs", {}).get("tool_calls")
-        tool_calls = (
-            values.get("tool_calls")
-            or values.get("invalid_tool_calls")
-            or values.get("tool_call_chunks")
+        check_additional_kwargs = not any(
+            values.get(k)
+            for k in ("tool_calls", "invalid_tool_calls", "tool_call_chunks")
         )
-        if raw_tool_calls and not tool_calls:
+        if check_additional_kwargs and (
+            raw_tool_calls := values.get("additional_kwargs", {}).get("tool_calls")
+        ):
             try:
                 if issubclass(cls, AIMessageChunk):  # type: ignore
                     values["tool_call_chunks"] = default_tool_chunk_parser(
                         raw_tool_calls
                     )
                 else:
-                    tool_calls, invalid_tool_calls = default_tool_parser(raw_tool_calls)
-                    values["tool_calls"] = tool_calls
-                    values["invalid_tool_calls"] = invalid_tool_calls
+                    parsed_tool_calls, parsed_invalid_tool_calls = default_tool_parser(
+                        raw_tool_calls
+                    )
+                    values["tool_calls"] = parsed_tool_calls
+                    values["invalid_tool_calls"] = parsed_invalid_tool_calls
             except Exception:
                 pass
+
+        # Ensure "type" is properly set on all tool call-like dicts.
+        if tool_calls := values.get("tool_calls"):
+            updated: List = []
+            for tc in tool_calls:
+                updated.append(
+                    create_tool_call(**{k: v for k, v in tc.items() if k != "type"})
+                )
+            values["tool_calls"] = updated
+        if invalid_tool_calls := values.get("invalid_tool_calls"):
+            updated = []
+            for tc in invalid_tool_calls:
+                updated.append(
+                    create_invalid_tool_call(
+                        **{k: v for k, v in tc.items() if k != "type"}
+                    )
+                )
+            values["invalid_tool_calls"] = updated
+
+        if tool_call_chunks := values.get("tool_call_chunks"):
+            updated = []
+            for tc in tool_call_chunks:
+                updated.append(
+                    create_tool_call_chunk(
+                        **{k: v for k, v in tc.items() if k != "type"}
+                    )
+                )
+            values["tool_call_chunks"] = updated
+
         return values
 
     def pretty_repr(self, html: bool = False) -> str:
@@ -216,7 +254,7 @@ def init_tool_calls(cls, values: dict) -> dict:
         if not values["tool_call_chunks"]:
             if values["tool_calls"]:
                 values["tool_call_chunks"] = [
-                    ToolCallChunk(
+                    create_tool_call_chunk(
                         name=tc["name"],
                         args=json.dumps(tc["args"]),
                         id=tc["id"],
@@ -228,7 +266,7 @@ def init_tool_calls(cls, values: dict) -> dict:
                 tool_call_chunks = values.get("tool_call_chunks", [])
                 tool_call_chunks.extend(
                     [
-                        ToolCallChunk(
+                        create_tool_call_chunk(
                             name=tc["name"], args=tc["args"], id=tc["id"], index=None
                         )
                         for tc in values["invalid_tool_calls"]
@@ -244,7 +282,7 @@ def init_tool_calls(cls, values: dict) -> dict:
                 args_ = parse_partial_json(chunk["args"]) if chunk["args"] != "" else {}
                 if isinstance(args_, dict):
                     tool_calls.append(
-                        ToolCall(
+                        create_tool_call(
                             name=chunk["name"] or "",
                             args=args_,
                             id=chunk["id"],
@@ -254,7 +292,7 @@ def init_tool_calls(cls, values: dict) -> dict:
                     raise ValueError("Malformed args.")
             except Exception:
                 invalid_tool_calls.append(
-                    InvalidToolCall(
+                    create_invalid_tool_call(
                         name=chunk["name"],
                         args=chunk["args"],
                         id=chunk["id"],
@@ -297,7 +335,7 @@ def add_ai_message_chunks(
         left.tool_call_chunks, *(o.tool_call_chunks for o in others)
     ):
         tool_call_chunks = [
-            ToolCallChunk(
+            create_tool_call_chunk(
                 name=rtc.get("name"),
                 args=rtc.get("args"),
                 index=rtc.get("index"),
diff --git a/libs/core/langchain_core/messages/tool.py b/libs/core/langchain_core/messages/tool.py
index e6146ed1f26d5..87c0fe5f4eafa 100644
--- a/libs/core/langchain_core/messages/tool.py
+++ b/libs/core/langchain_core/messages/tool.py
@@ -237,25 +237,25 @@ def default_tool_parser(
     """Best-effort parsing of tools."""
     tool_calls = []
     invalid_tool_calls = []
-    for tool_call in raw_tool_calls:
-        if "function" not in tool_call:
+    for raw_tool_call in raw_tool_calls:
+        if "function" not in raw_tool_call:
             continue
         else:
-            function_name = tool_call["function"]["name"]
+            function_name = raw_tool_call["function"]["name"]
             try:
-                function_args = json.loads(tool_call["function"]["arguments"])
-                parsed = ToolCall(
+                function_args = json.loads(raw_tool_call["function"]["arguments"])
+                parsed = tool_call(
                     name=function_name or "",
                     args=function_args or {},
-                    id=tool_call.get("id"),
+                    id=raw_tool_call.get("id"),
                 )
                 tool_calls.append(parsed)
             except json.JSONDecodeError:
                 invalid_tool_calls.append(
-                    InvalidToolCall(
+                    invalid_tool_call(
                         name=function_name,
-                        args=tool_call["function"]["arguments"],
-                        id=tool_call.get("id"),
+                        args=raw_tool_call["function"]["arguments"],
+                        id=raw_tool_call.get("id"),
                         error=None,
                     )
                 )
@@ -272,7 +272,7 @@ def default_tool_chunk_parser(raw_tool_calls: List[dict]) -> List[ToolCallChunk]
         else:
             function_args = tool_call["function"]["arguments"]
             function_name = tool_call["function"]["name"]
-        parsed = ToolCallChunk(
+        parsed = tool_call_chunk(
             name=function_name,
             args=function_args,
             id=tool_call.get("id"),
diff --git a/libs/core/langchain_core/messages/utils.py b/libs/core/langchain_core/messages/utils.py
index 53603dd9804ee..f48075b8b083c 100644
--- a/libs/core/langchain_core/messages/utils.py
+++ b/libs/core/langchain_core/messages/utils.py
@@ -451,12 +451,12 @@ def merge_message_runs(
                 HumanMessage("wait your favorite food", id="bar",),
                 AIMessage(
                     "my favorite colo",
-                    tool_calls=[ToolCall(name="blah_tool", args={"x": 2}, id="123")],
+                    tool_calls=[ToolCall(name="blah_tool", args={"x": 2}, id="123", type="tool_call")],
                     id="baz",
                 ),
                 AIMessage(
                     [{"type": "text", "text": "my favorite dish is lasagna"}],
-                    tool_calls=[ToolCall(name="blah_tool", args={"x": -10}, id="456")],
+                    tool_calls=[ToolCall(name="blah_tool", args={"x": -10}, id="456", type="tool_call")],
                     id="blur",
                 ),
             ]
@@ -474,8 +474,8 @@ def merge_message_runs(
                         {"type": "text", "text": "my favorite dish is lasagna"}
                     ],
                     tool_calls=[
-                        ToolCall({"name": "blah_tool", "args": {"x": 2}, "id": "123"),
-                        ToolCall({"name": "blah_tool", "args": {"x": -10}, "id": "456")
+                        ToolCall({"name": "blah_tool", "args": {"x": 2}, "id": "123", "type": "tool_call"}),
+                        ToolCall({"name": "blah_tool", "args": {"x": -10}, "id": "456", "type": "tool_call"})
                     ]
                     id="baz"
                 ),
diff --git a/libs/core/tests/unit_tests/messages/test_ai.py b/libs/core/tests/unit_tests/messages/test_ai.py
index 9d9e018f7bb54..1de40acf94cbd 100644
--- a/libs/core/tests/unit_tests/messages/test_ai.py
+++ b/libs/core/tests/unit_tests/messages/test_ai.py
@@ -1,19 +1,16 @@
 from langchain_core.load import dumpd, load
-from langchain_core.messages import (
-    AIMessage,
-    AIMessageChunk,
-    InvalidToolCall,
-    ToolCall,
-    ToolCallChunk,
-)
+from langchain_core.messages import AIMessage, AIMessageChunk
+from langchain_core.messages.tool import invalid_tool_call as create_invalid_tool_call
+from langchain_core.messages.tool import tool_call as create_tool_call
+from langchain_core.messages.tool import tool_call_chunk as create_tool_call_chunk
 
 
 def test_serdes_message() -> None:
     msg = AIMessage(
         content=[{"text": "blah", "type": "text"}],
-        tool_calls=[ToolCall(name="foo", args={"bar": 1}, id="baz")],
+        tool_calls=[create_tool_call(name="foo", args={"bar": 1}, id="baz")],
         invalid_tool_calls=[
-            InvalidToolCall(name="foobad", args="blah", id="booz", error="bad")
+            create_invalid_tool_call(name="foobad", args="blah", id="booz", error="bad")
         ],
     )
     expected = {
@@ -23,9 +20,17 @@ def test_serdes_message() -> None:
         "kwargs": {
             "type": "ai",
             "content": [{"text": "blah", "type": "text"}],
-            "tool_calls": [{"name": "foo", "args": {"bar": 1}, "id": "baz"}],
+            "tool_calls": [
+                {"name": "foo", "args": {"bar": 1}, "id": "baz", "type": "tool_call"}
+            ],
             "invalid_tool_calls": [
-                {"name": "foobad", "args": "blah", "id": "booz", "error": "bad"}
+                {
+                    "name": "foobad",
+                    "args": "blah",
+                    "id": "booz",
+                    "error": "bad",
+                    "type": "invalid_tool_call",
+                }
             ],
         },
     }
@@ -38,8 +43,13 @@ def test_serdes_message_chunk() -> None:
     chunk = AIMessageChunk(
         content=[{"text": "blah", "type": "text"}],
         tool_call_chunks=[
-            ToolCallChunk(name="foo", args='{"bar": 1}', id="baz", index=0),
-            ToolCallChunk(name="foobad", args="blah", id="booz", index=1),
+            create_tool_call_chunk(name="foo", args='{"bar": 1}', id="baz", index=0),
+            create_tool_call_chunk(
+                name="foobad",
+                args="blah",
+                id="booz",
+                index=1,
+            ),
         ],
     )
     expected = {
@@ -49,18 +59,33 @@ def test_serdes_message_chunk() -> None:
         "kwargs": {
             "type": "AIMessageChunk",
             "content": [{"text": "blah", "type": "text"}],
-            "tool_calls": [{"name": "foo", "args": {"bar": 1}, "id": "baz"}],
+            "tool_calls": [
+                {"name": "foo", "args": {"bar": 1}, "id": "baz", "type": "tool_call"}
+            ],
             "invalid_tool_calls": [
                 {
                     "name": "foobad",
                     "args": "blah",
                     "id": "booz",
                     "error": None,
+                    "type": "invalid_tool_call",
                 }
             ],
             "tool_call_chunks": [
-                {"name": "foo", "args": '{"bar": 1}', "id": "baz", "index": 0},
-                {"name": "foobad", "args": "blah", "id": "booz", "index": 1},
+                {
+                    "name": "foo",
+                    "args": '{"bar": 1}',
+                    "id": "baz",
+                    "index": 0,
+                    "type": "tool_call_chunk",
+                },
+                {
+                    "name": "foobad",
+                    "args": "blah",
+                    "id": "booz",
+                    "index": 1,
+                    "type": "tool_call_chunk",
+                },
             ],
         },
     }
diff --git a/libs/core/tests/unit_tests/messages/test_utils.py b/libs/core/tests/unit_tests/messages/test_utils.py
index 0aea8d7e11b3c..3959d7df287ee 100644
--- a/libs/core/tests/unit_tests/messages/test_utils.py
+++ b/libs/core/tests/unit_tests/messages/test_utils.py
@@ -35,12 +35,16 @@ def test_merge_message_runs_content() -> None:
                 {"text": "bar", "type": "text"},
                 {"image_url": "...", "type": "image_url"},
             ],
-            tool_calls=[ToolCall(name="foo_tool", args={"x": 1}, id="tool1")],
+            tool_calls=[
+                ToolCall(name="foo_tool", args={"x": 1}, id="tool1", type="tool_call")
+            ],
             id="2",
         ),
         AIMessage(
             "baz",
-            tool_calls=[ToolCall(name="foo_tool", args={"x": 5}, id="tool2")],
+            tool_calls=[
+                ToolCall(name="foo_tool", args={"x": 5}, id="tool2", type="tool_call")
+            ],
             id="3",
         ),
     ]
@@ -54,8 +58,8 @@ def test_merge_message_runs_content() -> None:
                 "baz",
             ],
             tool_calls=[
-                ToolCall(name="foo_tool", args={"x": 1}, id="tool1"),
-                ToolCall(name="foo_tool", args={"x": 5}, id="tool2"),
+                ToolCall(name="foo_tool", args={"x": 1}, id="tool1", type="tool_call"),
+                ToolCall(name="foo_tool", args={"x": 5}, id="tool2", type="tool_call"),
             ],
             id="1",
         ),
diff --git a/libs/core/tests/unit_tests/test_messages.py b/libs/core/tests/unit_tests/test_messages.py
index 5de94903704c9..3e0d9e31b2923 100644
--- a/libs/core/tests/unit_tests/test_messages.py
+++ b/libs/core/tests/unit_tests/test_messages.py
@@ -15,8 +15,6 @@
     HumanMessageChunk,
     RemoveMessage,
     SystemMessage,
-    ToolCall,
-    ToolCallChunk,
     ToolMessage,
     convert_to_messages,
     get_buffer_string,
@@ -25,6 +23,9 @@
     messages_from_dict,
     messages_to_dict,
 )
+from langchain_core.messages.tool import invalid_tool_call as create_invalid_tool_call
+from langchain_core.messages.tool import tool_call as create_tool_call
+from langchain_core.messages.tool import tool_call_chunk as create_tool_call_chunk
 from langchain_core.utils._merge import merge_lists
 
 
@@ -78,56 +79,72 @@ def test_message_chunks() -> None:
     assert (
         AIMessageChunk(
             content="",
-            tool_call_chunks=[ToolCallChunk(name="tool1", args="", id="1", index=0)],
+            tool_call_chunks=[
+                create_tool_call_chunk(name="tool1", args="", id="1", index=0)
+            ],
         )
         + AIMessageChunk(
             content="",
             tool_call_chunks=[
-                ToolCallChunk(name=None, args='{"arg1": "val', id=None, index=0)
+                create_tool_call_chunk(
+                    name=None, args='{"arg1": "val', id=None, index=0
+                )
             ],
         )
         + AIMessageChunk(
             content="",
-            tool_call_chunks=[ToolCallChunk(name=None, args='ue}"', id=None, index=0)],
+            tool_call_chunks=[
+                create_tool_call_chunk(name=None, args='ue}"', id=None, index=0)
+            ],
         )
     ) == AIMessageChunk(
         content="",
         tool_call_chunks=[
-            ToolCallChunk(name="tool1", args='{"arg1": "value}"', id="1", index=0)
+            create_tool_call_chunk(
+                name="tool1", args='{"arg1": "value}"', id="1", index=0
+            )
         ],
     )
 
     assert (
         AIMessageChunk(
             content="",
-            tool_call_chunks=[ToolCallChunk(name="tool1", args="", id="1", index=0)],
+            tool_call_chunks=[
+                create_tool_call_chunk(name="tool1", args="", id="1", index=0)
+            ],
         )
         + AIMessageChunk(
             content="",
-            tool_call_chunks=[ToolCallChunk(name="tool1", args="a", id=None, index=1)],
+            tool_call_chunks=[
+                create_tool_call_chunk(name="tool1", args="a", id=None, index=1)
+            ],
         )
         # Don't merge if `index` field does not match.
     ) == AIMessageChunk(
         content="",
         tool_call_chunks=[
-            ToolCallChunk(name="tool1", args="", id="1", index=0),
-            ToolCallChunk(name="tool1", args="a", id=None, index=1),
+            create_tool_call_chunk(name="tool1", args="", id="1", index=0),
+            create_tool_call_chunk(name="tool1", args="a", id=None, index=1),
         ],
     )
 
     ai_msg_chunk = AIMessageChunk(content="")
     tool_calls_msg_chunk = AIMessageChunk(
         content="",
-        tool_call_chunks=[ToolCallChunk(name="tool1", args="a", id=None, index=1)],
+        tool_call_chunks=[
+            create_tool_call_chunk(name="tool1", args="a", id=None, index=1)
+        ],
     )
     assert ai_msg_chunk + tool_calls_msg_chunk == tool_calls_msg_chunk
     assert tool_calls_msg_chunk + ai_msg_chunk == tool_calls_msg_chunk
 
     ai_msg_chunk = AIMessageChunk(
         content="",
-        tool_call_chunks=[ToolCallChunk(name="tool1", args="", id="1", index=0)],
+        tool_call_chunks=[
+            create_tool_call_chunk(name="tool1", args="", id="1", index=0)
+        ],
     )
-    assert ai_msg_chunk.tool_calls == [ToolCall(name="tool1", args={}, id="1")]
+    assert ai_msg_chunk.tool_calls == [create_tool_call(name="tool1", args={}, id="1")]
 
     # Test token usage
     left = AIMessageChunk(
@@ -347,11 +364,11 @@ def test_multiple_msg() -> None:
     msgs = [
         AIMessage(
             content="",
-            tool_calls=[ToolCall(name="a", args={"b": 1}, id=None)],
+            tool_calls=[create_tool_call(name="a", args={"b": 1}, id=None)],
         ),
         AIMessage(
             content="",
-            tool_calls=[ToolCall(name="c", args={"c": 2}, id=None)],
+            tool_calls=[create_tool_call(name="c", args={"c": 2}, id=None)],
         ),
     ]
     assert messages_from_dict(messages_to_dict(msgs)) == msgs
@@ -389,21 +406,25 @@ def test_message_chunk_to_message() -> None:
     chunk = AIMessageChunk(
         content="I am",
         tool_call_chunks=[
-            ToolCallChunk(name="tool1", args='{"a": 1}', id="1", index=0),
-            ToolCallChunk(name="tool2", args='{"b": ', id="2", index=0),
-            ToolCallChunk(name="tool3", args=None, id="3", index=0),
-            ToolCallChunk(name="tool4", args="abc", id="4", index=0),
+            create_tool_call_chunk(name="tool1", args='{"a": 1}', id="1", index=0),
+            create_tool_call_chunk(name="tool2", args='{"b": ', id="2", index=0),
+            create_tool_call_chunk(name="tool3", args=None, id="3", index=0),
+            create_tool_call_chunk(name="tool4", args="abc", id="4", index=0),
         ],
     )
     expected = AIMessage(
         content="I am",
         tool_calls=[
-            {"name": "tool1", "args": {"a": 1}, "id": "1"},
-            {"name": "tool2", "args": {}, "id": "2"},
+            create_tool_call(**{"name": "tool1", "args": {"a": 1}, "id": "1"}),  # type: ignore[arg-type]
+            create_tool_call(**{"name": "tool2", "args": {}, "id": "2"}),  # type: ignore[arg-type]
         ],
         invalid_tool_calls=[
-            {"name": "tool3", "args": None, "id": "3", "error": None},
-            {"name": "tool4", "args": "abc", "id": "4", "error": None},
+            create_invalid_tool_call(
+                **{"name": "tool3", "args": None, "id": "3", "error": None}
+            ),
+            create_invalid_tool_call(
+                **{"name": "tool4", "args": "abc", "id": "4", "error": None}
+            ),
         ],
     )
     assert message_chunk_to_message(chunk) == expected
@@ -632,6 +653,36 @@ def test_tool_calls_merge() -> None:
                 },
             ]
         },
+        tool_call_chunks=[
+            {
+                "name": "person",
+                "args": '{"name": "jane", "age": 2}',
+                "id": "call_CwGAsESnXehQEjiAIWzinlva",
+                "index": 0,
+                "type": "tool_call_chunk",
+            },
+            {
+                "name": "person",
+                "args": '{"name": "bob", "age": 3}',
+                "id": "call_zXSIylHvc5x3JUAPcHZR5GZI",
+                "index": 1,
+                "type": "tool_call_chunk",
+            },
+        ],
+        tool_calls=[
+            {
+                "name": "person",
+                "args": {"name": "jane", "age": 2},
+                "id": "call_CwGAsESnXehQEjiAIWzinlva",
+                "type": "tool_call",
+            },
+            {
+                "name": "person",
+                "args": {"name": "bob", "age": 3},
+                "id": "call_zXSIylHvc5x3JUAPcHZR5GZI",
+                "type": "tool_call",
+            },
+        ],
     )
 
 
@@ -654,7 +705,12 @@ def test_convert_to_messages() -> None:
                 "role": "assistant",
                 "content": "",
                 "tool_calls": [
-                    {"name": "greet", "args": {"name": "Jane"}, "id": "tool_id"}
+                    {
+                        "name": "greet",
+                        "args": {"name": "Jane"},
+                        "id": "tool_id",
+                        "type": "tool_call",
+                    }
                 ],
             },
             {"role": "tool", "tool_call_id": "tool_id", "content": "Hi!"},
@@ -682,7 +738,9 @@ def test_convert_to_messages() -> None:
         FunctionMessage(name="greet", content="Hi!"),
         AIMessage(
             content="",
-            tool_calls=[ToolCall(name="greet", args={"name": "Jane"}, id="tool_id")],
+            tool_calls=[
+                create_tool_call(name="greet", args={"name": "Jane"}, id="tool_id")
+            ],
         ),
         ToolMessage(tool_call_id="tool_id", content="Hi!"),
         ToolMessage(tool_call_id="tool_id2", content="Bye!", artifact={"foo": 123}),
@@ -755,32 +813,60 @@ def test_message_name_chat(MessageClass: Type) -> None:
 
 
 def test_merge_tool_calls() -> None:
-    tool_call_1 = ToolCallChunk(name="tool1", args="", id="1", index=0)
-    tool_call_2 = ToolCallChunk(name=None, args='{"arg1": "val', id=None, index=0)
-    tool_call_3 = ToolCallChunk(name=None, args='ue}"', id=None, index=0)
+    tool_call_1 = create_tool_call_chunk(name="tool1", args="", id="1", index=0)
+    tool_call_2 = create_tool_call_chunk(
+        name=None, args='{"arg1": "val', id=None, index=0
+    )
+    tool_call_3 = create_tool_call_chunk(name=None, args='ue}"', id=None, index=0)
     merged = merge_lists([tool_call_1], [tool_call_2])
     assert merged is not None
-    assert merged == [{"name": "tool1", "args": '{"arg1": "val', "id": "1", "index": 0}]
+    assert merged == [
+        {
+            "name": "tool1",
+            "args": '{"arg1": "val',
+            "id": "1",
+            "index": 0,
+            "type": "tool_call_chunk",
+        }
+    ]
     merged = merge_lists(merged, [tool_call_3])
     assert merged is not None
     assert merged == [
-        {"name": "tool1", "args": '{"arg1": "value}"', "id": "1", "index": 0}
+        {
+            "name": "tool1",
+            "args": '{"arg1": "value}"',
+            "id": "1",
+            "index": 0,
+            "type": "tool_call_chunk",
+        }
     ]
 
-    left = ToolCallChunk(name="tool1", args='{"arg1": "value1"}', id="1", index=None)
-    right = ToolCallChunk(name="tool2", args='{"arg2": "value2"}', id="1", index=None)
+    left = create_tool_call_chunk(
+        name="tool1", args='{"arg1": "value1"}', id="1", index=None
+    )
+    right = create_tool_call_chunk(
+        name="tool2", args='{"arg2": "value2"}', id="1", index=None
+    )
     merged = merge_lists([left], [right])
     assert merged is not None
     assert len(merged) == 2
 
-    left = ToolCallChunk(name="tool1", args='{"arg1": "value1"}', id=None, index=None)
-    right = ToolCallChunk(name="tool1", args='{"arg2": "value2"}', id=None, index=None)
+    left = create_tool_call_chunk(
+        name="tool1", args='{"arg1": "value1"}', id=None, index=None
+    )
+    right = create_tool_call_chunk(
+        name="tool1", args='{"arg2": "value2"}', id=None, index=None
+    )
     merged = merge_lists([left], [right])
     assert merged is not None
     assert len(merged) == 2
 
-    left = ToolCallChunk(name="tool1", args='{"arg1": "value1"}', id="1", index=0)
-    right = ToolCallChunk(name="tool2", args='{"arg2": "value2"}', id=None, index=1)
+    left = create_tool_call_chunk(
+        name="tool1", args='{"arg1": "value1"}', id="1", index=0
+    )
+    right = create_tool_call_chunk(
+        name="tool2", args='{"arg2": "value2"}', id=None, index=1
+    )
     merged = merge_lists([left], [right])
     assert merged is not None
     assert len(merged) == 2
diff --git a/libs/partners/together/poetry.lock b/libs/partners/together/poetry.lock
index 7ba5acd706477..99eb55b441134 100644
--- a/libs/partners/together/poetry.lock
+++ b/libs/partners/together/poetry.lock
@@ -604,7 +604,7 @@ url = "../../core"
 
 [[package]]
 name = "langchain-openai"
-version = "0.1.15"
+version = "0.1.16"
 description = "An integration package connecting OpenAI and LangChain"
 optional = false
 python-versions = ">=3.8.1,<4.0"
@@ -1798,4 +1798,4 @@ multidict = ">=4.0"
 [metadata]
 lock-version = "2.0"
 python-versions = ">=3.8.1,<4.0"
-content-hash = "32ec0f5b1afd7492c096028403f1f2f94a227cb0d922530ca743e1bd65db3f9f"
+content-hash = "8e255f5a0e6ecf23a3d04d0eeee9918d411339b5960c24c888521fbd1f6bf531"
diff --git a/libs/partners/together/pyproject.toml b/libs/partners/together/pyproject.toml
index 048f7b3baa22f..424313c7e98c7 100644
--- a/libs/partners/together/pyproject.toml
+++ b/libs/partners/together/pyproject.toml
@@ -20,7 +20,7 @@ disallow_untyped_defs = "True"
 [tool.poetry.dependencies]
 python = ">=3.8.1,<4.0"
 langchain-core = ">=0.2.17,<0.3"
-langchain-openai = "^0.1.8"
+langchain-openai = "^0.1.16"
 requests = "^2"
 aiohttp = "^3.9.1"