Amends to code execution
Browse files- actions.py +1 -1
- app.py +2 -3
- components.py +32 -26
actions.py
CHANGED
|
@@ -91,7 +91,7 @@ def execute_task(task_id: int, active_index: int, error_value, *args):
|
|
| 91 |
import traceback
|
| 92 |
|
| 93 |
traceback.print_exc()
|
| 94 |
-
outputs[active_index] = "ERROR"
|
| 95 |
return outputs + [
|
| 96 |
gr.HighlightedText.update(
|
| 97 |
value=[(f"Error in Task {task_id} :: {e}", "ERROR")],
|
|
|
|
| 91 |
import traceback
|
| 92 |
|
| 93 |
traceback.print_exc()
|
| 94 |
+
outputs[active_index] = f"ERROR :: {e}"
|
| 95 |
return outputs + [
|
| 96 |
gr.HighlightedText.update(
|
| 97 |
value=[(f"Error in Task {task_id} :: {e}", "ERROR")],
|
app.py
CHANGED
|
@@ -14,9 +14,8 @@ with gr.Blocks() as demo:
|
|
| 14 |
<br>There are 2 types of tasks.
|
| 15 |
<br>
|
| 16 |
<br>**AI Task**: Ask ChatGPT to do something for you. Eg, summarize a text.
|
| 17 |
-
<br>**Code Task**:
|
| 18 |
-
<br>
|
| 19 |
-
<br> The code must be generated before executing the tasks.
|
| 20 |
<br>
|
| 21 |
<br>Output from previous tasks can be referenced in subsequen tasks with {tn}. Max 10 tasks allowed (for now).
|
| 22 |
"""
|
|
|
|
| 14 |
<br>There are 2 types of tasks.
|
| 15 |
<br>
|
| 16 |
<br>**AI Task**: Ask ChatGPT to do something for you. Eg, summarize a text.
|
| 17 |
+
<br>**Code Task**: You will need code to do certain things that ChatGPT can't do, like access the internet or iterate over 4k+ tokens.
|
| 18 |
+
<br> With this task, ChatGPT will generate code for you that can be executed on the fly. The code must be generated before executing the task.
|
|
|
|
| 19 |
<br>
|
| 20 |
<br>Output from previous tasks can be referenced in subsequen tasks with {tn}. Max 10 tasks allowed (for now).
|
| 21 |
"""
|
components.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
import json
|
| 2 |
import re
|
|
|
|
| 3 |
from concurrent.futures import ThreadPoolExecutor
|
| 4 |
from abc import ABC, abstractmethod
|
| 5 |
from typing import Any, Dict, List, Optional, Union
|
|
@@ -65,7 +66,7 @@ class TaskComponent(Component, ABC):
|
|
| 65 |
undefined_vars = prompt_vars - vars_in_scope.keys()
|
| 66 |
if len(undefined_vars) > 0:
|
| 67 |
raise KeyError(
|
| 68 |
-
f"The variables :: {undefined_vars} are being used before being defined."
|
| 69 |
)
|
| 70 |
return input.format(**vars_in_scope)
|
| 71 |
|
|
@@ -127,7 +128,7 @@ class CodeTask(TaskComponent):
|
|
| 127 |
with gr.Row():
|
| 128 |
with gr.Column():
|
| 129 |
self.code_prompt = gr.Textbox(
|
| 130 |
-
label="What would you like to do?",
|
| 131 |
interactive=True,
|
| 132 |
value=self._initial_code_value,
|
| 133 |
lines=3,
|
|
@@ -159,7 +160,7 @@ class CodeTask(TaskComponent):
|
|
| 159 |
with gr.Column():
|
| 160 |
self.output = gr.Textbox(
|
| 161 |
label=f"Output: {{{self.vname}{self._id}}}",
|
| 162 |
-
lines=
|
| 163 |
interactive=True,
|
| 164 |
)
|
| 165 |
|
|
@@ -179,8 +180,6 @@ class CodeTask(TaskComponent):
|
|
| 179 |
|
| 180 |
@staticmethod
|
| 181 |
def generate_code(code_prompt: str):
|
| 182 |
-
import traceback
|
| 183 |
-
|
| 184 |
raw_output = ""
|
| 185 |
packages = ""
|
| 186 |
script = ""
|
|
@@ -202,9 +201,10 @@ class CodeTask(TaskComponent):
|
|
| 202 |
print(f"Generating code.")
|
| 203 |
try:
|
| 204 |
raw_output = llm_call(
|
| 205 |
-
f"""
|
|
|
|
| 206 |
|
| 207 |
-
|
| 208 |
Use pip packages where available.
|
| 209 |
For example, if you wanted to make a google search, use the googlesearch-python package instead of scraping google.
|
| 210 |
Include the necessary imports.
|
|
@@ -262,40 +262,46 @@ Extract it. Remove anything after the function definition.""",
|
|
| 262 |
return [self.packages, self.script, self.input]
|
| 263 |
|
| 264 |
def execute(
|
| 265 |
-
self, packages: str,
|
| 266 |
):
|
| 267 |
-
if not
|
| 268 |
return None
|
| 269 |
-
|
|
|
|
|
|
|
| 270 |
|
| 271 |
import inspect
|
| 272 |
import subprocess
|
| 273 |
import sys
|
| 274 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 275 |
for p in eval(packages):
|
| 276 |
subprocess.check_call([sys.executable, "-m", "pip", "install", p])
|
| 277 |
|
| 278 |
-
|
| 279 |
-
exec(
|
| 280 |
|
| 281 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 282 |
# Try to run all local functions
|
| 283 |
if callable(var):
|
| 284 |
-
print(var)
|
| 285 |
-
_toolkit_func = var
|
| 286 |
try:
|
| 287 |
-
|
| 288 |
-
formatted_input = self.format_input(input, vars_in_scope)
|
| 289 |
-
if formatted_input:
|
| 290 |
-
try:
|
| 291 |
-
return _toolkit_func(eval(formatted_input))
|
| 292 |
-
except:
|
| 293 |
-
return _toolkit_func(formatted_input)
|
| 294 |
-
return None # No input, so it doesn't run
|
| 295 |
-
return _toolkit_func()
|
| 296 |
except:
|
| 297 |
-
|
| 298 |
-
raise RuntimeError("Unable to run the code")
|
| 299 |
|
| 300 |
|
| 301 |
class Task(Component):
|
|
|
|
| 1 |
import json
|
| 2 |
import re
|
| 3 |
+
import traceback
|
| 4 |
from concurrent.futures import ThreadPoolExecutor
|
| 5 |
from abc import ABC, abstractmethod
|
| 6 |
from typing import Any, Dict, List, Optional, Union
|
|
|
|
| 66 |
undefined_vars = prompt_vars - vars_in_scope.keys()
|
| 67 |
if len(undefined_vars) > 0:
|
| 68 |
raise KeyError(
|
| 69 |
+
f"The variables :: {undefined_vars} in task :: {self._id} are being used before being defined."
|
| 70 |
)
|
| 71 |
return input.format(**vars_in_scope)
|
| 72 |
|
|
|
|
| 128 |
with gr.Row():
|
| 129 |
with gr.Column():
|
| 130 |
self.code_prompt = gr.Textbox(
|
| 131 |
+
label="What would you like the code to do?",
|
| 132 |
interactive=True,
|
| 133 |
value=self._initial_code_value,
|
| 134 |
lines=3,
|
|
|
|
| 160 |
with gr.Column():
|
| 161 |
self.output = gr.Textbox(
|
| 162 |
label=f"Output: {{{self.vname}{self._id}}}",
|
| 163 |
+
lines=14,
|
| 164 |
interactive=True,
|
| 165 |
)
|
| 166 |
|
|
|
|
| 180 |
|
| 181 |
@staticmethod
|
| 182 |
def generate_code(code_prompt: str):
|
|
|
|
|
|
|
| 183 |
raw_output = ""
|
| 184 |
packages = ""
|
| 185 |
script = ""
|
|
|
|
| 201 |
print(f"Generating code.")
|
| 202 |
try:
|
| 203 |
raw_output = llm_call(
|
| 204 |
+
f"""I want you to write a python function to:
|
| 205 |
+
{code_prompt}
|
| 206 |
|
| 207 |
+
Name the function toolkit.
|
| 208 |
Use pip packages where available.
|
| 209 |
For example, if you wanted to make a google search, use the googlesearch-python package instead of scraping google.
|
| 210 |
Include the necessary imports.
|
|
|
|
| 262 |
return [self.packages, self.script, self.input]
|
| 263 |
|
| 264 |
def execute(
|
| 265 |
+
self, packages: str, script: str, input: str, vars_in_scope: Dict[str, Any]
|
| 266 |
):
|
| 267 |
+
if not script:
|
| 268 |
return None
|
| 269 |
+
script = script.strip()
|
| 270 |
+
|
| 271 |
+
formatted_input = self.format_input(input, vars_in_scope)
|
| 272 |
|
| 273 |
import inspect
|
| 274 |
import subprocess
|
| 275 |
import sys
|
| 276 |
|
| 277 |
+
def run(toolkit_func):
|
| 278 |
+
if len(inspect.getfullargspec(toolkit_func)[0]) > 0:
|
| 279 |
+
if formatted_input:
|
| 280 |
+
try:
|
| 281 |
+
return toolkit_func(eval(formatted_input))
|
| 282 |
+
except:
|
| 283 |
+
return toolkit_func(formatted_input)
|
| 284 |
+
raise ValueError(f"Code for task :: {self._id} needs an input.")
|
| 285 |
+
return toolkit_func()
|
| 286 |
+
|
| 287 |
for p in eval(packages):
|
| 288 |
subprocess.check_call([sys.executable, "-m", "pip", "install", p])
|
| 289 |
|
| 290 |
+
script = f"import os\nos.environ = {{}}\n\n{script}"
|
| 291 |
+
exec(script, locals())
|
| 292 |
|
| 293 |
+
locals_ = locals()
|
| 294 |
+
if "toolkit" in locals_:
|
| 295 |
+
toolkit_func = locals_["toolkit"]
|
| 296 |
+
return run(toolkit_func)
|
| 297 |
+
for var in reversed(locals_.values()):
|
| 298 |
# Try to run all local functions
|
| 299 |
if callable(var):
|
|
|
|
|
|
|
| 300 |
try:
|
| 301 |
+
return run(var)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
except:
|
| 303 |
+
continue
|
| 304 |
+
raise RuntimeError(f"Unable to run the code for task :: {self._id}")
|
| 305 |
|
| 306 |
|
| 307 |
class Task(Component):
|