You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
DjangoBlog/servermanager/api/commonapi.py

104 lines
4.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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))