From 48531fd2da81f4eae821c62fe069f74c25ae9adf Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Thu, 16 Apr 2026 13:09:36 -0500 Subject: [PATCH 1/2] feat!: rename track_latency to track_duration on AIGraphTracker, update event key to $ld:ai:duration:total Co-Authored-By: Claude Opus 4.6 --- .../src/ldai_langchain/langgraph_agent_graph_runner.py | 4 ++-- .../tests/test_langgraph_agent_graph_runner.py | 4 ++-- .../server-ai-langchain/tests/test_tracking_langgraph.py | 4 ++-- .../src/ldai_openai/openai_agent_graph_runner.py | 4 ++-- .../tests/test_openai_agent_graph_runner.py | 4 ++-- .../server-ai-openai/tests/test_tracking_openai_agents.py | 4 ++-- packages/sdk/server-ai/src/ldai/tracker.py | 6 +++--- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/ai-providers/server-ai-langchain/src/ldai_langchain/langgraph_agent_graph_runner.py b/packages/ai-providers/server-ai-langchain/src/ldai_langchain/langgraph_agent_graph_runner.py index 158af79c..3146dde7 100644 --- a/packages/ai-providers/server-ai-langchain/src/ldai_langchain/langgraph_agent_graph_runner.py +++ b/packages/ai-providers/server-ai-langchain/src/ldai_langchain/langgraph_agent_graph_runner.py @@ -305,7 +305,7 @@ async def run(self, input: Any) -> AgentGraphResult: # Graph-level metrics if tracker: tracker.track_path(handler.path) - tracker.track_latency(duration) + tracker.track_duration(duration) tracker.track_invocation_success() tracker.track_total_tokens(sum_token_usage_from_messages(messages)) @@ -325,7 +325,7 @@ async def run(self, input: Any) -> AgentGraphResult: log.warning(f'LangGraphAgentGraphRunner run failed: {exc}') duration = (time.perf_counter_ns() - start_ns) // 1_000_000 if tracker: - tracker.track_latency(duration) + tracker.track_duration(duration) tracker.track_invocation_failure() return AgentGraphResult( output='', diff --git a/packages/ai-providers/server-ai-langchain/tests/test_langgraph_agent_graph_runner.py b/packages/ai-providers/server-ai-langchain/tests/test_langgraph_agent_graph_runner.py index 07802cb2..d816ecdc 100644 --- a/packages/ai-providers/server-ai-langchain/tests/test_langgraph_agent_graph_runner.py +++ b/packages/ai-providers/server-ai-langchain/tests/test_langgraph_agent_graph_runner.py @@ -86,7 +86,7 @@ async def test_langgraph_runner_run_tracks_failure_on_exception(): assert result.metrics.success is False tracker.track_invocation_failure.assert_called_once() - tracker.track_latency.assert_called_once() + tracker.track_duration.assert_called_once() @pytest.mark.asyncio @@ -148,4 +148,4 @@ async def test_langgraph_runner_run_success(): assert result.metrics.success is True tracker.track_path.assert_called_once_with([]) tracker.track_invocation_success.assert_called_once() - tracker.track_latency.assert_called_once() + tracker.track_duration.assert_called_once() diff --git a/packages/ai-providers/server-ai-langchain/tests/test_tracking_langgraph.py b/packages/ai-providers/server-ai-langchain/tests/test_tracking_langgraph.py index 948d58d6..4a78d91f 100644 --- a/packages/ai-providers/server-ai-langchain/tests/test_tracking_langgraph.py +++ b/packages/ai-providers/server-ai-langchain/tests/test_tracking_langgraph.py @@ -256,7 +256,7 @@ async def test_tracks_node_and_graph_tokens_on_success(): ev = _events(mock_ld_client) assert ev['$ld:ai:graph:total_tokens'][0][1] == 15 assert ev['$ld:ai:graph:invocation_success'][0][1] == 1 - assert '$ld:ai:graph:latency' in ev + assert '$ld:ai:duration:total' in ev assert '$ld:ai:graph:path' in ev @@ -428,7 +428,7 @@ async def test_tracks_failure_and_latency_on_model_error(): ev = _events(mock_ld_client) assert '$ld:ai:graph:invocation_failure' in ev - assert '$ld:ai:graph:latency' in ev + assert '$ld:ai:duration:total' in ev assert '$ld:ai:graph:invocation_success' not in ev diff --git a/packages/ai-providers/server-ai-openai/src/ldai_openai/openai_agent_graph_runner.py b/packages/ai-providers/server-ai-openai/src/ldai_openai/openai_agent_graph_runner.py index 3cfd595b..af1faba2 100644 --- a/packages/ai-providers/server-ai-openai/src/ldai_openai/openai_agent_graph_runner.py +++ b/packages/ai-providers/server-ai-openai/src/ldai_openai/openai_agent_graph_runner.py @@ -89,7 +89,7 @@ async def run(self, input: Any) -> AgentGraphResult: if tracker: tracker.track_path(path) - tracker.track_latency(duration) + tracker.track_duration(duration) tracker.track_invocation_success() token_usage = get_ai_usage_from_response(result) if token_usage is not None: @@ -110,7 +110,7 @@ async def run(self, input: Any) -> AgentGraphResult: log.warning(f'OpenAIAgentGraphRunner run failed: {exc}') duration = (time.perf_counter_ns() - start_ns) // 1_000_000 if tracker: - tracker.track_latency(duration) + tracker.track_duration(duration) tracker.track_invocation_failure() return AgentGraphResult( output='', diff --git a/packages/ai-providers/server-ai-openai/tests/test_openai_agent_graph_runner.py b/packages/ai-providers/server-ai-openai/tests/test_openai_agent_graph_runner.py index 56dd0c10..536d8932 100644 --- a/packages/ai-providers/server-ai-openai/tests/test_openai_agent_graph_runner.py +++ b/packages/ai-providers/server-ai-openai/tests/test_openai_agent_graph_runner.py @@ -89,7 +89,7 @@ async def test_openai_agent_graph_runner_run_tracks_invocation_failure_on_except assert result.metrics.success is False tracker.track_invocation_failure.assert_called_once() - tracker.track_latency.assert_called_once() + tracker.track_duration.assert_called_once() @pytest.mark.asyncio @@ -134,7 +134,7 @@ async def test_openai_agent_graph_runner_run_success(): assert result.metrics.success is True tracker.track_invocation_success.assert_called_once() tracker.track_path.assert_called_once() - tracker.track_latency.assert_called_once() + tracker.track_duration.assert_called_once() root_tracker = graph.get_node('root-agent').get_config().tracker root_tracker.track_duration.assert_called_once() diff --git a/packages/ai-providers/server-ai-openai/tests/test_tracking_openai_agents.py b/packages/ai-providers/server-ai-openai/tests/test_tracking_openai_agents.py index 39c75034..d1ed7d68 100644 --- a/packages/ai-providers/server-ai-openai/tests/test_tracking_openai_agents.py +++ b/packages/ai-providers/server-ai-openai/tests/test_tracking_openai_agents.py @@ -266,7 +266,7 @@ async def test_tracks_graph_invocation_success_and_latency(): ev = _events(mock_ld_client) assert ev['$ld:ai:graph:invocation_success'][0][1] == 1 - assert '$ld:ai:graph:latency' in ev + assert '$ld:ai:duration:total' in ev assert '$ld:ai:graph:path' in ev @@ -404,7 +404,7 @@ async def test_tracks_failure_and_latency_on_runner_error(): ev = _events(mock_ld_client) assert '$ld:ai:graph:invocation_failure' in ev - assert '$ld:ai:graph:latency' in ev + assert '$ld:ai:duration:total' in ev assert '$ld:ai:graph:invocation_success' not in ev diff --git a/packages/sdk/server-ai/src/ldai/tracker.py b/packages/sdk/server-ai/src/ldai/tracker.py index d36b070a..8c07f83d 100644 --- a/packages/sdk/server-ai/src/ldai/tracker.py +++ b/packages/sdk/server-ai/src/ldai/tracker.py @@ -508,14 +508,14 @@ def track_invocation_failure(self) -> None: 1, ) - def track_latency(self, duration: int) -> None: + def track_duration(self, duration: int) -> None: """ - Track the total latency of graph execution. + Track the total duration of graph execution. :param duration: Duration in milliseconds. """ self._ld_client.track( - "$ld:ai:graph:latency", + "$ld:ai:duration:total", self._context, self.__get_track_data(), duration, From f069ef0f9946836c10d8bea25a75416b63bfba47 Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Thu, 16 Apr 2026 13:59:02 -0500 Subject: [PATCH 2/2] chore: correct trackDuration event key to $ld:ai:graph:duration:total Co-Authored-By: Claude Opus 4.6 --- .../server-ai-langchain/tests/test_tracking_langgraph.py | 4 ++-- .../server-ai-openai/tests/test_tracking_openai_agents.py | 4 ++-- packages/sdk/server-ai/src/ldai/tracker.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/ai-providers/server-ai-langchain/tests/test_tracking_langgraph.py b/packages/ai-providers/server-ai-langchain/tests/test_tracking_langgraph.py index 4a78d91f..75c4c0c3 100644 --- a/packages/ai-providers/server-ai-langchain/tests/test_tracking_langgraph.py +++ b/packages/ai-providers/server-ai-langchain/tests/test_tracking_langgraph.py @@ -256,7 +256,7 @@ async def test_tracks_node_and_graph_tokens_on_success(): ev = _events(mock_ld_client) assert ev['$ld:ai:graph:total_tokens'][0][1] == 15 assert ev['$ld:ai:graph:invocation_success'][0][1] == 1 - assert '$ld:ai:duration:total' in ev + assert '$ld:ai:graph:duration:total' in ev assert '$ld:ai:graph:path' in ev @@ -428,7 +428,7 @@ async def test_tracks_failure_and_latency_on_model_error(): ev = _events(mock_ld_client) assert '$ld:ai:graph:invocation_failure' in ev - assert '$ld:ai:duration:total' in ev + assert '$ld:ai:graph:duration:total' in ev assert '$ld:ai:graph:invocation_success' not in ev diff --git a/packages/ai-providers/server-ai-openai/tests/test_tracking_openai_agents.py b/packages/ai-providers/server-ai-openai/tests/test_tracking_openai_agents.py index d1ed7d68..15a857df 100644 --- a/packages/ai-providers/server-ai-openai/tests/test_tracking_openai_agents.py +++ b/packages/ai-providers/server-ai-openai/tests/test_tracking_openai_agents.py @@ -266,7 +266,7 @@ async def test_tracks_graph_invocation_success_and_latency(): ev = _events(mock_ld_client) assert ev['$ld:ai:graph:invocation_success'][0][1] == 1 - assert '$ld:ai:duration:total' in ev + assert '$ld:ai:graph:duration:total' in ev assert '$ld:ai:graph:path' in ev @@ -404,7 +404,7 @@ async def test_tracks_failure_and_latency_on_runner_error(): ev = _events(mock_ld_client) assert '$ld:ai:graph:invocation_failure' in ev - assert '$ld:ai:duration:total' in ev + assert '$ld:ai:graph:duration:total' in ev assert '$ld:ai:graph:invocation_success' not in ev diff --git a/packages/sdk/server-ai/src/ldai/tracker.py b/packages/sdk/server-ai/src/ldai/tracker.py index 8c07f83d..799900c5 100644 --- a/packages/sdk/server-ai/src/ldai/tracker.py +++ b/packages/sdk/server-ai/src/ldai/tracker.py @@ -515,7 +515,7 @@ def track_duration(self, duration: int) -> None: :param duration: Duration in milliseconds. """ self._ld_client.track( - "$ld:ai:duration:total", + "$ld:ai:graph:duration:total", self._context, self.__get_track_data(), duration,