Skip to content

Commit b61875d

Browse files
[AIC-1636] fix: Improve usage reporting
Co-Authored-By: jbailey@launchdarkly.com <accounts@sidewaysgravity.com>
1 parent 4f986c4 commit b61875d

2 files changed

Lines changed: 51 additions & 9 deletions

File tree

packages/sdk/server-ai/src/ldai/client.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from ldclient import Context
55
from ldclient.client import LDClient
66

7+
from ldai import __version__ as ai_sdk_version
78
from ldai import log
89
from ldai.agent_graph import AgentGraphDefinition
910
from ldai.chat import Chat
@@ -17,12 +18,32 @@
1718
from ldai.providers.ai_provider_factory import AIProviderFactory
1819
from ldai.tracker import LDAIConfigTracker
1920

21+
_TRACK_SDK_INFO = '$ld:ai:sdk-info'
22+
_TRACK_USAGE_COMPLETION_CONFIG = '$ld:ai:usage:completion-config'
23+
_TRACK_USAGE_CREATE_CHAT = '$ld:ai:usage:create-chat'
24+
_TRACK_USAGE_JUDGE_CONFIG = '$ld:ai:usage:judge-config'
25+
_TRACK_USAGE_CREATE_JUDGE = '$ld:ai:usage:create-judge'
26+
_TRACK_USAGE_AGENT_CONFIG = '$ld:ai:usage:agent-config'
27+
_TRACK_USAGE_AGENT_CONFIGS = '$ld:ai:usage:agent-configs'
28+
29+
_INIT_TRACK_CONTEXT = Context.builder('ld-internal-tracking').anonymous(True).build()
30+
2031

2132
class LDAIClient:
2233
"""The LaunchDarkly AI SDK client object."""
2334

2435
def __init__(self, client: LDClient):
2536
self._client = client
37+
self._client.track(
38+
_TRACK_SDK_INFO,
39+
_INIT_TRACK_CONTEXT,
40+
{
41+
'aiSdkName': 'launchdarkly-server-sdk-ai',
42+
'aiSdkVersion': ai_sdk_version,
43+
'aiSdkLanguage': 'python',
44+
},
45+
1,
46+
)
2647

2748
def completion_config(
2849
self,
@@ -40,7 +61,7 @@ def completion_config(
4061
:param variables: Additional variables for the completion configuration.
4162
:return: The completion configuration with a tracker used for gathering metrics.
4263
"""
43-
self._client.track('$ld:ai:config:function:single', context, key, 1)
64+
self._client.track(_TRACK_USAGE_COMPLETION_CONFIG, context, key, 1)
4465

4566
model, provider, messages, instructions, tracker, enabled, judge_configuration, _ = self.__evaluate(
4667
key, context, default_value.to_dict(), variables
@@ -94,7 +115,7 @@ def judge_config(
94115
:param variables: Additional variables for the judge configuration.
95116
:return: The judge configuration with a tracker used for gathering metrics.
96117
"""
97-
self._client.track('$ld:ai:judge:function:single', context, key, 1)
118+
self._client.track(_TRACK_USAGE_JUDGE_CONFIG, context, key, 1)
98119

99120
model, provider, messages, instructions, tracker, enabled, judge_configuration, variation = self.__evaluate(
100121
key, context, default_value.to_dict(), variables
@@ -170,7 +191,7 @@ async def create_judge(
170191
if relevance_eval:
171192
print('Relevance score:', relevance_eval.score)
172193
"""
173-
self._client.track('$ld:ai:judge:function:createJudge', context, key, 1)
194+
self._client.track(_TRACK_USAGE_CREATE_JUDGE, context, key, 1)
174195

175196
try:
176197
if variables:
@@ -281,7 +302,7 @@ async def create_chat(
281302
messages = chat.get_messages()
282303
print(f"Conversation has {len(messages)} messages")
283304
"""
284-
self._client.track('$ld:ai:config:function:createChat', context, key, 1)
305+
self._client.track(_TRACK_USAGE_CREATE_CHAT, context, key, 1)
285306
log.debug(f"Creating chat for key: {key}")
286307
config = self.completion_config(key, context, default_value, variables)
287308

@@ -340,7 +361,7 @@ def agent_config(
340361
:return: Configured AIAgentConfig instance.
341362
"""
342363
self._client.track(
343-
"$ld:ai:agent:function:single",
364+
_TRACK_USAGE_AGENT_CONFIG,
344365
context,
345366
key,
346367
1
@@ -406,7 +427,7 @@ def agent_configs(
406427
"""
407428
agent_count = len(agent_configs)
408429
self._client.track(
409-
"$ld:ai:agent:function:multiple",
430+
_TRACK_USAGE_AGENT_CONFIGS,
410431
context,
411432
agent_count,
412433
agent_count

packages/sdk/server-ai/tests/test_model_config.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def test_model_initial_config_enabled(ldai_client: LDAIClient):
307307

308308

309309
def test_config_method_tracking(ldai_client: LDAIClient):
310-
from unittest.mock import Mock
310+
from unittest.mock import Mock, call
311311

312312
mock_client = Mock()
313313
mock_client.variation.return_value = {
@@ -323,9 +323,30 @@ def test_config_method_tracking(ldai_client: LDAIClient):
323323

324324
config = client.config('test-config-key', context, default_value)
325325

326-
mock_client.track.assert_called_once_with(
327-
'$ld:ai:config:function:single',
326+
mock_client.track.assert_any_call(
327+
'$ld:ai:usage:completion-config',
328328
context,
329329
'test-config-key',
330330
1
331331
)
332+
333+
334+
def test_sdk_info_tracked_on_init():
335+
from unittest.mock import Mock, call
336+
337+
from ldai.client import _INIT_TRACK_CONTEXT
338+
339+
mock_client = Mock()
340+
341+
client = LDAIClient(mock_client)
342+
343+
mock_client.track.assert_called_once_with(
344+
'$ld:ai:sdk-info',
345+
_INIT_TRACK_CONTEXT,
346+
{
347+
'aiSdkName': 'launchdarkly-server-sdk-ai',
348+
'aiSdkVersion': '0.14.0',
349+
'aiSdkLanguage': 'python',
350+
},
351+
1,
352+
)

0 commit comments

Comments
 (0)