91 lines
3.0 KiB
Python
Executable File
91 lines
3.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import sys
|
|
import os
|
|
import subprocess
|
|
import json
|
|
import time
|
|
if len(sys.argv) < 3: print("Arguments: <text editor> <topic>"); sys.exit(1)
|
|
prettyDistro = "simpleGPT"
|
|
distro = "me.fier." +prettyDistro
|
|
if "APPDATA" in os.environ: userDir = os.environ["APPDATA"]
|
|
if "HOME" in os.environ: userDir = os.path.join(os.environ["HOME"],".config")
|
|
userDir = os.path.join(userDir,distro)
|
|
os.makedirs(os.path.join(userDir,"conversations"),exist_ok = True)
|
|
|
|
api_key = False
|
|
if "OPENAI_API_KEY" in os.environ:
|
|
api_key = os.environ["OPENAI_API_KEY"]
|
|
elif os.path.isfile(os.path.join(userDir,"api_key.txt")):
|
|
api_key = open(os.path.join(userDir,"api_key.txt"),"r").read().strip(" \t\r\n")
|
|
|
|
if api_key == False:
|
|
print("Couldn't find API key, please set OPENAI_API_KEY or create " +os.path.join(userDir,"api_key.txt"))
|
|
os.exit(1)
|
|
|
|
rolePrefix = "* "
|
|
roleSuffix = " says:"
|
|
roles = ["system","user","assistant"]
|
|
|
|
def convertListToHumanReadable(lst):
|
|
txt = ""
|
|
for message in lst:
|
|
txt += rolePrefix +message["role"]+ roleSuffix + "\n" +message["content"].strip("\n")+ "\n\n"
|
|
return txt
|
|
|
|
def convertHumanReadableToList(txt):
|
|
lst = []
|
|
txt = txt.split("\n")
|
|
message = False
|
|
for line in txt:
|
|
isrole = False
|
|
for role in roles:
|
|
if line == rolePrefix + role + roleSuffix:
|
|
if message != False:
|
|
message["content"] = message["content"].strip("\n")
|
|
lst.append(message)
|
|
|
|
message = {"role": role, "content": ""}
|
|
isrole = True
|
|
break
|
|
|
|
if isrole: continue
|
|
message["content"] += line + "\n"
|
|
lst.append(message)
|
|
return lst
|
|
|
|
import urllib.parse
|
|
import urllib.request
|
|
def chatCompletion(lst):
|
|
lstOut = {}
|
|
lstOut["model"] = "gpt-3.5-turbo"
|
|
lstOut["messages"] = lst
|
|
data = json.dumps(lstOut).encode("utf-8")
|
|
dataLength = len(data)
|
|
request = urllib.request.Request("https://api.openai.com/v1/chat/completions",data=data)
|
|
request.add_header("Content-Type","application/json")
|
|
request.add_header("Authorization","Bearer " + api_key)
|
|
response = urllib.request.urlopen(request)
|
|
rtn = json.loads(response.read().decode("utf-8"))
|
|
response.close()
|
|
return rtn
|
|
|
|
userFile = os.path.join(userDir,"conversations",sys.argv[2] + ".txt")
|
|
userFileTmp = userFile + ".tmp"
|
|
if not os.path.isfile(userFile):
|
|
lst = []
|
|
lst.append({"role": "system", "content": "You are a smart and helpful chat assistant."})
|
|
lst.append({"role": "user", "content": ""})
|
|
open(userFile,"w",encoding="utf-8").write(convertListToHumanReadable(lst).strip(" \t\r\n") + "\n")
|
|
|
|
while True:
|
|
subprocess.Popen([sys.argv[1],userFile]).wait()
|
|
lst = convertHumanReadableToList(open(userFile,"r",encoding="utf8").read())
|
|
lst[-1]["content"] = lst[-1]["content"].strip(" \t\r\n")
|
|
if not (lst[-1]["role"] in ["user","system"]) or lst[-1]["content"] == "": sys.exit(0)
|
|
print("Awaiting response ...")
|
|
response = chatCompletion(lst)
|
|
lst.append({"role": "assistant", "content": response["choices"][0]["message"]["content"]})
|
|
lst.append({"role": "user", "content": ""})
|
|
open(userFileTmp,"w",encoding="utf-8").write(convertListToHumanReadable(lst).strip(" \t\r\n") + "\n")
|
|
os.replace(userFileTmp,userFile)
|