init commit, migrate from hf/tachi67
Browse files- CodeFileEditAtomicFlow.py +112 -0
- CodeFileEditAtomicFlow.yaml +12 -0
- README.md +49 -3
- __init__.py +1 -0
- pip_requirements.txt +15 -0
CodeFileEditAtomicFlow.py
ADDED
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from typing import Dict, Any
|
2 |
+
from aiflows.base_flows.atomic import AtomicFlow
|
3 |
+
import os
|
4 |
+
|
5 |
+
|
6 |
+
class CodeFileEditAtomicFlow(AtomicFlow):
|
7 |
+
"""This class is used to write code to a temp code file, with commented instructions to give information
|
8 |
+
to the user.
|
9 |
+
|
10 |
+
*Input Interface*:
|
11 |
+
- `code`: str
|
12 |
+
- `language_of_code`: str
|
13 |
+
- `memory_files`: Dict[str, str]
|
14 |
+
|
15 |
+
*Output Interface*:
|
16 |
+
- `code_editor_output`: str
|
17 |
+
- `temp_code_file_location`: str
|
18 |
+
"""
|
19 |
+
def _generate_content(self, code_lib_location, code_str) -> str:
|
20 |
+
"""This function generates the content to be written to the temp file.
|
21 |
+
:param code_lib_location (str): The location of the code library file.
|
22 |
+
:param code_str (str): The code to be written to the temp file.
|
23 |
+
:return: (str) The content to be written to the temp file.
|
24 |
+
"""
|
25 |
+
content = (
|
26 |
+
"# The below code will be appended to " +
|
27 |
+
code_lib_location + "\n"
|
28 |
+
"# Edit the code directly or provide your thoughts down below if you have any suggestions.\n"
|
29 |
+
"# When you are done editing code and providing feedback, save file and close the current VSCode session to continue. \n"
|
30 |
+
"###########\n"
|
31 |
+
"# Code:\n" +
|
32 |
+
code_str +
|
33 |
+
"\n############\n"
|
34 |
+
"# Thoughts:"
|
35 |
+
)
|
36 |
+
return content
|
37 |
+
|
38 |
+
def _generate_temp_file_location(self, code_lib_location):
|
39 |
+
"""This function generates the location of the temp file.
|
40 |
+
:param code_lib_location (str): The location of the code library file.
|
41 |
+
:return: (str) The location of the temp file.
|
42 |
+
"""
|
43 |
+
directory = os.path.dirname(code_lib_location)
|
44 |
+
ret = os.path.join(directory, 'temp.py')
|
45 |
+
return ret
|
46 |
+
|
47 |
+
def _write_code_content_to_file(self, file_location, content: str):
|
48 |
+
"""This function writes the content to the temp file.
|
49 |
+
:param file_location (str): The location of the temp file.
|
50 |
+
:param content (str): The content to be written to the temp file.
|
51 |
+
:return: (bool, str, str) The first value is a boolean indicating if the write was successful.
|
52 |
+
The second value is a string containing the output of the write operation.
|
53 |
+
The third value is a string containing the location of the temp file.
|
54 |
+
"""
|
55 |
+
try:
|
56 |
+
with open(file_location, "w") as file:
|
57 |
+
file.write(content)
|
58 |
+
|
59 |
+
return True, f"Code written to {file_location}", file_location
|
60 |
+
|
61 |
+
except Exception as e:
|
62 |
+
return False, str(e), file_location
|
63 |
+
|
64 |
+
def _check_input(self, input_data: Dict[str, Any]):
|
65 |
+
"""This function checks if the input data is valid.
|
66 |
+
:param input_data (Dict[str, Any]): The input data.
|
67 |
+
:return: None
|
68 |
+
"""
|
69 |
+
assert "code" in input_data, "code is not passed to CodeFileEditAtomicFlow"
|
70 |
+
assert "language_of_code" in input_data, "language_of_code is not passed to CodeFileEditAtomicFlow"
|
71 |
+
assert "memory_files" in input_data, "memory_files is not passed to CodeFileEditAtomicFlow"
|
72 |
+
assert "code_library" in input_data["memory_files"], "code_library not in memory files"
|
73 |
+
code_lib_loc = input_data["memory_files"]["code_library"]
|
74 |
+
assert os.path.exists(code_lib_loc), f"{code_lib_loc} does not exist"
|
75 |
+
assert os.path.isfile(code_lib_loc), f"{code_lib_loc} is not a file"
|
76 |
+
language_of_code = input_data["language_of_code"]
|
77 |
+
assert language_of_code.lower() == 'python', "sorry!! only writing python code is supported."
|
78 |
+
|
79 |
+
def _generate_input_to_writer(self, input_data: Dict[str, Any]):
|
80 |
+
"""This function generates the input to the writer function.
|
81 |
+
:param input_data (Dict[str, Any]): The input data.
|
82 |
+
:return: (str, str) The first value is a string containing the content to be written to the temp file.
|
83 |
+
The second value is a string containing the location of the temp file.
|
84 |
+
"""
|
85 |
+
code_str = input_data['code']
|
86 |
+
code_lib_location = input_data["memory_files"]["code_library"]
|
87 |
+
content_to_write = self._generate_content(code_lib_location, code_str)
|
88 |
+
file_location_to_write = self._generate_temp_file_location(code_lib_location)
|
89 |
+
return content_to_write, file_location_to_write
|
90 |
+
|
91 |
+
def run(
|
92 |
+
self,
|
93 |
+
input_data: Dict[str, Any]
|
94 |
+
):
|
95 |
+
"""This function runs the atomic flow.
|
96 |
+
:param input_data (Dict[str, Any]): The input data.
|
97 |
+
:return: Dict[str, Any] The output data.
|
98 |
+
"""
|
99 |
+
self._check_input(input_data)
|
100 |
+
|
101 |
+
# ~~~ Getting input data to the file editor ~~~
|
102 |
+
content_to_write, file_location_to_write = self._generate_input_to_writer(input_data)
|
103 |
+
|
104 |
+
# ~~~ Calling the writer function ~~~
|
105 |
+
result, code_editor_output, temp_file_location = self._write_code_content_to_file(
|
106 |
+
file_location_to_write, content_to_write)
|
107 |
+
|
108 |
+
# ~~~ Generating return variables ~~~
|
109 |
+
response = {}
|
110 |
+
response["code_editor_output"] = code_editor_output
|
111 |
+
response["temp_code_file_location"] = temp_file_location
|
112 |
+
return response
|
CodeFileEditAtomicFlow.yaml
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: "CodeFileEditAtomicFlow"
|
2 |
+
description: "A flow that writes code to a temp file"
|
3 |
+
_target_: flow_modules.aiflows.CodeFileEditFlowModule.CodeFileEditAtomicFlow.instantiate_from_default_config
|
4 |
+
|
5 |
+
input_interface:
|
6 |
+
- "code"
|
7 |
+
- "language_of_code"
|
8 |
+
- "memory_files"
|
9 |
+
|
10 |
+
output_interface:
|
11 |
+
- "code_editor_output"
|
12 |
+
- "temp_code_file_location"
|
README.md
CHANGED
@@ -1,3 +1,49 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Table of Contents
|
2 |
+
|
3 |
+
* [CodeFileEditAtomicFlow](#CodeFileEditAtomicFlow)
|
4 |
+
* [CodeFileEditAtomicFlow](#CodeFileEditAtomicFlow.CodeFileEditAtomicFlow)
|
5 |
+
* [run](#CodeFileEditAtomicFlow.CodeFileEditAtomicFlow.run)
|
6 |
+
* [\_\_init\_\_](#__init__)
|
7 |
+
|
8 |
+
<a id="CodeFileEditAtomicFlow"></a>
|
9 |
+
|
10 |
+
# CodeFileEditAtomicFlow
|
11 |
+
|
12 |
+
<a id="CodeFileEditAtomicFlow.CodeFileEditAtomicFlow"></a>
|
13 |
+
|
14 |
+
## CodeFileEditAtomicFlow Objects
|
15 |
+
|
16 |
+
```python
|
17 |
+
class CodeFileEditAtomicFlow(AtomicFlow)
|
18 |
+
```
|
19 |
+
|
20 |
+
This class is used to write code to a temp code file, with commented instructions to give information
|
21 |
+
to the user.
|
22 |
+
|
23 |
+
*Input Interface*:
|
24 |
+
- `code`: str
|
25 |
+
- `language_of_code`: str
|
26 |
+
- `memory_files`: Dict[str, str]
|
27 |
+
|
28 |
+
*Output Interface*:
|
29 |
+
- `code_editor_output`: str
|
30 |
+
- `temp_code_file_location`: str
|
31 |
+
|
32 |
+
<a id="CodeFileEditAtomicFlow.CodeFileEditAtomicFlow.run"></a>
|
33 |
+
|
34 |
+
#### run
|
35 |
+
|
36 |
+
```python
|
37 |
+
def run(input_data: Dict[str, Any])
|
38 |
+
```
|
39 |
+
|
40 |
+
This function runs the atomic flow.
|
41 |
+
|
42 |
+
:param input_data (Dict[str, Any]): The input data.
|
43 |
+
:return: Dict[str, Any] The output data.
|
44 |
+
|
45 |
+
|
46 |
+
<a id="__init__"></a>
|
47 |
+
|
48 |
+
# \_\_init\_\_
|
49 |
+
|
__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
from .CodeFileEditAtomicFlow import CodeFileEditAtomicFlow
|
pip_requirements.txt
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
colorama==0.4.6
|
2 |
+
pytest==7.3.1
|
3 |
+
pytest-cov==4.1.0
|
4 |
+
hydra-core==1.3.2
|
5 |
+
hydra-colorlog==1.1.0
|
6 |
+
wrapt-timeout-decorator==1.3.12.2
|
7 |
+
diskcache==5.6.1
|
8 |
+
openai==1.0.0
|
9 |
+
huggingface_hub==0.19.4
|
10 |
+
jsonlines==3.1.0
|
11 |
+
jinja2==3.1.2
|
12 |
+
mock==5.0.2
|
13 |
+
rich==12.6.0
|
14 |
+
litellm==1.0.0
|
15 |
+
aiflows
|