mirror of https://github.com/jumpserver/jumpserver
perf: DeepSeek
parent
b35a55ed54
commit
d8db76cc7b
|
@ -681,10 +681,12 @@ class Config(dict):
|
||||||
|
|
||||||
# Chat AI
|
# Chat AI
|
||||||
'CHAT_AI_ENABLED': False,
|
'CHAT_AI_ENABLED': False,
|
||||||
|
'CHAT_AI_TYPE': 'gpt',
|
||||||
'GPT_API_KEY': '',
|
'GPT_API_KEY': '',
|
||||||
'GPT_BASE_URL': '',
|
'GPT_BASE_URL': '',
|
||||||
'GPT_PROXY': '',
|
'GPT_PROXY': '',
|
||||||
'GPT_MODEL': 'gpt-3.5-turbo',
|
'GPT_MODEL': 'gpt-4o-mini',
|
||||||
|
'DEEPSEEK_MODEL': 'deepseek-chat',
|
||||||
'VIRTUAL_APP_ENABLED': False,
|
'VIRTUAL_APP_ENABLED': False,
|
||||||
|
|
||||||
'FILE_UPLOAD_SIZE_LIMIT_MB': 200,
|
'FILE_UPLOAD_SIZE_LIMIT_MB': 200,
|
||||||
|
|
|
@ -226,6 +226,8 @@ GPT_API_KEY = CONFIG.GPT_API_KEY
|
||||||
GPT_BASE_URL = CONFIG.GPT_BASE_URL
|
GPT_BASE_URL = CONFIG.GPT_BASE_URL
|
||||||
GPT_PROXY = CONFIG.GPT_PROXY
|
GPT_PROXY = CONFIG.GPT_PROXY
|
||||||
GPT_MODEL = CONFIG.GPT_MODEL
|
GPT_MODEL = CONFIG.GPT_MODEL
|
||||||
|
CHAT_AI_TYPE = CONFIG.CHAT_AI_TYPE
|
||||||
|
DEEPSEEK_MODEL = CONFIG.DEEPSEEK_MODEL
|
||||||
|
|
||||||
VIRTUAL_APP_ENABLED = CONFIG.VIRTUAL_APP_ENABLED
|
VIRTUAL_APP_ENABLED = CONFIG.VIRTUAL_APP_ENABLED
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ from rest_framework.response import Response
|
||||||
from common.api import JMSModelViewSet
|
from common.api import JMSModelViewSet
|
||||||
from common.permissions import IsValidUser, OnlySuperUser
|
from common.permissions import IsValidUser, OnlySuperUser
|
||||||
from .. import serializers
|
from .. import serializers
|
||||||
|
from ..const import ChatAITypeChoices
|
||||||
from ..models import ChatPrompt
|
from ..models import ChatPrompt
|
||||||
from ..prompt import DefaultChatPrompt
|
from ..prompt import DefaultChatPrompt
|
||||||
|
|
||||||
|
@ -41,7 +42,11 @@ class ChatAITestingAPI(GenericAPIView):
|
||||||
)
|
)
|
||||||
|
|
||||||
proxy = config['GPT_PROXY']
|
proxy = config['GPT_PROXY']
|
||||||
|
tp = config['CHAT_AI_TYPE']
|
||||||
|
if tp == ChatAITypeChoices.gpt:
|
||||||
model = config['GPT_MODEL']
|
model = config['GPT_MODEL']
|
||||||
|
else:
|
||||||
|
model = config['DEEPSEEK_MODEL']
|
||||||
|
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'base_url': config['GPT_BASE_URL'] or None,
|
'base_url': config['GPT_BASE_URL'] or None,
|
||||||
|
|
|
@ -5,3 +5,21 @@ class ImportStatus(TextChoices):
|
||||||
ok = 'ok', 'Ok'
|
ok = 'ok', 'Ok'
|
||||||
pending = 'pending', 'Pending'
|
pending = 'pending', 'Pending'
|
||||||
error = 'error', 'Error'
|
error = 'error', 'Error'
|
||||||
|
|
||||||
|
|
||||||
|
class ChatAITypeChoices(TextChoices):
|
||||||
|
gpt = 'gpt', 'GPT'
|
||||||
|
deep_seek = 'deep-seek', 'DeepSeek'
|
||||||
|
|
||||||
|
|
||||||
|
class GPTModelChoices(TextChoices):
|
||||||
|
gpt_4o_mini = 'gpt-4o-mini', 'gpt-4o-mini'
|
||||||
|
gpt_4o = 'gpt-4o', 'gpt-4o'
|
||||||
|
o3_mini = 'o3-mini', 'o3-mini'
|
||||||
|
o1_mini = 'o1-mini', 'o1-mini'
|
||||||
|
o1 = 'o1', 'o1'
|
||||||
|
|
||||||
|
|
||||||
|
class DeepSeekModelChoices(TextChoices):
|
||||||
|
deepseek_chat = 'deepseek-chat', 'DeepSeek-V3'
|
||||||
|
deepseek_reasoner = 'deepseek-reasoner', 'DeepSeek-R1'
|
||||||
|
|
|
@ -10,8 +10,9 @@ from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework.utils.encoders import JSONEncoder
|
from rest_framework.utils.encoders import JSONEncoder
|
||||||
|
|
||||||
from common.db.models import JMSBaseModel
|
from common.db.models import JMSBaseModel
|
||||||
from common.utils import get_logger
|
|
||||||
from common.db.utils import Encryptor
|
from common.db.utils import Encryptor
|
||||||
|
from common.utils import get_logger
|
||||||
|
from .const import ChatAITypeChoices
|
||||||
from .signals import setting_changed
|
from .signals import setting_changed
|
||||||
|
|
||||||
logger = get_logger(__name__)
|
logger = get_logger(__name__)
|
||||||
|
@ -191,3 +192,9 @@ class ChatPrompt(JMSBaseModel):
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
def get_chatai_model():
|
||||||
|
if settings.CHAT_AI_TYPE == ChatAITypeChoices.gpt:
|
||||||
|
return settings.GPT_MODEL
|
||||||
|
return settings.DEEPSEEK_MODEL
|
||||||
|
|
|
@ -4,7 +4,6 @@ from django.utils import timezone
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from assets.const import Protocol
|
|
||||||
from common.serializers.fields import EncryptedField
|
from common.serializers.fields import EncryptedField
|
||||||
from common.utils import date_expired_default
|
from common.utils import date_expired_default
|
||||||
|
|
||||||
|
@ -14,6 +13,8 @@ __all__ = [
|
||||||
'ChatAISettingSerializer', 'VirtualAppSerializer', 'AmazonSMSerializer',
|
'ChatAISettingSerializer', 'VirtualAppSerializer', 'AmazonSMSerializer',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
from settings.const import ChatAITypeChoices, GPTModelChoices, DeepSeekModelChoices
|
||||||
|
|
||||||
|
|
||||||
class AnnouncementSerializer(serializers.Serializer):
|
class AnnouncementSerializer(serializers.Serializer):
|
||||||
ID = serializers.CharField(required=False, allow_blank=True, allow_null=True)
|
ID = serializers.CharField(required=False, allow_blank=True, allow_null=True)
|
||||||
|
@ -119,16 +120,17 @@ class AmazonSMSerializer(serializers.Serializer):
|
||||||
|
|
||||||
class ChatAISettingSerializer(serializers.Serializer):
|
class ChatAISettingSerializer(serializers.Serializer):
|
||||||
PREFIX_TITLE = _('Chat AI')
|
PREFIX_TITLE = _('Chat AI')
|
||||||
API_MODEL = Protocol.gpt_protocols()[Protocol.chatgpt]['setting']['api_mode']
|
|
||||||
GPT_MODEL_CHOICES = API_MODEL['choices']
|
|
||||||
GPT_MODEL_DEFAULT = API_MODEL['default']
|
|
||||||
|
|
||||||
CHAT_AI_ENABLED = serializers.BooleanField(
|
CHAT_AI_ENABLED = serializers.BooleanField(
|
||||||
required=False, label=_('Chat AI')
|
required=False, label=_('Chat AI')
|
||||||
)
|
)
|
||||||
|
CHAT_AI_TYPE = serializers.ChoiceField(
|
||||||
|
default=ChatAITypeChoices.gpt, choices=ChatAITypeChoices.choices,
|
||||||
|
label=_("Chat AI type"), required=False,
|
||||||
|
)
|
||||||
GPT_BASE_URL = serializers.CharField(
|
GPT_BASE_URL = serializers.CharField(
|
||||||
allow_blank=True, required=False, label=_('GPT Base URL'),
|
allow_blank=True, required=False, label=_('Base URL'),
|
||||||
help_text=_('The base URL of the GPT service. For example: https://api.openai.com/v1')
|
help_text=_('The base URL of the Chat service.')
|
||||||
)
|
)
|
||||||
GPT_API_KEY = EncryptedField(
|
GPT_API_KEY = EncryptedField(
|
||||||
allow_blank=True, required=False, label=_('API Key'),
|
allow_blank=True, required=False, label=_('API Key'),
|
||||||
|
@ -138,7 +140,12 @@ class ChatAISettingSerializer(serializers.Serializer):
|
||||||
help_text=_('The proxy server address of the GPT service. For example: http://ip:port')
|
help_text=_('The proxy server address of the GPT service. For example: http://ip:port')
|
||||||
)
|
)
|
||||||
GPT_MODEL = serializers.ChoiceField(
|
GPT_MODEL = serializers.ChoiceField(
|
||||||
default=GPT_MODEL_DEFAULT, choices=GPT_MODEL_CHOICES, label=_("GPT Model"), required=False,
|
default=GPTModelChoices.gpt_4o_mini, choices=GPTModelChoices.choices,
|
||||||
|
label=_("GPT Model"), required=False,
|
||||||
|
)
|
||||||
|
DEEPSEEK_MODEL = serializers.ChoiceField(
|
||||||
|
default=DeepSeekModelChoices.deepseek_chat, choices=DeepSeekModelChoices.choices,
|
||||||
|
label=_("DeepSeek Model"), required=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ class PrivateSettingSerializer(PublicSettingSerializer):
|
||||||
VAULT_ENABLED = serializers.BooleanField()
|
VAULT_ENABLED = serializers.BooleanField()
|
||||||
VIRTUAL_APP_ENABLED = serializers.BooleanField()
|
VIRTUAL_APP_ENABLED = serializers.BooleanField()
|
||||||
CHAT_AI_ENABLED = serializers.BooleanField()
|
CHAT_AI_ENABLED = serializers.BooleanField()
|
||||||
|
CHAT_AI_TYPE = serializers.CharField()
|
||||||
GPT_MODEL = serializers.CharField()
|
GPT_MODEL = serializers.CharField()
|
||||||
FILE_UPLOAD_SIZE_LIMIT_MB = serializers.IntegerField()
|
FILE_UPLOAD_SIZE_LIMIT_MB = serializers.IntegerField()
|
||||||
FTP_FILE_MAX_STORE = serializers.IntegerField()
|
FTP_FILE_MAX_STORE = serializers.IntegerField()
|
||||||
|
|
|
@ -9,6 +9,7 @@ from common.const.signals import OP_LOG_SKIP_SIGNAL
|
||||||
from common.db.models import JMSBaseModel
|
from common.db.models import JMSBaseModel
|
||||||
from common.utils import get_logger, lazyproperty
|
from common.utils import get_logger, lazyproperty
|
||||||
from orgs.utils import tmp_to_root_org
|
from orgs.utils import tmp_to_root_org
|
||||||
|
from settings.models import get_chatai_model
|
||||||
from terminal.const import TerminalType as TypeChoices
|
from terminal.const import TerminalType as TypeChoices
|
||||||
from users.models import User
|
from users.models import User
|
||||||
from .status import Status
|
from .status import Status
|
||||||
|
@ -124,7 +125,7 @@ class Terminal(StorageMixin, TerminalStatusMixin, JMSBaseModel):
|
||||||
'GPT_BASE_URL': settings.GPT_BASE_URL,
|
'GPT_BASE_URL': settings.GPT_BASE_URL,
|
||||||
'GPT_API_KEY': settings.GPT_API_KEY,
|
'GPT_API_KEY': settings.GPT_API_KEY,
|
||||||
'GPT_PROXY': settings.GPT_PROXY,
|
'GPT_PROXY': settings.GPT_PROXY,
|
||||||
'GPT_MODEL': settings.GPT_MODEL,
|
'GPT_MODEL': get_chatai_model(),
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
@ -10,7 +10,6 @@ from common.utils import get_object_or_none
|
||||||
from orgs.utils import tmp_to_root_org
|
from orgs.utils import tmp_to_root_org
|
||||||
from users.notifications import (
|
from users.notifications import (
|
||||||
ResetPasswordMsg, ResetPasswordSuccessMsg, ResetSSHKeyMsg,
|
ResetPasswordMsg, ResetPasswordSuccessMsg, ResetSSHKeyMsg,
|
||||||
ResetPublicKeySuccessMsg,
|
|
||||||
)
|
)
|
||||||
from .mixins import UserQuerysetMixin
|
from .mixins import UserQuerysetMixin
|
||||||
from .. import serializers
|
from .. import serializers
|
||||||
|
|
Loading…
Reference in New Issue