mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-17 11:07:11 +08:00
Rework the multi custom-provider design per maintainer review: 1. Data model: use server-generated uuid4 short id as primary key; 'name' is now a pure display label that can be freely renamed. 2. Routing: drop 'custom_active_provider'; activate a provider by setting bot_type to 'custom:<id>'. Single source of truth — no pointer drift between bot_type and a separate active selector. 3. Security: drag_sensitive() now recursively masks api_key/secret in nested structures (custom_providers list); previously only top-level string fields were masked. 4. Per-provider model: the provider's 'model' field now takes effect on the main chat path and agent path (was silently ignored before). 5. XSS fix: replace all inline onclick handlers in custom-provider UI with data-* attributes + event delegation. Provider names never appear in executable HTML contexts. Legacy compatibility: bot_type='custom' (no colon) still reads the flat custom_api_key/custom_api_base fields byte-for-byte identically. Closes: consolidates #2876 into this PR as requested. Ref: #2838
85 lines
2.8 KiB
Python
85 lines
2.8 KiB
Python
"""
|
|
channel factory
|
|
"""
|
|
from common import const
|
|
|
|
|
|
def create_bot(bot_type):
|
|
"""
|
|
create a bot_type instance
|
|
:param bot_type: bot type code
|
|
:return: bot instance
|
|
"""
|
|
if bot_type == const.BAIDU:
|
|
# 替换Baidu Unit为Baidu文心千帆对话接口
|
|
# from models.baidu.baidu_unit_bot import BaiduUnitBot
|
|
# return BaiduUnitBot()
|
|
from models.baidu.baidu_wenxin import BaiduWenxinBot
|
|
return BaiduWenxinBot()
|
|
|
|
elif bot_type == const.DEEPSEEK:
|
|
from models.deepseek.deepseek_bot import DeepSeekBot
|
|
return DeepSeekBot()
|
|
|
|
elif bot_type == const.QIANFAN:
|
|
from models.qianfan.qianfan_bot import QianfanBot
|
|
return QianfanBot()
|
|
|
|
elif bot_type == const.MIMO:
|
|
from models.mimo.mimo_bot import MimoBot
|
|
return MimoBot()
|
|
|
|
elif bot_type in (const.OPENAI, const.CHATGPT, const.CUSTOM) or bot_type.startswith("custom:"): # OpenAI-compatible API
|
|
from models.chatgpt.chat_gpt_bot import ChatGPTBot
|
|
return ChatGPTBot()
|
|
|
|
elif bot_type == const.OPEN_AI:
|
|
# OpenAI 官方对话模型API
|
|
from models.openai.open_ai_bot import OpenAIBot
|
|
return OpenAIBot()
|
|
|
|
elif bot_type == const.CHATGPTONAZURE:
|
|
# Azure chatgpt service https://azure.microsoft.com/en-in/products/cognitive-services/openai-service/
|
|
from models.chatgpt.chat_gpt_bot import AzureChatGPTBot
|
|
return AzureChatGPTBot()
|
|
|
|
elif bot_type == const.XUNFEI:
|
|
from models.xunfei.xunfei_spark_bot import XunFeiBot
|
|
return XunFeiBot()
|
|
|
|
elif bot_type == const.LINKAI:
|
|
from models.linkai.link_ai_bot import LinkAIBot
|
|
return LinkAIBot()
|
|
|
|
elif bot_type == const.CLAUDEAPI:
|
|
from models.claudeapi.claude_api_bot import ClaudeAPIBot
|
|
return ClaudeAPIBot()
|
|
elif bot_type in (const.QWEN, const.QWEN_DASHSCOPE):
|
|
from models.dashscope.dashscope_bot import DashscopeBot
|
|
return DashscopeBot()
|
|
elif bot_type == const.GEMINI:
|
|
from models.gemini.google_gemini_bot import GoogleGeminiBot
|
|
return GoogleGeminiBot()
|
|
|
|
elif bot_type == const.ZHIPU_AI or bot_type == "glm-4": # "glm-4" kept for backward compatibility
|
|
from models.zhipuai.zhipuai_bot import ZHIPUAIBot
|
|
return ZHIPUAIBot()
|
|
|
|
elif bot_type == const.MOONSHOT:
|
|
from models.moonshot.moonshot_bot import MoonshotBot
|
|
return MoonshotBot()
|
|
|
|
elif bot_type == const.MiniMax:
|
|
from models.minimax.minimax_bot import MinimaxBot
|
|
return MinimaxBot()
|
|
|
|
elif bot_type == const.MODELSCOPE:
|
|
from models.modelscope.modelscope_bot import ModelScopeBot
|
|
return ModelScopeBot()
|
|
|
|
elif bot_type == const.DOUBAO:
|
|
from models.doubao.doubao_bot import DoubaoBot
|
|
return DoubaoBot()
|
|
|
|
raise RuntimeError
|