rahul7star commited on
Commit
9972992
·
verified ·
1 Parent(s): dab9bc3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +260 -51
app.py CHANGED
@@ -1,84 +1,293 @@
1
- import streamlit as st
2
- import re
3
- from pygmyclaw import PygmyClaw
 
 
 
 
 
 
 
 
4
 
5
- st.set_page_config(page_title="PygmyClaw AI", layout="wide")
6
 
7
- st.title("🧠 PygmyClaw AI Agent")
 
8
 
9
  agent = PygmyClaw()
10
 
11
- # -------------------
12
- # Prompt Input
13
- # -------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
- prompt_text = st.text_area("Enter Prompt")
 
 
 
16
 
17
- tool_list = ["AI Agent"] + list(agent.tools_data.keys())
 
 
 
 
18
 
19
- selected_tool = st.selectbox("Select Tool", tool_list)
20
 
21
- # -------------------
22
- # Generate
23
- # -------------------
24
 
25
- if st.button("Generate Code"):
26
 
27
- result = agent.submit_prompt(prompt_text, selected_tool)
 
 
 
 
28
 
29
- st.markdown("### AI Response")
30
- st.markdown(result)
31
 
32
- match = re.search(r"```python(.*?)```", result, re.S)
33
 
34
- if match:
 
 
 
35
 
36
- code = match.group(1).strip()
37
 
38
- st.markdown("### Extracted Code")
39
- st.code(code, language="python")
40
 
41
- if st.button("Run Code"):
 
42
 
43
- try:
44
 
45
- local_vars = {}
46
- exec(code, {}, local_vars)
 
 
47
 
48
- st.success("Execution Result")
49
- st.write(local_vars)
 
 
50
 
51
- except Exception as e:
 
52
 
53
- st.error(str(e))
54
 
 
55
 
56
- # -------------------
57
- # Tools Section
58
- # -------------------
59
 
60
- st.divider()
61
- st.header("🛠 Tools")
62
 
63
- for name, tool in agent.tools_data.items():
64
 
65
- st.subheader(name)
66
- st.write(tool["description"])
67
- st.code(tool["code"], language="python")
68
 
69
- # -------------------
70
- # Create Tool
71
- # -------------------
 
 
72
 
73
- st.divider()
74
- st.header("Create Tool")
75
 
76
- tool_name = st.text_input("Tool Name")
77
- tool_desc = st.text_area("Description")
78
- tool_code = st.text_area("Python Code")
79
 
80
- if st.button("Save Tool"):
 
 
 
 
81
 
82
- agent.add_tool(tool_name, tool_desc, tool_code)
83
 
84
- st.success("Tool saved and uploaded to HF")
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ PygmyClaw Dashboard UI
4
+ Shows queue, running jobs, results and allows safe code execution.
5
+ """
6
+
7
+ import gradio as gr
8
+ import json
9
+ import time
10
+ import traceback
11
+ from pathlib import Path
12
 
13
+ from pygmyclaw import PygmyClaw
14
 
15
+ # ---------------------------------------------------------
16
+ # Initialize Agent
17
 
18
  agent = PygmyClaw()
19
 
20
+ # ---------------------------------------------------------
21
+ # Storage
22
+
23
+ WORKSPACE = Path("./workspace")
24
+ WORKSPACE.mkdir(exist_ok=True)
25
+
26
+ TASK_FILE = WORKSPACE / "tasks.json"
27
+
28
+
29
+ def load_tasks():
30
+ if TASK_FILE.exists():
31
+ return json.loads(TASK_FILE.read_text())
32
+ return {}
33
+
34
+
35
+ def save_tasks(tasks):
36
+ TASK_FILE.write_text(json.dumps(tasks, indent=2))
37
+
38
+
39
+ tasks = load_tasks()
40
+
41
+ # ---------------------------------------------------------
42
+ # Queue system
43
+
44
+ queue = []
45
+ running_task = None
46
+
47
+
48
+ # ---------------------------------------------------------
49
+ # Submit Prompt
50
+
51
+
52
+ def submit_prompt(prompt, tool):
53
+
54
+ global queue
55
+
56
+ task_id = str(time.time())
57
+
58
+ task = {
59
+ "task_id": task_id,
60
+ "prompt": prompt,
61
+ "tool": tool,
62
+ "status": "queued",
63
+ "code": "",
64
+ "explanation": "",
65
+ "output": "",
66
+ "timestamp": time.time()
67
+ }
68
+
69
+ tasks[task_id] = task
70
+ queue.append(task_id)
71
+
72
+ save_tasks(tasks)
73
+
74
+ return f"Task {task_id} added to queue."
75
+
76
+
77
+ # ---------------------------------------------------------
78
+ # Process Queue
79
+
80
+
81
+ def process_queue():
82
+
83
+ global running_task
84
+
85
+ if running_task:
86
+ return
87
+
88
+ if not queue:
89
+ return
90
+
91
+ task_id = queue.pop(0)
92
+ running_task = task_id
93
+
94
+ task = tasks[task_id]
95
+ task["status"] = "running"
96
+
97
+ try:
98
+
99
+ result = agent.run(task["prompt"], tool=task["tool"])
100
+
101
+ task["code"] = result.get("code", "")
102
+ task["explanation"] = result.get("explanation", "")
103
+ task["status"] = "completed"
104
+
105
+ except Exception as e:
106
+
107
+ task["status"] = "failed"
108
+ task["output"] = str(e)
109
+
110
+ running_task = None
111
+ save_tasks(tasks)
112
+
113
+
114
+ # ---------------------------------------------------------
115
+ # Run Generated Code
116
+
117
+
118
+ def run_code(task_id):
119
+
120
+ task = tasks.get(task_id)
121
+
122
+ if not task:
123
+ return "Task not found"
124
+
125
+ code = task.get("code")
126
+
127
+ if not code:
128
+ return "No code to run"
129
+
130
+ try:
131
+
132
+ local_env = {}
133
+
134
+ exec(code, {}, local_env)
135
+
136
+ output = str(local_env)
137
+
138
+ task["output"] = output
139
+ save_tasks(tasks)
140
+
141
+ return output
142
+
143
+ except Exception:
144
+
145
+ err = traceback.format_exc()
146
+ task["output"] = err
147
+ save_tasks(tasks)
148
+
149
+ return err
150
+
151
+
152
+ # ---------------------------------------------------------
153
+ # Dashboard Data
154
+
155
+
156
+ def get_dashboard():
157
+
158
+ process_queue()
159
+
160
+ queue_view = []
161
+ completed_view = []
162
+
163
+ for tid, t in tasks.items():
164
+
165
+ row = [
166
+ tid,
167
+ t["prompt"],
168
+ t["status"],
169
+ t["tool"]
170
+ ]
171
+
172
+ if t["status"] in ["queued", "running"]:
173
+ queue_view.append(row)
174
+ else:
175
+ completed_view.append(row)
176
+
177
+ running = running_task if running_task else "None"
178
+
179
+ return queue_view, running, completed_view
180
+
181
+
182
+ # ---------------------------------------------------------
183
+ # Task Details
184
+
185
+
186
+ def get_task_details(task_id):
187
+
188
+ task = tasks.get(task_id)
189
+
190
+ if not task:
191
+ return "", "", ""
192
+
193
+ return task["explanation"], task["code"], task["output"]
194
+
195
+
196
+ # ---------------------------------------------------------
197
+ # UI
198
+
199
+
200
+ with gr.Blocks(title="PygmyClaw AI Dashboard") as demo:
201
+
202
+ gr.Markdown("# 🧠 PygmyClaw AI Agent Dashboard")
203
+
204
+ # -------------------------------------------------
205
+ # Prompt
206
+
207
+ with gr.Row():
208
 
209
+ prompt = gr.Textbox(
210
+ label="Prompt",
211
+ placeholder="Write a python function to add numbers..."
212
+ )
213
 
214
+ tool = gr.Dropdown(
215
+ choices=["AI Agent", "sys_info", "echo"],
216
+ value="AI Agent",
217
+ label="Tool"
218
+ )
219
 
220
+ submit = gr.Button("Submit Task")
221
 
 
 
 
222
 
223
+ submit_status = gr.Textbox(label="Status")
224
 
225
+ submit.click(
226
+ submit_prompt,
227
+ inputs=[prompt, tool],
228
+ outputs=submit_status
229
+ )
230
 
231
+ # -------------------------------------------------
232
+ # Queue
233
 
234
+ gr.Markdown("## Queue")
235
 
236
+ queue_table = gr.Dataframe(
237
+ headers=["Task ID", "Prompt", "Status", "Tool"],
238
+ interactive=False
239
+ )
240
 
241
+ running_box = gr.Textbox(label="Running Task")
242
 
243
+ refresh = gr.Button("Refresh Dashboard")
 
244
 
245
+ # -------------------------------------------------
246
+ # Completed
247
 
248
+ gr.Markdown("## Completed Jobs")
249
 
250
+ completed_table = gr.Dataframe(
251
+ headers=["Task ID", "Prompt", "Status", "Tool"],
252
+ interactive=False
253
+ )
254
 
255
+ refresh.click(
256
+ get_dashboard,
257
+ outputs=[queue_table, running_box, completed_table]
258
+ )
259
 
260
+ # -------------------------------------------------
261
+ # Task Details
262
 
263
+ gr.Markdown("## Task Details")
264
 
265
+ task_id_input = gr.Textbox(label="Enter Task ID")
266
 
267
+ explanation = gr.Textbox(label="Explanation", lines=6)
 
 
268
 
269
+ code = gr.Code(label="Generated Code", language="python")
 
270
 
271
+ output = gr.Textbox(label="Execution Output", lines=6)
272
 
273
+ load_task = gr.Button("Load Task")
 
 
274
 
275
+ load_task.click(
276
+ get_task_details,
277
+ inputs=task_id_input,
278
+ outputs=[explanation, code, output]
279
+ )
280
 
281
+ # -------------------------------------------------
282
+ # Run Code
283
 
284
+ run = gr.Button("Run Code")
 
 
285
 
286
+ run.click(
287
+ run_code,
288
+ inputs=task_id_input,
289
+ outputs=output
290
+ )
291
 
 
292
 
293
+ demo.launch(server_name="0.0.0.0", server_port=7860)