我最近为 Sublime Text 开发了一个 ChatGPT 插件,该插件旨在通过使用户能够直接将代码片段以及特定问题发送到 ChatGPT 来增强编码体验。这种集成旨在提供快速、智能的响应,促进更顺畅的编码工作流程。
但是,我在 Sublime Text 中遇到显示问题,其中 ChatGPT 响应的格式未正确呈现。
import os
import sublime
import sublime_plugin
import http.client
import requests
import json
OPENAI_API_KEY = ""
class SendToGptCommand(sublime_plugin.TextCommand):
def run(self, edit):
# Capture the selected text
self.selected_text = ''
for region in self.view.sel():
if not region.empty():
self.selected_text = self.view.substr(region)
# Prompt the user for additional input
self.view.window().show_input_panel("Enter your question:", "", self.on_done, None, None)
def on_done(self, user_input):
code = textwrap.dedent(self.selected_text)
# Combine the user's question with the selected text
data = {
'code': code,
'question': user_input
}
# Send the data as an HTTP request
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': 'You are a helpful coding assistant.'
},
{
'role': 'system',
'content': f"context code:```{data['code']}```"
},
{
'role': 'user',
'content': f"question: {data['question']}"
}
]
}
# Initialize result
result = ""
try:
response = requests.post(url, headers=headers, data=json.dumps(req))
response.raise_for_status() # Raise exception if the request was not successful
response_json = response.json()
# Get the HTTP response and extract the completion
if 'choices' in response_json:
choices = response_json['choices']
messages = [] # List to store messages
for choice in choices:
# Extract 'message' from each choice
if 'message' in choice:
messages.append(choice['message']['content'])
else:
messages.append("message field not found in choice")
# Join messages into a single string
result = " ".join(messages)
else:
result = "Choices field not found in response"
except (requests.RequestException, json.JSONDecodeError) as err:
result = f"Error occurred during request: {str(err)}"
self.display_result(data['question'], data['code'], result)
def display_result(self, question, code, result):
# Create a new buffer (tab)
new_view = self.view.window().new_file()
# Set the syntax to Markdown
new_view.set_syntax_file("Packages/Markdown/Markdown.sublime-syntax")
# Insert the question, code, and response
content = f"""Question Asked:\n\n{question}\n\n"""
new_view.run_command('insert', {'characters': content})
content = f"""Code:\n{code}\n\n"""
new_view.run_command('insert', {'characters': content})
content = f"""Response:\n{result}\n\n"""
new_view.run_command('insert', {'characters': content})
回复如下:
Question Asked:
Lets test this code ?
Code:
def display_result(self, question, code, result):
print(code)
code = textwrap.dedent(code)
print(code)
# Create a new buffer (tab)
new_view = self.view.window().new_file()
# Set the syntax to Markdown
new_view.set_syntax_file("Packages/Markdown/Markdown.sublime-syntax")
# Insert the question, code, and response
content = f"""Question Asked:\n\n{question}\n\n"""
new_view.run_command('insert', {'characters': content})
content = f"""Code:\n{code}\n\n"""
new_view.run_command('insert', {'characters': content})
content = f"""Response:\n{result}\n\n"""
new_view.run_command('insert', {'characters': content})
Response:
Sure, please provide the code that you would like to test.
这就是响应的样子。
Question Asked:
Lets test this code ?
Code:
def display_result(self, question, code, result):
print(code)
code = textwrap.dedent(code)
print(code)
# Create a new buffer (tab)
new_view = self.view.window().new_file()
# Set the syntax to Markdown
new_view.set_syntax_file("Packages/Markdown/Markdown.sublime-syntax")
# Insert the question, code, and response
content = f"""Question Asked:\n\n{question}\n\n"""
new_view.run_command('insert', {'characters': content})
content = f"""Code:\n{code}\n\n"""
new_view.run_command('insert', {'characters': content})
content = f"""Response:\n{result}\n\n"""
new_view.run_command('insert', {'characters': content})
Response:
Sure, please provide the code that you would like to test.
我不确定为什么有这些额外的空格/制表符。
感谢您的帮助。
使用
'append'
代替 'insert'
或关闭自动缩进:new_view.settings().set('auto_indent', False)