simpleGPT/simpleGPT.py

70 lines
2.4 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)
import openai
if "OPENAI_API_KEY" in os.environ:
openai.api_key = os.environ["OPENAI_API_KEY"]
elif os.path.isfile(os.path.join(userDir,"api_key.txt")):
openai.api_key = open(os.path.join(userDir,"api_key.txt"),"r").read().strip(" \t\r\n")
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
userFile = os.path.join(userDir,"conversations",sys.argv[1] + ".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[2],userFile]).wait()
lst = convertHumanReadableToList(open(userFile,"r",encoding="utf8").read())
if lst[-1]["role"] != "user" or lst[-1]["content"].strip(" \t\r\n") == "": sys.exit(0)
print("Awaiting response ...")
response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=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)