diff --git a/config/api.yaml b/config/api.yaml index c370b07..da4a60a 100644 --- a/config/api.yaml +++ b/config/api.yaml @@ -9,13 +9,17 @@ siZhiAi: #思知ai,已不建议使用,建议用ai, nasa_api: HSxxxxxxx #nasa相关天文api 从https://api.nasa.gov/index.html#main-content申请 chatGLM: 69xxxxxxx #chatGLM的apiKey,从https://open.bigmodel.cn/获取 -gemini: #谷歌的gemini api,免费的,有几个填几个,在https://ai.google.dev/tutorials/setup?hl=zh-cn获取,需要配置proxy或GeminiRevProxy,否则无法使用 +gemini: #谷歌的gemini api,支持多key,在https://ai.google.dev/tutorials/setup?hl=zh-cn获取,需要配置proxy或GeminiRevProxy,否则无法使用 - AIxxxxxxxxxx -openaiSettings: - openai-keys: #openai官方的apikey +openaiSettings: #openai官方的apikey + openai-keys: - sk-Mxxxxxxxxxxx openai-model: "gpt-3.5-turbo" #调用openai api对应的模型,前提:在settings.yaml默认模型已经设置为gpt3.5,并配置了apikey openai-transit: "" #你自己的chatGPT中转站,你最好知道这是什么,否则就不要动。 +sparkAI: #讯飞星火,在https://console.xfyun.cn/services/cbm申请,并复制对应key和secret,注意,免费的是lite版 + appKey: "" #事实上,我很推荐你使用sparkAi,因为它免费且无需代理 + appSecret: "" + spark-model: "general" #讯飞星火的模型设置,general是免费无限制的,一般不建议修改 bing-image-creator: #bing的ai绘画,参考https://github.com/avilliai/Manyana/issues/8 _U: "" diff --git a/config/settings.yaml b/config/settings.yaml index ec3733b..3f72f95 100644 --- a/config/settings.yaml +++ b/config/settings.yaml @@ -27,7 +27,7 @@ moderate: selfthreshold: 50 #自我审核阈值 chatGLM: #对话模型通用设置 aiReplyCore: False #ai回复核心,为大部分功能启用ai回复,可优化回复表现,目前为测试功能 - model: random #ai模型,random(自动选取免费可用模型) |binggpt4(免费无需配置,速度较慢)| 后面几个需要自己配置api.yaml对应变量: characterglm(对应chatGLM),Gemini(同名),gpt3.5(openai-keys) + model: random #ai模型,random(自动选取免费可用模型) |binggpt4(免费无需配置,速度较慢)| 后面几个需要自己配置api.yaml对应变量: sparkAI(同名),Gemini(同名),gpt3.5(openai-keys),characterglm(对应chatGLM) randomModel&&&Priority: #random模式下,模型优先使用顺序,确保稳定性,直接进文件里改。 - Gemma - alcex_GPT3_5 @@ -54,10 +54,11 @@ chatGLM: #对话模型通用设置 bot_info: "【机器人设定】" bot_name: "【机器人名字】" user_name: "【用户名】" - random: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。身为猫娘的【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" - Gemini: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。身为猫娘的【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" - binggpt4: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”。接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。身为猫娘的【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" - gpt3.5: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”。接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。身为猫娘的【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" + random: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" + Gemini: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" + sparkAI: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”。接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" + binggpt4: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”。接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" + gpt3.5: "你现在是一个开朗且极其可爱的女孩,名为“【bot】”。接下来,请完全以【bot】的角色回复我,不要超出这个角色,不要自己试图进行旁白,你只需要扮演好【bot】即可。无论发生什么,你都必须以【bot】的角色和口吻进行回复,不要强调自己是个语音助手。【bot】性格开朗,时刻都想和“【用户】”打成一片,每次眼神交汇时,总是会脸红耳赤。【bot】始终在想方设法的博得“【用户】”的欢心。【bot】什么都不懂,天真可爱,性格外向。" scheduledTasks: #其他定时任务模块的内容会陆续转到这里 morning: #晨间推送 enable: False #向信任用户推送天气信息 diff --git a/plugins/ReplyModels.py b/plugins/ReplyModels.py index 651543c..1beed3e 100644 --- a/plugins/ReplyModels.py +++ b/plugins/ReplyModels.py @@ -1,4 +1,5 @@ # -*- coding:utf-8 -*- +import asyncio import copy import os import random @@ -304,8 +305,26 @@ def momoRep(prompt,meta): url=f"https://api.lolimi.cn/API/AI/mm.php?msg={prompt}" r = requests.get(url, timeout=20) return {"role": "assistant", "content": r.json().get("data").get("output")} +async def sparkAI(prompt,bot_info,key,secret,model): + prompt_copy = copy.deepcopy(prompt) + prompt_copy.insert(0, {"role": "user", "content": bot_info}) + prompt_copy.insert(1, {"role": "assistant", "content": "好的,已了解您的需求~我会扮演好您设定的角色。"}) + url = "https://spark-api-open.xf-yun.com/v1/chat/completions" + data = { + "model": model, # 指定请求的模型 + "messages": prompt_copy, + } + header = { + "Authorization": f"Bearer {key}:{secret}" # 注意此处替换自己的key和secret + } + async with httpx.AsyncClient(timeout=20,headers=header) as client: + r = await client.post(url,json=data) + return r.json()["choices"][0]["message"] if __name__ == '__main__': - k = momoRep([{"role": "user", "content": "谁赢得了2020年的世界职业棒球大赛?"}, + asyncio.run(sparkAI([{"role": "user", "content": "谁赢得了2020年的世界职业棒球大赛?"}, + {"role": "assistant", "content": "洛杉矶道奇队在2020年赢得了世界职业棒球大赛冠军."}, + {"role": "user", "content": "它在哪里举办的?"}],"你是猫娘",)) + '''k = momoRep([{"role": "user", "content": "谁赢得了2020年的世界职业棒球大赛?"}, {"role": "assistant", "content": "洛杉矶道奇队在2020年赢得了世界职业棒球大赛冠军."}, {"role": "user", "content": "它在哪里举办的?"}],"你是猫娘") - print(k) + print(k)''' diff --git a/plugins/aiReplyCore.py b/plugins/aiReplyCore.py index 5394c2c..afd3edd 100644 --- a/plugins/aiReplyCore.py +++ b/plugins/aiReplyCore.py @@ -10,7 +10,8 @@ from mirai import logger from plugins.RandomStr import random_str from plugins.ReplyModels import gptOfficial, gptUnofficial, kimi, qingyan, lingyi, stepAI, qwen, gptvvvv, grop, \ - gpt4hahaha, anotherGPT35, chatGLM, relolimigpt2, xinghuo, Gemma, binggpt4, alcex_GPT3_5, freeGemini, catRep, momoRep + gpt4hahaha, anotherGPT35, chatGLM, relolimigpt2, xinghuo, Gemma, binggpt4, alcex_GPT3_5, freeGemini, catRep, \ + momoRep, sparkAI from plugins.googleGemini import geminirep from plugins.translater import translate from plugins.vitsGenerate import voiceGenerate, superVG @@ -18,17 +19,24 @@ from plugins.vitsGenerate import voiceGenerate, superVG with open('config/api.yaml', 'r', encoding='utf-8') as f: resulttr = yaml.load(f.read(), Loader=yaml.FullLoader) CoziUrl = resulttr.get("cozi") -geminiapikey = resulttr.get("gemini") -proxy = resulttr.get("proxy") -openai_transit=resulttr.get("openaiSettings").get("openai-transit") -gptkeys = resulttr.get("openaiSettings").get("openai-keys") -openai_model=resulttr.get("openaiSettings").get("openai-model") -GeminiRevProxy = resulttr.get("GeminiRevProxy") berturl = resulttr.get("bert_colab") + +#gemini +geminiapikey = resulttr.get("gemini") +#openai相关配置 +openai_transit = resulttr.get("openaiSettings").get("openai-transit") +gptkeys = resulttr.get("openaiSettings").get("openai-keys") +openai_model = resulttr.get("openaiSettings").get("openai-model") +#代理 +proxy = resulttr.get("proxy") +GeminiRevProxy = resulttr.get("GeminiRevProxy") +#讯飞星火模型配置 +sparkAppKey=resulttr.get("sparkAI").get("appKey") +sparkAppSecret=resulttr.get("sparkAI").get("appSecret") +sparkModel=resulttr.get("sparkAI").get("spark-model") if proxy != "": os.environ["http_proxy"] = proxy - chatGLM_api_key = resulttr.get("chatGLM") with open('config.json', 'r', encoding='utf-8') as f: data = yaml.load(f.read(), Loader=yaml.FullLoader) @@ -103,7 +111,8 @@ async def loop_run_in_executor(executor, func, *args): # 运行异步函数 -async def modelReply(senderName, senderId, text, modelHere=modelDefault, trustUser=None, imgurls=None,checkIfRepFirstTime=False): +async def modelReply(senderName, senderId, text, modelHere=modelDefault, trustUser=None, imgurls=None, + checkIfRepFirstTime=False): global chatGLMData logger.info(modelHere) try: @@ -154,39 +163,38 @@ async def modelReply(senderName, senderId, text, modelHere=modelDefault, trustUs logger.error("初始化anotherGPT3.5失败") firstRep = True logger.info(f"{modelHere} bot 接受提问:" + text) - - + if modelHere == "random": - prompt1 = copy.deepcopy(prompt1)#去重人设 + prompt1 = copy.deepcopy(prompt1) # 去重人设 tasks = [] logger.warning("请求所有模型接口") # 将所有模型的执行代码包装成异步任务,并添加到任务列表 - # tasks.append(loop_run_in_executor(loop, cozeBotRep, CoziUrl, prompt1, proxy))# 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, kimi, prompt1, bot_in)) # 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, qingyan, prompt1, bot_in)) # 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, grop, prompt1, bot_in)) # 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, lingyi, prompt1, bot_in)) # 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, relolimigpt2, prompt1, bot_in)) # 2024-07-17测试无法解析API - # tasks.append(loop_run_in_executor(loop, stepAI, prompt1, bot_in)) # 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, qwen, prompt1, bot_in)) # 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, gptvvvv, prompt1, bot_in)) # 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, gpt4hahaha, prompt1, bot_in)) # 2024-07-17测试无效 - # tasks.append(loop_run_in_executor(loop, anotherGPT35, prompt1, senderId)) # 2024-07-17测试 初始化失败 - # tasks.append(loop_run_in_executor(loop, xinghuo, prompt1, senderId)) # 2024-07-17测试无效 - tasks.append(loop_run_in_executor(loop,Gemma,prompt1,bot_in)) # 2024-07-17测试通过 - tasks.append(loop_run_in_executor(loop,alcex_GPT3_5,prompt1,bot_in)) # 2024-07-17测试通过 - tasks.append(loop_run_in_executor(loop,catRep,prompt1,bot_in)) - tasks.append(loop_run_in_executor(loop,momoRep,prompt1,bot_in)) - # tasks.append(loop_run_in_executor(loop,freeGemini,prompt1,bot_in)) # 2024-07-17测试无效 - + # tasks.append(loop_run_in_executor(loop, cozeBotRep, CoziUrl, prompt1, proxy))# 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, kimi, prompt1, bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, qingyan, prompt1, bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, grop, prompt1, bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, lingyi, prompt1, bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, relolimigpt2, prompt1, bot_in)) # 2024-07-17测试无法解析API + # tasks.append(loop_run_in_executor(loop, stepAI, prompt1, bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, qwen, prompt1, bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, gptvvvv, prompt1, bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, gpt4hahaha, prompt1, bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop, anotherGPT35, prompt1, senderId)) # 2024-07-17测试 初始化失败 + # tasks.append(loop_run_in_executor(loop, xinghuo, prompt1, senderId)) # 2024-07-17测试无效 + tasks.append(loop_run_in_executor(loop, Gemma, prompt1, bot_in)) # 2024-07-17测试通过 + tasks.append(loop_run_in_executor(loop, alcex_GPT3_5, prompt1, bot_in)) # 2024-07-17测试通过 + tasks.append(loop_run_in_executor(loop, catRep, prompt1, bot_in)) + tasks.append(loop_run_in_executor(loop, momoRep, prompt1, bot_in)) + # tasks.append(loop_run_in_executor(loop,freeGemini,prompt1,bot_in)) # 2024-07-17测试无效 + # tasks.append(loop_run_in_executor(loop,localAurona,prompt1,bot_in)) # ... 添加其他模型的任务 ... aim = {"role": "user", "content": bot_in} prompt1 = [i for i in prompt1 if i != aim] - #prompt1 = [i for i in prompt1 if not (i.get("role") == aim["role"] and i.get("content") == aim["content"])] + # prompt1 = [i for i in prompt1 if not (i.get("role") == aim["role"] and i.get("content") == aim["content"])] aim = {"role": "assistant", "content": "好的,已了解您的需求~我会扮演好您设定的角色。"} prompt1 = [i for i in prompt1 if i != aim] - #prompt1 = [i for i in prompt1 if not (i.get("role") == aim["role"] and i.get("content") == aim["content"])] + # prompt1 = [i for i in prompt1 if not (i.get("role") == aim["role"] and i.get("content") == aim["content"])] done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED) reps = {} @@ -216,7 +224,8 @@ async def modelReply(senderName, senderId, text, modelHere=modelDefault, trustUs raise Exception # print(reps) modeltrans = {"gptX": "gptvvvv", "清言": "qingyan", "通义千问": "qwen", "anotherGPT3.5": "anotherGPT35", - "lolimigpt": "relolimigpt2", "step": "stepAI", "讯飞星火": "xinghuo","猫娘米米": "catRep","沫沫":"momoRep"} + "lolimigpt": "relolimigpt2", "step": "stepAI", "讯飞星火": "xinghuo", "猫娘米米": "catRep", + "沫沫": "momoRep"} for priority in randomModelPriority: if priority in modeltrans: priority = modeltrans.get(priority) @@ -225,19 +234,23 @@ async def modelReply(senderName, senderId, text, modelHere=modelDefault, trustUs logger.info(f"random模型选择结果:{priority}: {rep}") break elif modelHere == "gpt3.5": - if openai_transit=="" or openai_transit==" ": - rep = await loop.run_in_executor(None, gptOfficial, prompt1, gptkeys, proxy, bot_in,openai_model) + if openai_transit == "" or openai_transit == " ": + rep = await loop.run_in_executor(None, gptOfficial, prompt1, gptkeys, proxy, bot_in, openai_model) else: - rep = await loop.run_in_executor(None, gptUnofficial, prompt1, gptkeys, openai_transit, bot_in,openai_model) - elif modelHere=="binggpt4": - #print(1) - rep=await loop_run_in_executor(None,binggpt4,prompt1,bot_in) - if type(rep)==list: + rep = await loop.run_in_executor(None, gptUnofficial, prompt1, gptkeys, openai_transit, bot_in, + openai_model) + elif modelHere == "binggpt4": + # print(1) + rep = await loop_run_in_executor(None, binggpt4, prompt1, bot_in) + if type(rep) == list: return "模型不可用,请更换模型。" elif modelHere == "Gemini": - r = await geminirep(ak=random.choice(geminiapikey), messages=prompt1, bot_info=bot_in,GeminiRevProxy=GeminiRevProxy,imgurls=imgurls), - #print(r,type(r)) + r = await geminirep(ak=random.choice(geminiapikey), messages=prompt1, bot_info=bot_in, + GeminiRevProxy=GeminiRevProxy, imgurls=imgurls), + # print(r,type(r)) rep = {"role": "assistant", "content": r[0].replace(r"\n", "\n")} + elif modelHere=="sparkAI": + rep=await sparkAI(prompt1, bot_in,sparkAppKey,sparkAppSecret,sparkModel) elif type(allcharacters.get(modelHere)) == dict: if (str(senderId) not in trustUser and trustglmReply) and trustUser is not None: if checkIfRepFirstTime: @@ -257,14 +270,14 @@ async def modelReply(senderName, senderId, text, modelHere=modelDefault, trustUs # 写入文件 with open('data/chatGLMData.yaml', 'w', encoding="utf-8") as file: yaml.dump(chatGLMData, file, allow_unicode=True) - #print(rep.get('content'),type(rep.get('content'))) - #print(rep,type(rep)) + # print(rep.get('content'),type(rep.get('content'))) + # print(rep,type(rep)) logger.info(f"{modelHere} bot 回复:" + rep.get('content')) if checkIfRepFirstTime: return rep.get("content"), firstRep else: return rep.get("content") - #await tstt(rep.get('content'), event) + # await tstt(rep.get('content'), event) except Exception as e: logger.error(e) try: @@ -298,7 +311,7 @@ async def clearAllPrompts(): # 写入文件 with open('data/chatGLMData.yaml', 'w', encoding="utf-8") as file: yaml.dump(chatGLMData, file, allow_unicode=True) - #print(chatGLMData) + # print(chatGLMData) return "已清除所有用户的prompt" except: return "清理缓存出错,无本地对话记录" diff --git a/更新日志.yaml b/更新日志.yaml index bc78466..983c462 100644 --- a/更新日志.yaml +++ b/更新日志.yaml @@ -306,4 +306,6 @@ 2024/7/24: - 增加语音合成自定义前缀,减少误触发 - 增加random模式可用模型,注意,新增的两个模型可能无法使用bot_info设定 - - 增加两个指令 开始对话/退出 可以在没有艾特的情况下展开对话,同时,gemini支持了图像识别 \ No newline at end of file + - 增加两个指令 开始对话/退出 可以在没有艾特的情况下展开对话,同时,gemini支持了图像识别 +2024/7/25: + - 支持对接讯飞星火api,免费无需代理,详见api.yaml和settings.yaml \ No newline at end of file