Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/alpaca4610_nonebot-plugin-xinghuo-api.json

1 line
7.7 KiB
JSON

{"repo": "alpaca4610/nonebot-plugin-xinghuo-api", "files": {"nonebot_plugin_xinghuo_api/__init__.py": {"cfc0756a004be5d5ee5c3c18d5ca592def43ae45": {"t": 1785768233.3742423, "n": 6505, "h": "18334afbaf718aea", "c": "import nonebot\r\nimport asyncio\r\n\r\nfrom sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler\r\nfrom sparkai.core.messages import ChatMessage\r\n\r\nfrom nonebot import on_command\r\nfrom nonebot.params import CommandArg\r\nfrom nonebot.adapters.onebot.v11 import Message, MessageSegment\r\nfrom nonebot.adapters.onebot.v11 import PrivateMessageEvent, MessageEvent\r\nfrom nonebot.plugin import PluginMetadata\r\n# from nonebot.rule import to_me\r\nfrom nonebot.log import logger\r\nfrom .config import Config, ConfigError\r\n\r\n\r\n__plugin_meta__ = PluginMetadata(\r\n name=\"科大讯飞星火大模型聊天\",\r\n description=\"Nonebot框架下的科大讯飞星火大模型聊天插件,已适配V2.0版API\",\r\n usage=\"\"\"\r\n xh 获取回复,没有上下文回复的能力\r\n XH 获取回复,具有上下文回复的能力\r\n xh_clear 清除当前用户的聊天记录\r\n \"\"\",\r\n config=Config,\r\n extra={},\r\n type=\"application\",\r\n homepage=\"https://github.com/Alpaca4610/nonebot-plugin-xinghuo-api\",\r\n supported_adapters={\"~onebot.v11\"},\r\n)\r\n\r\n\r\ndef get_spark_model_info(model_version):\r\n model_info = {\r\n \"Ultra\": {\"wss\": \"wss://spark-api.xf-yun.com/v4.0/chat\", \"domain\": \"4.0Ultra\"},\r\n \"Max\": {\"wss\": \"wss://spark-api.xf-yun.com/v3.5/chat\", \"domain\": \"generalv3.5\"},\r\n \"Pro-128K\": {\r\n \"wss\": \"wss://spark-api.xf-yun.com/chat/pro-128k\",\r\n \"domain\": \"pro-128k\",\r\n },\r\n \"Pro\": {\"wss\": \"wss://spark-api.xf-yun.com/v3.1/chat\", \"domain\": \"generalv3\"},\r\n \"V2.0\": {\"wss\": \"wss://spark-api.xf-yun.com/v2.1/chat\", \"domain\": \"generalv2\"},\r\n \"Lite\": {\"wss\": \"wss://spark-api.xf-yun.com/v1.1/chat\", \"domain\": \"general\"},\r\n }\r\n\r\n try:\r\n info = model_info[model_version]\r\n wss = info[\"wss\"]\r\n domain = info[\"domain\"]\r\n return wss, domain\r\n except KeyError:\r\n info = model_info[\"Lite\"]\r\n logger.info(f\"错误:未找到模型 '{model_version}',默认使用Lite模型\")\r\n return info[\"wss\"], info[\"domain\"]\r\n\r\n\r\n# 配置导入\r\nplugin_config = Config.parse_obj(nonebot.get_driver().config.dict())\r\n\r\nif (\r\n not plugin_config.xinghuo_app_id\r\n or not plugin_config.xinghuo_app_id\r\n or not plugin_config.xinghuo_api_key\r\n):\r\n raise ConfigError(\"请设置星火大模型API信息\")\r\n\r\nappid = plugin_config.xinghuo_app_id\r\napi_secret = plugin_config.xinghuo_api_secret\r\napi_key = plugin_config.xinghuo_api_key\r\n\r\nsys_prompt = plugin_config.xinghuo_api_prompt\r\n\r\nAPI_URL, domain = get_spark_model_info(plugin_config.xinghuo_api_version)\r\n\r\npublic = plugin_config.xinghuo_group_public\r\nsession = {}\r\n\r\n# 带上下文的聊天\r\nchat_record = on_command(\"XH\", block=False, priority=1)\r\n\r\n# 不带上下文的聊天\r\nchat_request = on_command(\"xh\", block=False, priority=1)\r\n\r\n# 清除历史记录\r\nclear_request = on_command(\"xh_clear\", block=True, priority=1)\r\n\r\n\r\n# 带记忆的聊天\r\n@chat_record.handle()\r\nasync def _(event: MessageEvent, msg: Message = CommandArg()):\r\n # 若未开启私聊模式则检测到私聊就结束\r\n if (\r\n isinstance(event, PrivateMessageEvent)\r\n and not plugin_config.xinghuo_enable_private_chat\r\n ):\r\n chat_record.finish(\"对不起,私聊暂不支持此功能。\")\r\n\r\n # 检测是否填写 API key\r\n if appid == \"\" or api_secret == \"\" or api_key == \"\":\r\n await chat_record.finish(\r\n MessageSegment.text(\"请先配置星火大模型API信息\"), at_sender=True\r\n )\r\n\r\n # 提取提问内容\r\n content = msg.extract_plain_text()\r\n if content == \"\" or content is None:\r\n await chat_record.finish(MessageSegment.text(\"内容不能为空!\"), at_sender=True)\r\n\r\n await chat_record.send(MessageSegment.text(\"星火大模型正在思考中......\"))\r\n\r\n # 创建会话ID\r\n session_id = create_session_id(event)\r\n\r\n # 初始化保存空间\r\n if session_id not in session:\r\n if sys_prompt:\r\n session[session_id] = [ChatMessage(role=\"system\", content=sys_prompt),ChatMessage(role=\"user\", content=content)]\r\n else:\r\n session[session_id] = [ChatMessage(role=\"user\", content=content)]\r\n else:\r\n session[session_id].append(ChatMessage(role=\"user\", content=content))\r\n\r\n # 开始请求\r\n try:\r\n loop = asyncio.get_event_loop()\r\n res = await loop.run_in_executor(\r\n None,\r\n getRes,\r\n API_URL,\r\n appid,\r\n api_key,\r\n api_secret,\r\n domain,\r\n session[session_id],\r\n )\r\n except Exception as error:\r\n await chat_record.finish(str(error), at_sender=True)\r\n await chat_record.finish(MessageSegment.text(res), at_sender=True)\r\n\r\n\r\n# 不带记忆的对话\r\n@chat_request.handle()\r\nasync def _(event: MessageEvent, msg: Message = CommandArg()):\r\n if (\r\n isinstance(event, PrivateMessageEvent)\r\n and not plugin_config.xinghuo_enable_private_chat\r\n ):\r\n chat_record.finish(\"对不起,私聊暂不支持此功能。\")\r\n\r\n content = msg.extract_plain_text()\r\n if content == \"\" or content is None:\r\n await chat_request.finish(MessageSegment.text(\"内容不能为空!\"))\r\n\r\n await chat_request.send(MessageSegment.text(\"星火大模型正在思考中......\"))\r\n\r\n try:\r\n if sys_prompt:\r\n msg = [ChatMessage(role=\"system\", content=sys_prompt),ChatMessage(role=\"user\", content=content)]\r\n else:\r\n msg = [ChatMessage(role=\"user\", content=content)]\r\n\r\n loop = asyncio.get_event_loop()\r\n res = await loop.run_in_executor(\r\n None,\r\n getRes,\r\n API_URL,\r\n appid,\r\n api_key,\r\n api_secret,\r\n domain,\r\n msg,\r\n )\r\n except Exception as error:\r\n await chat_request.finish(str(error))\r\n await chat_request.finish(MessageSegment.text(res), at_sender=True)\r\n\r\n\r\n@clear_request.handle()\r\nasync def _(event: MessageEvent):\r\n del session[create_session_id(event)]\r\n await clear_request.finish(\r\n MessageSegment.text(\"成功清除历史记录!\"), at_sender=True\r\n )\r\n\r\n\r\n# 根据消息类型创建会话id\r\ndef create_session_id(event):\r\n if isinstance(event, PrivateMessageEvent):\r\n session_id = f\"Private_{event.user_id}\"\r\n elif public:\r\n session_id = event.get_session_id().replace(f\"{event.user_id}\", \"Public\")\r\n else:\r\n session_id = event.get_session_id()\r\n return session_id\r\n\r\n\r\ndef getRes(url, id, key, secret, domain, messages_):\r\n spark = ChatSparkLLM(\r\n spark_api_url=url,\r\n spark_app_id=id,\r\n spark_api_key=key,\r\n spark_api_secret=secret,\r\n spark_llm_domain=domain,\r\n streaming=False,\r\n max_tokens=1024,\r\n )\r\n messages = messages_\r\n handler = ChunkPrintHandler()\r\n a = spark.generate([messages], callbacks=[handler])\r\n res = a.generations[0][0].text\r\n messages_.append(ChatMessage(role=\"assistant\", content=res))\r\n return res\r\n"}}}}