File size: 4,117 Bytes
a35fa4d
 
 
 
c4df480
a35fa4d
 
c121218
 
 
a35fa4d
c121218
 
 
 
a35fa4d
c121218
a35fa4d
9f68e0d
c121218
 
 
a35fa4d
c121218
 
 
 
a35fa4d
c121218
a35fa4d
 
c4df480
78dfff8
 
c4df480
 
78dfff8
c4df480
78dfff8
c4df480
 
 
 
31918dc
71586bc
 
 
 
 
fb97b78
 
 
71586bc
fb97b78
71586bc
 
 
 
 
 
 
 
 
 
 
 
fb97b78
71586bc
 
 
 
 
 
 
c4df480
 
 
 
 
 
 
71586bc
a35fa4d
78dfff8
c4df480
a35fa4d
ef06a8c
c4df480
 
 
 
71586bc
c4df480
 
 
 
 
 
a35fa4d
ef06a8c
 
 
71586bc
ef06a8c
71586bc
 
 
 
 
ef06a8c
31918dc
ef06a8c
 
71586bc
ef06a8c
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import re

import gradio as gr

from components import MAX_TASKS, all_tasks, Task


def add_task(*visibilities):
    for i, visible in enumerate(visibilities, 1):
        if not bool(visible):
            return (
                [gr.Box.update(visible=True)] * i
                + [gr.Box.update(visible=False)] * (MAX_TASKS - i)
                + [1] * i
                + [0] * (MAX_TASKS - i)
            )
    return [gr.Box.update()] * MAX_TASKS + [gr.Number.update()] * MAX_TASKS


def remove_task(*visibilities):
    for i, visible in reversed(list(enumerate(visibilities))):
        if bool(visible):
            return (
                [gr.Box.update(visible=True)] * i
                + [gr.Box.update(visible=False)] * (MAX_TASKS - i)
                + [1] * i
                + [0] * (MAX_TASKS - i)
            )
    return [gr.Box.update()] * MAX_TASKS + [gr.Number.update()] * MAX_TASKS


def execute_task(task_id: int, active_index: int, error_value, *args):
    """
    Params:
        - task_id: This will tell us which task to execute.
        - active_index: The index of the actual task that is visible.
        - prev_error_value: I carry around whether there is an error in the execution, to be displayed at the end.
        - args: Other variables that will be decomposed.
    """
    n_avail_tasks = len(Task.available_tasks)
    # We need to return outputs for all tasks in the row.
    outputs = [""] * n_avail_tasks

    if active_index is None or error_value:  # Active index could be 0 == not active_index
        return outputs + [
            gr.HighlightedText.update(
                value=error_value, visible=error_value is not None
            )
        ]

    task_id = int(task_id)
    active_index = int(active_index)
    inner_n_inputs = all_tasks[task_id].inner_n_inputs

    start_inputs = 0
    end_inputs = 0
    end_all_inputs = sum(inner_n_inputs)
    for i, n in enumerate(inner_n_inputs):
        if i == active_index:
            end_inputs = start_inputs + n
            break
        start_inputs += n
    task_inputs = args[start_inputs:end_inputs]
    prev_active_indexes = args[end_all_inputs : end_all_inputs + task_id]
    prev_task_outputs = args[end_all_inputs + task_id :]
    non_empty_inputs = [i for i in task_inputs if i]

    if len(non_empty_inputs) < len(task_inputs):
        return outputs + [
            gr.HighlightedText.update(
                value=[(f"Missing inputs for Task: {task_id}", "ERROR")],
                visible=True,
            )
        ]

    vars_in_scope = {}
    for i, prev_active_index in enumerate(prev_active_indexes):
        vars_in_scope[f"{Task.vname}{i}"] = prev_task_outputs[
            i * n_avail_tasks + int(prev_active_index)
        ]
    # Get all variables referenced within the task input
    prompt_vars = [v for ti in non_empty_inputs for v in re.findall("{(.*?)}", ti)]

    # If there is an undefined variable referenced, HighlightedText will signal the error.
    undefined_vars = prompt_vars - vars_in_scope.keys()
    if len(undefined_vars) > 0:
        outputs[active_index] = "ERROR"
        return outputs + [
            gr.HighlightedText.update(
                value=[
                    (
                        f"The variables in Task :: {task_id} are being used before being defined :: {undefined_vars}. Please check your tasks.",
                        "ERROR",
                    )
                ],
                visible=True,
            )
        ]

    try:
        # Task logic gets inserted into the right index
        outputs[active_index] = all_tasks[task_id].execute(
            active_index, *non_empty_inputs, vars_in_scope=vars_in_scope
        )
        return outputs + [
            gr.HighlightedText.update(
                value=error_value, visible=error_value is not None
            )
        ]
    except Exception as e:
        outputs[active_index] = "ERROR"
        return outputs + [
            gr.HighlightedText.update(
                value=[(f"Error in Task {task_id} :: {e}", "ERROR")],
                visible=True,
            )
        ]