From 068195d21c2b567096df09688fc19c45ca5595c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=B6nicke?= Date: Wed, 12 Apr 2023 18:54:45 +0200 Subject: [PATCH 1/7] docs: update --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index adb63aa..24ae7e3 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,11 @@ Your imagination is the limit! Supported platforms -[![Watch the video](res/thumbnail.png)]() +
+ + Watch the video + +

This project streamlines the creation and deployment of microservices. From 82e42f4db9fbf7d24c49e4bd2b6bcdbd57e548d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=B6nicke?= Date: Wed, 12 Apr 2023 19:06:51 +0200 Subject: [PATCH 2/7] docs: update --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 24ae7e3..a881f5a 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,8 @@ Your imagination is the limit! Supported platforms -
- - Watch the video - -
+ +[![Watch the video](res/thumbnail.png)](https://user-images.githubusercontent.com/11627845/231530421-272a66aa-4260-4e17-ab7a-ba66adca754c.mp4)

This project streamlines the creation and deployment of microservices. From f0acf9db50e7b8ecebf98a52d07c6f8f6008c1ab Mon Sep 17 00:00:00 2001 From: Francesco R <424577+francescor@users.noreply.github.com> Date: Thu, 13 Apr 2023 10:26:12 +0000 Subject: [PATCH 3/7] fix typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a881f5a..761c68b 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ gptdeploy create --description "Given a 3d object, return vertex count and face ### Table extraction ```bash ---description "Given a URL, extract all tables as csv" --test "http://www.ins.tn/statistiques/90" +gptdeploy create --description "Given a URL, extract all tables as csv" --test "http://www.ins.tn/statistiques/90" ``` Table Extraction From 5b7f0d55c1ee61fe521463e929aabef1ea8b9e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=B6nicke?= Date: Thu, 13 Apr 2023 14:56:47 +0200 Subject: [PATCH 4/7] docs: update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 761c68b..2d387b0 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ To ensure the microservice accurately aligns with your intended task a test scen ## Quickstart ### Requirements +- OpenAI key with access to GPT-4 - Create an account at [cloud.jina.ai](https://cloud.jina.ai) where your microservice will be deployed ### Installation From 04febfa506d443d1f5ef243b03352bfa70ff7f6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Ho=CC=88nicke?= Date: Thu, 13 Apr 2023 16:34:53 +0200 Subject: [PATCH 5/7] feat: dont delete code --- src/executor_factory.py | 28 ++++++++++++++-------------- src/utils/io.py | 13 +++++++------ 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/executor_factory.py b/src/executor_factory.py index 830cc5d..f162d6d 100644 --- a/src/executor_factory.py +++ b/src/executor_factory.py @@ -7,7 +7,7 @@ from src.constants import FILE_AND_TAG_PAIRS from src.jina_cloud import push_executor, process_error_message from src.prompt_tasks import general_guidelines, executor_file_task, chain_of_thought_creation, test_executor_file_task, \ chain_of_thought_optimization, requirements_file_task, docker_file_task, not_allowed -from src.utils.io import recreate_folder, persist_file +from src.utils.io import create_folder_if_not_exist, persist_file from src.utils.string_tools import print_colored @@ -66,10 +66,11 @@ class ExecutorFactory: output_path, executor_name, package, + num_approach, is_chain_of_thought=False, ): - EXECUTOR_FOLDER_v1 = self.get_executor_path(output_path, package, 1) - recreate_folder(EXECUTOR_FOLDER_v1) + EXECUTOR_FOLDER_v1 = self.get_executor_path(output_path, executor_name, package, num_approach, 1) + create_folder_if_not_exist(EXECUTOR_FOLDER_v1) print_colored('', '############# Executor #############', 'red') user_query = ( @@ -167,22 +168,22 @@ print(response[0].text) # can also be blob in case of image/audio..., this shoul playground_content = self.extract_content_from_result(playground_content_raw, 'app.py') persist_file(playground_content, os.path.join(executor_path, 'app.py')) - def get_executor_path(self, output_path, package, version): + def get_executor_path(self, output_path, executor_name, package, num_approach, version): package_path = '_'.join(package) - return os.path.join(output_path, package_path, f'v{version}') + return os.path.join(output_path, executor_name, f'{num_approach}_package_path', f'v{version}') - def debug_executor(self, output_path, package, description, test): + def debug_executor(self, output_path, executor_name, package, description, test): MAX_DEBUGGING_ITERATIONS = 10 error_before = '' for i in range(1, MAX_DEBUGGING_ITERATIONS): print('Debugging iteration', i) print('Trying to build the microservice. Might take a while...') - previous_executor_path = self.get_executor_path(output_path, package, i) - next_executor_path = self.get_executor_path(output_path, package, i + 1) + previous_executor_path = self.get_executor_path(output_path, executor_name, package, num_approach, i) + next_executor_path = self.get_executor_path(output_path, executor_name, package, num_approach, i + 1) log_hubble = push_executor(previous_executor_path) error = process_error_message(log_hubble) if error: - recreate_folder(next_executor_path) + create_folder_if_not_exist(next_executor_path) file_name_to_content = self.get_all_executor_files_with_content(previous_executor_path) all_files_string = self.files_to_string(file_name_to_content) user_query = ( @@ -223,7 +224,7 @@ print(response[0].text) # can also be blob in case of image/audio..., this shoul break if i == MAX_DEBUGGING_ITERATIONS - 1: raise self.MaxDebugTimeReachedException('Could not debug the executor.') - return self.get_executor_path(output_path, package, i) + return self.get_executor_path(output_path, executor_name, package, num_approach, i) class MaxDebugTimeReachedException(BaseException): pass @@ -285,11 +286,10 @@ package2,package3,... generated_name = self.generate_executor_name(description) executor_name = f'{generated_name}{random.randint(0, 1000_000)}' packages_list = self.get_possible_packages(description, num_approaches) - recreate_folder(output_path) - for packages in packages_list: + for num_approach, packages in enumerate(packages_list): try: - self.create_executor(description, test, output_path, executor_name, packages) - executor_path = self.debug_executor(output_path, packages, description, test) + self.create_executor(description, test, output_path, executor_name, packages, num_approach) + executor_path = self.debug_executor(output_path, executor_name, packages, description, test) host = jina_cloud.deploy_flow(executor_name, executor_path) self.create_playground(executor_name, executor_path, host) except self.MaxDebugTimeReachedException: diff --git a/src/utils/io.py b/src/utils/io.py index 9e53475..b4d0c01 100644 --- a/src/utils/io.py +++ b/src/utils/io.py @@ -6,13 +6,14 @@ from typing import Generator import sys from contextlib import contextmanager -def recreate_folder(folder_path): - if os.path.exists(folder_path) and os.path.isdir(folder_path): - shutil.rmtree(folder_path) - os.makedirs(folder_path) +def create_folder_if_not_exist(folder_path): + try: + os.makedirs(folder_path) + except FileExistsError: + pass -def persist_file(file_content, file_name): - with open(f'{file_name}', 'w') as f: +def persist_file(file_content, file_path): + with open(file_path, 'w') as f: f.write(file_content) From 51687424ba6d4a6b3957191c50adfd340c3d9b14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Ho=CC=88nicke?= Date: Thu, 13 Apr 2023 22:03:29 +0200 Subject: [PATCH 6/7] feat: dont delete code --- README.md | 3 +++ res/discord.png | Bin 0 -> 26938 bytes 2 files changed, 3 insertions(+) create mode 100644 res/discord.png diff --git a/README.md b/README.md index adb63aa..db606f6 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ This project streamlines the creation and deployment of microservices. Simply describe your task using natural language, and the system will automatically build and deploy your microservice. To ensure the microservice accurately aligns with your intended task a test scenario is required. +Join our Discord logo to get in touch with the team and other users. + + ## Quickstart ### Requirements - Create an account at [cloud.jina.ai](https://cloud.jina.ai) where your microservice will be deployed diff --git a/res/discord.png b/res/discord.png new file mode 100644 index 0000000000000000000000000000000000000000..c6366507bfbf622ced06e338d7cf4b90bfa949ae GIT binary patch literal 26938 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 Date: Thu, 13 Apr 2023 22:42:05 +0200 Subject: [PATCH 7/7] feat: dont delete code --- src/executor_factory.py | 18 +++++++++--------- src/utils/io.py | 5 ----- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/executor_factory.py b/src/executor_factory.py index f162d6d..c8923c6 100644 --- a/src/executor_factory.py +++ b/src/executor_factory.py @@ -7,7 +7,7 @@ from src.constants import FILE_AND_TAG_PAIRS from src.jina_cloud import push_executor, process_error_message from src.prompt_tasks import general_guidelines, executor_file_task, chain_of_thought_creation, test_executor_file_task, \ chain_of_thought_optimization, requirements_file_task, docker_file_task, not_allowed -from src.utils.io import create_folder_if_not_exist, persist_file +from src.utils.io import persist_file from src.utils.string_tools import print_colored @@ -70,7 +70,7 @@ class ExecutorFactory: is_chain_of_thought=False, ): EXECUTOR_FOLDER_v1 = self.get_executor_path(output_path, executor_name, package, num_approach, 1) - create_folder_if_not_exist(EXECUTOR_FOLDER_v1) + os.makedirs(EXECUTOR_FOLDER_v1) print_colored('', '############# Executor #############', 'red') user_query = ( @@ -170,20 +170,20 @@ print(response[0].text) # can also be blob in case of image/audio..., this shoul def get_executor_path(self, output_path, executor_name, package, num_approach, version): package_path = '_'.join(package) - return os.path.join(output_path, executor_name, f'{num_approach}_package_path', f'v{version}') + return os.path.join(output_path, executor_name, f'{num_approach}_{package_path}', f'v{version}') - def debug_executor(self, output_path, executor_name, package, description, test): + def debug_executor(self, output_path, executor_name, num_approach, packages, description, test): MAX_DEBUGGING_ITERATIONS = 10 error_before = '' for i in range(1, MAX_DEBUGGING_ITERATIONS): print('Debugging iteration', i) print('Trying to build the microservice. Might take a while...') - previous_executor_path = self.get_executor_path(output_path, executor_name, package, num_approach, i) - next_executor_path = self.get_executor_path(output_path, executor_name, package, num_approach, i + 1) + previous_executor_path = self.get_executor_path(output_path, executor_name, packages, num_approach, i) + next_executor_path = self.get_executor_path(output_path, executor_name, packages, num_approach, i + 1) log_hubble = push_executor(previous_executor_path) error = process_error_message(log_hubble) if error: - create_folder_if_not_exist(next_executor_path) + os.makedirs(next_executor_path) file_name_to_content = self.get_all_executor_files_with_content(previous_executor_path) all_files_string = self.files_to_string(file_name_to_content) user_query = ( @@ -224,7 +224,7 @@ print(response[0].text) # can also be blob in case of image/audio..., this shoul break if i == MAX_DEBUGGING_ITERATIONS - 1: raise self.MaxDebugTimeReachedException('Could not debug the executor.') - return self.get_executor_path(output_path, executor_name, package, num_approach, i) + return self.get_executor_path(output_path, executor_name, packages, num_approach, i) class MaxDebugTimeReachedException(BaseException): pass @@ -289,7 +289,7 @@ package2,package3,... for num_approach, packages in enumerate(packages_list): try: self.create_executor(description, test, output_path, executor_name, packages, num_approach) - executor_path = self.debug_executor(output_path, executor_name, packages, description, test) + executor_path = self.debug_executor(output_path, executor_name, num_approach, packages, description, test) host = jina_cloud.deploy_flow(executor_name, executor_path) self.create_playground(executor_name, executor_path, host) except self.MaxDebugTimeReachedException: diff --git a/src/utils/io.py b/src/utils/io.py index b4d0c01..a9104f5 100644 --- a/src/utils/io.py +++ b/src/utils/io.py @@ -6,11 +6,6 @@ from typing import Generator import sys from contextlib import contextmanager -def create_folder_if_not_exist(folder_path): - try: - os.makedirs(folder_path) - except FileExistsError: - pass def persist_file(file_content, file_path): with open(file_path, 'w') as f: