Skip to content

Commit f90d2f5

Browse files
committed
update to supported ai client version and fix tests
1 parent 260c2b5 commit f90d2f5

3 files changed

Lines changed: 15 additions & 30 deletions

File tree

packages/ai-providers/server-ai-langchain/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ packages = [{ include = "ldai_langchain", from = "src" }]
2424

2525
[tool.poetry.dependencies]
2626
python = ">=3.9,<4"
27-
launchdarkly-server-sdk-ai = ">=0.11.0"
27+
launchdarkly-server-sdk-ai = ">=0.12.0"
2828
langchain-core = ">=0.2.0"
2929
langchain = ">=0.2.0"
3030

packages/ai-providers/server-ai-langchain/src/ldai_langchain/langchain_provider.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ async def invoke_model(self, messages: List[LDMessage]) -> ChatResponse:
5353
if isinstance(response.content, str):
5454
content = response.content
5555
else:
56-
log.warn(
56+
log.warning(
5757
f'Multimodal response not supported, expecting a string. '
5858
f'Content type: {type(response.content)}, Content: {response.content}'
5959
)
@@ -64,7 +64,7 @@ async def invoke_model(self, messages: List[LDMessage]) -> ChatResponse:
6464
metrics=metrics,
6565
)
6666
except Exception as error:
67-
log.warn(f'LangChain model invocation failed: {error}')
67+
log.warning(f'LangChain model invocation failed: {error}')
6868

6969
return ChatResponse(
7070
message=LDMessage(role='assistant', content=''),
@@ -89,7 +89,7 @@ async def invoke_structured_model(
8989
response = await structured_llm.ainvoke(langchain_messages)
9090

9191
if not isinstance(response, dict):
92-
log.warn(
92+
log.warning(
9393
f'Structured output did not return a dict. '
9494
f'Got: {type(response)}'
9595
)
@@ -111,7 +111,7 @@ async def invoke_structured_model(
111111
),
112112
)
113113
except Exception as error:
114-
log.warn(f'LangChain structured model invocation failed: {error}')
114+
log.warning(f'LangChain structured model invocation failed: {error}')
115115

116116
return StructuredResponse(
117117
data={},

packages/ai-providers/server-ai-langchain/tests/test_langchain_provider.py

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -145,53 +145,45 @@ def mock_llm(self):
145145
"""Create a mock LLM."""
146146
return MagicMock()
147147

148-
@pytest.fixture
149-
def mock_logger(self):
150-
"""Create a mock logger."""
151-
return MagicMock()
152-
153148
@pytest.mark.asyncio
154-
async def test_returns_success_true_for_string_content(self, mock_llm, mock_logger):
149+
async def test_returns_success_true_for_string_content(self, mock_llm):
155150
"""Should return success=True for string content."""
156151
mock_response = AIMessage(content='Test response')
157152
mock_llm.ainvoke = AsyncMock(return_value=mock_response)
158-
provider = LangChainProvider(mock_llm, mock_logger)
153+
provider = LangChainProvider(mock_llm)
159154

160155
messages = [LDMessage(role='user', content='Hello')]
161156
result = await provider.invoke_model(messages)
162157

163158
assert result.metrics.success is True
164159
assert result.message.content == 'Test response'
165-
mock_logger.warn.assert_not_called()
166160

167161
@pytest.mark.asyncio
168-
async def test_returns_success_false_for_non_string_content_and_logs_warning(self, mock_llm, mock_logger):
162+
async def test_returns_success_false_for_non_string_content_and_logs_warning(self, mock_llm):
169163
"""Should return success=False for non-string content and log warning."""
170164
mock_response = AIMessage(content=[{'type': 'image', 'data': 'base64data'}])
171165
mock_llm.ainvoke = AsyncMock(return_value=mock_response)
172-
provider = LangChainProvider(mock_llm, mock_logger)
166+
provider = LangChainProvider(mock_llm)
173167

174168
messages = [LDMessage(role='user', content='Hello')]
175169
result = await provider.invoke_model(messages)
176170

177171
assert result.metrics.success is False
178172
assert result.message.content == ''
179-
mock_logger.warn.assert_called_once()
180173

181174
@pytest.mark.asyncio
182-
async def test_returns_success_false_when_model_invocation_throws_error(self, mock_llm, mock_logger):
175+
async def test_returns_success_false_when_model_invocation_throws_error(self, mock_llm):
183176
"""Should return success=False when model invocation throws an error."""
184177
error = Exception('Model invocation failed')
185178
mock_llm.ainvoke = AsyncMock(side_effect=error)
186-
provider = LangChainProvider(mock_llm, mock_logger)
179+
provider = LangChainProvider(mock_llm)
187180

188181
messages = [LDMessage(role='user', content='Hello')]
189182
result = await provider.invoke_model(messages)
190183

191184
assert result.metrics.success is False
192185
assert result.message.content == ''
193186
assert result.message.role == 'assistant'
194-
mock_logger.warn.assert_called()
195187

196188

197189
class TestInvokeStructuredModel:
@@ -202,36 +194,30 @@ def mock_llm(self):
202194
"""Create a mock LLM."""
203195
return MagicMock()
204196

205-
@pytest.fixture
206-
def mock_logger(self):
207-
"""Create a mock logger."""
208-
return MagicMock()
209-
210197
@pytest.mark.asyncio
211-
async def test_returns_success_true_for_successful_invocation(self, mock_llm, mock_logger):
198+
async def test_returns_success_true_for_successful_invocation(self, mock_llm):
212199
"""Should return success=True for successful invocation."""
213200
mock_response = {'result': 'structured data'}
214201
mock_structured_llm = MagicMock()
215202
mock_structured_llm.ainvoke = AsyncMock(return_value=mock_response)
216203
mock_llm.with_structured_output = MagicMock(return_value=mock_structured_llm)
217-
provider = LangChainProvider(mock_llm, mock_logger)
204+
provider = LangChainProvider(mock_llm)
218205

219206
messages = [LDMessage(role='user', content='Hello')]
220207
response_structure = {'type': 'object', 'properties': {}}
221208
result = await provider.invoke_structured_model(messages, response_structure)
222209

223210
assert result.metrics.success is True
224211
assert result.data == mock_response
225-
mock_logger.warn.assert_not_called()
226212

227213
@pytest.mark.asyncio
228-
async def test_returns_success_false_when_structured_model_invocation_throws_error(self, mock_llm, mock_logger):
214+
async def test_returns_success_false_when_structured_model_invocation_throws_error(self, mock_llm):
229215
"""Should return success=False when structured model invocation throws an error."""
230216
error = Exception('Structured invocation failed')
231217
mock_structured_llm = MagicMock()
232218
mock_structured_llm.ainvoke = AsyncMock(side_effect=error)
233219
mock_llm.with_structured_output = MagicMock(return_value=mock_structured_llm)
234-
provider = LangChainProvider(mock_llm, mock_logger)
220+
provider = LangChainProvider(mock_llm)
235221

236222
messages = [LDMessage(role='user', content='Hello')]
237223
response_structure = {'type': 'object', 'properties': {}}
@@ -242,7 +228,6 @@ async def test_returns_success_false_when_structured_model_invocation_throws_err
242228
assert result.raw_response == ''
243229
assert result.metrics.usage is not None
244230
assert result.metrics.usage.total == 0
245-
mock_logger.warn.assert_called()
246231

247232

248233
class TestGetChatModel:

0 commit comments

Comments
 (0)