File size: 4,565 Bytes
5e9e416 c4df480 a35fa4d 9f68e0d a35fa4d 5e9e416 0905f7c 5e9e416 78dfff8 5e9e416 0905f7c a35fa4d 5e9e416 a35fa4d 0905f7c a35fa4d 9f68e0d 0905f7c 78dfff8 c4df480 78dfff8 b3d1811 c4df480 b3d1811 78dfff8 9f68e0d 0905f7c 9f68e0d 5e9e416 a35fa4d 9f68e0d 0905f7c 9f68e0d a35fa4d c4df480 a35fa4d 9f68e0d a35fa4d 0905f7c a35fa4d c4df480 78dfff8 a35fa4d 9f68e0d 0905f7c 9f68e0d 0905f7c 9f68e0d c4df480 9f68e0d 0905f7c 9f68e0d c4df480 9f68e0d 0905f7c 9f68e0d 0905f7c 9f68e0d c4df480 754049c 9f68e0d c4df480 9f68e0d c4df480 9f68e0d c4df480 9f68e0d c4df480 4bd8f86 c4df480 9f68e0d c4df480 a35fa4d c4df480 a35fa4d c4df480 0905f7c c4df480 0905f7c c4df480 0905f7c c4df480 |
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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
from abc import ABC, abstractmethod
from typing import List
import gradio as gr
import requests
import ai
class Component(ABC):
vname = None
def __init__(self, id_: int, visible: bool = False):
# Internal state
self._id = id_
self._source = self.__class__.__name__
self._initial_visibility = visible
# Gradio state
self.component_id: gr.Number
self.visible: gr.Number
self.gr_component = gr.Box
self.output: gr.Textbox
@abstractmethod
def _render(self, id_: int, visible: bool):
...
def render(self) -> None:
self.component_id = gr.Number(value=self._id, visible=False)
self.visible = gr.Number(int(self._initial_visibility), visible=False)
self.gr_component = self._render(self._id, self._initial_visibility)
class Input(Component):
vname = "v"
def _render(self, id_: int, visible: bool) -> gr.Textbox:
self.output = gr.Textbox(
label=f"Input: {{{self.vname}{id_}}}",
interactive=True,
placeholder="Variable value",
visible=visible,
)
return self.output
class TaskComponent(Component, ABC):
vname = "t"
def __init__(self, id_: int, visible: bool = False):
super().__init__(id_, visible)
self.name: str
self.input: gr.Textbox
@abstractmethod
def execute(self, input):
...
class AITask(TaskComponent):
name = "AI Task"
def _render(self, id_: int, visible: bool) -> gr.Box:
with gr.Box(visible=visible) as gr_component:
gr.Markdown(
f"""
{self.name}
<br> Use this Task to give instructions to ChatGPT.
"""
)
with gr.Row():
self.input = gr.Textbox(
label="Instructions",
lines=10,
interactive=True,
placeholder="Example - summarize this text: {v1}",
)
self.output = gr.Textbox(
label=f"Output: {{{self.vname}{id_}}}",
lines=10,
interactive=False,
)
return gr_component
def execute(self, prompt: str) -> str:
return ai.llm.next([{"role": "user", "content": prompt}])
class VisitURL(TaskComponent):
name = "Visit URL"
def _render(self, id_: int, visible: bool) -> gr.Box:
with gr.Box(visible=visible) as gr_component:
gr.Markdown(
f"""
{self.name}
<br> Use this Task to visit an URL and get its content.
"""
)
with gr.Row():
self.input = gr.Textbox(
interactive=True,
placeholder="URL",
show_label=False,
)
self.output = gr.Textbox(
label=f"Output: {{{self.vname}{id_}}}",
lines=10,
interactive=False,
)
return gr_component
def execute(self, url: str) -> str:
return requests.get(url).text
class Task:
available_tasks = [AITask, VisitURL]
vname = "t"
def __init__(self, id_: int):
self._id = id_
self._inner_tasks = [t(self._id, False) for t in self.available_tasks]
def render(self) -> None:
self.active_index = gr.Number(-1, visible=False)
for t in self._inner_tasks:
t.render()
@property
def component_id(self) -> gr.Textbox:
return self._inner_tasks[0].component_id
def inputs(self) -> List[gr.Textbox]:
return [t.input for t in self._inner_tasks]
def outputs(self) -> List[gr.Textbox]:
return [t.output for t in self._inner_tasks]
def execute(self, active_index, input):
inner_task = self._inner_tasks[active_index]
print(f"Executing {inner_task._source}: {inner_task._id}")
return inner_task.execute(input)
MAX_TASKS = 10
all_tasks = {i: Task(i) for i in range(MAX_TASKS)}
class Tasks:
@classmethod
def visibilities(cls) -> List[gr.Number]:
return [it.visible for t in all_tasks.values() for it in t._inner_tasks]
@classmethod
def active_indexes(cls) -> List[gr.Number]:
return [t.active_index for t in all_tasks.values()]
@classmethod
def gr_components(cls) -> List[gr.Box]:
return [it.gr_component for t in all_tasks.values() for it in t._inner_tasks]
|