Skip to content

Commit faef4e7

Browse files
jsonbaileyclaude
andcommitted
Rename OpenAIProvider → OpenAIRunnerFactory
Completes the rename that was done for the file (openai_provider.py → openai_runner_factory.py) but missed the class itself. Updates all references in __init__.py, runner_factory.py, and tests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 3baae96 commit faef4e7

4 files changed

Lines changed: 29 additions & 29 deletions

File tree

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from ldai_openai.openai_runner_factory import OpenAIProvider
1+
from ldai_openai.openai_runner_factory import OpenAIRunnerFactory
22

33
__all__ = [
4-
'OpenAIProvider',
4+
'OpenAIRunnerFactory',
55
]

packages/ai-providers/server-ai-openai/src/ldai_openai/openai_runner_factory.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from openai.types.chat import ChatCompletionMessageParam
1212

1313

14-
class OpenAIProvider(AIProvider):
14+
class OpenAIRunnerFactory(AIProvider):
1515
"""
1616
OpenAI provider for the LaunchDarkly AI SDK.
1717
@@ -50,21 +50,21 @@ def __init__(
5050

5151
# --- AIProvider factory methods ---
5252

53-
def create_model(self, config: AIConfigKind) -> 'OpenAIProvider':
53+
def create_model(self, config: AIConfigKind) -> 'OpenAIRunnerFactory':
5454
"""
5555
Create a configured OpenAI model provider for the given AI config.
5656
5757
Reuses the underlying AsyncOpenAI client so that connection pooling is
5858
preserved across calls.
5959
6060
:param config: The LaunchDarkly AI configuration
61-
:return: Configured OpenAIProvider ready to invoke the model
61+
:return: Configured OpenAIRunnerFactory ready to invoke the model
6262
"""
6363
config_dict = config.to_dict()
6464
model_dict = config_dict.get('model') or {}
6565
model_name = model_dict.get('name', '')
6666
parameters = model_dict.get('parameters') or {}
67-
return OpenAIProvider(self._client, model_name, parameters)
67+
return OpenAIRunnerFactory(self._client, model_name, parameters)
6868

6969
# --- Model invocation ---
7070

@@ -87,7 +87,7 @@ async def invoke_model(self, messages: List[LDMessage]) -> ChatResponse:
8787
**self._parameters,
8888
)
8989

90-
metrics = OpenAIProvider.get_ai_metrics_from_response(response)
90+
metrics = OpenAIRunnerFactory.get_ai_metrics_from_response(response)
9191

9292
content = ''
9393
if response.choices and len(response.choices) > 0:
@@ -143,7 +143,7 @@ async def invoke_structured_model(
143143
**self._parameters,
144144
)
145145

146-
metrics = OpenAIProvider.get_ai_metrics_from_response(response)
146+
metrics = OpenAIRunnerFactory.get_ai_metrics_from_response(response)
147147

148148
content = ''
149149
if response.choices and len(response.choices) > 0:
@@ -206,7 +206,7 @@ def get_ai_metrics_from_response(response: Any) -> LDAIMetrics:
206206
207207
response = await tracker.track_metrics_of(
208208
lambda: client.chat.completions.create(config),
209-
OpenAIProvider.get_ai_metrics_from_response
209+
OpenAIRunnerFactory.get_ai_metrics_from_response
210210
)
211211
"""
212212
usage: Optional[TokenUsage] = None

packages/ai-providers/server-ai-openai/tests/test_openai_provider.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from ldai import LDMessage
77

8-
from ldai_openai import OpenAIProvider
8+
from ldai_openai import OpenAIRunnerFactory
99

1010

1111
class TestGetAIMetricsFromResponse:
@@ -19,7 +19,7 @@ def test_creates_metrics_with_success_true_and_token_usage(self):
1919
mock_response.usage.completion_tokens = 50
2020
mock_response.usage.total_tokens = 100
2121

22-
result = OpenAIProvider.get_ai_metrics_from_response(mock_response)
22+
result = OpenAIRunnerFactory.get_ai_metrics_from_response(mock_response)
2323

2424
assert result.success is True
2525
assert result.usage is not None
@@ -32,7 +32,7 @@ def test_creates_metrics_with_success_true_and_no_usage_when_usage_missing(self)
3232
mock_response = MagicMock()
3333
mock_response.usage = None
3434

35-
result = OpenAIProvider.get_ai_metrics_from_response(mock_response)
35+
result = OpenAIRunnerFactory.get_ai_metrics_from_response(mock_response)
3636

3737
assert result.success is True
3838
assert result.usage is None
@@ -45,7 +45,7 @@ def test_handles_partial_usage_data(self):
4545
mock_response.usage.completion_tokens = None
4646
mock_response.usage.total_tokens = None
4747

48-
result = OpenAIProvider.get_ai_metrics_from_response(mock_response)
48+
result = OpenAIRunnerFactory.get_ai_metrics_from_response(mock_response)
4949

5050
assert result.success is True
5151
assert result.usage is not None
@@ -78,7 +78,7 @@ async def test_invokes_openai_chat_completions_and_returns_response(self, mock_c
7878
mock_client.chat.completions = MagicMock()
7979
mock_client.chat.completions.create = AsyncMock(return_value=mock_response)
8080

81-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
81+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
8282
messages = [LDMessage(role='user', content='Hello!')]
8383
result = await provider.invoke_model(messages)
8484

@@ -108,7 +108,7 @@ async def test_returns_unsuccessful_response_when_no_content(self, mock_client):
108108
mock_client.chat.completions = MagicMock()
109109
mock_client.chat.completions.create = AsyncMock(return_value=mock_response)
110110

111-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
111+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
112112
messages = [LDMessage(role='user', content='Hello!')]
113113
result = await provider.invoke_model(messages)
114114

@@ -127,7 +127,7 @@ async def test_returns_unsuccessful_response_when_choices_empty(self, mock_clien
127127
mock_client.chat.completions = MagicMock()
128128
mock_client.chat.completions.create = AsyncMock(return_value=mock_response)
129129

130-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
130+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
131131
messages = [LDMessage(role='user', content='Hello!')]
132132
result = await provider.invoke_model(messages)
133133

@@ -142,7 +142,7 @@ async def test_returns_unsuccessful_response_when_exception_thrown(self, mock_cl
142142
mock_client.chat.completions = MagicMock()
143143
mock_client.chat.completions.create = AsyncMock(side_effect=Exception('API Error'))
144144

145-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
145+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
146146
messages = [LDMessage(role='user', content='Hello!')]
147147
result = await provider.invoke_model(messages)
148148

@@ -175,7 +175,7 @@ async def test_invokes_openai_with_structured_output(self, mock_client):
175175
mock_client.chat.completions = MagicMock()
176176
mock_client.chat.completions.create = AsyncMock(return_value=mock_response)
177177

178-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
178+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
179179
messages = [LDMessage(role='user', content='Tell me about a person')]
180180
response_structure = {
181181
'type': 'object',
@@ -210,7 +210,7 @@ async def test_returns_unsuccessful_when_no_content_in_structured_response(self,
210210
mock_client.chat.completions = MagicMock()
211211
mock_client.chat.completions.create = AsyncMock(return_value=mock_response)
212212

213-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
213+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
214214
messages = [LDMessage(role='user', content='Tell me about a person')]
215215
response_structure = {'type': 'object'}
216216

@@ -236,7 +236,7 @@ async def test_handles_json_parsing_errors(self, mock_client):
236236
mock_client.chat.completions = MagicMock()
237237
mock_client.chat.completions.create = AsyncMock(return_value=mock_response)
238238

239-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
239+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
240240
messages = [LDMessage(role='user', content='Tell me about a person')]
241241
response_structure = {'type': 'object'}
242242

@@ -255,7 +255,7 @@ async def test_returns_unsuccessful_response_when_exception_thrown(self, mock_cl
255255
mock_client.chat.completions = MagicMock()
256256
mock_client.chat.completions.create = AsyncMock(side_effect=Exception('API Error'))
257257

258-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
258+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
259259
messages = [LDMessage(role='user', content='Tell me about a person')]
260260
response_structure = {'type': 'object'}
261261

@@ -272,7 +272,7 @@ class TestGetClient:
272272
def test_returns_underlying_client(self):
273273
"""Should return the underlying OpenAI client."""
274274
mock_client = MagicMock()
275-
provider = OpenAIProvider(mock_client, 'gpt-3.5-turbo', {})
275+
provider = OpenAIRunnerFactory(mock_client, 'gpt-3.5-turbo', {})
276276

277277
assert provider.get_client() is mock_client
278278

@@ -281,7 +281,7 @@ class TestCreateModel:
281281
"""Tests for create_model instance method."""
282282

283283
def test_creates_connector_with_correct_model_and_parameters(self):
284-
"""Should create OpenAIProvider with correct model and parameters."""
284+
"""Should create OpenAIRunnerFactory with correct model and parameters."""
285285
mock_ai_config = MagicMock()
286286
mock_ai_config.to_dict.return_value = {
287287
'model': {
@@ -298,9 +298,9 @@ def test_creates_connector_with_correct_model_and_parameters(self):
298298
mock_client = MagicMock()
299299
mock_openai_class.return_value = mock_client
300300

301-
result = OpenAIProvider().create_model(mock_ai_config)
301+
result = OpenAIRunnerFactory().create_model(mock_ai_config)
302302

303-
assert isinstance(result, OpenAIProvider)
303+
assert isinstance(result, OpenAIRunnerFactory)
304304
assert result._model_name == 'gpt-4'
305305
assert result._parameters == {'temperature': 0.7, 'max_tokens': 1000}
306306

@@ -313,9 +313,9 @@ def test_handles_missing_model_config(self):
313313
mock_client = MagicMock()
314314
mock_openai_class.return_value = mock_client
315315

316-
result = OpenAIProvider().create_model(mock_ai_config)
316+
result = OpenAIRunnerFactory().create_model(mock_ai_config)
317317

318-
assert isinstance(result, OpenAIProvider)
318+
assert isinstance(result, OpenAIRunnerFactory)
319319
assert result._model_name == ''
320320
assert result._parameters == {}
321321

packages/sdk/server-ai/src/ldai/providers/runner_factory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ def _get_provider_factory(provider_type: str) -> Optional[AIProvider]:
4040

4141
if provider_type == 'openai':
4242
RunnerFactory._pkg_exists('ldai_openai')
43-
from ldai_openai import OpenAIProvider
44-
return OpenAIProvider()
43+
from ldai_openai import OpenAIRunnerFactory
44+
return OpenAIRunnerFactory()
4545

4646
log.warning(
4747
f"Provider '{provider_type}' is not supported. "

0 commit comments

Comments
 (0)