From 762a6c52e1cbc4318d14103284ece2050f5712fa Mon Sep 17 00:00:00 2001 From: liuwei Date: Thu, 29 May 2025 10:05:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/game_task/config.toml | 7 ++- plugins/game_task/main.py | 104 ++++++++++++++++++++++++++++++++-- utils/ai/game_chatgpt_qa.py | 102 --------------------------------- 3 files changed, 106 insertions(+), 107 deletions(-) delete mode 100644 utils/ai/game_chatgpt_qa.py diff --git a/plugins/game_task/config.toml b/plugins/game_task/config.toml index 6287d0a..b169340 100644 --- a/plugins/game_task/config.toml +++ b/plugins/game_task/config.toml @@ -9,4 +9,9 @@ command-format = """ /r - 查看排行榜 /l - 查看活跃任务 /h - 查看未完成任务 -""" \ No newline at end of file +""" + +# AI获取题目确认答案用的配置信息 +authorization = "Bearer b8586595-eb81-483d-8e91-a35cc789729e" # 请替换为真实的Authorization token +url = 'https://ark.cn-beijing.volces.com/api/v3/chat/completions' +model = "doubao-1-5-lite-32k-250115" \ No newline at end of file diff --git a/plugins/game_task/main.py b/plugins/game_task/main.py index 9489993..c4cead1 100644 --- a/plugins/game_task/main.py +++ b/plugins/game_task/main.py @@ -10,9 +10,10 @@ from base.plugin_common.plugin_interface import PluginStatus from utils.decorator.plugin_decorators import plugin_stats_decorator from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager from utils.decorator.points_decorator import points_reward_decorator -from utils.ai.game_chatgpt_qa import game_question_json, game_answer_json from db.connection import DBConnectionManager from db.encyclopedia import EncyclopediaDB +import requests +import json class GameTaskPlugin(MessagePluginInterface): @@ -66,6 +67,10 @@ class GameTaskPlugin(MessagePluginInterface): /l - 查看活跃任务 /h - 查看未完成任务 """) + self.authorization = self._config.get("GameTask", {}).get("authorization", "") + self.url = self._config.get("GameTask", {}).get("url", "") + self.model = self._config.get("GameTask", {}).get("model", "") + self.enable = self._config.get("GameTask", {}).get("enable", True) # 初始化数据库连接 @@ -228,7 +233,7 @@ class GameTaskPlugin(MessagePluginInterface): return # 以下是原有的出题逻辑 - task = game_question_json("请出题!") + task = self.game_question_json("请出题!") category = task["category"] question = task["question"] answer = task["answer"] @@ -343,7 +348,7 @@ class GameTaskPlugin(MessagePluginInterface): holder_name = holder['player_name'] if holder else "未知玩家" answer_json = {"question": question, "top_score": str(top_score), "answer": answer} - result = game_answer_json(answer_json) + result = self.game_answer_json(answer_json) points = int(result["score"]) description = result["description"] is_correct = points > 0 @@ -528,7 +533,7 @@ class GameTaskPlugin(MessagePluginInterface): holder_name = holder['player_name'] # 创建任务 - task = game_question_json("请出题!") + task = self.game_question_json("请出题!") category = task["category"] question = task["question"] answer = task["answer"] @@ -552,3 +557,94 @@ class GameTaskPlugin(MessagePluginInterface): [holder_id]) except Exception as e: self.LOG.error(f"定时任务出错: {e}") + + # 解析JSON + def extract_content(self, data_string): + try: + data = json.loads(data_string) + # 提取content字段 + content = data["choices"][0]["message"].get("content", "") + return content + except json.JSONDecodeError: + print("Invalid JSON") + return None + + def message_task_json(self, prompt, content): + # 设置Authorization和URL + authorization = self.authorization # 请替换为真实的Authorization token + url = self.url + + data = { + # "stream": True, + "model": self.model, + "messages": [ + { + "role": "system", + "content": f"{prompt}" + }, + { + "role": "user", + "content": f"{content}" + } + + ] + } + + # 设置请求头 + headers = { + "Content-Type": "application/json; charset=utf-8", + "Authorization": authorization + } + + # 发送POST请求 + response = requests.post(url, headers=headers, data=json.dumps(data), ) + response.encoding = 'utf-8' + + # 输出响应内容 + print(response.status_code) + print(response.text) + return json.loads(self.extract_content(response.text)) + + def game_question_json(self, question): + fields = [ + "近现代史", "战争与政治", "文化遗产与考古学", "进化论", "动植物学", "基因与遗传学", + "生态学", "有机化学", "无机化学", "生物化学", "环境化学", "人文地理", "自然地理", + "地质学", "气候变化", "古典文学", "现代文学", "小说与戏剧", "诗歌与散文", "美术", + "音乐", "戏剧与舞蹈", "电影与媒体", "西方哲学", "东方哲学", "道德与伦理学", "逻辑与认识论", + "人类学", "心理学", "政治学", "经济学", "编程语言", "人工智能", "数据科学", "网络与安全", + "机械工程", "电气工程", "化学工程", "土木工程", "解剖学", "生理学", "临床医学", "药学与护理", + "球类运动", "奥林匹克运动", "运动心理学", "健身与营养", "世界宗教", "神话与民间故事", + "宗教哲学", "语法与词汇", "语言习得", "方言与语言变异", "宏观经济学", "微观经济学", + "国际贸易", "金融与投资", "民法与刑法", "国际法", "知识产权法", "环境法" + ] + + # 随机选择一个领域 + selected_field = random.choice(fields) + + # 输出随机选择的领域 + print(f"随机选择的领域是:{selected_field}") + question = question + f"随机选择的领域是:{selected_field}" + prompt = """ + 请根据以下要求,随机生成一个问题,确保每次提问涉及不同领域,且不重复: + 1. 每个问题应该覆盖以下任意领域:近现代史、战争与政治、文化遗产与考古学、进化论、动植物学、基因与遗传学、生态学、有机化学、无机化学、生物化学、环境化学、人文地理、自然地理、地质学、气候变化、古典文学、现代文学、小说与戏剧、诗歌与散文、美术、音乐、戏剧与舞蹈、电影与媒体、西方哲学、东方哲学、道德与伦理学、逻辑与认识论、人类学、心理学、政治学、经济学、编程语言、人工智能、数据科学、网络与安全、机械工程、电气工程、化学工程、土木工程、解剖学、生理学、临床医学、药学与护理、球类运动、奥林匹克运动、运动心理学、健身与营养、世界宗教、神话与民间故事、宗教哲学、语法与词汇、语言习得、方言与语言变异、宏观经济学、微观经济学、国际贸易、金融与投资、民法与刑法、国际法、知识产权法、环境法。 + 2. 问题应简洁,具有一定难度,易于理解且充满乐趣,适合百科类知识问答。 + 3. 每个问题应独立,且问题之间无连贯性或延续性。 + 4. 避免重复提问或产生相似的问题,确保问题新颖。 + 5. 对于每个问题,提供难度评分(1-10分)。在问题答对后,用户可以根据难度给出相应的分数。 + 6. 答案控制长度在25字以内。 + + 输出格式要求如下(仅返回JSON格式,确保不添加多余的符号): + { + "category":"人文地理" + "question": "哪个国家最早将玫瑰与爱情联系起来?", + "score": "1", + "answer": "波斯", + "description": "波斯文化中,玫瑰被广泛认为是象征爱情的花卉,其象征意义逐渐传入西方。" + } + """ + + return self.message_task_json(prompt, question) + + def game_answer_json(self, answer): + prompt = "你是一个益智百科问答大师,可以根据用户回答的答案进行判断,并且对问题(question)答案(answer)进行打分,打分时请参考最高分要求(top_score),告知用户能获得多少分,请在description中描述打分理由,请只返回JSON格式的内容:格式要求如下(请不要加上markdown 的符号):{\"question\": \"哪个国家最早将玫瑰与爱情联系起来?\", \"score\":\"1\", \"answer\": \"波斯\",\"description\":\"描述问题答案的原因\"}" + return self.message_task_json(prompt, answer) diff --git a/utils/ai/game_chatgpt_qa.py b/utils/ai/game_chatgpt_qa.py deleted file mode 100644 index afd0f87..0000000 --- a/utils/ai/game_chatgpt_qa.py +++ /dev/null @@ -1,102 +0,0 @@ -import requests -import json -import random - -# 解析JSON -def extract_content(data_string): - try: - data = json.loads(data_string) - # 提取content字段 - content = data["choices"][0]["message"].get("content", "") - return content - except json.JSONDecodeError: - print("Invalid JSON") - return None - - -def message_task_json(prompt, content): - # 设置Authorization和URL - authorization = "Bearer b8586595-eb81-483d-8e91-a35cc789729e" # 请替换为真实的Authorization token - url = 'https://ark.cn-beijing.volces.com/api/v3/chat/completions' - - data = { - # "stream": True, - "model": "doubao-1-5-lite-32k-250115", - "messages": [ - { - "role": "system", - "content": f"{prompt}" - }, - { - "role": "user", - "content": f"{content}" - } - - ] - } - - # 设置请求头 - headers = { - "Content-Type": "application/json; charset=utf-8", - "Authorization": authorization - } - - # 发送POST请求 - response = requests.post(url, headers=headers, data=json.dumps(data), ) - response.encoding = 'utf-8' - - # 输出响应内容 - print(response.status_code) - print(response.text) - return json.loads(extract_content(response.text)) - - -def game_question_json(question): - fields = [ - "近现代史", "战争与政治", "文化遗产与考古学", "进化论", "动植物学", "基因与遗传学", - "生态学", "有机化学", "无机化学", "生物化学", "环境化学", "人文地理", "自然地理", - "地质学", "气候变化", "古典文学", "现代文学", "小说与戏剧", "诗歌与散文", "美术", - "音乐", "戏剧与舞蹈", "电影与媒体", "西方哲学", "东方哲学", "道德与伦理学", "逻辑与认识论", - "人类学", "心理学", "政治学", "经济学", "编程语言", "人工智能", "数据科学", "网络与安全", - "机械工程", "电气工程", "化学工程", "土木工程", "解剖学", "生理学", "临床医学", "药学与护理", - "球类运动", "奥林匹克运动", "运动心理学", "健身与营养", "世界宗教", "神话与民间故事", - "宗教哲学", "语法与词汇", "语言习得", "方言与语言变异", "宏观经济学", "微观经济学", - "国际贸易", "金融与投资", "民法与刑法", "国际法", "知识产权法", "环境法" - ] - - # 随机选择一个领域 - selected_field = random.choice(fields) - - # 输出随机选择的领域 - print(f"随机选择的领域是:{selected_field}") - question = question + f"随机选择的领域是:{selected_field}" - prompt = """ - 请根据以下要求,随机生成一个问题,确保每次提问涉及不同领域,且不重复: - 1. 每个问题应该覆盖以下任意领域:近现代史、战争与政治、文化遗产与考古学、进化论、动植物学、基因与遗传学、生态学、有机化学、无机化学、生物化学、环境化学、人文地理、自然地理、地质学、气候变化、古典文学、现代文学、小说与戏剧、诗歌与散文、美术、音乐、戏剧与舞蹈、电影与媒体、西方哲学、东方哲学、道德与伦理学、逻辑与认识论、人类学、心理学、政治学、经济学、编程语言、人工智能、数据科学、网络与安全、机械工程、电气工程、化学工程、土木工程、解剖学、生理学、临床医学、药学与护理、球类运动、奥林匹克运动、运动心理学、健身与营养、世界宗教、神话与民间故事、宗教哲学、语法与词汇、语言习得、方言与语言变异、宏观经济学、微观经济学、国际贸易、金融与投资、民法与刑法、国际法、知识产权法、环境法。 - 2. 问题应简洁,具有一定难度,易于理解且充满乐趣,适合百科类知识问答。 - 3. 每个问题应独立,且问题之间无连贯性或延续性。 - 4. 避免重复提问或产生相似的问题,确保问题新颖。 - 5. 对于每个问题,提供难度评分(1-10分)。在问题答对后,用户可以根据难度给出相应的分数。 - 6. 答案控制长度在25字以内。 - - 输出格式要求如下(仅返回JSON格式,确保不添加多余的符号): - { - "category":"人文地理" - "question": "哪个国家最早将玫瑰与爱情联系起来?", - "score": "1", - "answer": "波斯", - "description": "波斯文化中,玫瑰被广泛认为是象征爱情的花卉,其象征意义逐渐传入西方。" - } - """ - - return message_task_json(prompt, question) - - -def game_answer_json(answer): - prompt = "你是一个益智百科问答大师,可以根据用户回答的答案进行判断,并且对问题(question)答案(answer)进行打分,打分时请参考最高分要求(top_score),告知用户能获得多少分,请在description中描述打分理由,请只返回JSON格式的内容:格式要求如下(请不要加上markdown 的符号):{\"question\": \"哪个国家最早将玫瑰与爱情联系起来?\", \"score\":\"1\", \"answer\": \"波斯\",\"description\":\"描述问题答案的原因\"}" - return message_task_json(prompt, answer) - - -if __name__ == '__main__': - print(game_question_json('请出题!')) - # print(game_answer_json('question:哪个国家的节日与裸体狂欢有关?,answer:古罗马,top_score:3'))