| 
									
										
										
										
											2024-01-12 12:29:13 +08:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2024-04-18 20:24:05 +08:00
										 |  |  | from collections.abc import Generator | 
					
						
							| 
									
										
										
										
											2024-01-12 12:29:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2024-04-18 20:24:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-01 18:11:57 +08:00
										 |  |  | from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta | 
					
						
							| 
									
										
										
										
											2024-04-18 20:24:05 +08:00
										 |  |  | from core.model_runtime.entities.message_entities import ( | 
					
						
							|  |  |  |     AssistantPromptMessage, | 
					
						
							|  |  |  |     ImagePromptMessageContent, | 
					
						
							|  |  |  |     SystemPromptMessage, | 
					
						
							|  |  |  |     TextPromptMessageContent, | 
					
						
							|  |  |  |     UserPromptMessage, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2024-01-12 12:29:13 +08:00
										 |  |  | from core.model_runtime.errors.validate import CredentialsValidateFailedError | 
					
						
							|  |  |  | from core.model_runtime.model_providers.ollama.llm.llm import OllamaLargeLanguageModel | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_validate_credentials(): | 
					
						
							|  |  |  |     model = OllamaLargeLanguageModel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises(CredentialsValidateFailedError): | 
					
						
							|  |  |  |         model.validate_credentials( | 
					
						
							|  |  |  |             model='mistral:text', | 
					
						
							|  |  |  |             credentials={ | 
					
						
							|  |  |  |                 'base_url': 'http://localhost:21434', | 
					
						
							|  |  |  |                 'mode': 'chat', | 
					
						
							|  |  |  |                 'context_size': 2048, | 
					
						
							|  |  |  |                 'max_tokens': 2048, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     model.validate_credentials( | 
					
						
							|  |  |  |         model='mistral:text', | 
					
						
							|  |  |  |         credentials={ | 
					
						
							|  |  |  |             'base_url': os.environ.get('OLLAMA_BASE_URL'), | 
					
						
							|  |  |  |             'mode': 'chat', | 
					
						
							|  |  |  |             'context_size': 2048, | 
					
						
							|  |  |  |             'max_tokens': 2048, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_invoke_model(): | 
					
						
							|  |  |  |     model = OllamaLargeLanguageModel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = model.invoke( | 
					
						
							|  |  |  |         model='mistral:text', | 
					
						
							|  |  |  |         credentials={ | 
					
						
							|  |  |  |             'base_url': os.environ.get('OLLAMA_BASE_URL'), | 
					
						
							|  |  |  |             'mode': 'chat', | 
					
						
							|  |  |  |             'context_size': 2048, | 
					
						
							|  |  |  |             'max_tokens': 2048, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         prompt_messages=[ | 
					
						
							|  |  |  |             UserPromptMessage( | 
					
						
							|  |  |  |                 content='Who are you?' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         model_parameters={ | 
					
						
							|  |  |  |             'temperature': 1.0, | 
					
						
							|  |  |  |             'top_k': 2, | 
					
						
							|  |  |  |             'top_p': 0.5, | 
					
						
							|  |  |  |             'num_predict': 10 | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         stop=['How'], | 
					
						
							|  |  |  |         stream=False | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert isinstance(response, LLMResult) | 
					
						
							|  |  |  |     assert len(response.message.content) > 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_invoke_stream_model(): | 
					
						
							|  |  |  |     model = OllamaLargeLanguageModel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = model.invoke( | 
					
						
							|  |  |  |         model='mistral:text', | 
					
						
							|  |  |  |         credentials={ | 
					
						
							|  |  |  |             'base_url': os.environ.get('OLLAMA_BASE_URL'), | 
					
						
							|  |  |  |             'mode': 'chat', | 
					
						
							|  |  |  |             'context_size': 2048, | 
					
						
							|  |  |  |             'max_tokens': 2048, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         prompt_messages=[ | 
					
						
							|  |  |  |             SystemPromptMessage( | 
					
						
							|  |  |  |                 content='You are a helpful AI assistant.', | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             UserPromptMessage( | 
					
						
							|  |  |  |                 content='Who are you?' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         model_parameters={ | 
					
						
							|  |  |  |             'temperature': 1.0, | 
					
						
							|  |  |  |             'top_k': 2, | 
					
						
							|  |  |  |             'top_p': 0.5, | 
					
						
							|  |  |  |             'num_predict': 10 | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         stop=['How'], | 
					
						
							|  |  |  |         stream=True | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert isinstance(response, Generator) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for chunk in response: | 
					
						
							|  |  |  |         assert isinstance(chunk, LLMResultChunk) | 
					
						
							|  |  |  |         assert isinstance(chunk.delta, LLMResultChunkDelta) | 
					
						
							|  |  |  |         assert isinstance(chunk.delta.message, AssistantPromptMessage) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_invoke_completion_model(): | 
					
						
							|  |  |  |     model = OllamaLargeLanguageModel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = model.invoke( | 
					
						
							|  |  |  |         model='mistral:text', | 
					
						
							|  |  |  |         credentials={ | 
					
						
							|  |  |  |             'base_url': os.environ.get('OLLAMA_BASE_URL'), | 
					
						
							|  |  |  |             'mode': 'completion', | 
					
						
							|  |  |  |             'context_size': 2048, | 
					
						
							|  |  |  |             'max_tokens': 2048, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         prompt_messages=[ | 
					
						
							|  |  |  |             UserPromptMessage( | 
					
						
							|  |  |  |                 content='Who are you?' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         model_parameters={ | 
					
						
							|  |  |  |             'temperature': 1.0, | 
					
						
							|  |  |  |             'top_k': 2, | 
					
						
							|  |  |  |             'top_p': 0.5, | 
					
						
							|  |  |  |             'num_predict': 10 | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         stop=['How'], | 
					
						
							|  |  |  |         stream=False | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert isinstance(response, LLMResult) | 
					
						
							|  |  |  |     assert len(response.message.content) > 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_invoke_stream_completion_model(): | 
					
						
							|  |  |  |     model = OllamaLargeLanguageModel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = model.invoke( | 
					
						
							|  |  |  |         model='mistral:text', | 
					
						
							|  |  |  |         credentials={ | 
					
						
							|  |  |  |             'base_url': os.environ.get('OLLAMA_BASE_URL'), | 
					
						
							|  |  |  |             'mode': 'completion', | 
					
						
							|  |  |  |             'context_size': 2048, | 
					
						
							|  |  |  |             'max_tokens': 2048, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         prompt_messages=[ | 
					
						
							|  |  |  |             SystemPromptMessage( | 
					
						
							|  |  |  |                 content='You are a helpful AI assistant.', | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             UserPromptMessage( | 
					
						
							|  |  |  |                 content='Who are you?' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         model_parameters={ | 
					
						
							|  |  |  |             'temperature': 1.0, | 
					
						
							|  |  |  |             'top_k': 2, | 
					
						
							|  |  |  |             'top_p': 0.5, | 
					
						
							|  |  |  |             'num_predict': 10 | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         stop=['How'], | 
					
						
							|  |  |  |         stream=True | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert isinstance(response, Generator) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for chunk in response: | 
					
						
							|  |  |  |         assert isinstance(chunk, LLMResultChunk) | 
					
						
							|  |  |  |         assert isinstance(chunk.delta, LLMResultChunkDelta) | 
					
						
							|  |  |  |         assert isinstance(chunk.delta.message, AssistantPromptMessage) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_invoke_completion_model_with_vision(): | 
					
						
							|  |  |  |     model = OllamaLargeLanguageModel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = model.invoke( | 
					
						
							|  |  |  |         model='llava', | 
					
						
							|  |  |  |         credentials={ | 
					
						
							|  |  |  |             'base_url': os.environ.get('OLLAMA_BASE_URL'), | 
					
						
							|  |  |  |             'mode': 'completion', | 
					
						
							|  |  |  |             'context_size': 2048, | 
					
						
							|  |  |  |             'max_tokens': 2048, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         prompt_messages=[ | 
					
						
							|  |  |  |             UserPromptMessage( | 
					
						
							|  |  |  |                 content=[ | 
					
						
							|  |  |  |                     TextPromptMessageContent( | 
					
						
							|  |  |  |                         data='What is this in this picture?', | 
					
						
							|  |  |  |                     ), | 
					
						
							|  |  |  |                     ImagePromptMessageContent( | 
					
						
							|  |  |  |                         data='data:image/png;base64,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 | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                 ] | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         model_parameters={ | 
					
						
							|  |  |  |             'temperature': 0.1, | 
					
						
							|  |  |  |             'num_predict': 100 | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         stream=False, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert isinstance(result, LLMResult) | 
					
						
							|  |  |  |     assert len(result.message.content) > 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_invoke_chat_model_with_vision(): | 
					
						
							|  |  |  |     model = OllamaLargeLanguageModel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = model.invoke( | 
					
						
							|  |  |  |         model='llava', | 
					
						
							|  |  |  |         credentials={ | 
					
						
							|  |  |  |             'base_url': os.environ.get('OLLAMA_BASE_URL'), | 
					
						
							|  |  |  |             'mode': 'chat', | 
					
						
							|  |  |  |             'context_size': 2048, | 
					
						
							|  |  |  |             'max_tokens': 2048, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         prompt_messages=[ | 
					
						
							|  |  |  |             UserPromptMessage( | 
					
						
							|  |  |  |                 content=[ | 
					
						
							|  |  |  |                     TextPromptMessageContent( | 
					
						
							|  |  |  |                         data='What is this in this picture?', | 
					
						
							|  |  |  |                     ), | 
					
						
							|  |  |  |                     ImagePromptMessageContent( | 
					
						
							|  |  |  |                         data='data:image/png;base64,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 | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                 ] | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         model_parameters={ | 
					
						
							|  |  |  |             'temperature': 0.1, | 
					
						
							|  |  |  |             'num_predict': 100 | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         stream=False, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert isinstance(result, LLMResult) | 
					
						
							|  |  |  |     assert len(result.message.content) > 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_get_num_tokens(): | 
					
						
							|  |  |  |     model = OllamaLargeLanguageModel() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     num_tokens = model.get_num_tokens( | 
					
						
							|  |  |  |         model='mistral:text', | 
					
						
							|  |  |  |         credentials={ | 
					
						
							|  |  |  |             'base_url': os.environ.get('OLLAMA_BASE_URL'), | 
					
						
							|  |  |  |             'mode': 'chat', | 
					
						
							|  |  |  |             'context_size': 2048, | 
					
						
							|  |  |  |             'max_tokens': 2048, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         prompt_messages=[ | 
					
						
							|  |  |  |             UserPromptMessage( | 
					
						
							|  |  |  |                 content='Hello World!' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert isinstance(num_tokens, int) | 
					
						
							|  |  |  |     assert num_tokens == 6 |