Dont require to be in the same folder as the repo to run, v0.0.5

This commit is contained in:
Anton Osika
2023-06-22 10:42:35 +02:00
parent 22c2e76026
commit ed1a7da296
13 changed files with 24 additions and 16 deletions

View File

@@ -11,6 +11,9 @@ class DB:
self.path.mkdir(parents=True, exist_ok=True) self.path.mkdir(parents=True, exist_ok=True)
def __contains__(self, key):
return (self.path / key).is_file()
def __getitem__(self, key): def __getitem__(self, key):
full_path = self.path / key full_path = self.path / key
@@ -35,6 +38,6 @@ class DB:
class DBs: class DBs:
memory: DB memory: DB
logs: DB logs: DB
identity: DB preprompts: DB
input: DB input: DB
workspace: DB workspace: DB

View File

@@ -1,6 +1,5 @@
import json import json
import logging import logging
import os
import shutil import shutil
from pathlib import Path from pathlib import Path
@@ -54,7 +53,7 @@ def main(
logs=DB(memory_path / "logs"), logs=DB(memory_path / "logs"),
input=DB(input_path), input=DB(input_path),
workspace=DB(workspace_path), workspace=DB(workspace_path),
identity=DB(Path(os.path.curdir) / "identity"), preprompts=DB(Path(__file__).parent / "preprompts"),
) )
for step in STEPS[steps_config]: for step in STEPS[steps_config]:

View File

@@ -3,6 +3,7 @@ import re
import subprocess import subprocess
from enum import Enum from enum import Enum
from typing import Callable, TypeVar
from gpt_engineer.ai import AI from gpt_engineer.ai import AI
from gpt_engineer.chat_to_files import to_files from gpt_engineer.chat_to_files import to_files
@@ -10,7 +11,12 @@ from gpt_engineer.db import DBs
def setup_sys_prompt(dbs): def setup_sys_prompt(dbs):
return dbs.identity["generate"] + "\nUseful to know:\n" + dbs.identity["philosophy"] return (
dbs.preprompts["generate"] + "\nUseful to know:\n" + dbs.preprompts["philosophy"]
)
Step = TypeVar("Step", bound=Callable[[AI, DBs], list[dict]])
def simple_gen(ai: AI, dbs: DBs): def simple_gen(ai: AI, dbs: DBs):
@@ -27,7 +33,7 @@ def clarify(ai: AI, dbs: DBs):
""" """
Ask the user if they want to clarify anything and save the results to the workspace Ask the user if they want to clarify anything and save the results to the workspace
""" """
messages = [ai.fsystem(dbs.identity["qa"])] messages = [ai.fsystem(dbs.preprompts["qa"])]
user = dbs.input["main_prompt"] user = dbs.input["main_prompt"]
while True: while True:
messages = ai.next(messages, user) messages = ai.next(messages, user)
@@ -64,7 +70,7 @@ def gen_spec(ai: AI, dbs: DBs):
ai.fsystem(f"Instructions: {dbs.input['main_prompt']}"), ai.fsystem(f"Instructions: {dbs.input['main_prompt']}"),
] ]
messages = ai.next(messages, dbs.identity["spec"]) messages = ai.next(messages, dbs.preprompts["spec"])
dbs.memory["specification"] = messages[-1]["content"] dbs.memory["specification"] = messages[-1]["content"]
@@ -73,7 +79,7 @@ def gen_spec(ai: AI, dbs: DBs):
def respec(ai: AI, dbs: DBs): def respec(ai: AI, dbs: DBs):
messages = json.loads(dbs.logs[gen_spec.__name__]) messages = json.loads(dbs.logs[gen_spec.__name__])
messages += [ai.fsystem(dbs.identity["respec"])] messages += [ai.fsystem(dbs.preprompts["respec"])]
messages = ai.next(messages) messages = ai.next(messages)
messages = ai.next( messages = ai.next(
@@ -102,7 +108,7 @@ def gen_unit_tests(ai: AI, dbs: DBs):
ai.fuser(f"Specification:\n\n{dbs.memory['specification']}"), ai.fuser(f"Specification:\n\n{dbs.memory['specification']}"),
] ]
messages = ai.next(messages, dbs.identity["unit_tests"]) messages = ai.next(messages, dbs.preprompts["unit_tests"])
dbs.memory["unit_tests"] = messages[-1]["content"] dbs.memory["unit_tests"] = messages[-1]["content"]
to_files(dbs.memory["unit_tests"], dbs.workspace) to_files(dbs.memory["unit_tests"], dbs.workspace)
@@ -118,7 +124,7 @@ def gen_clarified_code(ai: AI, dbs: DBs):
messages = [ messages = [
ai.fsystem(setup_sys_prompt(dbs)), ai.fsystem(setup_sys_prompt(dbs)),
] + messages[1:] ] + messages[1:]
messages = ai.next(messages, dbs.identity["use_qa"]) messages = ai.next(messages, dbs.preprompts["use_qa"])
to_files(messages[-1]["content"], dbs.workspace) to_files(messages[-1]["content"], dbs.workspace)
return messages return messages
@@ -133,7 +139,7 @@ def gen_code(ai: AI, dbs: DBs):
ai.fuser(f"Specification:\n\n{dbs.memory['specification']}"), ai.fuser(f"Specification:\n\n{dbs.memory['specification']}"),
ai.fuser(f"Unit tests:\n\n{dbs.memory['unit_tests']}"), ai.fuser(f"Unit tests:\n\n{dbs.memory['unit_tests']}"),
] ]
messages = ai.next(messages, dbs.identity["use_qa"]) messages = ai.next(messages, dbs.preprompts["use_qa"])
to_files(messages[-1]["content"], dbs.workspace) to_files(messages[-1]["content"], dbs.workspace)
return messages return messages
@@ -170,7 +176,7 @@ def gen_entrypoint(ai, dbs):
"From this you will answer with code blocks that includes all the necessary " "From this you will answer with code blocks that includes all the necessary "
"unix terminal commands to " "unix terminal commands to "
"a) install dependencies " "a) install dependencies "
"b) run all necessary parts of the codebase (in parallel if necessary).\n" "b) run all necessary parts of the codebase (in parallell if necessary).\n"
"Do not install globally. Do not use sudo.\n" "Do not install globally. Do not use sudo.\n"
"Do not explain the code, just give the commands.\n" "Do not explain the code, just give the commands.\n"
"Do not use placeholders, use example values (like . for a folder argument) " "Do not use placeholders, use example values (like . for a folder argument) "
@@ -191,7 +197,7 @@ def use_feedback(ai: AI, dbs: DBs):
ai.fsystem(setup_sys_prompt(dbs)), ai.fsystem(setup_sys_prompt(dbs)),
ai.fuser(f"Instructions: {dbs.input['main_prompt']}"), ai.fuser(f"Instructions: {dbs.input['main_prompt']}"),
ai.fassistant(dbs.workspace["all_output.txt"]), ai.fassistant(dbs.workspace["all_output.txt"]),
ai.fsystem(dbs.identity["use_feedback"]), ai.fsystem(dbs.preprompts["use_feedback"]),
] ]
messages = ai.next(messages, dbs.input["feedback"]) messages = ai.next(messages, dbs.input["feedback"])
to_files(messages[-1]["content"], dbs.workspace) to_files(messages[-1]["content"], dbs.workspace)
@@ -199,12 +205,12 @@ def use_feedback(ai: AI, dbs: DBs):
def fix_code(ai: AI, dbs: DBs): def fix_code(ai: AI, dbs: DBs):
code_output = json.loads(dbs.logs[gen_code.__name__])[-1]["content"] code_ouput = json.loads(dbs.logs[gen_code.__name__])[-1]["content"]
messages = [ messages = [
ai.fsystem(setup_sys_prompt(dbs)), ai.fsystem(setup_sys_prompt(dbs)),
ai.fuser(f"Instructions: {dbs.input['main_prompt']}"), ai.fuser(f"Instructions: {dbs.input['main_prompt']}"),
ai.fuser(code_output), ai.fuser(code_ouput),
ai.fsystem(dbs.identity["fix_code"]), ai.fsystem(dbs.preprompts["fix_code"]),
] ]
messages = ai.next(messages, "Please fix any errors in the code above.") messages = ai.next(messages, "Please fix any errors in the code above.")
to_files(messages[-1]["content"], dbs.workspace) to_files(messages[-1]["content"], dbs.workspace)

View File

@@ -3,7 +3,7 @@ requires = ["setuptools", "wheel"]
[project] [project]
name = "gpt-engineer" name = "gpt-engineer"
version = "0.0.4" version = "0.0.5"
description = "Specify what you want it to build, the AI asks for clarification, and then builds it." description = "Specify what you want it to build, the AI asks for clarification, and then builds it."
readme = "README.md" readme = "README.md"
requires-python = ">=3" requires-python = ">=3"