Skip to content

Commit 3996fbb

Browse files
authored
Merge pull request #897 from ATheorell/main
Updates of build system with related changes to CI
2 parents 26a1ec7 + ec35094 commit 3996fbb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+769
-710
lines changed

.pre-commit-config.yaml

+5-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ repos:
1111
args: [--config, pyproject.toml]
1212
types: [python]
1313

14-
# - repo: https://github.com/charliermarsh/ruff-pre-commit
15-
# rev: "v0.0.272"
16-
# hooks:
17-
# - id: ruff
18-
# args: [--fix, --exit-non-zero-on-fix]
14+
- repo: https://github.com/charliermarsh/ruff-pre-commit
15+
rev: "v0.0.272"
16+
hooks:
17+
- id: ruff
18+
args: [--fix, --exit-non-zero-on-fix]
1919

2020
- repo: https://github.com/pre-commit/pre-commit-hooks
2121
rev: v4.4.0

gpt_engineer/__init__.py

-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
# Adding convenience imports to the package
2-
from gpt_engineer.core import (
3-
ai,
4-
chat_to_files,
5-
)
62

73
# from gpt_engineer.tools import code_vector_repository
84
# from gpt_engineer.core.default import on_disk_repository

gpt_engineer/applications/cli/cli_agent.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
1-
from gpt_engineer.core.files_dict import FilesDict
1+
from typing import Callable, TypeVar
22

33
# from gpt_engineer.core.default.git_version_manager import GitVersionManager
44
from gpt_engineer.core.ai import AI
5+
from gpt_engineer.core.base_agent import BaseAgent
6+
from gpt_engineer.core.base_execution_env import BaseExecutionEnv
7+
from gpt_engineer.core.base_memory import BaseMemory
8+
from gpt_engineer.core.default.disk_execution_env import DiskExecutionEnv
9+
from gpt_engineer.core.default.disk_memory import DiskMemory
10+
from gpt_engineer.core.default.paths import ENTRYPOINT_FILE, PREPROMPTS_PATH
511
from gpt_engineer.core.default.steps import (
12+
execute_entrypoint,
613
gen_code,
714
gen_entrypoint,
8-
execute_entrypoint,
915
improve,
1016
)
11-
from gpt_engineer.core.base_memory import BaseMemory
12-
from gpt_engineer.core.default.disk_memory import DiskMemory
13-
from gpt_engineer.core.base_execution_env import BaseExecutionEnv
14-
from gpt_engineer.core.default.disk_execution_env import DiskExecutionEnv
15-
from gpt_engineer.core.default.paths import memory_path, ENTRYPOINT_FILE, PREPROMPTS_PATH
16-
from gpt_engineer.core.base_agent import BaseAgent
17+
from gpt_engineer.core.files_dict import FilesDict
1718
from gpt_engineer.core.preprompts_holder import PrepromptsHolder
18-
from typing import TypeVar, Callable, Union
19-
from pathlib import Path
2019

2120
CodeGenType = TypeVar("CodeGenType", bound=Callable[[AI, str, BaseMemory], FilesDict])
2221
CodeProcessor = TypeVar(

gpt_engineer/applications/cli/collect.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,16 @@
2323
Consent logic is in gpt_engineer/learning.py.
2424
2525
"""
26-
import hashlib
2726

28-
from typing import List, Tuple
27+
from typing import Tuple
2928

30-
from gpt_engineer.core.default.disk_memory import DiskMemory
3129
from gpt_engineer.applications.cli.learning import (
3230
Learning,
31+
Review,
3332
extract_learning,
3433
human_review_input,
35-
Review,
3634
)
35+
from gpt_engineer.core.default.disk_memory import DiskMemory
3736

3837

3938
def send_learning(learning: Learning):
@@ -88,7 +87,7 @@ def collect_learnings(
8887
learnings = extract_learning(prompt, model, temperature, config, memory, review)
8988
try:
9089
send_learning(learnings)
91-
except RuntimeError as e:
90+
except RuntimeError:
9291
# try to remove some parts of learning that might be too big
9392
# rudderstack max event size is 32kb
9493
max_size = 32 << 10 # 32KB in bytes
@@ -100,7 +99,8 @@ def collect_learnings(
10099
remove_length = overflow + len(f"[REMOVED {overflow} CHARACTERS]") + 100
101100

102101
learnings.logs = (
103-
learnings.logs[:-remove_length] + f"\n\n[REMOVED {remove_length} CHARACTERS]"
102+
learnings.logs[:-remove_length]
103+
+ f"\n\n[REMOVED {remove_length} CHARACTERS]"
104104
)
105105

106106
print(
@@ -109,7 +109,7 @@ def collect_learnings(
109109
)
110110
try:
111111
send_learning(learnings)
112-
except RuntimeError as e:
112+
except RuntimeError:
113113
print(
114114
"Sending learnings crashed despite truncation. Progressing without saving learnings."
115115
)

gpt_engineer/applications/cli/file_selector.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ def display_name(self) -> str:
119119
return self.path.name
120120

121121
@classmethod
122-
def make_tree(cls, root: Union[str, Path], parent=None, is_last=False, criteria=None):
122+
def make_tree(
123+
cls, root: Union[str, Path], parent=None, is_last=False, criteria=None
124+
):
123125
"""
124126
Generate a tree of DisplayablePath objects.
125127

gpt_engineer/applications/cli/learning.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
from dataclasses import dataclass, field
4848
from datetime import datetime
4949
from pathlib import Path
50-
from typing import List, Optional, Tuple
50+
from typing import Optional, Tuple
5151

5252
from dataclasses_json import dataclass_json
5353
from termcolor import colored

gpt_engineer/applications/cli/main.py

+33-18
Original file line numberDiff line numberDiff line change
@@ -25,32 +25,39 @@
2525
2626
"""
2727

28+
import logging
2829
import os
30+
31+
from importlib.util import find_spec
2932
from pathlib import Path
3033

3134
import openai
35+
import toml
3236
import typer
37+
3338
from dotenv import load_dotenv
3439

35-
from gpt_engineer.core.default.file_store import FileStore
36-
from gpt_engineer.core.default.disk_memory import DiskMemory
37-
from gpt_engineer.core.ai import AI
38-
from gpt_engineer.core.default.paths import PREPROMPTS_PATH, memory_path
39-
from gpt_engineer.applications.cli.file_selector import ask_for_files, get_all_code
40-
from gpt_engineer.tools.custom_steps import (
41-
lite_gen,
42-
clarified_gen,
43-
self_heal,
44-
)
45-
from gpt_engineer.tools.experimental.experimental_steps import (
46-
improve_automatic_file_selection,
47-
)
48-
from gpt_engineer.core.default.steps import gen_code, execute_entrypoint, improve
4940
from gpt_engineer.applications.cli.cli_agent import CliAgent
5041
from gpt_engineer.applications.cli.collect import collect_and_send_human_review
51-
from gpt_engineer.core.preprompts_holder import PrepromptsHolder
42+
from gpt_engineer.applications.cli.file_selector import ask_for_files
43+
from gpt_engineer.core.ai import AI
5244
from gpt_engineer.core.default.disk_execution_env import DiskExecutionEnv
53-
import logging
45+
from gpt_engineer.core.default.disk_memory import DiskMemory
46+
from gpt_engineer.core.default.file_store import FileStore
47+
from gpt_engineer.core.default.paths import PREPROMPTS_PATH, memory_path
48+
from gpt_engineer.core.default.steps import execute_entrypoint, gen_code, improve
49+
from gpt_engineer.core.preprompts_holder import PrepromptsHolder
50+
from gpt_engineer.tools.custom_steps import clarified_gen, lite_gen, self_heal
51+
52+
# Load the names of the optional dependencies from the pyprojecct file and determine whether
53+
# they can be imported
54+
with open("pyproject.toml", "r") as file:
55+
pyproject = toml.load(file)
56+
57+
dependency_group = pyproject["tool"]["poetry"]["group"]["experimental"]["dependencies"]
58+
optional_deps_importable = all(
59+
[find_spec(dep_name.replace("-", "_")) is not None for dep_name in dependency_group]
60+
)
5461

5562
app = typer.Typer() # creates a CLI app
5663

@@ -105,7 +112,7 @@ def main(
105112
),
106113
improve_all_mode: bool = typer.Option(
107114
False,
108-
"--improve_all_experimental",
115+
"--improve-all-experimental",
109116
help="Improve files_dict from existing project, without manually choosing which files to improve, using vector store (EXPERIMENTAL).",
110117
),
111118
lite_mode: bool = typer.Option(
@@ -185,8 +192,16 @@ def main(
185192
else:
186193
execution_fn = execute_entrypoint
187194

188-
if improve_all_mode:
195+
if improve_all_mode and optional_deps_importable:
196+
from gpt_engineer.tools.experimental.experimental_steps import (
197+
improve_automatic_file_selection,
198+
)
199+
189200
improve_fn = improve_automatic_file_selection
201+
elif improve_all_mode:
202+
raise ImportError(
203+
"The experimental improve_all_mode is selected, but the optional dependencies to use it are not installed. Please run 'poetry install --with experimental'"
204+
)
190205
else:
191206
improve_fn = improve
192207

gpt_engineer/benchmark/__main__.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import importlib
2-
from typing import Optional, Annotated
2+
3+
from typing import Annotated, Optional
4+
35
import typer
46

57
from langchain.cache import SQLiteCache
@@ -22,7 +24,9 @@ def main(
2224
help="python file that contains a function called 'default_config_agent'"
2325
),
2426
],
25-
benchmarks: Annotated[str, typer.Argument(help="benchmark name(s) separated by ','")],
27+
benchmarks: Annotated[
28+
str, typer.Argument(help="benchmark name(s) separated by ','")
29+
],
2630
task_name: Annotated[
2731
Optional[str], typer.Argument(help="optional task name in benchmark")
2832
] = None,
@@ -38,7 +42,9 @@ def main(
3842
agent = get_agent(path_to_agent)
3943

4044
results = run(agent, benchmark, task_name, verbose=verbose)
41-
print(f"\n--- Results for agent {path_to_agent}, benchmark: {benchmark_name} ---")
45+
print(
46+
f"\n--- Results for agent {path_to_agent}, benchmark: {benchmark_name} ---"
47+
)
4248
print_results(results)
4349
print()
4450

gpt_engineer/benchmark/benchmarks/gpteng/eval_tools.py

-7
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,6 @@
99
be expanded.
1010
"""
1111

12-
import subprocess
13-
14-
from datetime import datetime
15-
16-
import yaml
17-
18-
from tabulate import tabulate
1912

2013
from gpt_engineer.core.files_dict import FilesDict
2114

gpt_engineer/benchmark/benchmarks/gpteng/load.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from pathlib import Path
22

3-
from gpt_engineer.benchmark.benchmarks.gpteng.eval_tools import check_evaluation_component
4-
from gpt_engineer.benchmark.types import Benchmark, Task, Assertable
5-
from gpt_engineer.core import chat_to_files
3+
from gpt_engineer.benchmark.benchmarks.gpteng.eval_tools import (
4+
check_evaluation_component,
5+
)
6+
from gpt_engineer.benchmark.types import Assertable, Benchmark, Task
67
from gpt_engineer.core.chat_to_files import chat_to_files_dict
7-
from gpt_engineer.core.files_dict import FilesDict
88

99
evaluations = [
1010
{
@@ -156,4 +156,6 @@ def eval_to_task(case):
156156

157157

158158
def load_gpteng():
159-
return Benchmark(name="gpte_eval", tasks=[eval_to_task(case) for case in evaluations])
159+
return Benchmark(
160+
name="gpte_eval", tasks=[eval_to_task(case) for case in evaluations]
161+
)

gpt_engineer/benchmark/benchmarks/gptme/load.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from gpt_engineer.benchmark.types import Benchmark, Task
22
from gpt_engineer.core.files_dict import FilesDict
3-
from gpt_engineer.core.base_execution_env import BaseExecutionEnv
43

54

65
def load_gptme():

gpt_engineer/benchmark/run.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import time
22

3-
import typer
4-
53
from gpt_engineer.benchmark.types import Assertable, Benchmark, TaskResult
64
from gpt_engineer.core.base_agent import BaseAgent
75
from gpt_engineer.core.default.disk_execution_env import DiskExecutionEnv
@@ -67,7 +65,9 @@ def print_results(results: list[TaskResult]):
6765
)
6866
for task_result in results
6967
)
70-
total_assertions = sum(len(task_result.assertion_results) for task_result in results)
68+
total_assertions = sum(
69+
len(task_result.assertion_results) for task_result in results
70+
)
7171
print(f"Total correct assertions: {correct_assertions}/{total_assertions}")
7272

7373
correct_tasks = sum(

gpt_engineer/benchmark/types.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from subprocess import Popen
33
from typing import Callable
44

5-
from gpt_engineer.core.files_dict import FilesDict
65
from gpt_engineer.core.base_execution_env import BaseExecutionEnv
6+
from gpt_engineer.core.files_dict import FilesDict
77

88

99
@dataclass

gpt_engineer/core/ai.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import backoff
1010
import openai
1111

12-
from gpt_engineer.core.token_usage import TokenUsageLog
13-
1412
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
1513
from langchain.chat_models import AzureChatOpenAI, ChatOpenAI
1614
from langchain.chat_models.base import BaseChatModel
@@ -22,6 +20,8 @@
2220
messages_to_dict,
2321
)
2422

23+
from gpt_engineer.core.token_usage import TokenUsageLog
24+
2525
# Type hint for a chat message
2626
Message = Union[AIMessage, HumanMessage, SystemMessage]
2727

gpt_engineer/core/base_agent.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
from gpt_engineer.core.files_dict import FilesDict
2-
from gpt_engineer.core.version_manager import BaseVersionManager
3-
from gpt_engineer.core.ai import AI
41
from abc import ABC, abstractmethod
52

3+
from gpt_engineer.core.files_dict import FilesDict
4+
65

76
class BaseAgent(ABC):
87
"""

gpt_engineer/core/base_execution_env.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from abc import ABC, abstractmethod
2-
from gpt_engineer.core.files_dict import FilesDict
32
from subprocess import Popen
43

4+
from gpt_engineer.core.files_dict import FilesDict
5+
56

67
class BaseExecutionEnv(ABC):
78
"""

gpt_engineer/core/base_memory.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from pathlib import Path
2-
from typing import TypeVar, MutableMapping
3-
from abc import ABC
2+
from typing import MutableMapping
43

54
BaseMemory = MutableMapping[str | Path, str]

gpt_engineer/core/chat_to_files.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
- apply_edits: Applies file edits to a workspace.
2727
"""
2828

29-
import re
3029
import logging
30+
import re
3131

3232
from dataclasses import dataclass
33-
from typing import List, Tuple
33+
from typing import List
3434

3535
from gpt_engineer.core.files_dict import FilesDict
3636

gpt_engineer/core/default/disk_execution_env.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import time
33

44
from gpt_engineer.core.base_execution_env import BaseExecutionEnv
5-
from gpt_engineer.core.files_dict import FilesDict
65
from gpt_engineer.core.default.file_store import FileStore
6+
from gpt_engineer.core.files_dict import FilesDict
77

88

99
class DiskExecutionEnv(BaseExecutionEnv):

gpt_engineer/core/default/disk_memory.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@
3030
import json
3131
import shutil
3232

33-
from gpt_engineer.core.base_memory import BaseMemory
3433
from pathlib import Path
35-
from typing import Any, Optional, Union, Iterator, Dict
34+
from typing import Any, Dict, Iterator, Optional, Union
35+
36+
from gpt_engineer.core.base_memory import BaseMemory
3637
from gpt_engineer.tools.experimental.supported_languages import SUPPORTED_LANGUAGES
3738

3839

0 commit comments

Comments
 (0)