diff --git a/coder.py b/coder.py index f766088af..e116492b7 100755 --- a/coder.py +++ b/coder.py @@ -22,6 +22,8 @@ import openai from dump import dump +import prompts + history_file = '.coder.history' try: readline.read_history_file(history_file) @@ -32,58 +34,6 @@ formatter = formatters.TerminalFormatter() openai.api_key = os.getenv("OPENAI_API_KEY") -prompt_webdev = ''' -I want you to act as an expert software engineer and pair programmer. -You are an expert at understanding code and proposing code changes in response to user requests. - -Your job is to: - - Understand what the user wants. Ask questions if needed! - - Suggest changes to the code by performing search and replace using the syntax below. - -FOR EACH CHANGE TO THE CODE, DESCRIBE IT USING THIS FORMAT: - -path/to/filename.ext -<<<<<<< ORIGINAL -original lines -to search for -======= -new lines to replace -the original chunk ->>>>>>> UPDATED - -ONLY USE THIS ORIGINAL/UPDATED FORMAT TO DESCRIBE CODE CHANGES! - -Example: - -foo.py -<<<<<<< ORIGINAL -print(1+1) -======= -print(2+2) ->>>>>>> UPDATED - - -To add new code, anchor it by including 2-3 lines in the ORIGINAL and UPDATED portions of the diff. -Don't just output the ENTIRE file. Turn it into an edit. -''' - -prompt_comments = ''' -I want you to act as a web development expert. -I want you to answer only with comments in the code. -Whatever the user requests, add comments in the code showing how to make the requested change and explaining why it will work. -Just add comments to the code. -Output the new version of the code with added comments. -Embed lots of comments in the code explaining how and where to make changes. -MAKE NO OTHER CHANGES! - -For each file, output like this: - -path/to/filename.ext -``` -... file content ... -``` -''' - def find_index(list1, list2): for i in range(len(list1)): @@ -94,9 +44,6 @@ def find_index(list1, list2): class Coder: fnames = dict() - def system(self, prompt): - self.system_prompt = prompt - def add_file(self, fname): self.fnames[fname] = Path(fname).stat().st_mtime @@ -116,79 +63,11 @@ class Coder: prompt += '\n```\n' return prompt - def run_davinci(self): - prompt = '' - prompt += 'Original code:\n\n' - - for fname in self.fnames: - prompt += self.quoted_file(fname) - - prompt += '\n###\n' - prompt += self.request_prompt - - prompt += '\n###\n' - - prompt += 'Modified code including those changes:\n\n' - - completion = openai.Completion.create( - model="text-davinci-003", - prompt= prompt, - max_tokens=2048, - temperature=0, - stream = True, - ) - resp = '' - for chunk in completion: - try: - text = chunk.choices[0].text - resp += text - except AttributeError: - continue - - sys.stdout.write(text) - sys.stdout.flush() - - resp = ''.join(resp) - self.update_files(resp) - - - def run_edit(self): - prompt = '' - for fname in self.fnames: - prompt += self.quoted_file(fname) - - completion = openai.Edit.create( - model="code-davinci-edit-001", - instruction= prompt, - input=prompt, - #max_tokens=2048, - temperature=0, - ) - dump(completion) - resp = [] - for chunk in completion: - try: - text = chunk.choices[0].text - resp.append(text) - except AttributeError: - continue - sys.stdout.write(text) - sys.stdout.flush() - - resp = ''.join(resp) - self.update_files(resp) - - def get_files_content(self): prompt = '' for fname in self.fnames: prompt += self.quoted_file(fname) - prompt += '''' - -YOU CAN ONLY EDIT THESE FILES. -NEVER REPLY WITH WHOLE FILES LIKE THIS! -ONLY TELL ME CODE CHANGES USING ORIGINAL/UPDATED EDIT COMMANDS! -''' + prompt += prompts.files_content_suffix return prompt def get_input(self): @@ -209,7 +88,7 @@ ONLY TELL ME CODE CHANGES USING ORIGINAL/UPDATED EDIT COMMANDS! def run(self): messages = [ - dict(role = 'system', content = self.system_prompt), + dict(role = 'system', content = prompts.main_system), ] did_edits = False @@ -219,9 +98,10 @@ ONLY TELL ME CODE CHANGES USING ORIGINAL/UPDATED EDIT COMMANDS! return if did_edits: - files_prefix = 'I made your suggested changes, here are the updated files:' + files_prefix = prompts.files_content_prefix_edited else: - files_prefix = 'Here are the files:' + files_prefix = prompts.files_content_prefix_plain + files_prefix += '\n\n' messages += [ @@ -405,35 +285,15 @@ ONLY TELL ME CODE CHANGES USING ORIGINAL/UPDATED EDIT COMMANDS! fname = Path(fname) content = fname.read_text() - prompt = f''' -To complete this request: - -{request} - -You need to apply this change: - -{edit} - -To this file: - -{fname} -``` -{content} -``` - -ONLY OUTPUT {fname} !!! -''' - sys_prompt = ''' -You are an expert code editor. -Perform the requested edit. -Output ONLY the new version of the file. -Just that one file. -Do not output explanations! -Do not wrap the output in ``` delimiters. -''' + prompt = prompts.editor_user.format( + request = request, + edit = edit, + fname = fname, + content = content, + ) messages = [ - dict(role = 'system', content = sys_prompt), + dict(role = 'system', content = prompts.editor_system), dict(role = 'user', content = prompt), ] res = self.send(messages, show_progress = len(content) + len(edit)/2) @@ -458,37 +318,11 @@ Do not wrap the output in ``` delimiters. return res - -def test_do_gpt_powered_replace(coder): - fname = Path('../easy-chat/index.html') - edit = ''' -../easy-chat/index.html -<<<<<<< ORIGINAL -

Hello!

-

How can I help - you?

-======= -

Hello!

-

How can I helpyou?

->>>>>>> UPDATED -''' - coder.do_gpt_powered_replace(fname, edit) - coder = Coder() -#test_do_gpt_powered_replace(coder) ; sys.exit() -coder.system(prompt_webdev) for fname in sys.argv[1:]: coder.add_file(fname) #coder.update_files(Path('tmp.commands').read_text()) ; sys.exit() coder.run() - -''' -Change all the speaker icons to orange. - -Currently the speaker icons come before the text of each message. Move them so they come after the text instead. - -Move the About and New Chat links into a hamburger menu. -''' diff --git a/prompts.py b/prompts.py new file mode 100644 index 000000000..eb089ccf7 --- /dev/null +++ b/prompts.py @@ -0,0 +1,76 @@ + +main_system = ''' +I want you to act as an expert software engineer and pair programmer. +You are an expert at understanding code and proposing code changes in response to user requests. + +Your job is to: + - Understand what the user wants. Ask questions if needed! + - Suggest changes to the code by performing search and replace using the syntax below. + +FOR EACH CHANGE TO THE CODE, DESCRIBE IT USING THIS FORMAT: + +path/to/filename.ext +<<<<<<< ORIGINAL +original lines +to search for +======= +new lines to replace +the original chunk +>>>>>>> UPDATED + +ONLY USE THIS ORIGINAL/UPDATED FORMAT TO DESCRIBE CODE CHANGES! + +Example: + +foo.py +<<<<<<< ORIGINAL +print(1+1) +======= +print(2+2) +>>>>>>> UPDATED + + +To add new code, anchor it by including 2-3 lines in the ORIGINAL and UPDATED portions of the diff. +Don't just output the ENTIRE file. Turn it into an edit. +''' + +files_content_suffix = '''' + +YOU CAN ONLY EDIT THESE FILES. +NEVER REPLY WITH WHOLE FILES LIKE THIS! +ONLY TELL ME CODE CHANGES USING ORIGINAL/UPDATED EDIT COMMANDS! +''' + +files_content_prefix_edited = 'I made your suggested changes, here are the updated files:' + +files_content_prefix_plain = 'Here are the files:' + + + +editor_system = ''' +You are an expert code editor. +Perform the requested edit. +Output ONLY the new version of the file. +Just that one file. +Do not output explanations! +Do not wrap the output in ``` delimiters. +''' + +editor_user = ''' +To complete this request: + +{request} + +You need to apply this change: + +{edit} + +To this file: + +{fname} +``` +{content} +``` + +ONLY OUTPUT {fname} !!! +'''