我最近开发了一个适用于Sublime Text的ChatGPT插件,旨在通过允许用户直接向ChatGPT发送代码片段和具体问题来增强编码体验。这种集成旨在提供快速且智能的响应,促进更流畅的编码工作流程。
然而,我在Sublime Text中遇到了显示问题,ChatGPT的响应格式未能正确渲染。
import osimport sublimeimport sublime_pluginimport http.clientimport requestsimport jsonOPENAI_API_KEY = ""class SendToGptCommand(sublime_plugin.TextCommand): def run(self, edit): # 捕获选中的文本 self.selected_text = '' for region in self.view.sel(): if not region.empty(): self.selected_text = self.view.substr(region) # 提示用户输入额外信息 self.view.window().show_input_panel("输入您的问题:", "", self.on_done, None, None) def on_done(self, user_input): code = textwrap.dedent(self.selected_text) # 结合用户的问题和选中的文本 data = { 'code': code, 'question': user_input } # 以HTTP请求的形式发送数据 self.send_http_request(data) def send_http_request(self, data): url = 'https://api.openai.com/v1/chat/completions' headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {OPENAI_API_KEY}' } req = { 'model': 'gpt-3.5-turbo', 'messages': [ { 'role': 'system', 'content': '您是一个有帮助的编码助手。' }, { 'role': 'system', 'content': f"context code:```{data['code']}```" }, { 'role': 'user', 'content': f"question: {data['question']}" } ] } # 初始化结果 result = "" try: response = requests.post(url, headers=headers, data=json.dumps(req)) response.raise_for_status() # 如果请求不成功则引发异常 response_json = response.json() # 获取HTTP响应并提取完成内容 if 'choices' in response_json: choices = response_json['choices'] messages = [] # 存储消息的列表 for choice in choices: # 从每个选择中提取'message' if 'message' in choice: messages.append(choice['message']['content']) else: messages.append("message字段在选择中未找到") # 将消息连接成一个字符串 result = " ".join(messages) else: result = "响应中未找到choices字段" except (requests.RequestException, json.JSONDecodeError) as err: result = f"请求过程中发生错误: {str(err)}" self.display_result(data['question'], data['code'], result) def display_result(self, question, code, result): # 创建一个新的缓冲区(标签页) new_view = self.view.window().new_file() # 设置语法为Markdown new_view.set_syntax_file("Packages/Markdown/Markdown.sublime-syntax") # 插入问题、代码和响应 content = f"""提出的问题:\n\n{question}\n\n""" new_view.run_command('insert', {'characters': content}) content = f"""代码:\n{code}\n\n""" new_view.run_command('insert', {'characters': content}) content = f"""响应:\n{result}\n\n""" new_view.run_command('insert', {'characters': content})
这是响应内容:
提出的问题:让我们测试这段代码?代码:def display_result(self, question, code, result): print(code) code = textwrap.dedent(code) print(code) # 创建一个新的缓冲区(标签页) new_view = self.view.window().new_file() # 设置语法为Markdown new_view.set_syntax_file("Packages/Markdown/Markdown.sublime-syntax") # 插入问题、代码和响应 content = f"""提出的问题:\n\n{question}\n\n""" new_view.run_command('insert', {'characters': content}) content = f"""代码:\n{code}\n\n""" new_view.run_command('insert', {'characters': content}) content = f"""响应:\n{result}\n\n""" new_view.run_command('insert', {'characters': content}) 响应: 当然,请提供您想要测试的代码。
这是响应应该呈现的样子:
提出的问题:让我们测试这段代码?代码:def display_result(self, question, code, result): print(code) code = textwrap.dedent(code) print(code) # 创建一个新的缓冲区(标签页) new_view = self.view.window().new_file() # 设置语法为Markdown new_view.set_syntax_file("Packages/Markdown/Markdown.sublime-syntax") # 插入问题、代码和响应 content = f"""提出的问题:\n\n{question}\n\n""" new_view.run_command('insert', {'characters': content}) content = f"""代码:\n{code}\n\n""" new_view.run_command('insert', {'characters': content}) content = f"""响应:\n{result}\n\n""" new_view.run_command('insert', {'characters': content})响应:当然,请提供您想要测试的代码。
我不确定为什么会有这些额外的空格/制表符。
感谢您的帮助。
回答:
使用'append'
代替'insert'
,或者关闭自动缩进: new_view.settings().set('auto_indent', False)