|
|
|
|
@ -3,62 +3,100 @@ import os
|
|
|
|
|
|
|
|
|
|
import openai
|
|
|
|
|
|
|
|
|
|
# 注意:原代码导入可能存在拼写问题,推测应为从servermanager.models导入Commands模型(首字母通常大写)
|
|
|
|
|
from servermanager.models import commands
|
|
|
|
|
|
|
|
|
|
# 初始化日志记录器,用于记录操作日志和错误信息
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
# 从环境变量获取OpenAI API密钥并配置
|
|
|
|
|
openai.api_key = os.environ.get('OPENAI_API_KEY')
|
|
|
|
|
# 若环境变量中配置了HTTP代理,为OpenAI客户端设置代理
|
|
|
|
|
if os.environ.get('HTTP_PROXY'):
|
|
|
|
|
openai.proxy = os.environ.get('HTTP_PROXY')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ChatGPT:
|
|
|
|
|
"""封装OpenAI GPT-3.5-turbo模型的对话功能"""
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def chat(prompt):
|
|
|
|
|
"""
|
|
|
|
|
调用GPT-3.5-turbo模型生成对话响应
|
|
|
|
|
:param prompt: 用户输入的提示词
|
|
|
|
|
:return: 模型生成的响应内容,出错时返回错误提示
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
completion = openai.ChatCompletion.create(model="gpt-3.5-turbo",
|
|
|
|
|
messages=[{"role": "user", "content": prompt}])
|
|
|
|
|
# 调用OpenAI的ChatCompletion接口,使用gpt-3.5-turbo模型
|
|
|
|
|
completion = openai.ChatCompletion.create(
|
|
|
|
|
model="gpt-3.5-turbo",
|
|
|
|
|
messages=[{"role": "user", "content": prompt}] # 构造用户角色的对话消息
|
|
|
|
|
)
|
|
|
|
|
# 提取并返回模型生成的内容(取第一个选项的message内容)
|
|
|
|
|
return completion.choices[0].message.content
|
|
|
|
|
except Exception as e:
|
|
|
|
|
# 记录异常信息到日志
|
|
|
|
|
logger.error(e)
|
|
|
|
|
# 返回友好的错误提示给用户
|
|
|
|
|
return "服务器出错了"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CommandHandler:
|
|
|
|
|
"""处理命令查询、执行与帮助信息展示的类"""
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
"""初始化:加载所有已配置的命令(从commands模型查询)"""
|
|
|
|
|
self.commands = commands.objects.all()
|
|
|
|
|
|
|
|
|
|
def run(self, title):
|
|
|
|
|
"""
|
|
|
|
|
运行命令
|
|
|
|
|
:param title: 命令
|
|
|
|
|
:return: 返回命令执行结果
|
|
|
|
|
根据命令标题查找并执行对应的命令
|
|
|
|
|
:param title: 用户输入的命令标题(不区分大小写)
|
|
|
|
|
:return: 命令执行结果,未找到命令时返回帮助提示
|
|
|
|
|
"""
|
|
|
|
|
# 过滤出标题(不区分大小写)匹配的命令
|
|
|
|
|
cmd = list(
|
|
|
|
|
filter(
|
|
|
|
|
lambda x: x.title.upper() == title.upper(),
|
|
|
|
|
self.commands))
|
|
|
|
|
self.commands
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
# 若找到匹配命令,执行命令;否则返回未找到提示
|
|
|
|
|
if cmd:
|
|
|
|
|
return self.__run_command__(cmd[0].command)
|
|
|
|
|
else:
|
|
|
|
|
return "未找到相关命令,请输入hepme获得帮助。"
|
|
|
|
|
return "未找到相关命令,请输入hepme获得帮助。" # 注意:推测"hepme"应为"help"的笔误
|
|
|
|
|
|
|
|
|
|
def __run_command__(self, cmd):
|
|
|
|
|
"""
|
|
|
|
|
私有方法:执行系统命令并返回结果
|
|
|
|
|
:param cmd: 要执行的系统命令字符串
|
|
|
|
|
:return: 命令执行输出结果,出错时返回错误提示
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
# 使用os.popen执行命令并读取输出(注: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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 主程序入口:测试ChatGPT类功能
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
# 实例化ChatGPT对象
|
|
|
|
|
chatbot = ChatGPT()
|
|
|
|
|
# 定义测试提示词(生成1000字关于AI的论文)
|
|
|
|
|
prompt = "写一篇1000字关于AI的论文"
|
|
|
|
|
# 调用chat方法并打印结果(原代码缺少右括号,此处已补充)
|
|
|
|
|
print(chatbot.chat(prompt))
|
|
|
|
|
|