diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index d25136389..33a9fea91 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -264,7 +264,6 @@ "ChangeViewHelpText": "Click to switch different views", "Chat": "Chat", "ChatAI": "Chat AI", - "ChatAITypeHelpText": "Only used for page switching. After switching the type, you need to update the following properties to take effect.", "ChatHello": "Hello, can I help you?", "ChdirHelpText": "By default, the execution directory is the user's home directory", "CheckAssetsAmount": "Check asset quantity", diff --git a/apps/i18n/lina/ja.json b/apps/i18n/lina/ja.json index 1fa66c6c2..608f7ca66 100644 --- a/apps/i18n/lina/ja.json +++ b/apps/i18n/lina/ja.json @@ -278,7 +278,6 @@ "ChangeViewHelpText": "クリックして異なるビューを切り替え", "Chat": "チャット", "ChatAI": "スマートアンサー", - "ChatAITypeHelpText": "ページ切り替え専用で、切り替えタイプを変更した後は、下の属性を更新する必要があります。", "ChatHello": "こんにちは!お手伝いできることがあれば何でもお申し付けください。", "ChdirHelpText": "デフォルトの実行ディレクトリは実行ユーザーのホームディレクトリです", "CheckAssetsAmount": "資産の数量を確認", diff --git a/apps/i18n/lina/pt_br.json b/apps/i18n/lina/pt_br.json index d9bb0ef9c..c939beee0 100644 --- a/apps/i18n/lina/pt_br.json +++ b/apps/i18n/lina/pt_br.json @@ -264,7 +264,6 @@ "ChangeViewHelpText": "Clique para alternar diferentes pontos de vista", "Chat": "Chat", "ChatAI": "Resposta inteligente", - "ChatAITypeHelpText": "Utilizado apenas para a troca de página. Após alterar o tipo, é necessário atualizar os atributos abaixo para que a mudança tenha efeito.", "ChatHello": "Olá! Como posso ajudá-lo? ", "ChdirHelpText": "O diretório de execução padrão é o diretório home do usuário de execução", "CheckAssetsAmount": "Verificar Quantidade de Ativos", diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index b51c9a491..68d75366e 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -264,7 +264,6 @@ "ChangeViewHelpText": "点击切换不同视图", "Chat": "聊天", "ChatAI": "智能问答", - "ChatAITypeHelpText": "仅用于页面切换,切换类型后需更新下方属性才能生效。", "ChatHello": "你好!我能为你提供什么帮助?", "ChdirHelpText": "默认执行目录为执行用户的 home 目录", "CheckAssetsAmount": "校对资产数量", diff --git a/apps/i18n/lina/zh_hant.json b/apps/i18n/lina/zh_hant.json index 420027e6c..ff186de9f 100644 --- a/apps/i18n/lina/zh_hant.json +++ b/apps/i18n/lina/zh_hant.json @@ -351,7 +351,6 @@ "Charset": "字元集", "Chat": "聊天", "ChatAI": "智慧問答", - "ChatAITypeHelpText": "僅用於頁面切換,切換類型後需更新下方屬性方能生效。", "ChatHello": "你好!我能為你提供什麼幫助?", "ChdirHelpText": "默認執行目錄為執行用戶的 home 目錄", "CheckAssetsAmount": "校對資產數量", diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 452b809d9..0471bcd9d 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -682,10 +682,13 @@ class Config(dict): # Chat AI 'CHAT_AI_ENABLED': False, 'CHAT_AI_TYPE': 'gpt', - 'GPT_API_KEY': '', 'GPT_BASE_URL': '', + 'GPT_API_KEY': '', 'GPT_PROXY': '', 'GPT_MODEL': 'gpt-4o-mini', + 'DEEPSEEK_BASE_URL': '', + 'DEEPSEEK_API_KEY': '', + 'DEEPSEEK_PROXY': '', 'DEEPSEEK_MODEL': 'deepseek-chat', 'VIRTUAL_APP_ENABLED': False, diff --git a/apps/jumpserver/settings/custom.py b/apps/jumpserver/settings/custom.py index f02eb1cb6..f0ff095b1 100644 --- a/apps/jumpserver/settings/custom.py +++ b/apps/jumpserver/settings/custom.py @@ -222,11 +222,14 @@ ASSET_SIZE = 'small' # Chat AI CHAT_AI_ENABLED = CONFIG.CHAT_AI_ENABLED -GPT_API_KEY = CONFIG.GPT_API_KEY +CHAT_AI_TYPE = CONFIG.CHAT_AI_TYPE GPT_BASE_URL = CONFIG.GPT_BASE_URL +GPT_API_KEY = CONFIG.GPT_API_KEY GPT_PROXY = CONFIG.GPT_PROXY GPT_MODEL = CONFIG.GPT_MODEL -CHAT_AI_TYPE = CONFIG.CHAT_AI_TYPE +DEEPSEEK_BASE_URL = CONFIG.DEEPSEEK_BASE_URL +DEEPSEEK_API_KEY = CONFIG.DEEPSEEK_API_KEY +DEEPSEEK_PROXY = CONFIG.DEEPSEEK_PROXY DEEPSEEK_MODEL = CONFIG.DEEPSEEK_MODEL VIRTUAL_APP_ENABLED = CONFIG.VIRTUAL_APP_ENABLED diff --git a/apps/settings/api/chat.py b/apps/settings/api/chat.py index 0d5135999..6a0e12020 100644 --- a/apps/settings/api/chat.py +++ b/apps/settings/api/chat.py @@ -41,16 +41,21 @@ class ChatAITestingAPI(GenericAPIView): data={'msg': _('Chat AI is not enabled')} ) - proxy = config['GPT_PROXY'] tp = config['CHAT_AI_TYPE'] if tp == ChatAITypeChoices.gpt: + url = config['GPT_BASE_URL'] + api_key = config['GPT_API_KEY'] + proxy = config['GPT_PROXY'] model = config['GPT_MODEL'] else: + url = config['DEEPSEEK_BASE_URL'] + api_key = config['DEEPSEEK_API_KEY'] + proxy = config['DEEPSEEK_PROXY'] model = config['DEEPSEEK_MODEL'] kwargs = { - 'base_url': config['GPT_BASE_URL'] or None, - 'api_key': config['GPT_API_KEY'], + 'base_url': url or None, + 'api_key': api_key, } try: if proxy: diff --git a/apps/settings/models.py b/apps/settings/models.py index 9c0a4053c..32a6f5f4d 100644 --- a/apps/settings/models.py +++ b/apps/settings/models.py @@ -194,7 +194,17 @@ class ChatPrompt(JMSBaseModel): return self.name -def get_chatai_model(): - if settings.CHAT_AI_TYPE == ChatAITypeChoices.gpt: - return settings.GPT_MODEL - return settings.DEEPSEEK_MODEL +def get_chatai_data(): + data = { + 'url': settings.GPT_BASE_URL, + 'api_key': settings.GPT_API_KEY, + 'proxy': settings.GPT_PROXY, + 'model': settings.GPT_MODEL, + } + if settings.CHAT_AI_TYPE != ChatAITypeChoices.gpt: + data['url'] = settings.DEEPSEEK_BASE_URL + data['api_key'] = settings.DEEPSEEK_API_KEY + data['proxy'] = settings.DEEPSEEK_PROXY + data['model'] = settings.DEEPSEEK_MODEL + + return data diff --git a/apps/settings/serializers/feature.py b/apps/settings/serializers/feature.py index 7d7ac0d0a..e2b838eee 100644 --- a/apps/settings/serializers/feature.py +++ b/apps/settings/serializers/feature.py @@ -143,6 +143,17 @@ class ChatAISettingSerializer(serializers.Serializer): default=GPTModelChoices.gpt_4o_mini, choices=GPTModelChoices.choices, label=_("GPT Model"), required=False, ) + DEEPSEEK_BASE_URL = serializers.CharField( + allow_blank=True, required=False, label=_('Base URL'), + help_text=_('The base URL of the Chat service.') + ) + DEEPSEEK_API_KEY = EncryptedField( + allow_blank=True, required=False, label=_('API Key'), + ) + DEEPSEEK_PROXY = serializers.CharField( + allow_blank=True, required=False, label=_('Proxy'), + help_text=_('The proxy server address of the GPT service. For example: http://ip:port') + ) DEEPSEEK_MODEL = serializers.ChoiceField( default=DeepSeekModelChoices.deepseek_chat, choices=DeepSeekModelChoices.choices, label=_("DeepSeek Model"), required=False, diff --git a/apps/terminal/models/component/terminal.py b/apps/terminal/models/component/terminal.py index 01ad3f8d8..a9c500644 100644 --- a/apps/terminal/models/component/terminal.py +++ b/apps/terminal/models/component/terminal.py @@ -9,7 +9,7 @@ from common.const.signals import OP_LOG_SKIP_SIGNAL from common.db.models import JMSBaseModel from common.utils import get_logger, lazyproperty from orgs.utils import tmp_to_root_org -from settings.models import get_chatai_model +from settings.models import get_chatai_data from terminal.const import TerminalType as TypeChoices from users.models import User from .status import Status @@ -121,11 +121,12 @@ class Terminal(StorageMixin, TerminalStatusMixin, JMSBaseModel): @staticmethod def get_chat_ai_setting(): + data = get_chatai_data() return { - 'GPT_BASE_URL': settings.GPT_BASE_URL, - 'GPT_API_KEY': settings.GPT_API_KEY, - 'GPT_PROXY': settings.GPT_PROXY, - 'GPT_MODEL': get_chatai_model(), + 'GPT_BASE_URL': data['url'], + 'GPT_API_KEY': data['api_key'], + 'GPT_PROXY': data['proxy'], + 'GPT_MODEL': data['model'], } @staticmethod