feat: add additonal user actions for modifying prompt and copying command to clipboard.

This commit is contained in:
Joshua Hamlet
2023-03-22 22:38:38 -07:00
parent d7bbf9e200
commit fd552f0779
2 changed files with 53 additions and 25 deletions
+1
View File
@@ -4,3 +4,4 @@ colorama==0.4.4
python-dotenv==1.0.0 python-dotenv==1.0.0
distro==1.7.0 distro==1.7.0
PyYAML==5.4.1 PyYAML==5.4.1
pyperclip==1.8.2
+50 -23
View File
@@ -12,6 +12,7 @@ import subprocess
import dotenv import dotenv
import distro import distro
import yaml import yaml
import pyperclip
from termcolor import colored from termcolor import colored
from colorama import init from colorama import init
@@ -131,13 +132,14 @@ if __name__ == "__main__":
arguments = sys.argv[command_start_idx:] arguments = sys.argv[command_start_idx:]
user_prompt = " ".join(arguments) user_prompt = " ".join(arguments)
def call_open_ai(query):
# do we have a prompt from the user? # do we have a prompt from the user?
if user_prompt == "": if query == "":
print ("No user prompt specified.") print ("No user prompt specified.")
sys.exit(-1) sys.exit(-1)
# Load the correct prompt based on Shell and OS and append the user's prompt # Load the correct prompt based on Shell and OS and append the user's prompt
prompt = get_full_prompt(user_prompt, shell) prompt = get_full_prompt(query, shell)
# Make the first line also the system prompt # Make the first line also the system prompt
system_prompt = prompt[1] system_prompt = prompt[1]
@@ -154,32 +156,57 @@ if __name__ == "__main__":
max_tokens=config["max_tokens"], max_tokens=config["max_tokens"],
) )
#print (response) return response.choices[0].message.content.strip()
res_command = response.choices[0].message.content.strip()
#Enable color output on Windows using colorama #Enable color output on Windows using colorama
init() init()
prefixes = ("sorry", "i'm sorry", "the question is not clear", "i'm", "i am") def check_for_issue(response):
if res_command.lower().startswith(prefixes): prefixes = ("sorry", "i'm sorry", "the question is not clear", "i'm", "i am")
print(colored("There was an issue: "+res_command, 'red')) if response.lower().startswith(prefixes):
sys.exit(-1) print(colored("There was an issue: "+response, 'red'))
sys.exit(-1)
# odd corner case, sometimes ChatCompletion returns markdown def check_for_markdown(response):
if res_command.count("```",2): # odd corner case, sometimes ChatCompletion returns markdown
print(colored("The proposed command contains markdown, so I did not execute the response directly: \n", 'red')+res_command) if response.count("```",2):
sys.exit(-1) print(colored("The proposed command contains markdown, so I did not execute the response directly: \n", 'red')+response)
sys.exit(-1)
print("Command: " + colored(res_command, 'blue')) def prompt_user_input(response):
if config["safety"] != "off" or ask_flag == True: print("Command: " + colored(response, 'blue'))
print("Execute the command? [Y/n] ==> ", end = '') if config["safety"] != "off" or ask_flag == True:
yolo = input() print("Execute command? [Y]es [n]o [m]odify [c]opy to clipboard ==> ", end = '')
print() user_input = input()
return user_input
if yolo.upper() == "Y" or yolo == "": def evaluate_input(user_input, command):
if shell == "powershell.exe": if user_input.upper() == "Y" or user_input == "":
subprocess.run([shell, "/c", res_command], shell=False) if shell == "powershell.exe":
else: subprocess.run([shell, "/c", command], shell=False)
# Unix: /bin/bash /bin/zsh: uses -c both Ubuntu and macOS should work, others might not else:
subprocess.run([shell, "-c", res_command], shell=False) # Unix: /bin/bash /bin/zsh: uses -c both Ubuntu and macOS should work, others might not
subprocess.run([shell, "-c", command], shell=False)
if user_input.upper() == "M":
print("Modify prompt: ", end = '')
modded_query = input()
modded_response = call_open_ai(modded_query)
print(modded_response)
check_for_issue(modded_response)
check_for_markdown(modded_response)
modded_user_input = prompt_user_input(modded_response)
print()
evaluate_input(modded_user_input, modded_response)
if user_input.upper() == "C":
pyperclip.copy(command)
print("Copied command to clipboard.")
res_command = call_open_ai(user_prompt)
check_for_issue(res_command)
check_for_markdown(res_command)
user_iput = prompt_user_input(res_command)
print()
evaluate_input(user_iput, res_command)