Skip to content

Commit a41c7e3

Browse files
jsonbaileyclaude
andcommitted
feat!: Remove public disabled() classmethod from AIConfigDefault
The disabled() factory on AIConfigDefault and subclasses created configs without tracker factories, breaking the spec requirement. Replace with private module-level constants in client.py, matching how js-core handles disabled configs as an internal concern. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 84a1ab1 commit a41c7e3

3 files changed

Lines changed: 12 additions & 56 deletions

File tree

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545

4646
_INIT_TRACK_CONTEXT = Context.builder('ld-internal-tracking').kind('ld_ai').anonymous(True).build()
4747

48+
_DISABLED_COMPLETION_DEFAULT = AICompletionConfigDefault(enabled=False)
49+
_DISABLED_AGENT_DEFAULT = AIAgentConfigDefault(enabled=False)
50+
_DISABLED_JUDGE_DEFAULT = AIJudgeConfigDefault(enabled=False)
51+
4852

4953
class LDAIClient:
5054
"""The LaunchDarkly AI SDK client object."""
@@ -121,7 +125,7 @@ def completion_config(
121125
self._client.track(_TRACK_USAGE_COMPLETION_CONFIG, context, key, 1)
122126

123127
return self._completion_config(
124-
key, context, default or AICompletionConfigDefault.disabled(), variables
128+
key, context, default or _DISABLED_COMPLETION_DEFAULT, variables
125129
)
126130

127131
def config(
@@ -205,7 +209,7 @@ def judge_config(
205209
self._client.track(_TRACK_USAGE_JUDGE_CONFIG, context, key, 1)
206210

207211
return self._judge_config(
208-
key, context, default or AIJudgeConfigDefault.disabled(), variables
212+
key, context, default or _DISABLED_JUDGE_DEFAULT, variables
209213
)
210214

211215
async def create_judge(
@@ -263,7 +267,7 @@ async def create_judge(
263267
extended_variables['response_to_evaluate'] = '{{response_to_evaluate}}'
264268

265269
judge_config = self._judge_config(
266-
key, context, default or AIJudgeConfigDefault.disabled(), extended_variables
270+
key, context, default or _DISABLED_JUDGE_DEFAULT, extended_variables
267271
)
268272

269273
if not judge_config.enabled:
@@ -361,7 +365,7 @@ async def create_model(
361365
"""
362366
self._client.track(_TRACK_USAGE_CREATE_MODEL, context, key, 1)
363367
log.debug(f"Creating managed model for key: {key}")
364-
config = self._completion_config(key, context, default or AICompletionConfigDefault.disabled(), variables)
368+
config = self._completion_config(key, context, default or _DISABLED_COMPLETION_DEFAULT, variables)
365369

366370
if not config.enabled:
367371
return None
@@ -444,7 +448,7 @@ async def create_agent(
444448
"""
445449
self._client.track(_TRACK_USAGE_CREATE_AGENT, context, key, 1)
446450
log.debug(f"Creating managed agent for key: {key}")
447-
config = self.__evaluate_agent(key, context, default or AIAgentConfigDefault.disabled(), variables)
451+
config = self.__evaluate_agent(key, context, default or _DISABLED_AGENT_DEFAULT, variables)
448452

449453
if not config.enabled:
450454
return None
@@ -501,7 +505,7 @@ def agent_config(
501505
)
502506

503507
return self.__evaluate_agent(
504-
key, context, default or AIAgentConfigDefault.disabled(), variables
508+
key, context, default or _DISABLED_AGENT_DEFAULT, variables
505509
)
506510

507511
def agent(
@@ -575,7 +579,7 @@ def agent_configs(
575579
agent = self.__evaluate_agent(
576580
config.key,
577581
context,
578-
config.default or AIAgentConfigDefault.disabled(),
582+
config.default or _DISABLED_AGENT_DEFAULT,
579583
config.variables
580584
)
581585
result[config.key] = agent

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,6 @@ class AIConfigDefault:
150150
model: Optional[ModelConfig] = None
151151
provider: Optional[ProviderConfig] = None
152152

153-
@classmethod
154-
def disabled(cls):
155-
"""
156-
Returns a new disabled config default with enabled set to false.
157-
When called on a subclass, returns an instance of that subclass.
158-
"""
159-
return cls(enabled=False)
160-
161153
def _base_to_dict(self) -> Dict[str, Any]:
162154
"""
163155
Render the base config fields as a dictionary object.

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

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from ldai import LDAIClient, LDMessage, ModelConfig
66
from ldai.models import (AIAgentConfigDefault, AICompletionConfigDefault,
7-
AIConfigDefault, AIJudgeConfigDefault)
7+
AIJudgeConfigDefault)
88

99

1010
@pytest.fixture
@@ -354,46 +354,6 @@ def test_sdk_info_tracked_on_init():
354354
)
355355

356356

357-
# ============================================================================
358-
# disabled() classmethod tests
359-
# ============================================================================
360-
361-
def test_ai_config_default_disabled_returns_disabled_instance():
362-
result = AIConfigDefault.disabled()
363-
assert isinstance(result, AIConfigDefault)
364-
assert result.enabled is False
365-
366-
367-
def test_completion_config_default_disabled_returns_correct_type():
368-
result = AICompletionConfigDefault.disabled()
369-
assert isinstance(result, AICompletionConfigDefault)
370-
assert result.enabled is False
371-
assert result.messages is None
372-
assert result.model is None
373-
374-
375-
def test_agent_config_default_disabled_returns_correct_type():
376-
result = AIAgentConfigDefault.disabled()
377-
assert isinstance(result, AIAgentConfigDefault)
378-
assert result.enabled is False
379-
assert result.instructions is None
380-
assert result.model is None
381-
382-
383-
def test_judge_config_default_disabled_returns_correct_type():
384-
result = AIJudgeConfigDefault.disabled()
385-
assert isinstance(result, AIJudgeConfigDefault)
386-
assert result.enabled is False
387-
assert result.messages is None
388-
assert result.evaluation_metric_key is None
389-
390-
391-
def test_disabled_returns_new_instance_each_call():
392-
first = AICompletionConfigDefault.disabled()
393-
second = AICompletionConfigDefault.disabled()
394-
assert first is not second
395-
396-
397357
# ============================================================================
398358
# Optional default value tests
399359
# ============================================================================

0 commit comments

Comments
 (0)