From 44a82caaa650ef74194a1d782e2520cb649440cb Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Mon, 31 Jul 2023 20:10:41 -0700 Subject: testing nuitka, pyoxidizer, pyinstaller --- continuedev/src/.gitignore | 4 +++ continuedev/src/continuedev/libs/llm/openai.py | 7 ----- continuedev/src/continuedev/libs/util/paths.py | 21 +++++++++++---- .../plugins/recipes/AddTransformRecipe/steps.py | 4 ++- .../plugins/recipes/DDtoBQRecipe/steps.py | 3 ++- .../continuedev/plugins/steps/draft/migration.py | 30 ---------------------- continuedev/src/run.py | 4 +++ 7 files changed, 29 insertions(+), 44 deletions(-) create mode 100644 continuedev/src/.gitignore delete mode 100644 continuedev/src/continuedev/plugins/steps/draft/migration.py create mode 100644 continuedev/src/run.py (limited to 'continuedev/src') diff --git a/continuedev/src/.gitignore b/continuedev/src/.gitignore new file mode 100644 index 00000000..7137bb08 --- /dev/null +++ b/continuedev/src/.gitignore @@ -0,0 +1,4 @@ +main.build +main.dist +run.build +run.dist \ No newline at end of file diff --git a/continuedev/src/continuedev/libs/llm/openai.py b/continuedev/src/continuedev/libs/llm/openai.py index fce6e8ab..9591e824 100644 --- a/continuedev/src/continuedev/libs/llm/openai.py +++ b/continuedev/src/continuedev/libs/llm/openai.py @@ -28,12 +28,6 @@ MAX_TOKENS_FOR_MODEL = { } -class AzureInfo(BaseModel): - endpoint: str - engine: str - api_version: str - - class OpenAI(LLM): model: str openai_server_info: Optional[OpenAIServerInfo] = None @@ -42,7 +36,6 @@ class OpenAI(LLM): requires_write_log = True system_message: Optional[str] = None - azure_info: Optional[AzureInfo] = None write_log: Optional[Callable[[str], None]] = None api_key: str = None diff --git a/continuedev/src/continuedev/libs/util/paths.py b/continuedev/src/continuedev/libs/util/paths.py index b08b0949..a033d6dd 100644 --- a/continuedev/src/continuedev/libs/util/paths.py +++ b/continuedev/src/continuedev/libs/util/paths.py @@ -1,8 +1,20 @@ import os - +import sys from ..constants.main import CONTINUE_SESSIONS_FOLDER, CONTINUE_GLOBAL_FOLDER, CONTINUE_SERVER_FOLDER +def find_data_file(filename): + if getattr(sys, 'frozen', False): + # The application is frozen + datadir = os.path.dirname(sys.executable) + else: + # The application is not frozen + # Change this bit to match where you store your data files: + datadir = os.path.dirname(__file__) + + return os.path.join(datadir, filename) + + def getGlobalFolderPath(): path = os.path.join(os.path.expanduser("~"), CONTINUE_GLOBAL_FOLDER) os.makedirs(path, exist_ok=True) @@ -28,10 +40,9 @@ def getSessionFilePath(session_id: str): def getDefaultConfigFile() -> str: - current_path = os.path.dirname(os.path.realpath(__file__)) - config_path = os.path.join( - current_path, "..", "constants", "default_config.py.txt") - with open(config_path, 'r') as f: + default_config_path = find_data_file(os.path.join( + "..", "constants", "default_config.py.txt")) + with open(default_config_path, 'r') as f: return f.read() diff --git a/continuedev/src/continuedev/plugins/recipes/AddTransformRecipe/steps.py b/continuedev/src/continuedev/plugins/recipes/AddTransformRecipe/steps.py index 8c6446da..e589fc36 100644 --- a/continuedev/src/continuedev/plugins/recipes/AddTransformRecipe/steps.py +++ b/continuedev/src/continuedev/plugins/recipes/AddTransformRecipe/steps.py @@ -1,7 +1,9 @@ import os from textwrap import dedent + from ....plugins.steps.core.core import MessageStep +from ....libs.util.paths import find_data_file from ....core.sdk import Models from ....core.main import Step from ....core.sdk import ContinueSDK @@ -54,7 +56,7 @@ class AddTransformStep(Step): - Load the data into a local DuckDB instance - Open up a Streamlit app for you to view the data"""), name="Write transformation function")) - with open(os.path.join(os.path.dirname(__file__), 'dlt_transform_docs.md')) as f: + with open(find_data_file('dlt_transform_docs.md')) as f: dlt_transform_docs = f.read() prompt = dedent(f"""\ diff --git a/continuedev/src/continuedev/plugins/recipes/DDtoBQRecipe/steps.py b/continuedev/src/continuedev/plugins/recipes/DDtoBQRecipe/steps.py index 767936b8..14972142 100644 --- a/continuedev/src/continuedev/plugins/recipes/DDtoBQRecipe/steps.py +++ b/continuedev/src/continuedev/plugins/recipes/DDtoBQRecipe/steps.py @@ -6,6 +6,7 @@ from ....plugins.steps.core.core import MessageStep from ....core.sdk import Models from ....core.main import Step from ....core.sdk import ContinueSDK +from ....libs.util.paths import find_data_file AI_ASSISTED_STRING = "(✨ AI-Assisted ✨)" @@ -72,7 +73,7 @@ class LoadDataStep(Step): output = await sdk.run('.env/bin/python3 chess_pipeline.py', name="Load data to BigQuery", description="Running `.env/bin/python3 chess_pipeline.py` to load data to Google BigQuery") if "Traceback" in output or "SyntaxError" in output: - with open(os.path.join(os.path.dirname(__file__), "dlt_duckdb_to_bigquery_docs.md"), "r") as f: + with open(find_data_file("dlt_duckdb_to_bigquery_docs.md"), "r") as f: docs = f.read() output = "Traceback" + output.split("Traceback")[-1] diff --git a/continuedev/src/continuedev/plugins/steps/draft/migration.py b/continuedev/src/continuedev/plugins/steps/draft/migration.py deleted file mode 100644 index c38f54dc..00000000 --- a/continuedev/src/continuedev/plugins/steps/draft/migration.py +++ /dev/null @@ -1,30 +0,0 @@ -# When an edit is made to an existing class or a new sqlalchemy class is created, -# this should be kicked off. - -from ....core.main import Step - - -class MigrationStep(Step): - name: str = "Create and run an alembic migration." - - edited_file: str - - async def run(self, sdk): - recent_edits = await sdk.ide.get_recent_edits(self.edited_file) - recent_edits_string = "\n\n".join( - map(lambda x: x.to_string(), recent_edits)) - description = await sdk.models.medium.complete(f"{recent_edits_string}\n\nGenerate a short description of the migration made in the above changes:\n") - await sdk.run([ - "cd libs", - "poetry run alembic revision --autogenerate -m " + description, - ]) - migration_file = f"libs/alembic/versions/{?}.py" - contents = await sdk.ide.readFile(migration_file) - await sdk.run_step(EditCodeStep( - range_in_files=[RangeInFile.from_entire_file(migration_file, contents)], - prompt=f"Here are the changes made to the sqlalchemy classes:\n\n{recent_edits_string}\n\nThis is the generated migration file:\n\n{{code}}\n\nReview the migration file to make sure it correctly reflects the changes made to the sqlalchemy classes.", - )) - await sdk.run([ - "cd libs", - "poetry run alembic upgrade head", - ]) diff --git a/continuedev/src/run.py b/continuedev/src/run.py new file mode 100644 index 00000000..089cc54d --- /dev/null +++ b/continuedev/src/run.py @@ -0,0 +1,4 @@ +from continuedev.server.main import run_server + +if __name__ == "__main__": + run_server() -- cgit v1.2.3-70-g09d2 From e18df47cee14cde58584ffc1a8bbb2606b6f4102 Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Mon, 31 Jul 2023 22:27:08 -0700 Subject: ci: :green_heart: fix file structure for pyinstaller, main.yaml updates --- .github/workflows/main.yaml | 27 ++++++++++++++-------- continuedev/main.py | 5 ++++ .../src/continuedev/libs/util/count_tokens.py | 1 + continuedev/src/run.py | 4 ---- run.py | 4 ++++ 5 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 continuedev/main.py delete mode 100644 continuedev/src/run.py create mode 100644 run.py (limited to 'continuedev/src') diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 6642d5c0..1d5f2cbc 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -18,14 +18,23 @@ jobs: - name: Check-out repository uses: actions/checkout@v3 - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: "3.10" # Version range or exact version of a Python version to use, using SemVer's version range syntax - architecture: "x64" # optional x64 or x86. Defaults to x64 if not specified - cache: "pip" - cache-dependency-path: | - **/requirements*.txt + - name: Install Poetry + run: | + curl -sSL https://install.python-poetry.org | python3 - + + - name: Install Python dependencies + run: | + cd continuedev + poetry install + + # - name: Setup Python + # uses: actions/setup-python@v4 + # with: + # python-version: "3.10" # Version range or exact version of a Python version to use, using SemVer's version range syntax + # architecture: "x64" # optional x64 or x86. Defaults to x64 if not specified + # cache: "pip" + # cache-dependency-path: | + # **/requirements*.txt - name: Install Dependencies run: | @@ -35,7 +44,7 @@ jobs: uses: Nuitka/Nuitka-Action@main with: nuitka-version: main - script-name: kasa_cli + script-name: continuedev/src/run.py onefile: true - name: Upload Artifacts diff --git a/continuedev/main.py b/continuedev/main.py new file mode 100644 index 00000000..3cf4e817 --- /dev/null +++ b/continuedev/main.py @@ -0,0 +1,5 @@ +from .src.continuedev.server.main import run_server + + +def main(): + run_server() diff --git a/continuedev/src/continuedev/libs/util/count_tokens.py b/continuedev/src/continuedev/libs/util/count_tokens.py index 6add7b1a..3b594036 100644 --- a/continuedev/src/continuedev/libs/util/count_tokens.py +++ b/continuedev/src/continuedev/libs/util/count_tokens.py @@ -3,6 +3,7 @@ from typing import Dict, List, Union from ...core.main import ChatMessage from .templating import render_templated_string from ...libs.llm import LLM +from tiktoken_ext import openai_public import tiktoken # TODO move many of these into specific LLM.properties() function that diff --git a/continuedev/src/run.py b/continuedev/src/run.py deleted file mode 100644 index 089cc54d..00000000 --- a/continuedev/src/run.py +++ /dev/null @@ -1,4 +0,0 @@ -from continuedev.server.main import run_server - -if __name__ == "__main__": - run_server() diff --git a/run.py b/run.py new file mode 100644 index 00000000..7160bbc7 --- /dev/null +++ b/run.py @@ -0,0 +1,4 @@ +from continuedev.main import main + +if __name__ == "__main__": + main() -- cgit v1.2.3-70-g09d2 From 70eb274f51c703c352865b8af39557b271fae6dd Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Tue, 1 Aug 2023 00:37:24 -0700 Subject: try cx_freeze, smaller pyinstaller --- .github/workflows/main.yaml | 2 +- continuedev/pyapp/pyoxidizer.bzl | 353 --------------------- continuedev/pyproject.toml | 2 - continuedev/requirements.txt | 88 +---- .../src/continuedev/libs/util/calculate_diff.py | 35 -- cxf.py | 14 + 6 files changed, 31 insertions(+), 463 deletions(-) delete mode 100644 continuedev/pyapp/pyoxidizer.bzl create mode 100644 cxf.py (limited to 'continuedev/src') diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 26d0d768..41fd174d 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -36,7 +36,7 @@ jobs: run: | pip install -r continuedev/requirements.txt pyinstaller - - run: pyinstaller run.py + - run: pyinstaller run.py --exclude-module numpy --exclude-module jedi -F - name: Upload Artifacts uses: actions/upload-artifact@v3 diff --git a/continuedev/pyapp/pyoxidizer.bzl b/continuedev/pyapp/pyoxidizer.bzl deleted file mode 100644 index 943007ff..00000000 --- a/continuedev/pyapp/pyoxidizer.bzl +++ /dev/null @@ -1,353 +0,0 @@ -# This file defines how PyOxidizer application building and packaging is -# performed. See PyOxidizer's documentation at -# https://gregoryszorc.com/docs/pyoxidizer/stable/pyoxidizer.html for details -# of this configuration file format. - -# Configuration files consist of functions which define build "targets." -# This function creates a Python executable and installs it in a destination -# directory. -def make_exe(): - # Obtain the default PythonDistribution for our build target. We link - # this distribution into our produced executable and extract the Python - # standard library from it. - dist = default_python_distribution() - - # This function creates a `PythonPackagingPolicy` instance, which - # influences how executables are built and how resources are added to - # the executable. You can customize the default behavior by assigning - # to attributes and calling functions. - policy = dist.make_python_packaging_policy() - - # Enable support for non-classified "file" resources to be added to - # resource collections. - # policy.allow_files = True - - # Control support for loading Python extensions and other shared libraries - # from memory. This is only supported on Windows and is ignored on other - # platforms. - # policy.allow_in_memory_shared_library_loading = True - - # Control whether to generate Python bytecode at various optimization - # levels. The default optimization level used by Python is 0. - # policy.bytecode_optimize_level_zero = True - # policy.bytecode_optimize_level_one = True - # policy.bytecode_optimize_level_two = True - - # Package all available Python extensions in the distribution. - # policy.extension_module_filter = "all" - - # Package the minimum set of Python extensions in the distribution needed - # to run a Python interpreter. Various functionality from the Python - # standard library won't work with this setting! But it can be used to - # reduce the size of generated executables by omitting unused extensions. - # policy.extension_module_filter = "minimal" - - # Package Python extensions in the distribution not having additional - # library dependencies. This will exclude working support for SSL, - # compression formats, and other functionality. - # policy.extension_module_filter = "no-libraries" - - # Package Python extensions in the distribution not having a dependency on - # copyleft licensed software like GPL. - # policy.extension_module_filter = "no-copyleft" - - # Controls whether the file scanner attempts to classify files and emit - # resource-specific values. - # policy.file_scanner_classify_files = True - - # Controls whether `File` instances are emitted by the file scanner. - # policy.file_scanner_emit_files = False - - # Controls the `add_include` attribute of "classified" resources - # (`PythonModuleSource`, `PythonPackageResource`, etc). - # policy.include_classified_resources = True - - # Toggle whether Python module source code for modules in the Python - # distribution's standard library are included. - # policy.include_distribution_sources = False - - # Toggle whether Python package resource files for the Python standard - # library are included. - # policy.include_distribution_resources = False - - # Controls the `add_include` attribute of `File` resources. - # policy.include_file_resources = False - - # Controls the `add_include` attribute of `PythonModuleSource` not in - # the standard library. - # policy.include_non_distribution_sources = True - - # Toggle whether files associated with tests are included. - # policy.include_test = False - - # Resources are loaded from "in-memory" or "filesystem-relative" paths. - # The locations to attempt to add resources to are defined by the - # `resources_location` and `resources_location_fallback` attributes. - # The former is the first/primary location to try and the latter is - # an optional fallback. - - # Use in-memory location for adding resources by default. - # policy.resources_location = "in-memory" - - # Use filesystem-relative location for adding resources by default. - # policy.resources_location = "filesystem-relative:prefix" - - # Attempt to add resources relative to the built binary when - # `resources_location` fails. - # policy.resources_location_fallback = "filesystem-relative:prefix" - - # Clear out a fallback resource location. - # policy.resources_location_fallback = None - - # Define a preferred Python extension module variant in the Python distribution - # to use. - # policy.set_preferred_extension_module_variant("foo", "bar") - - # Configure policy values to classify files as typed resources. - # (This is the default.) - # policy.set_resource_handling_mode("classify") - - # Configure policy values to handle files as files and not attempt - # to classify files as specific types. - # policy.set_resource_handling_mode("files") - - # This variable defines the configuration of the embedded Python - # interpreter. By default, the interpreter will run a Python REPL - # using settings that are appropriate for an "isolated" run-time - # environment. - # - # The configuration of the embedded Python interpreter can be modified - # by setting attributes on the instance. Some of these are - # documented below. - python_config = dist.make_python_interpreter_config() - - # Make the embedded interpreter behave like a `python` process. - # python_config.config_profile = "python" - - # Set initial value for `sys.path`. If the string `$ORIGIN` exists in - # a value, it will be expanded to the directory of the built executable. - # python_config.module_search_paths = ["$ORIGIN/lib"] - - # Use jemalloc as Python's memory allocator. - # python_config.allocator_backend = "jemalloc" - - # Use mimalloc as Python's memory allocator. - # python_config.allocator_backend = "mimalloc" - - # Use snmalloc as Python's memory allocator. - # python_config.allocator_backend = "snmalloc" - - # Let Python choose which memory allocator to use. (This will likely - # use the malloc()/free() linked into the program. - # python_config.allocator_backend = "default" - - # Enable the use of a custom allocator backend with the "raw" memory domain. - # python_config.allocator_raw = True - - # Enable the use of a custom allocator backend with the "mem" memory domain. - # python_config.allocator_mem = True - - # Enable the use of a custom allocator backend with the "obj" memory domain. - # python_config.allocator_obj = True - - # Enable the use of a custom allocator backend with pymalloc's arena - # allocator. - # python_config.allocator_pymalloc_arena = True - - # Enable Python memory allocator debug hooks. - # python_config.allocator_debug = True - - # Automatically calls `multiprocessing.set_start_method()` with an - # appropriate value when OxidizedFinder imports the `multiprocessing` - # module. - # python_config.multiprocessing_start_method = 'auto' - - # Do not call `multiprocessing.set_start_method()` automatically. (This - # is the default behavior of Python applications.) - # python_config.multiprocessing_start_method = 'none' - - # Call `multiprocessing.set_start_method()` with explicit values. - # python_config.multiprocessing_start_method = 'fork' - # python_config.multiprocessing_start_method = 'forkserver' - # python_config.multiprocessing_start_method = 'spawn' - - # Control whether `oxidized_importer` is the first importer on - # `sys.meta_path`. - # python_config.oxidized_importer = False - - # Enable the standard path-based importer which attempts to load - # modules from the filesystem. - # python_config.filesystem_importer = True - - # Set `sys.frozen = False` - # python_config.sys_frozen = False - - # Set `sys.meipass` - # python_config.sys_meipass = True - - # Write files containing loaded modules to the directory specified - # by the given environment variable. - # python_config.write_modules_directory_env = "/tmp/oxidized/loaded_modules" - - # Evaluate a string as Python code when the interpreter starts. - python_config.run_command = "from continuedev.server.main import run_server; run_server()" - policy.resources_location_fallback = "filesystem-relative:prefix" - - # Run a Python module as __main__ when the interpreter starts. - # python_config.run_module = "" - - # Run a Python file when the interpreter starts. - # python_config.run_filename = "/path/to/file" - - # Produce a PythonExecutable from a Python distribution, embedded - # resources, and other options. The returned object represents the - # standalone executable that will be built. - exe = dist.to_python_executable( - name="pyapp", - - # If no argument passed, the default `PythonPackagingPolicy` for the - # distribution is used. - packaging_policy=policy, - - # If no argument passed, the default `PythonInterpreterConfig` is used. - config=python_config, - ) - - for resource in exe.pip_install(["../dist/continuedev-0.1.2-py3-none-any.whl"]): - resource.add_location = "in-memory" - exe.add_python_resource(resource) - - - - # Install tcl/tk support files to a specified directory so the `tkinter` Python - # module works. - # exe.tcl_files_path = "lib" - - # Never attempt to copy Windows runtime DLLs next to the built executable. - # exe.windows_runtime_dlls_mode = "never" - - # Copy Windows runtime DLLs next to the built executable when they can be - # located. - # exe.windows_runtime_dlls_mode = "when-present" - - # Copy Windows runtime DLLs next to the build executable and error if this - # cannot be done. - # exe.windows_runtime_dlls_mode = "always" - - # Make the executable a console application on Windows. - # exe.windows_subsystem = "console" - - # Make the executable a non-console application on Windows. - # exe.windows_subsystem = "windows" - - # Invoke `pip download` to install a single package using wheel archives - # obtained via `pip download`. `pip_download()` returns objects representing - # collected files inside Python wheels. `add_python_resources()` adds these - # objects to the binary, with a load location as defined by the packaging - # policy's resource location attributes. - #exe.add_python_resources(exe.pip_download(["pyflakes==2.2.0"])) - - # Invoke `pip install` with our Python distribution to install a single package. - # `pip_install()` returns objects representing installed files. - # `add_python_resources()` adds these objects to the binary, with a load - # location as defined by the packaging policy's resource location - # attributes. - #exe.add_python_resources(exe.pip_install(["appdirs"])) - - # Invoke `pip install` using a requirements file and add the collected resources - # to our binary. - #exe.add_python_resources(exe.pip_install(["-r", "requirements.txt"])) - - - # Read Python files from a local directory and add them to our embedded - # context, taking just the resources belonging to the `foo` and `bar` - # Python packages. - #exe.add_python_resources(exe.read_package_root( - # path="/src/mypackage", - # packages=["foo", "bar"], - #)) - - # Discover Python files from a virtualenv and add them to our embedded - # context. - #exe.add_python_resources(exe.read_virtualenv(path="/path/to/venv")) - - # Filter all resources collected so far through a filter of names - # in a file. - #exe.filter_resources_from_files(files=["/path/to/filter-file"]) - - # Return our `PythonExecutable` instance so it can be built and - # referenced by other consumers of this target. - return exe - -def make_embedded_resources(exe): - return exe.to_embedded_resources() - -def make_install(exe): - # Create an object that represents our installed application file layout. - files = FileManifest() - - # Add the generated executable to our install layout in the root directory. - files.add_python_resource(".", exe) - - return files - -def make_msi(exe): - # See the full docs for more. But this will convert your Python executable - # into a `WiXMSIBuilder` Starlark type, which will be converted to a Windows - # .msi installer when it is built. - return exe.to_wix_msi_builder( - # Simple identifier of your app. - "myapp", - # The name of your application. - "My Application", - # The version of your application. - "1.0", - # The author/manufacturer of your application. - "Alice Jones" - ) - - -# Dynamically enable automatic code signing. -def register_code_signers(): - # You will need to run with `pyoxidizer build --var ENABLE_CODE_SIGNING 1` for - # this if block to be evaluated. - if not VARS.get("ENABLE_CODE_SIGNING"): - return - - # Use a code signing certificate in a .pfx/.p12 file, prompting the - # user for its path and password to open. - # pfx_path = prompt_input("path to code signing certificate file") - # pfx_password = prompt_password( - # "password for code signing certificate file", - # confirm = True - # ) - # signer = code_signer_from_pfx_file(pfx_path, pfx_password) - - # Use a code signing certificate in the Windows certificate store, specified - # by its SHA-1 thumbprint. (This allows you to use YubiKeys and other - # hardware tokens if they speak to the Windows certificate APIs.) - # sha1_thumbprint = prompt_input( - # "SHA-1 thumbprint of code signing certificate in Windows store" - # ) - # signer = code_signer_from_windows_store_sha1_thumbprint(sha1_thumbprint) - - # Choose a code signing certificate automatically from the Windows - # certificate store. - # signer = code_signer_from_windows_store_auto() - - # Activate your signer so it gets called automatically. - # signer.activate() - - -# Call our function to set up automatic code signers. -register_code_signers() - -# Tell PyOxidizer about the build targets defined above. -register_target("exe", make_exe) -register_target("resources", make_embedded_resources, depends=["exe"], default_build_script=True) -register_target("install", make_install, depends=["exe"], default=True) -register_target("msi_installer", make_msi, depends=["exe"]) - -# Resolve whatever targets the invoker of this configuration file is requesting -# be resolved. -resolve_targets() diff --git a/continuedev/pyproject.toml b/continuedev/pyproject.toml index d7505e2b..7355beb0 100644 --- a/continuedev/pyproject.toml +++ b/continuedev/pyproject.toml @@ -7,7 +7,6 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.8.1" -diff-match-patch = "^20230430" fastapi = "^0.95.1" typer = "^0.7.0" openai = "^0.27.5" @@ -18,7 +17,6 @@ python-dotenv = "^1.0.0" nest-asyncio = "^1.5.6" websockets = "^11.0.2" urllib3 = "1.26.15" -gpt-index = "^0.6.8" posthog = "^3.0.1" tiktoken = "^0.4.0" jsonref = "^1.1.0" diff --git a/continuedev/requirements.txt b/continuedev/requirements.txt index 970681f9..6a776a62 100644 --- a/continuedev/requirements.txt +++ b/continuedev/requirements.txt @@ -1,76 +1,20 @@ -aiofiles==23.1.0 -aiohttp==3.8.4 -aiosignal==1.3.1 -anthropic==0.3.4 -anyio==3.6.2 -async-timeout==4.0.2 -attrs==23.1.0 -backoff==2.2.1 -boltons==23.0.0 -camel-converter==3.0.2 -certifi==2022.12.7 -cffi==1.15.1 -charset-normalizer==3.1.0 -chevron==0.14.0 -click==8.1.3 --e git+https://github.com/continuedev/continue.git@78ada9b463a41260ccf53bbdc08b396ab9783ee2#egg=continuedev&subdirectory=continuedev -cryptography==41.0.2 -dataclasses-json==0.5.7 -Deprecated==1.2.14 -diff-match-patch==20230430 -directory-tree==0.0.3.1 -distro==1.8.0 fastapi==0.95.1 -frozenlist==1.3.3 -gpt-index==0.6.8 -h11==0.14.0 -httpcore==0.17.3 -httpx==0.24.1 -idna==3.4 -jsonref==1.1.0 -jsonschema==4.17.3 -langchain==0.0.171 -marshmallow==3.19.0 -marshmallow-enum==1.5.1 -meilisearch-python-async==1.4.8 -monotonic==1.6 -multidict==6.0.4 -mypy-extensions==1.0.0 -nest-asyncio==1.5.6 -numexpr==2.8.4 -numpy==1.24.3 -openai==0.27.6 -openapi-schema-pydantic==1.2.4 -packaging==23.1 -pandas==2.0.1 -posthog==3.0.1 -psutil==5.9.5 -pycparser==2.21 -pydantic==1.10.7 -PyGithub==1.59.0 -PyJWT==2.8.0 -PyNaCl==1.5.0 -pyrsistent==0.19.3 -python-dateutil==2.8.2 -python-dotenv==1.0.0 -pytz==2023.3 -PyYAML==6.0 -regex==2023.5.5 -requests==2.29.0 -six==1.16.0 -sniffio==1.3.0 -SQLAlchemy==2.0.13 -starlette==0.26.1 -tenacity==8.2.2 -tiktoken==0.4.0 -tokenizers==0.13.3 -tqdm==4.65.0 typer==0.7.0 -typing-inspect==0.8.0 -typing_extensions==4.5.0 -tzdata==2023.3 -urllib3==1.26.15 +openai==0.27.5 +boltons==23.0.0 +pydantic==1.10.7 uvicorn==0.21.1 +python-dotenv==1.0.0 +nest-asyncio==1.5.6 websockets==11.0.2 -wrapt==1.15.0 -yarl==1.9.2 +urllib3==1.26.15 +posthog==3.0.1 +tiktoken==0.4.0 +jsonref==1.1.0 +jsonschema==4.17.3 +directory-tree==0.0.3.1 +anthropic==0.3.4 +chevron==0.14.0 +psutil==5.9.5 +pygithub==1.59.0 +meilisearch-python-async==1.4.8 diff --git a/continuedev/src/continuedev/libs/util/calculate_diff.py b/continuedev/src/continuedev/libs/util/calculate_diff.py index 3e82bab3..e8e48839 100644 --- a/continuedev/src/continuedev/libs/util/calculate_diff.py +++ b/continuedev/src/continuedev/libs/util/calculate_diff.py @@ -2,41 +2,6 @@ import difflib from typing import List from ...models.main import Position, Range from ...models.filesystem import FileEdit -from diff_match_patch import diff_match_patch - - -def calculate_diff_match_patch(filepath: str, original: str, updated: str) -> List[FileEdit]: - dmp = diff_match_patch() - diffs = dmp.diff_main(original, updated) - dmp.diff_cleanupSemantic(diffs) - - replacements = [] - - current_index = 0 - deleted_length = 0 - - for diff in diffs: - if diff[0] == diff_match_patch.DIFF_EQUAL: - current_index += len(diff[1]) - deleted_length = 0 - elif diff[0] == diff_match_patch.DIFF_INSERT: - current_index += deleted_length - replacements.append((current_index, current_index, diff[1])) - current_index += len(diff[1]) - deleted_length = 0 - elif diff[0] == diff_match_patch.DIFF_DELETE: - replacements.append( - (current_index, current_index + len(diff[1]), '')) - deleted_length += len(diff[1]) - elif diff[0] == diff_match_patch.DIFF_REPLACE: - replacements.append( - (current_index, current_index + len(diff[1]), '')) - current_index += deleted_length - replacements.append((current_index, current_index, diff[2])) - current_index += len(diff[2]) - deleted_length = 0 - - return [FileEdit(filepath=filepath, range=Range.from_indices(original, r[0], r[1]), replacement=r[2]) for r in replacements] def calculate_diff(filepath: str, original: str, updated: str) -> List[FileEdit]: diff --git a/cxf.py b/cxf.py new file mode 100644 index 00000000..b8610999 --- /dev/null +++ b/cxf.py @@ -0,0 +1,14 @@ +from cx_Freeze import setup, Executable + +setup( + name="Continue", + version="0.1", + description="Continue Server", + executables=[Executable("run.py")], + + options={ + "build_exe": { + "excludes": ["unnecessary_module"], + }, + }, +) -- cgit v1.2.3-70-g09d2 From f5f9d7712323756e6f94b8ee1d1c9f0c8f0be57b Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Tue, 1 Aug 2023 22:37:03 -0700 Subject: full vsce publish workflow --- .github/workflows/main.yaml | 27 +++++++++++++------------- continuedev/src/continuedev/libs/util/paths.py | 11 ++--------- 2 files changed, 16 insertions(+), 22 deletions(-) (limited to 'continuedev/src') diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index dc670137..5f2571ab 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -46,8 +46,8 @@ jobs: publish: needs: pyinstaller runs-on: ubuntu-latest - # permissions: - # contents: write + permissions: + contents: write steps: - name: Checkout @@ -107,18 +107,19 @@ jobs: run: | cd extension npm run package + vsce publish patch -p ${{ secrets.VSCE_TOKEN }} - # - name: Commit changes - # run: | - # git config --local user.email "action@github.com" - # git config --local user.name "GitHub Action" - # git commit -am "Update package.json version [skip ci]" - - # - name: Push changes - # uses: ad-m/github-push-action@master - # with: - # github_token: ${{ secrets.GITHUB_TOKEN }} - # branch: ${{ github.ref }} + - name: Commit changes + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git commit -am "Update package.json version [skip ci]" + + - name: Push changes + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: ${{ github.ref }} - name: Upload .vsix artifact uses: actions/upload-artifact@v2 diff --git a/continuedev/src/continuedev/libs/util/paths.py b/continuedev/src/continuedev/libs/util/paths.py index a033d6dd..6385dc6f 100644 --- a/continuedev/src/continuedev/libs/util/paths.py +++ b/continuedev/src/continuedev/libs/util/paths.py @@ -4,15 +4,8 @@ from ..constants.main import CONTINUE_SESSIONS_FOLDER, CONTINUE_GLOBAL_FOLDER, C def find_data_file(filename): - if getattr(sys, 'frozen', False): - # The application is frozen - datadir = os.path.dirname(sys.executable) - else: - # The application is not frozen - # Change this bit to match where you store your data files: - datadir = os.path.dirname(__file__) - - return os.path.join(datadir, filename) + datadir = os.path.dirname(__file__) + return os.path.abspath(os.path.join(datadir, filename)) def getGlobalFolderPath(): -- cgit v1.2.3-70-g09d2 From 48feeb55877aa95e91707beca228237fba74543a Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Tue, 1 Aug 2023 23:14:40 -0700 Subject: remove data file --- .github/workflows/main.yaml | 2 +- continuedev/src/continuedev/core/sdk.py | 2 +- .../continuedev/libs/constants/default_config.py | 128 +++++++++++++++++++++ .../libs/constants/default_config.py.txt | 126 -------------------- continuedev/src/continuedev/libs/util/paths.py | 11 +- 5 files changed, 132 insertions(+), 137 deletions(-) create mode 100644 continuedev/src/continuedev/libs/constants/default_config.py delete mode 100644 continuedev/src/continuedev/libs/constants/default_config.py.txt (limited to 'continuedev/src') diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 0d51d0c0..7787ddad 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -113,7 +113,7 @@ jobs: run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - git commit -am "Update package.json version [skip ci]" + git commit -am "ci: 💚 Update package.json version [skip ci]" - name: Push changes uses: ad-m/github-push-action@master diff --git a/continuedev/src/continuedev/core/sdk.py b/continuedev/src/continuedev/core/sdk.py index a5b16168..57e2c099 100644 --- a/continuedev/src/continuedev/core/sdk.py +++ b/continuedev/src/continuedev/core/sdk.py @@ -54,7 +54,7 @@ class ContinueSDK(AbstractContinueSDK): formatted_err = '\n'.join(traceback.format_exception(e)) msg_step = MessageStep( name="Invalid Continue Config File", message=formatted_err) - msg_step.description = f"Falling back to default config settings.\n```\n{formatted_err}\n```\n\nIt's possible this error was caused by an update to the Continue config format. If you'd like to see the new recommended default `config.py`, check [here](https://github.com/continuedev/continue/blob/main/continuedev/src/continuedev/libs/constants/default_config.py.txt)." + msg_step.description = f"Falling back to default config settings.\n```\n{formatted_err}\n```\n\nIt's possible this error was caused by an update to the Continue config format. If you'd like to see the new recommended default `config.py`, check [here](https://github.com/continuedev/continue/blob/main/continuedev/src/continuedev/libs/constants/default_config.py)." sdk.history.add_node(HistoryNode( step=msg_step, observation=None, diff --git a/continuedev/src/continuedev/libs/constants/default_config.py b/continuedev/src/continuedev/libs/constants/default_config.py new file mode 100644 index 00000000..9d6d4270 --- /dev/null +++ b/continuedev/src/continuedev/libs/constants/default_config.py @@ -0,0 +1,128 @@ +default_config = """\ +\"\"\" +This is the Continue configuration file. + +If you aren't getting strong typing on these imports, +be sure to select the Python interpreter in ~/.continue/server/env. +\"\"\" + +import subprocess + +from continuedev.core.main import Step +from continuedev.core.sdk import ContinueSDK +from continuedev.core.models import Models +from continuedev.core.config import CustomCommand, SlashCommand, ContinueConfig +from continuedev.plugins.context_providers.github import GitHubIssuesContextProvider +from continuedev.plugins.context_providers.google import GoogleContextProvider +from continuedev.libs.llm.maybe_proxy_openai import MaybeProxyOpenAI +from continuedev.plugins.policies.default import DefaultPolicy + +from continuedev.plugins.steps.open_config import OpenConfigStep +from continuedev.plugins.steps.clear_history import ClearHistoryStep +from continuedev.plugins.steps.feedback import FeedbackStep +from continuedev.plugins.steps.comment_code import CommentCodeStep +from continuedev.plugins.steps.main import EditHighlightedCodeStep + + +class CommitMessageStep(Step): + \"\"\" + This is a Step, the building block of Continue. + It can be used below as a slash command, so that + run will be called when you type '/commit'. + \"\"\" + async def run(self, sdk: ContinueSDK): + + # Get the root directory of the workspace + dir = sdk.ide.workspace_directory + + # Run git diff in that directory + diff = subprocess.check_output( + ["git", "diff"], cwd=dir).decode("utf-8") + + # Ask the LLM to write a commit message, + # and set it as the description of this step + self.description = await sdk.models.default.complete( + f"{diff}\n\nWrite a short, specific (less than 50 chars) commit message about the above changes:") + + +config = ContinueConfig( + + # If set to False, we will not collect any usage data + # See here to learn what anonymous data we collect: https://continue.dev/docs/telemetry + allow_anonymous_telemetry=True, + + models=Models( + default=MaybeProxyOpenAI(model="gpt-4"), + medium=MaybeProxyOpenAI(model="gpt-3.5-turbo") + ), + + # Set a system message with information that the LLM should always keep in mind + # E.g. "Please give concise answers. Always respond in Spanish." + system_message=None, + + # Set temperature to any value between 0 and 1. Higher values will make the LLM + # more creative, while lower values will make it more predictable. + temperature=0.5, + + # Custom commands let you map a prompt to a shortened slash command + # They are like slash commands, but more easily defined - write just a prompt instead of a Step class + # Their output will always be in chat form + custom_commands=[CustomCommand( + name="test", + description="This is an example custom command. Use /config to edit it and create more", + prompt="Write a comprehensive set of unit tests for the selected code. It should setup, run tests that check for correctness including important edge cases, and teardown. Ensure that the tests are complete and sophisticated. Give the tests just as chat output, don't edit any file.", + )], + + # Slash commands let you run a Step from a slash command + slash_commands=[ + # SlashCommand( + # name="commit", + # description="This is an example slash command. Use /config to edit it and create more", + # step=CommitMessageStep, + # ) + SlashCommand( + name="edit", + description="Edit code in the current file or the highlighted code", + step=EditHighlightedCodeStep, + ), + SlashCommand( + name="config", + description="Open the config file to create new and edit existing slash commands", + step=OpenConfigStep, + ), + SlashCommand( + name="comment", + description="Write comments for the current file or highlighted code", + step=CommentCodeStep, + ), + SlashCommand( + name="feedback", + description="Send feedback to improve Continue", + step=FeedbackStep, + ), + SlashCommand( + name="clear", + description="Clear step history", + step=ClearHistoryStep, + ) + ], + + # Context providers let you quickly select context by typing '@' + # Uncomment the following to + # - quickly reference GitHub issues + # - show Google search results to the LLM + context_providers=[ + # GitHubIssuesContextProvider( + # repo_name="/", + # auth_token="" + # ), + # GoogleContextProvider( + # serper_api_key="" + # ) + ], + + # Policies hold the main logic that decides which Step to take next + # You can use them to design agents, or deeply customize Continue + policy=DefaultPolicy() +) +""" diff --git a/continuedev/src/continuedev/libs/constants/default_config.py.txt b/continuedev/src/continuedev/libs/constants/default_config.py.txt deleted file mode 100644 index cf8b0324..00000000 --- a/continuedev/src/continuedev/libs/constants/default_config.py.txt +++ /dev/null @@ -1,126 +0,0 @@ -""" -This is the Continue configuration file. - -If you aren't getting strong typing on these imports, -be sure to select the Python interpreter in ~/.continue/server/env. -""" - -import subprocess - -from continuedev.core.main import Step -from continuedev.core.sdk import ContinueSDK -from continuedev.core.models import Models -from continuedev.core.config import CustomCommand, SlashCommand, ContinueConfig -from continuedev.plugins.context_providers.github import GitHubIssuesContextProvider -from continuedev.plugins.context_providers.google import GoogleContextProvider -from continuedev.libs.llm.maybe_proxy_openai import MaybeProxyOpenAI -from continuedev.plugins.policies.default import DefaultPolicy - -from continuedev.plugins.steps.open_config import OpenConfigStep -from continuedev.plugins.steps.clear_history import ClearHistoryStep -from continuedev.plugins.steps.feedback import FeedbackStep -from continuedev.plugins.steps.comment_code import CommentCodeStep -from continuedev.plugins.steps.main import EditHighlightedCodeStep - - -class CommitMessageStep(Step): - """ - This is a Step, the building block of Continue. - It can be used below as a slash command, so that - run will be called when you type '/commit'. - """ - async def run(self, sdk: ContinueSDK): - - # Get the root directory of the workspace - dir = sdk.ide.workspace_directory - - # Run git diff in that directory - diff = subprocess.check_output( - ["git", "diff"], cwd=dir).decode("utf-8") - - # Ask the LLM to write a commit message, - # and set it as the description of this step - self.description = await sdk.models.default.complete( - f"{diff}\n\nWrite a short, specific (less than 50 chars) commit message about the above changes:") - - -config = ContinueConfig( - - # If set to False, we will not collect any usage data - # See here to learn what anonymous data we collect: https://continue.dev/docs/telemetry - allow_anonymous_telemetry=True, - - models=Models( - default=MaybeProxyOpenAI(model="gpt-4"), - medium=MaybeProxyOpenAI(model="gpt-3.5-turbo") - ), - - # Set a system message with information that the LLM should always keep in mind - # E.g. "Please give concise answers. Always respond in Spanish." - system_message=None, - - # Set temperature to any value between 0 and 1. Higher values will make the LLM - # more creative, while lower values will make it more predictable. - temperature=0.5, - - # Custom commands let you map a prompt to a shortened slash command - # They are like slash commands, but more easily defined - write just a prompt instead of a Step class - # Their output will always be in chat form - custom_commands=[CustomCommand( - name="test", - description="This is an example custom command. Use /config to edit it and create more", - prompt="Write a comprehensive set of unit tests for the selected code. It should setup, run tests that check for correctness including important edge cases, and teardown. Ensure that the tests are complete and sophisticated. Give the tests just as chat output, don't edit any file.", - )], - - # Slash commands let you run a Step from a slash command - slash_commands=[ - # SlashCommand( - # name="commit", - # description="This is an example slash command. Use /config to edit it and create more", - # step=CommitMessageStep, - # ) - SlashCommand( - name="edit", - description="Edit code in the current file or the highlighted code", - step=EditHighlightedCodeStep, - ), - SlashCommand( - name="config", - description="Open the config file to create new and edit existing slash commands", - step=OpenConfigStep, - ), - SlashCommand( - name="comment", - description="Write comments for the current file or highlighted code", - step=CommentCodeStep, - ), - SlashCommand( - name="feedback", - description="Send feedback to improve Continue", - step=FeedbackStep, - ), - SlashCommand( - name="clear", - description="Clear step history", - step=ClearHistoryStep, - ) - ], - - # Context providers let you quickly select context by typing '@' - # Uncomment the following to - # - quickly reference GitHub issues - # - show Google search results to the LLM - context_providers=[ - # GitHubIssuesContextProvider( - # repo_name="/", - # auth_token="" - # ), - # GoogleContextProvider( - # serper_api_key="" - # ) - ], - - # Policies hold the main logic that decides which Step to take next - # You can use them to design agents, or deeply customize Continue - policy=DefaultPolicy() -) diff --git a/continuedev/src/continuedev/libs/util/paths.py b/continuedev/src/continuedev/libs/util/paths.py index 6385dc6f..a659f044 100644 --- a/continuedev/src/continuedev/libs/util/paths.py +++ b/continuedev/src/continuedev/libs/util/paths.py @@ -1,6 +1,6 @@ import os -import sys from ..constants.main import CONTINUE_SESSIONS_FOLDER, CONTINUE_GLOBAL_FOLDER, CONTINUE_SERVER_FOLDER +from ..constants.default_config import default_config def find_data_file(filename): @@ -32,20 +32,13 @@ def getSessionFilePath(session_id: str): return path -def getDefaultConfigFile() -> str: - default_config_path = find_data_file(os.path.join( - "..", "constants", "default_config.py.txt")) - with open(default_config_path, 'r') as f: - return f.read() - - def getConfigFilePath() -> str: path = os.path.join(getGlobalFolderPath(), "config.py") os.makedirs(os.path.dirname(path), exist_ok=True) if not os.path.exists(path): with open(path, 'w') as f: - f.write(getDefaultConfigFile()) + f.write(default_config) return path -- cgit v1.2.3-70-g09d2 From 6d7507e6a71efaa5c3d9795b6e2ea97634674fe2 Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Tue, 1 Aug 2023 23:37:22 -0700 Subject: escape curly braces --- continuedev/src/continuedev/libs/constants/default_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'continuedev/src') diff --git a/continuedev/src/continuedev/libs/constants/default_config.py b/continuedev/src/continuedev/libs/constants/default_config.py index 9d6d4270..ebdd0cb8 100644 --- a/continuedev/src/continuedev/libs/constants/default_config.py +++ b/continuedev/src/continuedev/libs/constants/default_config.py @@ -42,7 +42,7 @@ class CommitMessageStep(Step): # Ask the LLM to write a commit message, # and set it as the description of this step self.description = await sdk.models.default.complete( - f"{diff}\n\nWrite a short, specific (less than 50 chars) commit message about the above changes:") + f"\{diff\}\n\nWrite a short, specific (less than 50 chars) commit message about the above changes:") config = ContinueConfig( -- cgit v1.2.3-70-g09d2 From 017b37fc315cf05ec848cbaf300503bee6ffac8f Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Wed, 2 Aug 2023 00:11:12 -0700 Subject: docs update and fix default_config.py --- continuedev/src/continuedev/libs/constants/default_config.py | 2 +- docs/docs/troubleshooting.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'continuedev/src') diff --git a/continuedev/src/continuedev/libs/constants/default_config.py b/continuedev/src/continuedev/libs/constants/default_config.py index ebdd0cb8..d10844c3 100644 --- a/continuedev/src/continuedev/libs/constants/default_config.py +++ b/continuedev/src/continuedev/libs/constants/default_config.py @@ -42,7 +42,7 @@ class CommitMessageStep(Step): # Ask the LLM to write a commit message, # and set it as the description of this step self.description = await sdk.models.default.complete( - f"\{diff\}\n\nWrite a short, specific (less than 50 chars) commit message about the above changes:") + f"{diff}\\n\\nWrite a short, specific (less than 50 chars) commit message about the above changes:") config = ContinueConfig( diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 53cec3e4..52385855 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -31,9 +31,9 @@ If the above doesn't work, you can try to kill the server manually before reload 2. Enter `lsof -i :65432 | grep "(LISTEN)" | awk '{print $2}' | xargs kill -9` to kill the server running on port 65432. 3. Restart VS Code, and Continue will attempt to start a fresh server. -## Manually install Python requirements +## Delete `~/.continue` -Open any terminal and run `cd ~/.continue/server` to enter the Continue server directory, then `pip3 install -r requirements.txt` to install the requirements. Restarting VS Code should now correctly start the server. +To get a completely fresh install of Continue, you can delete the `~/.continue` directory. Note that this will delete your config file and all saved sessions and development data. ## Run the server manually -- cgit v1.2.3-70-g09d2 From f18ddbc962059a6df1f8cc858d1ac88d9ec04887 Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Wed, 2 Aug 2023 15:41:10 -0700 Subject: attempting alternative solution to import config --- .github/workflows/main.yaml | 25 ++++++------ continuedev/src/continuedev/core/sdk.py | 50 ++++++++++++++++++++++- continuedev/src/continuedev/libs/llm/anthropic.py | 4 -- cxf.py | 14 ------- 4 files changed, 60 insertions(+), 33 deletions(-) delete mode 100644 cxf.py (limited to 'continuedev/src') diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 7787ddad..365f7b7d 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -107,19 +107,18 @@ jobs: run: | cd extension npm run package - npx vsce publish patch -p ${{ secrets.VSCE_TOKEN }} - - - name: Commit changes - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git commit -am "ci: 💚 Update package.json version [skip ci]" - - - name: Push changes - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: ${{ github.ref }} + # npx vsce publish patch -p ${{ secrets.VSCE_TOKEN }} + # - name: Commit changes + # run: | + # git config --local user.email "action@github.com" + # git config --local user.name "GitHub Action" + # git commit -am "ci: 💚 Update package.json version [skip ci]" + + # - name: Push changes + # uses: ad-m/github-push-action@master + # with: + # github_token: ${{ secrets.GITHUB_TOKEN }} + # branch: ${{ github.ref }} - name: Upload .vsix artifact uses: actions/upload-artifact@v2 diff --git a/continuedev/src/continuedev/core/sdk.py b/continuedev/src/continuedev/core/sdk.py index 57e2c099..42cfbcb9 100644 --- a/continuedev/src/continuedev/core/sdk.py +++ b/continuedev/src/continuedev/core/sdk.py @@ -1,7 +1,7 @@ -from functools import cached_property import traceback -from typing import Coroutine, Dict, Literal, Union +from typing import Coroutine, Union import os +import importlib from ..plugins.steps.core.core import DefaultModelEditCodeStep from ..models.main import Range @@ -164,6 +164,52 @@ class ContinueSDK(AbstractContinueSDK): _last_valid_config: ContinueConfig = None def _load_config_dot_py(self) -> ContinueConfig: + # Read the file content + with open(os.path.expanduser('~/.continue/config.py')) as file: + config_content = file.read() + + def load_module(module_name: str, class_names: List[str]): + # from anthropic import AsyncAnthropic + module = importlib.import_module(module_name) + for class_name in class_names: + globals()[class_name] = getattr(module, class_name) + + while True: + # Execute the file content + locals_var = {} + try: + import importlib.util + spec = importlib.util.spec_from_file_location( + "config", "/Users/natesesti/.continue/config.py") + config = importlib.util.module_from_spec(spec) + spec.loader.exec_module(config) + + return config.config + # exec(config_content, globals(), locals_var) + # print("Done executing, ", locals_var) + # return locals_var['config'] + except ModuleNotFoundError as e: + print("ModuleNotFoundError") + print(e) + print(traceback.format_exception(e)) + formatted = traceback.format_exception(e) + line = formatted[-2].split("\n")[-2].strip().split() + # Parse the module name and class name from the error message + # Example: ModuleNotFoundError: No module named 'continuedev.src.continuedev.plugins.context_providers.google' + + # Get the module name + module_name = line[1] + # Get the class name + class_names = list(map(lambda x: x.replace(",", ""), filter(lambda x: x.strip() != "", line[3:]))) + + # Load the module + print( + f"Loading module {module_name} with class names {class_names}") + load_module(module_name, class_names) + except Exception as e: + print("Failed to execute config.py: ", e) + raise e + # Use importlib to load the config file config.py at the given path path = getConfigFilePath() diff --git a/continuedev/src/continuedev/libs/llm/anthropic.py b/continuedev/src/continuedev/libs/llm/anthropic.py index ec1b7e40..e6b88d03 100644 --- a/continuedev/src/continuedev/libs/llm/anthropic.py +++ b/continuedev/src/continuedev/libs/llm/anthropic.py @@ -17,10 +17,6 @@ class AnthropicLLM(LLM): class Config: arbitrary_types_allowed = True - def __init__(self, model: str, system_message: str = None): - self.model = model - self.system_message = system_message - async def start(self, *, api_key: Optional[str] = None, **kwargs): self._async_client = AsyncAnthropic(api_key=api_key) diff --git a/cxf.py b/cxf.py deleted file mode 100644 index b8610999..00000000 --- a/cxf.py +++ /dev/null @@ -1,14 +0,0 @@ -from cx_Freeze import setup, Executable - -setup( - name="Continue", - version="0.1", - description="Continue Server", - executables=[Executable("run.py")], - - options={ - "build_exe": { - "excludes": ["unnecessary_module"], - }, - }, -) -- cgit v1.2.3-70-g09d2 From d000c7bf3fbfb0ed0b48dc8508e551ad9331333a Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Wed, 2 Aug 2023 18:58:21 -0700 Subject: checkpoint --- continuedev/src/continuedev/core/sdk.py | 19 +++++++++---- continuedev/src/continuedev/libs/llm/anthropic.py | 33 ++++++++++++++++++----- 2 files changed, 40 insertions(+), 12 deletions(-) (limited to 'continuedev/src') diff --git a/continuedev/src/continuedev/core/sdk.py b/continuedev/src/continuedev/core/sdk.py index 42cfbcb9..d040ea41 100644 --- a/continuedev/src/continuedev/core/sdk.py +++ b/continuedev/src/continuedev/core/sdk.py @@ -18,6 +18,7 @@ from ..libs.util.telemetry import posthog_logger from ..libs.util.paths import getConfigFilePath from .models import Models from ..libs.util.logging import logger +# __import__("anthropic", globals(), locals(), ["AsyncAnthropic"], 0) class Autopilot: @@ -46,7 +47,8 @@ class ContinueSDK(AbstractContinueSDK): config = sdk._load_config_dot_py() sdk.config = config except Exception as e: - logger.error(f"Failed to load config.py: {e}") + logger.error( + f"Failed to load config.py: {traceback.format_exception(e)}") sdk.config = ContinueConfig( ) if sdk._last_valid_config is None else sdk._last_valid_config @@ -170,9 +172,15 @@ class ContinueSDK(AbstractContinueSDK): def load_module(module_name: str, class_names: List[str]): # from anthropic import AsyncAnthropic - module = importlib.import_module(module_name) - for class_name in class_names: - globals()[class_name] = getattr(module, class_name) + print("IMPORTING") + # exec("from anthropic import AsyncAnthropic", globals(), locals()) + # imports = __import__("anthropic", globals(), locals(), ["AsyncAnthropic"], 0) + # print("IMPORTS: ", imports) + # for class_name in class_names: + # globals()[class_name] = getattr(imports, class_name) + # module = importlib.import_module(module_name) + # for class_name in class_names: + # globals()[class_name] = getattr(module, class_name) while True: # Execute the file content @@ -200,7 +208,8 @@ class ContinueSDK(AbstractContinueSDK): # Get the module name module_name = line[1] # Get the class name - class_names = list(map(lambda x: x.replace(",", ""), filter(lambda x: x.strip() != "", line[3:]))) + class_names = list(map(lambda x: x.replace( + ",", ""), filter(lambda x: x.strip() != "", line[3:]))) # Load the module print( diff --git a/continuedev/src/continuedev/libs/llm/anthropic.py b/continuedev/src/continuedev/libs/llm/anthropic.py index e6b88d03..ac5c56a4 100644 --- a/continuedev/src/continuedev/libs/llm/anthropic.py +++ b/continuedev/src/continuedev/libs/llm/anthropic.py @@ -1,29 +1,32 @@ - from functools import cached_property import time -from typing import Any, Coroutine, Dict, Generator, List, Optional, Union +from typing import Any, Callable, Coroutine, Dict, Generator, List, Optional, Union from ...core.main import ChatMessage from anthropic import HUMAN_PROMPT, AI_PROMPT, AsyncAnthropic from ..llm import LLM -from ..util.count_tokens import compile_chat_messages, DEFAULT_ARGS, count_tokens +from ..util.count_tokens import compile_chat_messages, DEFAULT_ARGS, count_tokens, format_chat_messages class AnthropicLLM(LLM): model: str = "claude-2" requires_api_key: str = "ANTHROPIC_API_KEY" + requires_write_log = True _async_client: AsyncAnthropic = None class Config: arbitrary_types_allowed = True - async def start(self, *, api_key: Optional[str] = None, **kwargs): + write_log: Optional[Callable[[str], None]] = None + + async def start(self, *, api_key: Optional[str] = None, write_log: Callable[[str], None], **kwargs): + self.write_log = write_log self._async_client = AsyncAnthropic(api_key=api_key) async def stop(self): pass - @cached_property + @property def name(self): return self.model @@ -68,12 +71,18 @@ class AnthropicLLM(LLM): args.update(kwargs) args["stream"] = True args = self._transform_args(args) + prompt = f"{HUMAN_PROMPT} {prompt} {AI_PROMPT}" + self.write_log(f"Prompt: \n\n{prompt}") + completion = "" async for chunk in await self._async_client.completions.create( - prompt=f"{HUMAN_PROMPT} {prompt} {AI_PROMPT}", + prompt=prompt, **args ): yield chunk.completion + completion += chunk.completion + + self.write_log(f"Completion: \n\n{completion}") async def stream_chat(self, messages: List[ChatMessage] = None, **kwargs) -> Generator[Union[Any, List, Dict], None, None]: args = self.default_args.copy() @@ -82,7 +91,10 @@ class AnthropicLLM(LLM): args = self._transform_args(args) messages = compile_chat_messages( - args["model"], messages, self.context_length, self.context_length, args["max_tokens_to_sample"], functions=args.get("functions", None), system_message=self.system_message) + args["model"], messages, self.context_length, args["max_tokens_to_sample"], functions=args.get("functions", None), system_message=self.system_message) + + completion = "" + self.write_log(f"Prompt: \n\n{format_chat_messages(messages)}") async for chunk in await self._async_client.completions.create( prompt=self.__messages_to_prompt(messages), **args @@ -91,6 +103,9 @@ class AnthropicLLM(LLM): "role": "assistant", "content": chunk.completion } + completion += chunk.completion + + self.write_log(f"Completion: \n\n{completion}") async def complete(self, prompt: str, with_history: List[ChatMessage] = None, **kwargs) -> Coroutine[Any, Any, str]: args = {**self.default_args, **kwargs} @@ -98,9 +113,13 @@ class AnthropicLLM(LLM): messages = compile_chat_messages( args["model"], with_history, self.context_length, args["max_tokens_to_sample"], prompt, functions=None, system_message=self.system_message) + + completion = "" + self.write_log(f"Prompt: \n\n{format_chat_messages(messages)}") resp = (await self._async_client.completions.create( prompt=self.__messages_to_prompt(messages), **args )).completion + self.write_log(f"Completion: \n\n{resp}") return resp -- cgit v1.2.3-70-g09d2 From 54111067474b62f652c157a5f5289c9eba2555e5 Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Wed, 2 Aug 2023 19:19:34 -0700 Subject: add --hidden-imports, simplify sdk.py --- .github/workflows/main.yaml | 2 +- continuedev/src/continuedev/core/sdk.py | 54 --------------------------------- 2 files changed, 1 insertion(+), 55 deletions(-) (limited to 'continuedev/src') diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 365f7b7d..1309aa24 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -31,7 +31,7 @@ jobs: run: | pip install -r continuedev/requirements.txt - - run: pyinstaller run.py --exclude-module numpy --exclude-module jedi -F + - run: pyinstaller run.py --exclude-module numpy --exclude-module jedi -F --add-data 'continuedev:continuedev' --hidden-import=anthropic --hidden-import=github - name: Set permissions run: | diff --git a/continuedev/src/continuedev/core/sdk.py b/continuedev/src/continuedev/core/sdk.py index d040ea41..5065ff88 100644 --- a/continuedev/src/continuedev/core/sdk.py +++ b/continuedev/src/continuedev/core/sdk.py @@ -18,7 +18,6 @@ from ..libs.util.telemetry import posthog_logger from ..libs.util.paths import getConfigFilePath from .models import Models from ..libs.util.logging import logger -# __import__("anthropic", globals(), locals(), ["AsyncAnthropic"], 0) class Autopilot: @@ -166,59 +165,6 @@ class ContinueSDK(AbstractContinueSDK): _last_valid_config: ContinueConfig = None def _load_config_dot_py(self) -> ContinueConfig: - # Read the file content - with open(os.path.expanduser('~/.continue/config.py')) as file: - config_content = file.read() - - def load_module(module_name: str, class_names: List[str]): - # from anthropic import AsyncAnthropic - print("IMPORTING") - # exec("from anthropic import AsyncAnthropic", globals(), locals()) - # imports = __import__("anthropic", globals(), locals(), ["AsyncAnthropic"], 0) - # print("IMPORTS: ", imports) - # for class_name in class_names: - # globals()[class_name] = getattr(imports, class_name) - # module = importlib.import_module(module_name) - # for class_name in class_names: - # globals()[class_name] = getattr(module, class_name) - - while True: - # Execute the file content - locals_var = {} - try: - import importlib.util - spec = importlib.util.spec_from_file_location( - "config", "/Users/natesesti/.continue/config.py") - config = importlib.util.module_from_spec(spec) - spec.loader.exec_module(config) - - return config.config - # exec(config_content, globals(), locals_var) - # print("Done executing, ", locals_var) - # return locals_var['config'] - except ModuleNotFoundError as e: - print("ModuleNotFoundError") - print(e) - print(traceback.format_exception(e)) - formatted = traceback.format_exception(e) - line = formatted[-2].split("\n")[-2].strip().split() - # Parse the module name and class name from the error message - # Example: ModuleNotFoundError: No module named 'continuedev.src.continuedev.plugins.context_providers.google' - - # Get the module name - module_name = line[1] - # Get the class name - class_names = list(map(lambda x: x.replace( - ",", ""), filter(lambda x: x.strip() != "", line[3:]))) - - # Load the module - print( - f"Loading module {module_name} with class names {class_names}") - load_module(module_name, class_names) - except Exception as e: - print("Failed to execute config.py: ", e) - raise e - # Use importlib to load the config file config.py at the given path path = getConfigFilePath() -- cgit v1.2.3-70-g09d2 From efc32bbd43f591a75f1e94dfebc912e2c2dc1c99 Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Wed, 2 Aug 2023 22:55:12 -0700 Subject: fix default config file --- .../continuedev/libs/constants/default_config.py | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'continuedev/src') diff --git a/continuedev/src/continuedev/libs/constants/default_config.py b/continuedev/src/continuedev/libs/constants/default_config.py index d10844c3..238dc1da 100644 --- a/continuedev/src/continuedev/libs/constants/default_config.py +++ b/continuedev/src/continuedev/libs/constants/default_config.py @@ -8,20 +8,20 @@ be sure to select the Python interpreter in ~/.continue/server/env. import subprocess -from continuedev.core.main import Step -from continuedev.core.sdk import ContinueSDK -from continuedev.core.models import Models -from continuedev.core.config import CustomCommand, SlashCommand, ContinueConfig -from continuedev.plugins.context_providers.github import GitHubIssuesContextProvider -from continuedev.plugins.context_providers.google import GoogleContextProvider -from continuedev.libs.llm.maybe_proxy_openai import MaybeProxyOpenAI -from continuedev.plugins.policies.default import DefaultPolicy - -from continuedev.plugins.steps.open_config import OpenConfigStep -from continuedev.plugins.steps.clear_history import ClearHistoryStep -from continuedev.plugins.steps.feedback import FeedbackStep -from continuedev.plugins.steps.comment_code import CommentCodeStep -from continuedev.plugins.steps.main import EditHighlightedCodeStep +from continuedev.src.continuedev.core.main import Step +from continuedev.src.continuedev.core.sdk import ContinueSDK +from continuedev.src.continuedev.core.models import Models +from continuedev.src.continuedev.core.config import CustomCommand, SlashCommand, ContinueConfig +from continuedev.src.continuedev.plugins.context_providers.github import GitHubIssuesContextProvider +from continuedev.src.continuedev.plugins.context_providers.google import GoogleContextProvider +from continuedev.src.continuedev.libs.llm.maybe_proxy_openai import MaybeProxyOpenAI +from continuedev.src.continuedev.plugins.policies.default import DefaultPolicy + +from continuedev.src.continuedev.plugins.steps.open_config import OpenConfigStep +from continuedev.src.continuedev.plugins.steps.clear_history import ClearHistoryStep +from continuedev.src.continuedev.plugins.steps.feedback import FeedbackStep +from continuedev.src.continuedev.plugins.steps.comment_code import CommentCodeStep +from continuedev.src.continuedev.plugins.steps.main import EditHighlightedCodeStep class CommitMessageStep(Step): -- cgit v1.2.3-70-g09d2 From 6717bbff707373b3a5a08c3384ffd0f8496aee9a Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Wed, 2 Aug 2023 23:51:23 -0700 Subject: default_config.py migration helper --- continuedev/src/continuedev/libs/util/paths.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'continuedev/src') diff --git a/continuedev/src/continuedev/libs/util/paths.py b/continuedev/src/continuedev/libs/util/paths.py index a659f044..1e11898f 100644 --- a/continuedev/src/continuedev/libs/util/paths.py +++ b/continuedev/src/continuedev/libs/util/paths.py @@ -36,9 +36,16 @@ def getConfigFilePath() -> str: path = os.path.join(getGlobalFolderPath(), "config.py") os.makedirs(os.path.dirname(path), exist_ok=True) - if not os.path.exists(path): + with open(path, 'r') as f: + existing_content = f.read() + + if not os.path.exists(path) or existing_content.strip() == "": with open(path, 'w') as f: f.write(default_config) + elif " continuedev.core" in existing_content: + with open(path, 'w') as f: + f.write(existing_content.replace(" continuedev.", + " continuedev.src.continuedev.")) return path -- cgit v1.2.3-70-g09d2 From bfd2f09cd6ebdc18e8162555a1859f0098b14cd3 Mon Sep 17 00:00:00 2001 From: Nate Sesti Date: Thu, 3 Aug 2023 01:11:41 -0700 Subject: small fixes to setup --- continuedev/src/continuedev/libs/util/paths.py | 20 ++++++++++++-------- extension/src/activation/environmentSetup.ts | 20 ++++++++++---------- 2 files changed, 22 insertions(+), 18 deletions(-) (limited to 'continuedev/src') diff --git a/continuedev/src/continuedev/libs/util/paths.py b/continuedev/src/continuedev/libs/util/paths.py index 1e11898f..83a472ad 100644 --- a/continuedev/src/continuedev/libs/util/paths.py +++ b/continuedev/src/continuedev/libs/util/paths.py @@ -36,16 +36,20 @@ def getConfigFilePath() -> str: path = os.path.join(getGlobalFolderPath(), "config.py") os.makedirs(os.path.dirname(path), exist_ok=True) - with open(path, 'r') as f: - existing_content = f.read() - - if not os.path.exists(path) or existing_content.strip() == "": + if not os.path.exists(path): with open(path, 'w') as f: f.write(default_config) - elif " continuedev.core" in existing_content: - with open(path, 'w') as f: - f.write(existing_content.replace(" continuedev.", - " continuedev.src.continuedev.")) + else: + with open(path, 'r') as f: + existing_content = f.read() + + if existing_content.strip() == "": + with open(path, 'w') as f: + f.write(default_config) + elif " continuedev.core" in existing_content: + with open(path, 'w') as f: + f.write(existing_content.replace(" continuedev.", + " continuedev.src.continuedev.")) return path diff --git a/extension/src/activation/environmentSetup.ts b/extension/src/activation/environmentSetup.ts index 8d9578e8..db457bd2 100644 --- a/extension/src/activation/environmentSetup.ts +++ b/extension/src/activation/environmentSetup.ts @@ -83,23 +83,23 @@ export function getExtensionVersion() { // Returns whether a server of the current version is already running async function checkOrKillRunningServer(serverUrl: string): Promise { console.log("Checking if server is old version"); + const serverRunning = await checkServerRunning(serverUrl); // Kill the server if it is running an old version if (fs.existsSync(serverVersionPath())) { const serverVersion = fs.readFileSync(serverVersionPath(), "utf8"); - if ( - serverVersion === getExtensionVersion() && - (await checkServerRunning(serverUrl)) - ) { + if (serverVersion === getExtensionVersion() && serverRunning) { // The current version is already up and running, no need to continue return true; } } - console.log("Killing old server..."); - try { - await fkill(":65432"); - } catch (e: any) { - if (!e.message.includes("Process doesn't exist")) { - console.log("Failed to kill old server:", e); + if (serverRunning) { + console.log("Killing old server..."); + try { + await fkill(":65432"); + } catch (e: any) { + if (!e.message.includes("Process doesn't exist")) { + console.log("Failed to kill old server:", e); + } } } return false; -- cgit v1.2.3-70-g09d2