import logging import os import openai from servermanager.models import commands #wjl# 获取当前模块的 logger,用于记录日志 logger = logging.getLogger(__name__) #wjl# 从环境变量中读取 OpenAI API 密钥 openai.api_key = os.environ.get('OPENAI_API_KEY') #wjl# 如果设置了 HTTP 代理,则配置 openai 库使用该代理 if os.environ.get('HTTP_PROXY'): openai.proxy = os.environ.get('HTTP_PROXY') class ChatGPT: #wjl """ 封装与 OpenAI 的 ChatGPT 模型进行交互的功能。 提供静态方法 `chat` 用于发送用户提示并获取模型回复。 """ @staticmethod def chat(prompt): # wjl """ 调用 OpenAI 的 GPT-3.5 Turbo 模型生成回复。 参数: prompt (str): 用户输入的提示文本(问题或请求)。 返回: str: 模型生成的回复内容;如果调用失败,则返回错误提示。 流程: 1. 使用 openai.ChatCompletion.create 发起请求,指定模型为 "gpt-3.5-turbo"。 2. 将用户提示作为 role="user" 的消息发送。 3. 提取并返回模型返回的第一条消息内容。 4. 如果发生异常(如网络错误、认证失败等),记录错误日志并返回友好提示。 """ try: completion = openai.ChatCompletion.create( model="gpt-3.5-turbo", #wjl# 使用 GPT-3.5 Turbo 模型 messages=[{"role": "user", "content": prompt}] #wjl# 构造对话消息 ) return completion.choices[0].message.content #wjl# 返回模型生成的文本 except Exception as e: logger.error(e) #wjl# 记录异常信息到日志 return "服务器出错了" #wjl # 返回用户友好的错误提示 class CommandHandler: # wjl """ 命令处理器类,用于管理、查找和执行预定义的系统命令。 从数据库加载命令列表,支持通过名称查找并执行命令,以及获取帮助信息。 """ def __init__(self): # wjl """ 初始化 CommandHandler 实例。 从数据库中加载所有预定义的命令对象,存储在实例变量 self.commands 中。 """ self.commands = commands.objects.all() #wjl# 查询数据库中所有命令记录 def run(self, title): # wjl """ 根据命令标题查找并执行对应的系统命令。 参数: title (str): 用户输入的命令标题。 返回: str: 命令执行后的输出结果;如果未找到命令,则返回帮助提示。 流程: 1. 在 self.commands 列表中查找 title(忽略大小写)匹配的命令。 2. 如果找到匹配的命令,调用私有方法 __run_command__ 执行其对应的操作。 3. 如果未找到,则返回提示信息,引导用户输入 'hepme' 获取帮助。 """ cmd = list( filter( lambda x: x.title.upper() == title.upper(), #wjl# 忽略大小写比较 self.commands)) if cmd: return self.__run_command__(cmd[0].command) #wjl# 执行找到的命令 else: return "未找到相关命令,请输入hepme获得帮助。" def __run_command__(self, cmd): # wjl """ 执行给定的系统命令(shell 命令)。 参数: cmd (str): 要执行的系统命令字符串。 返回: str: 命令执行的标准输出;如果执行出错,则返回错误提示。 说明: 使用 os.popen 打开一个管道来执行命令,并读取其输出。 捕获所有异常(包括执行失败、权限问题等),防止程序崩溃。 """ try: res = os.popen(cmd).read() #wjl# 执行命令并读取输出 return res except BaseException: return '命令执行出错!' def get_help(self): # wjl """ 生成帮助信息,列出所有可用的命令及其描述。 返回: str: 格式化的帮助文本,每行包含一个命令的标题和描述,用冒号分隔。 说明: 遍历 self.commands 中的所有命令,拼接成一个字符串,用于向用户展示可用命令。 """ rsp = '' for cmd in self.commands: rsp += '{c}:{d}\n'.format(c=cmd.title, d=cmd.describe) #wjl# 拼接命令帮助信息 return rsp if __name__ == '__main__': # wjl """ 主程序入口,用于测试 ChatGPT 类的功能。 创建 ChatGPT 实例,发送一个测试提示,并打印模型回复。 """ chatbot = ChatGPT() prompt = "写一篇1000字关于AI的论文" print(chatbot.chat(prompt))