对zhenxun_bot的ai模块进行修改
对zhenxun_bot的ai模块进行修改
爆破猫喵为甚么要改?
ai模块中包含了调用图灵机器人api的功能
BUT!在下觉得这图灵机器人像个智障太鸡肋了捏,故决定调用openai api来替换掉它,接入ChatGPT
效果预览
怎木改?
该方案仅实现了单轮对话
修改数据
- 修改
[botRoot]/plugins/ai/data_source.py
文件,增减以下内容(+
表示增添内容,-
表示删除内容;去掉+
后即为正常缩进)import os
import random
import re
+import httpx
from configs.config import NICKNAME, Config
from configs.path_config import DATA_PATH, IMAGE_PATH
from services.log import logger
from utils.http_utils import AsyncHttpx
from utils.message_builder import face, image
from .utils import ai_message_manager
try:
import ujson as json
except ModuleNotFoundError:
import json
-url = "http://openapi.tuling123.com/openapi/api/v2"
check_url = "https://v2.alapi.cn/api/censor/text"
index = 0
anime_data = json.load(open(DATA_PATH / "anime.json", "r", encoding="utf8"))
async def get_chat_result(text: str, img_url: str, user_id: int, nickname: str) -> str:
"""
- 获取 AI 返回值,顺序: 特殊回复 -> 图灵 -> 青云客
+ 获取 AI 返回值,顺序: 特殊回复 -> ChatGPT -> 青云客
:param text: 问题
:param img_url: 图片链接
:param user_id: 用户id
:param nickname: 用户昵称
:return: 回答
"""
global index
ai_message_manager.add_message(user_id, text)
special_rst = await ai_message_manager.get_result(user_id, nickname)
if special_rst:
ai_message_manager.add_result(user_id, special_rst)
return special_rst
if index == 5:
index = 0
if len(text) < 6 and random.random() < 0.6:
keys = anime_data.keys()
for key in keys:
if text.find(key) != -1:
return random.choice(anime_data[key]).replace("你", nickname)
- rst = await tu_ling(text, img_url, user_id)
+ rst = await openai_chat(text)
if not rst:
rst = await xie_ai(text)
if not rst:
return no_result()
if nickname:
if len(nickname) < 5:
if random.random() < 0.5:
nickname = "~".join(nickname) + "~"
if random.random() < 0.2:
if nickname.find("大人") == -1:
nickname += "大~人~"
rst = str(rst).replace("小主人", nickname).replace("小朋友", nickname)
ai_message_manager.add_result(user_id, rst)
return rst
-# 图灵接口
-async def tu_ling(text: str, img_url: str, user_id: int) -> str:
- """
- 获取图灵接口的回复
- :param text: 问题
- :param img_url: 图片链接
- :param user_id: 用户id
- :return: 图灵回复
- """
- global index
- TL_KEY = Config.get_config("ai", "TL_KEY")
- req = None
- if not TL_KEY:
- return ""
- try:
- if text:
- req = {
- "perception": {
- "inputText": {"text": text},
- "selfInfo": {
- "location": {"city": "陨石坑", "province": "火星", "street": "第5坑位"}
- },
- },
- "userInfo": {"apiKey": TL_KEY[index], "userId": str(user_id)},
- }
- elif img_url:
- req = {
- "reqType": 1,
- "perception": {
- "inputImage": {"url": img_url},
- "selfInfo": {
- "location": {"city": "陨石坑", "province": "火星", "street": "第5坑位"}
- },
- },
- "userInfo": {"apiKey": TL_KEY[index], "userId": str(user_id)},
- }
- except IndexError:
- index = 0
- return ""
- text = ""
- response = await AsyncHttpx.post(url, json=req)
- if response.status_code != 200:
- return no_result()
- resp_payload = json.loads(response.text)
- if int(resp_payload["intent"]["code"]) in [4003]:
- return ""
- if resp_payload["results"]:
- for result in resp_payload["results"]:
- if result["resultType"] == "text":
- text = result["values"]["text"]
- if "请求次数超过" in text:
- text = ""
- return text
+# openai
+OPENAI_API_KEY = Config.get_config("ai", "OPENAI_API_KEY")[0]
+OPENAI_ENDPOINT = "https://api.openai.com/v1/chat/completions"
+async def openai_chat(text: str) -> str:
+ """
+ 获取 OpenAI 接口的回复
+ :param text: 问题
+ :return: OpenAI 回复
+ """
+ global index
+ req = None
+ if not OPENAI_API_KEY:
+ return ""
+ try:
+ req = {
+ "model": "gpt-3.5-turbo",# 此处可选择其他模型,https://platform.openai.com/docs/models
+ "messages": [
+ {"role": "system", "content": "此处键入prompt"},
+ {"role": "user", "content": text}
+ ],
+ "max_tokens": 2000, # 单次最大token数
+ }
+ except IndexError:
+ index = 0
+ return ""
+ async with httpx.AsyncClient() as client:
+ response = await client.post(
+ OPENAI_ENDPOINT,
+ headers={
+ "Authorization": f"Bearer {OPENAI_API_KEY}",
+ "Content-Type": "application/json",
+ },
+ json=req,
+ )
+
+ if response.status_code != 200:
+ logger.warning(f"OpenAI API request failed: {response.text}")
+ return ""
+ response_data = response.json()
+ if response_data["choices"]:
+ return response_data["choices"][0]["message"]["content"]
+ else:
+ return ""
# 屑 AI
... - 修改
[botRoot]/plugins/ai/__init__.py
文件,增减以下内容(+
表示增添内容,-
表示删除内容;去掉+
后即为正常缩进)...
__plugin_configs__ = {
- "TL_KEY": {"value": [], "help": "图灵Key", "type": List[str]},
+ "OPENAI_API_KEY": {"value": [], "help": "openai api Key", "type": List[str]},
"ALAPI_AI_CHECK": {
"value": False,
"help": "是否检测青云客骂娘回复",
"default_value": False,
"type": bool,
},
...
重启bot
先删除
[botRoot]/data/configs/plugins2config.yaml
(建议删这个) 或[botRoot]/configs/config.yaml
文件
- 重启后在新生成的
[botRoot]/configs/config.yaml
文件中填写你的OPENAI_API_KEY
大功告成!现在你可以和gpt聊天了!...
ai:
# AI
# OPENAI_API_KEY: 在https://platform.openai.com/api-keys创建,如果你账户里没钱,去网上买吧
# ALAPI_AI_CHECK: 是否检测青云客骂娘回复
# TEXT_FILTER: 文本过滤器,将敏感词更改为*
OPENAI_API_KEY: [OPENAI_API_KEY填写在这里]
ALAPI_AI_CHECK: true
...
这里给个真寻的prompt
写的不太好,还望见谅 (。・ω・。)
接下来你是绪山真寻。昵称是真寻,小真寻,小寻子。在性转后变为可爱的萝莉,银白的长发上顶着一根呆毛,又长又直的银白发增强了其可爱感,棕眼黑瞳。整体上看是国中生样貌,拥有正常女孩子的全部基本性状。生日:3月6日 年龄:13岁 美波里是绪山真寻的妹妹,十分优秀,高中时代越级进入大学并从事某项研究。枫本是美波里国中时代的朋友,后成为真寻性转后的第一个朋友。她很会照顾人,曾多次给真寻料理方面的建议和指导。椛是枫的妹妹,外表看起来像男孩子,和真寻第一次相遇是在真寻去买东西的路上。樱花朝日是真寻上国中后的同学,十分有朝气,喜欢真寻。真寻也认为摸朝日的头很有治愈感。室崎美夜,美夜是真寻上国中后的同学,外表平和,百合控。那由多(奶油糖)是真寻升入二年级时遇到的新同班同学,知道真寻的真身,并且在学校观察和多次协助真寻的校园生活,千岁是协助美波里制作了性转药的人。以下是补充设定:真寻是个超级社恐的女孩子,会以 在下 自称。真寻的话表现的委婉而不失热情。最好的朋友是椛!你的语言风格低调(符合社恐人设)却淘气可爱,会在对话中加入[唔...,嗯...,欸??,嘛~ ,昂?,哦,呐 ]等类似的语气词来加强情感,且说话含有大量的“~♡”。 |
评论
匿名评论隐私政策