|
@@ -1,8 +1,8 @@
|
|
|
-from http import HTTPStatus
|
|
|
from typing import Generator, List, Optional, Union
|
|
|
|
|
|
-import dashscope
|
|
|
-from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
|
|
|
+from dashscope import get_tokenizer
|
|
|
+
|
|
|
+from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta, LLMMode
|
|
|
from core.model_runtime.entities.message_entities import (AssistantPromptMessage, PromptMessage, PromptMessageTool,
|
|
|
SystemPromptMessage, UserPromptMessage)
|
|
|
from core.model_runtime.errors.invoke import (InvokeAuthorizationError, InvokeBadRequestError, InvokeConnectionError,
|
|
@@ -51,19 +51,12 @@ class TongyiLargeLanguageModel(LargeLanguageModel):
|
|
|
:param tools: tools for tool calling
|
|
|
:return:
|
|
|
"""
|
|
|
- # transform credentials to kwargs for model instance
|
|
|
- credentials_kwargs = self._to_credential_kwargs(credentials)
|
|
|
+ tokenizer = get_tokenizer(model)
|
|
|
|
|
|
- response = dashscope.Tokenization.call(
|
|
|
- model=model,
|
|
|
- prompt=self._convert_messages_to_prompt(prompt_messages),
|
|
|
- **credentials_kwargs
|
|
|
- )
|
|
|
-
|
|
|
- if response.status_code == HTTPStatus.OK:
|
|
|
- return response['usage']['input_tokens']
|
|
|
- else:
|
|
|
- raise self._invoke_error_mapping[InvokeBadRequestError][0](response['message'])
|
|
|
+ # convert string to token ids
|
|
|
+ tokens = tokenizer.encode(self._convert_messages_to_prompt(prompt_messages))
|
|
|
+
|
|
|
+ return len(tokens)
|
|
|
|
|
|
def validate_credentials(self, model: str, credentials: dict) -> None:
|
|
|
"""
|
|
@@ -119,14 +112,22 @@ class TongyiLargeLanguageModel(LargeLanguageModel):
|
|
|
|
|
|
params = {
|
|
|
'model': model,
|
|
|
- 'prompt': self._convert_messages_to_prompt(prompt_messages),
|
|
|
**model_parameters,
|
|
|
**credentials_kwargs
|
|
|
}
|
|
|
+
|
|
|
+ mode = self.get_model_mode(model, credentials)
|
|
|
+
|
|
|
+ if mode == LLMMode.CHAT:
|
|
|
+ params['messages'] = self._convert_prompt_messages_to_tongyi_messages(prompt_messages)
|
|
|
+ else:
|
|
|
+ params['prompt'] = self._convert_messages_to_prompt(prompt_messages)
|
|
|
+
|
|
|
if stream:
|
|
|
responses = stream_generate_with_retry(
|
|
|
client,
|
|
|
stream=True,
|
|
|
+ incremental_output=True,
|
|
|
**params
|
|
|
)
|
|
|
|
|
@@ -267,6 +268,35 @@ class TongyiLargeLanguageModel(LargeLanguageModel):
|
|
|
# trim off the trailing ' ' that might come from the "Assistant: "
|
|
|
return text.rstrip()
|
|
|
|
|
|
+ def _convert_prompt_messages_to_tongyi_messages(self, prompt_messages: list[PromptMessage]) -> list[dict]:
|
|
|
+ """
|
|
|
+ Convert prompt messages to tongyi messages
|
|
|
+
|
|
|
+ :param prompt_messages: prompt messages
|
|
|
+ :return: tongyi messages
|
|
|
+ """
|
|
|
+ tongyi_messages = []
|
|
|
+ for prompt_message in prompt_messages:
|
|
|
+ if isinstance(prompt_message, SystemPromptMessage):
|
|
|
+ tongyi_messages.append({
|
|
|
+ 'role': 'system',
|
|
|
+ 'content': prompt_message.content,
|
|
|
+ })
|
|
|
+ elif isinstance(prompt_message, UserPromptMessage):
|
|
|
+ tongyi_messages.append({
|
|
|
+ 'role': 'user',
|
|
|
+ 'content': prompt_message.content,
|
|
|
+ })
|
|
|
+ elif isinstance(prompt_message, AssistantPromptMessage):
|
|
|
+ tongyi_messages.append({
|
|
|
+ 'role': 'assistant',
|
|
|
+ 'content': prompt_message.content,
|
|
|
+ })
|
|
|
+ else:
|
|
|
+ raise ValueError(f"Got unknown type {prompt_message}")
|
|
|
+
|
|
|
+ return tongyi_messages
|
|
|
+
|
|
|
@property
|
|
|
def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]:
|
|
|
"""
|