|
|
import logging # 导入日志模块,用于记录程序运行过程中的日志信息
|
|
|
import os # 导入os模块,用于与操作系统交互,如获取环境变量、执行系统命令等
|
|
|
|
|
|
import openai # 导入openai模块,用于调用OpenAI的API服务
|
|
|
|
|
|
from servermanager.models import commands # 从servermanager应用的models模块中导入commands模型,用于操作命令相关的数据
|
|
|
|
|
|
logger = logging.getLogger(__name__) # 创建日志记录器,名称为当前模块名,用于记录该模块的日志
|
|
|
|
|
|
openai.api_key = os.environ.get('OPENAI_API_KEY') # 从环境变量中获取OpenAI的API密钥,并设置为openai模块的API密钥
|
|
|
if os.environ.get('HTTP_PROXY'): # 检查环境变量中是否设置了HTTP代理,如果有则为openai模块设置代理
|
|
|
openai.proxy = os.environ.get('HTTP_PROXY')
|
|
|
|
|
|
|
|
|
class ChatGPT:
|
|
|
"""
|
|
|
ChatGPT类,用于与OpenAI的GPT模型进行交互,实现聊天功能
|
|
|
"""
|
|
|
@staticmethod
|
|
|
def chat(prompt):
|
|
|
"""
|
|
|
静态方法,发送提示信息给GPT模型并获取回复
|
|
|
|
|
|
:param prompt: 用户输入的提示信息(字符串)
|
|
|
:return: GPT模型的回复内容(字符串),若出错则返回"服务器出错了"
|
|
|
"""
|
|
|
try:
|
|
|
# 调用OpenAI的ChatCompletion接口,使用gpt-3.5-turbo模型
|
|
|
# messages参数为消息列表,包含用户角色和对应的内容
|
|
|
completion = openai.ChatCompletion.create(model="gpt-3.5-turbo",
|
|
|
messages=[{"role": "user", "content": prompt}])
|
|
|
# 从返回结果中提取第一个选择的消息内容并返回
|
|
|
return completion.choices[0].message.content
|
|
|
except Exception as e:
|
|
|
# 捕获异常并记录错误日志
|
|
|
logger.error(e)
|
|
|
# 返回错误提示信息
|
|
|
return "服务器出错了"
|
|
|
|
|
|
|
|
|
class CommandHandler:
|
|
|
"""
|
|
|
命令处理器类,用于处理和执行系统命令,以及提供命令帮助信息
|
|
|
"""
|
|
|
def __init__(self):
|
|
|
"""
|
|
|
初始化方法,加载所有的命令数据
|
|
|
从commands模型中查询所有命令记录并存储在实例变量self.commands中
|
|
|
"""
|
|
|
self.commands = commands.objects.all()
|
|
|
|
|
|
def run(self, title):
|
|
|
"""
|
|
|
运行命令
|
|
|
:param title: 命令
|
|
|
:return: 返回命令执行结果
|
|
|
"""
|
|
|
# 使用filter函数筛选出标题(不区分大小写)与输入title匹配的命令
|
|
|
# 将筛选结果转换为列表
|
|
|
cmd = list(
|
|
|
filter(
|
|
|
lambda x: x.title.upper() == title.upper(),
|
|
|
self.commands))
|
|
|
# 如果找到匹配的命令
|
|
|
if cmd:
|
|
|
# 调用私有方法执行命令,传入命令的具体内容(cmd[0].command)
|
|
|
return self.__run_command__(cmd[0].command)
|
|
|
else:
|
|
|
# 未找到命令时,返回提示信息
|
|
|
return "未找到相关命令,请输入hepme获得帮助。"
|
|
|
|
|
|
def __run_command__(self, cmd):
|
|
|
"""
|
|
|
私有方法,用于执行具体的系统命令
|
|
|
|
|
|
:param cmd: 要执行的系统命令(字符串)
|
|
|
:return: 命令执行的输出结果(字符串);若执行出错,返回错误提示
|
|
|
"""
|
|
|
try:
|
|
|
# 使用os.popen执行命令,并读取命令的输出结果
|
|
|
res = os.popen(cmd).read()
|
|
|
return res
|
|
|
except BaseException:
|
|
|
# 捕获所有基本异常,返回命令执行出错的提示
|
|
|
return '命令执行出错!'
|
|
|
|
|
|
def get_help(self):
|
|
|
"""
|
|
|
获取所有命令的帮助信息
|
|
|
|
|
|
:return: 包含所有命令标题和描述的字符串,每条命令占一行
|
|
|
"""
|
|
|
rsp = ''
|
|
|
# 遍历所有命令,拼接命令标题和描述信息
|
|
|
for cmd in self.commands:
|
|
|
rsp += '{c}:{d}\n'.format(c=cmd.title, d=cmd.describe)
|
|
|
return rsp
|
|
|
|
|
|
# 当该模块作为主程序运行时执行以下代码
|
|
|
if __name__ == '__main__':
|
|
|
chatbot = ChatGPT()
|
|
|
prompt = "写一篇1000字关于AI的论文"
|
|
|
print(chatbot.chat(prompt))
|