diff --git a/splunklib/ai/engines/langchain.py b/splunklib/ai/engines/langchain.py index b53d1cd7..93a13527 100644 --- a/splunklib/ai/engines/langchain.py +++ b/splunklib/ai/engines/langchain.py @@ -485,6 +485,7 @@ def unpack_tool_call(self, call: LC_ToolCall) -> LC_ToolCall: id=call["id"], name=call["name"], args=unpacked_args, + type="tool_call", ) return call @@ -1142,6 +1143,7 @@ def _convert_model_response_to_model_result( id=call.id, name=f"{TOOL_STRATEGY_TOOL_PREFIX}{call.name}", args=call.args, + type="tool_call", ) for call in resp.message.structured_output_calls ) @@ -1646,7 +1648,7 @@ def _map_tool_call_to_langchain(call: ToolCall | SubagentCall) -> LC_ToolCall: name = _normalize_tool_name(call.name, call.type) args = call.args - return LC_ToolCall(id=call.id, name=name, args=args) + return LC_ToolCall(id=call.id, name=name, args=args, type="tool_call") def _map_content_from_langchain( @@ -1754,6 +1756,7 @@ def _map_message_to_langchain(message: BaseMessage) -> LC_AnyMessage: id=call.id, name=f"{TOOL_STRATEGY_TOOL_PREFIX}{call.name}", args=call.args, + type="tool_call", ) for call in message.structured_output_calls ) diff --git a/tests/unit/ai/engine/test_langchain_backend.py b/tests/unit/ai/engine/test_langchain_backend.py index 1daa0add..450fd7f4 100644 --- a/tests/unit/ai/engine/test_langchain_backend.py +++ b/tests/unit/ai/engine/test_langchain_backend.py @@ -184,6 +184,7 @@ def test_map_message_from_langchain_ai_with_agent_call(self) -> None: name=f"{lc.AGENT_PREFIX}assistant", args={"args": {"q": "test"}, "thread_id": None}, id="tc-2", + type="tool_call", ) message = LC_AIMessage(content="done", tool_calls=[tool_call]) mapped = lc._map_message_from_langchain(message) @@ -199,11 +200,14 @@ def test_map_message_from_langchain_ai_with_agent_call(self) -> None: ] def test_map_message_from_langchain_ai_with_mixed_calls(self) -> None: - tool_call = LC_ToolCall(name="lookup", args={"q": "test"}, id="tc-1") + tool_call = LC_ToolCall( + name="lookup", args={"q": "test"}, id="tc-1", type="tool_call" + ) agent_call = LC_ToolCall( name=f"{lc.AGENT_PREFIX}assistant", args={"args": {"q": "test"}, "thread_id": None}, id="tc-2", + type="tool_call", ) message = LC_AIMessage(content="done", tool_calls=[tool_call, agent_call]) @@ -280,7 +284,9 @@ def test_map_message_to_langchain_ai(self) -> None: assert isinstance(mapped, LC_AIMessage) assert mapped.content == "hi" - assert mapped.tool_calls == [LC_ToolCall(name="lookup", args={}, id="tc-1")] + assert mapped.tool_calls == [ + LC_ToolCall(name="lookup", args={}, id="tc-1", type="tool_call") + ] def test_map_message_to_langchain_ai_with_text_content_block(self) -> None: extras = { @@ -389,6 +395,7 @@ def test_map_message_to_langchain_ai_with_agent_call(self) -> None: name=f"{lc.AGENT_PREFIX}assistant", args={"args": {"q": "test"}, "thread_id": None}, id="tc-2", + type="tool_call", ) ] @@ -424,6 +431,7 @@ def test_map_message_to_langchain_ai_with_tool_call_with_thought_signature( name=f"__local-startup_time", args={"q": "test"}, id="tc-2", + type="tool_call", ) ] assert mapped.additional_kwargs == extras @@ -451,7 +459,9 @@ def test_map_message_to_langchain_tool_call_with_reserved_prefix(self) -> None: ) assert isinstance(message, LC_AIMessage) assert message.tool_calls == [ - LC_ToolCall(name="__tool-__agent-bad-tool", args={}, id="tc-1") + LC_ToolCall( + name="__tool-__agent-bad-tool", args={}, id="tc-1", type="tool_call" + ) ] message = lc._map_message_to_langchain( @@ -466,7 +476,7 @@ def test_map_message_to_langchain_tool_call_with_reserved_prefix(self) -> None: ) assert isinstance(message, LC_AIMessage) assert message.tool_calls == [ - LC_ToolCall(name="__tool-__bad-tool", args={}, id="tc-2") + LC_ToolCall(name="__tool-__bad-tool", args={}, id="tc-2", type="tool_call") ] message = lc._map_message_to_langchain( @@ -535,6 +545,7 @@ def test_map_message_to_langchain_agent_call_with_agent_prefix_raises( name="__agent-__agent-bad-agent", args={"args": {}, "thread_id": None}, id="tc-1", + type="tool_call", ) ]