From 9f440c11e002b0b39ddbcaff798b3a58a732e3e7 Mon Sep 17 00:00:00 2001 From: Su Yang Date: Wed, 8 May 2024 00:28:16 +0800 Subject: [PATCH] feat: DeepSeek (#4162) --- .../model_providers/_position.yaml | 1 + .../deepseek/_assets/icon_l_en.png | Bin 8232 -> 0 bytes .../deepseek/_assets/icon_l_en.svg | 22 ++++ .../deepseek/_assets/icon_s_en.png | Bin 11573 -> 0 bytes .../deepseek/_assets/icon_s_en.svg | 3 + .../model_providers/deepseek/deepseek.py | 5 +- .../model_providers/deepseek/deepseek.yaml | 25 +++-- .../deepseek/llm/deepseek-chat.yaml | 54 ++++++++-- .../model_providers/deepseek/llm/llm.py | 96 +++++++++++++++++- 9 files changed, 186 insertions(+), 20 deletions(-) delete mode 100644 api/core/model_runtime/model_providers/deepseek/_assets/icon_l_en.png create mode 100644 api/core/model_runtime/model_providers/deepseek/_assets/icon_l_en.svg delete mode 100644 api/core/model_runtime/model_providers/deepseek/_assets/icon_s_en.png create mode 100644 api/core/model_runtime/model_providers/deepseek/_assets/icon_s_en.svg diff --git a/api/core/model_runtime/model_providers/_position.yaml b/api/core/model_runtime/model_providers/_position.yaml index c06f122984..bda53e4394 100644 --- a/api/core/model_runtime/model_providers/_position.yaml +++ b/api/core/model_runtime/model_providers/_position.yaml @@ -27,3 +27,4 @@ - openllm - localai - openai_api_compatible +- deepseek diff --git a/api/core/model_runtime/model_providers/deepseek/_assets/icon_l_en.png b/api/core/model_runtime/model_providers/deepseek/_assets/icon_l_en.png deleted file mode 100644 index 25254d7f533b431b5235f90b6b468f6049046d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8232 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 a1Y}P)>K&h2S*%OWz$)MX0000000007YNdz( diff --git a/api/core/model_runtime/model_providers/deepseek/_assets/icon_l_en.svg b/api/core/model_runtime/model_providers/deepseek/_assets/icon_l_en.svg new file mode 100644 index 0000000000..425494404f --- /dev/null +++ b/api/core/model_runtime/model_providers/deepseek/_assets/icon_l_en.svg @@ -0,0 +1,22 @@ + + + Created with Pixso. + + + + + + + + + + + + + + + + + + + diff --git a/api/core/model_runtime/model_providers/deepseek/_assets/icon_s_en.png b/api/core/model_runtime/model_providers/deepseek/_assets/icon_s_en.png deleted file mode 100644 index 3271f5cfe48fd9a4609bf11f1a2838812bf3769d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11573 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 Xz`p$~0$v9W>*v7k*Ly9$hxz{ncCI&w diff --git a/api/core/model_runtime/model_providers/deepseek/_assets/icon_s_en.svg b/api/core/model_runtime/model_providers/deepseek/_assets/icon_s_en.svg new file mode 100644 index 0000000000..aa854a7504 --- /dev/null +++ b/api/core/model_runtime/model_providers/deepseek/_assets/icon_s_en.svg @@ -0,0 +1,3 @@ + + + diff --git a/api/core/model_runtime/model_providers/deepseek/deepseek.py b/api/core/model_runtime/model_providers/deepseek/deepseek.py index 5fb821ed45..d61fd4ddc8 100644 --- a/api/core/model_runtime/model_providers/deepseek/deepseek.py +++ b/api/core/model_runtime/model_providers/deepseek/deepseek.py @@ -7,7 +7,8 @@ from core.model_runtime.model_providers.__base.model_provider import ModelProvid logger = logging.getLogger(__name__) -class DeepseekProvider(ModelProvider): + +class DeepSeekProvider(ModelProvider): def validate_provider_credentials(self, credentials: dict) -> None: """ @@ -19,6 +20,8 @@ class DeepseekProvider(ModelProvider): try: model_instance = self.get_model_instance(ModelType.LLM) + # Use `deepseek-chat` model for validate, + # no matter what model you pass in, text completion model or chat model model_instance.validate_credentials( model='deepseek-chat', credentials=credentials diff --git a/api/core/model_runtime/model_providers/deepseek/deepseek.yaml b/api/core/model_runtime/model_providers/deepseek/deepseek.yaml index b535053c36..dacb20ab18 100644 --- a/api/core/model_runtime/model_providers/deepseek/deepseek.yaml +++ b/api/core/model_runtime/model_providers/deepseek/deepseek.yaml @@ -1,15 +1,19 @@ provider: deepseek label: - en_US: Deepseek + en_US: deepseek + zh_Hans: 深度求索 +description: + en_US: Models provided by deepseek, such as deepseek-chat、deepseek-coder. + zh_Hans: 深度求索提供的模型,例如 deepseek-chat、deepseek-coder 。 icon_small: - en_US: icon_s_en.png + en_US: icon_s_en.svg icon_large: - en_US: icon_l_en.png -background: "#FFFFFF" + en_US: icon_l_en.svg +background: "#c0cdff" help: title: - en_US: Get your API Key from Deepseek - zh_Hans: 从 Deepseek 获取 API Key + en_US: Get your API Key from deepseek + zh_Hans: 从深度求索获取 API Key url: en_US: https://platform.deepseek.com/api_keys supported_model_types: @@ -26,3 +30,12 @@ provider_credential_schema: placeholder: zh_Hans: 在此输入您的 API Key en_US: Enter your API Key + - variable: endpoint_url + label: + zh_Hans: 自定义 API endpoint 地址 + en_US: CUstom API endpoint URL + type: text-input + required: false + placeholder: + zh_Hans: Base URL, e.g. https://api.deepseek.com/v1 or https://api.deepseek.com + en_US: Base URL, e.g. https://api.deepseek.com/v1 or https://api.deepseek.com diff --git a/api/core/model_runtime/model_providers/deepseek/llm/deepseek-chat.yaml b/api/core/model_runtime/model_providers/deepseek/llm/deepseek-chat.yaml index a766a09a7b..3a5a63fa61 100644 --- a/api/core/model_runtime/model_providers/deepseek/llm/deepseek-chat.yaml +++ b/api/core/model_runtime/model_providers/deepseek/llm/deepseek-chat.yaml @@ -11,16 +11,54 @@ model_properties: parameter_rules: - name: temperature use_template: temperature - min: 0 - max: 1 - default: 0.5 - - name: top_p - use_template: top_p - min: 0 - max: 1 + type: float default: 1 + min: 0.0 + max: 2.0 + help: + zh_Hans: 控制生成结果的多样性和随机性。数值越小,越严谨;数值越大,越发散。 + en_US: Control the diversity and randomness of generated results. The smaller the value, the more rigorous it is; the larger the value, the more divergent it is. - name: max_tokens use_template: max_tokens + type: int + default: 4096 min: 1 max: 32000 - default: 1024 + help: + zh_Hans: 指定生成结果长度的上限。如果生成结果截断,可以调大该参数。 + en_US: Specifies the upper limit on the length of generated results. If the generated results are truncated, you can increase this parameter. + - name: top_p + use_template: top_p + type: float + default: 1 + min: 0.01 + max: 1.00 + help: + zh_Hans: 控制生成结果的随机性。数值越小,随机性越弱;数值越大,随机性越强。一般而言,top_p 和 temperature 两个参数选择一个进行调整即可。 + en_US: Control the randomness of generated results. The smaller the value, the weaker the randomness; the larger the value, the stronger the randomness. Generally speaking, you can adjust one of the two parameters top_p and temperature. + - name: logprobs + help: + zh_Hans: 是否返回所输出 token 的对数概率。如果为 true,则在 message 的 content 中返回每个输出 token 的对数概率。 + en_US: Whether to return the log probability of the output token. If true, returns the log probability of each output token in the content of message . + type: boolean + - name: top_logprobs + type: int + default: 0 + min: 0 + max: 20 + help: + zh_Hans: 一个介于 0 到 20 之间的整数 N,指定每个输出位置返回输出概率 top N 的 token,且返回这些 token 的对数概率。指定此参数时,logprobs 必须为 true。 + en_US: An integer N between 0 and 20, specifying that each output position returns the top N tokens with output probability, and returns the logarithmic probability of these tokens. When specifying this parameter, logprobs must be true. + - name: frequency_penalty + use_template: frequency_penalty + default: 0 + min: -2.0 + max: 2.0 + help: + zh_Hans: 介于 -2.0 和 2.0 之间的数字。如果该值为正,那么新 token 会根据其在已有文本中的出现频率受到相应的惩罚,降低模型重复相同内容的可能性。 + en_US: A number between -2.0 and 2.0. If the value is positive, new tokens are penalized based on their frequency of occurrence in existing text, reducing the likelihood that the model will repeat the same content. +pricing: + input: '1' + output: '2' + unit: '0.000001' + currency: RMB diff --git a/api/core/model_runtime/model_providers/deepseek/llm/llm.py b/api/core/model_runtime/model_providers/deepseek/llm/llm.py index 4d20a07447..bdb3823b60 100644 --- a/api/core/model_runtime/model_providers/deepseek/llm/llm.py +++ b/api/core/model_runtime/model_providers/deepseek/llm/llm.py @@ -1,18 +1,24 @@ from collections.abc import Generator from typing import Optional, Union +from urllib.parse import urlparse + +import tiktoken from core.model_runtime.entities.llm_entities import LLMResult -from core.model_runtime.entities.message_entities import PromptMessage, PromptMessageTool -from core.model_runtime.model_providers.openai_api_compatible.llm.llm import OAIAPICompatLargeLanguageModel +from core.model_runtime.entities.message_entities import ( + PromptMessage, + PromptMessageTool, +) +from core.model_runtime.model_providers.openai.llm.llm import OpenAILargeLanguageModel -class DeepseekLargeLanguageModel(OAIAPICompatLargeLanguageModel): +class DeepSeekLargeLanguageModel(OpenAILargeLanguageModel): + def _invoke(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], model_parameters: dict, tools: Optional[list[PromptMessageTool]] = None, stop: Optional[list[str]] = None, stream: bool = True, user: Optional[str] = None) \ -> Union[LLMResult, Generator]: - self._add_custom_parameters(credentials) return super()._invoke(model, credentials, prompt_messages, model_parameters, tools, stop, stream, user) @@ -21,7 +27,87 @@ class DeepseekLargeLanguageModel(OAIAPICompatLargeLanguageModel): self._add_custom_parameters(credentials) super().validate_credentials(model, credentials) + + # refactored from openai model runtime, use cl100k_base for calculate token number + def _num_tokens_from_string(self, model: str, text: str, + tools: Optional[list[PromptMessageTool]] = None) -> int: + """ + Calculate num tokens for text completion model with tiktoken package. + + :param model: model name + :param text: prompt text + :param tools: tools for tool calling + :return: number of tokens + """ + encoding = tiktoken.get_encoding("cl100k_base") + num_tokens = len(encoding.encode(text)) + + if tools: + num_tokens += self._num_tokens_for_tools(encoding, tools) + + return num_tokens + + # refactored from openai model runtime, use cl100k_base for calculate token number + def _num_tokens_from_messages(self, model: str, messages: list[PromptMessage], + tools: Optional[list[PromptMessageTool]] = None) -> int: + """Calculate num tokens for gpt-3.5-turbo and gpt-4 with tiktoken package. + + Official documentation: https://github.com/openai/openai-cookbook/blob/ + main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb""" + encoding = tiktoken.get_encoding("cl100k_base") + tokens_per_message = 3 + tokens_per_name = 1 + + num_tokens = 0 + messages_dict = [self._convert_prompt_message_to_dict(m) for m in messages] + for message in messages_dict: + num_tokens += tokens_per_message + for key, value in message.items(): + # Cast str(value) in case the message value is not a string + # This occurs with function messages + # TODO: The current token calculation method for the image type is not implemented, + # which need to download the image and then get the resolution for calculation, + # and will increase the request delay + if isinstance(value, list): + text = '' + for item in value: + if isinstance(item, dict) and item['type'] == 'text': + text += item['text'] + + value = text + + if key == "tool_calls": + for tool_call in value: + for t_key, t_value in tool_call.items(): + num_tokens += len(encoding.encode(t_key)) + if t_key == "function": + for f_key, f_value in t_value.items(): + num_tokens += len(encoding.encode(f_key)) + num_tokens += len(encoding.encode(f_value)) + else: + num_tokens += len(encoding.encode(t_key)) + num_tokens += len(encoding.encode(t_value)) + else: + num_tokens += len(encoding.encode(str(value))) + + if key == "name": + num_tokens += tokens_per_name + + # every reply is primed with assistant + num_tokens += 3 + + if tools: + num_tokens += self._num_tokens_for_tools(encoding, tools) + + return num_tokens + @staticmethod def _add_custom_parameters(credentials: dict) -> None: credentials['mode'] = 'chat' - credentials['endpoint_url'] = 'https://api.deepseek.com/' + credentials['openai_api_key']=credentials['api_key'] + if 'endpoint_url' not in credentials or credentials['endpoint_url'] == "": + credentials['openai_api_base']='https://api.deepseek.com' + else: + parsed_url = urlparse(credentials['endpoint_url']) + credentials['openai_api_base']=f"{parsed_url.scheme}://{parsed_url.netloc}" +