77
88from ldai import LDMessage
99
10- from ldai_langchain import LangChainProvider
10+ from ldai_langchain import LangChainRunnerFactory
1111
1212
1313class TestConvertMessagesToLangchain :
@@ -16,7 +16,7 @@ class TestConvertMessagesToLangchain:
1616 def test_converts_system_messages_to_system_message (self ):
1717 """Should convert system messages to SystemMessage."""
1818 messages = [LDMessage (role = 'system' , content = 'You are a helpful assistant.' )]
19- result = LangChainProvider .convert_messages_to_langchain (messages )
19+ result = LangChainRunnerFactory .convert_messages_to_langchain (messages )
2020
2121 assert len (result ) == 1
2222 assert isinstance (result [0 ], SystemMessage )
@@ -25,7 +25,7 @@ def test_converts_system_messages_to_system_message(self):
2525 def test_converts_user_messages_to_human_message (self ):
2626 """Should convert user messages to HumanMessage."""
2727 messages = [LDMessage (role = 'user' , content = 'Hello, how are you?' )]
28- result = LangChainProvider .convert_messages_to_langchain (messages )
28+ result = LangChainRunnerFactory .convert_messages_to_langchain (messages )
2929
3030 assert len (result ) == 1
3131 assert isinstance (result [0 ], HumanMessage )
@@ -34,7 +34,7 @@ def test_converts_user_messages_to_human_message(self):
3434 def test_converts_assistant_messages_to_ai_message (self ):
3535 """Should convert assistant messages to AIMessage."""
3636 messages = [LDMessage (role = 'assistant' , content = 'I am doing well, thank you!' )]
37- result = LangChainProvider .convert_messages_to_langchain (messages )
37+ result = LangChainRunnerFactory .convert_messages_to_langchain (messages )
3838
3939 assert len (result ) == 1
4040 assert isinstance (result [0 ], AIMessage )
@@ -47,7 +47,7 @@ def test_converts_multiple_messages_in_order(self):
4747 LDMessage (role = 'user' , content = 'What is the weather like?' ),
4848 LDMessage (role = 'assistant' , content = 'I cannot check the weather.' ),
4949 ]
50- result = LangChainProvider .convert_messages_to_langchain (messages )
50+ result = LangChainRunnerFactory .convert_messages_to_langchain (messages )
5151
5252 assert len (result ) == 3
5353 assert isinstance (result [0 ], SystemMessage )
@@ -62,11 +62,11 @@ class MockMessage:
6262 content = 'Test message'
6363
6464 with pytest .raises (ValueError , match = 'Unsupported message role: unknown' ):
65- LangChainProvider .convert_messages_to_langchain ([MockMessage ()]) # type: ignore
65+ LangChainRunnerFactory .convert_messages_to_langchain ([MockMessage ()]) # type: ignore
6666
6767 def test_handles_empty_message_array (self ):
6868 """Should handle empty message array."""
69- result = LangChainProvider .convert_messages_to_langchain ([])
69+ result = LangChainRunnerFactory .convert_messages_to_langchain ([])
7070 assert len (result ) == 0
7171
7272
@@ -84,7 +84,7 @@ def test_creates_metrics_with_success_true_and_token_usage(self):
8484 },
8585 }
8686
87- result = LangChainProvider .get_ai_metrics_from_response (mock_response )
87+ result = LangChainRunnerFactory .get_ai_metrics_from_response (mock_response )
8888
8989 assert result .success is True
9090 assert result .usage is not None
@@ -103,7 +103,7 @@ def test_creates_metrics_with_snake_case_token_usage(self):
103103 },
104104 }
105105
106- result = LangChainProvider .get_ai_metrics_from_response (mock_response )
106+ result = LangChainRunnerFactory .get_ai_metrics_from_response (mock_response )
107107
108108 assert result .success is True
109109 assert result .usage is not None
@@ -115,7 +115,7 @@ def test_creates_metrics_with_success_true_and_no_usage_when_metadata_missing(se
115115 """Should create metrics with success=True and no usage when metadata is missing."""
116116 mock_response = AIMessage (content = 'Test response' )
117117
118- result = LangChainProvider .get_ai_metrics_from_response (mock_response )
118+ result = LangChainRunnerFactory .get_ai_metrics_from_response (mock_response )
119119
120120 assert result .success is True
121121 assert result .usage is None
@@ -126,23 +126,23 @@ class TestMapProvider:
126126
127127 def test_maps_gemini_to_google_genai (self ):
128128 """Should map gemini to google-genai."""
129- assert LangChainProvider .map_provider ('gemini' ) == 'google-genai'
130- assert LangChainProvider .map_provider ('Gemini' ) == 'google-genai'
131- assert LangChainProvider .map_provider ('GEMINI' ) == 'google-genai'
129+ assert LangChainRunnerFactory .map_provider ('gemini' ) == 'google-genai'
130+ assert LangChainRunnerFactory .map_provider ('Gemini' ) == 'google-genai'
131+ assert LangChainRunnerFactory .map_provider ('GEMINI' ) == 'google-genai'
132132
133133 def test_maps_bedrock_and_model_families_to_bedrock_converse (self ):
134134 """Should map bedrock and bedrock:model_family to bedrock_converse."""
135- assert LangChainProvider .map_provider ('bedrock' ) == 'bedrock_converse'
136- assert LangChainProvider .map_provider ('Bedrock:Anthropic' ) == 'bedrock_converse'
137- assert LangChainProvider .map_provider ('bedrock:anthropic' ) == 'bedrock_converse'
138- assert LangChainProvider .map_provider ('bedrock:amazon' ) == 'bedrock_converse'
139- assert LangChainProvider .map_provider ('bedrock:cohere' ) == 'bedrock_converse'
135+ assert LangChainRunnerFactory .map_provider ('bedrock' ) == 'bedrock_converse'
136+ assert LangChainRunnerFactory .map_provider ('Bedrock:Anthropic' ) == 'bedrock_converse'
137+ assert LangChainRunnerFactory .map_provider ('bedrock:anthropic' ) == 'bedrock_converse'
138+ assert LangChainRunnerFactory .map_provider ('bedrock:amazon' ) == 'bedrock_converse'
139+ assert LangChainRunnerFactory .map_provider ('bedrock:cohere' ) == 'bedrock_converse'
140140
141141 def test_returns_provider_name_unchanged_for_unmapped_providers (self ):
142142 """Should return provider name unchanged for unmapped providers."""
143- assert LangChainProvider .map_provider ('openai' ) == 'openai'
144- assert LangChainProvider .map_provider ('anthropic' ) == 'anthropic'
145- assert LangChainProvider .map_provider ('unknown' ) == 'unknown'
143+ assert LangChainRunnerFactory .map_provider ('openai' ) == 'openai'
144+ assert LangChainRunnerFactory .map_provider ('anthropic' ) == 'anthropic'
145+ assert LangChainRunnerFactory .map_provider ('unknown' ) == 'unknown'
146146
147147
148148class TestInvokeModel :
@@ -158,7 +158,7 @@ async def test_returns_success_true_for_string_content(self, mock_llm):
158158 """Should return success=True for string content."""
159159 mock_response = AIMessage (content = 'Test response' )
160160 mock_llm .ainvoke = AsyncMock (return_value = mock_response )
161- provider = LangChainProvider (mock_llm )
161+ provider = LangChainRunnerFactory (mock_llm )
162162
163163 messages = [LDMessage (role = 'user' , content = 'Hello' )]
164164 result = await provider .invoke_model (messages )
@@ -171,7 +171,7 @@ async def test_returns_success_false_for_non_string_content_and_logs_warning(sel
171171 """Should return success=False for non-string content and log warning."""
172172 mock_response = AIMessage (content = [{'type' : 'image' , 'data' : 'base64data' }])
173173 mock_llm .ainvoke = AsyncMock (return_value = mock_response )
174- provider = LangChainProvider (mock_llm )
174+ provider = LangChainRunnerFactory (mock_llm )
175175
176176 messages = [LDMessage (role = 'user' , content = 'Hello' )]
177177 result = await provider .invoke_model (messages )
@@ -184,7 +184,7 @@ async def test_returns_success_false_when_model_invocation_throws_error(self, mo
184184 """Should return success=False when model invocation throws an error."""
185185 error = Exception ('Model invocation failed' )
186186 mock_llm .ainvoke = AsyncMock (side_effect = error )
187- provider = LangChainProvider (mock_llm )
187+ provider = LangChainRunnerFactory (mock_llm )
188188
189189 messages = [LDMessage (role = 'user' , content = 'Hello' )]
190190 result = await provider .invoke_model (messages )
@@ -210,7 +210,7 @@ async def test_returns_success_true_for_successful_invocation(self, mock_llm):
210210 mock_structured_llm = MagicMock ()
211211 mock_structured_llm .ainvoke = AsyncMock (return_value = mock_response )
212212 mock_llm .with_structured_output = MagicMock (return_value = mock_structured_llm )
213- provider = LangChainProvider (mock_llm )
213+ provider = LangChainRunnerFactory (mock_llm )
214214
215215 messages = [LDMessage (role = 'user' , content = 'Hello' )]
216216 response_structure = {'type' : 'object' , 'properties' : {}}
@@ -226,7 +226,7 @@ async def test_returns_success_false_when_structured_model_invocation_throws_err
226226 mock_structured_llm = MagicMock ()
227227 mock_structured_llm .ainvoke = AsyncMock (side_effect = error )
228228 mock_llm .with_structured_output = MagicMock (return_value = mock_structured_llm )
229- provider = LangChainProvider (mock_llm )
229+ provider = LangChainRunnerFactory (mock_llm )
230230
231231 messages = [LDMessage (role = 'user' , content = 'Hello' )]
232232 response_structure = {'type' : 'object' , 'properties' : {}}
@@ -244,7 +244,7 @@ class TestGetChatModel:
244244 def test_returns_underlying_llm (self ):
245245 """Should return the underlying LLM."""
246246 mock_llm = MagicMock ()
247- provider = LangChainProvider (mock_llm )
247+ provider = LangChainRunnerFactory (mock_llm )
248248
249249 assert provider .get_chat_model () is mock_llm
250250
0 commit comments