acecalisto3 commited on
Commit
308bc46
·
verified ·
1 Parent(s): 1115ab9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -198
app.py CHANGED
@@ -21,6 +21,7 @@ from agent import (
21
  )
22
  from utils import parse_action, parse_file_content, read_python_module_structure
23
  from datetime import datetime
 
24
  now = datetime.now()
25
  date_time_str = now.strftime("%Y-%m-%d %H:%M:%S")
26
 
@@ -30,31 +31,21 @@ client = InferenceClient(
30
 
31
  ############################################
32
 
33
-
34
  VERBOSE = True
35
  MAX_HISTORY = 100
36
- #MODEL = "gpt-3.5-turbo" # "gpt-4"
37
-
38
 
39
  def format_prompt(message, history):
40
- prompt = "<s>"
41
- for user_prompt, bot_response in history:
42
- prompt += f"[INST] {user_prompt} [/INST]"
43
- prompt += f" {bot_response}</s> "
44
- prompt += f"[INST] {message} [/INST]"
45
- return prompt
46
-
47
-
48
-
49
- def run_gpt(
50
- prompt_template,
51
- stop_tokens,
52
- max_tokens,
53
- purpose,
54
- **prompt_kwargs,
55
- ):
56
- seed = random.randint(1,1111111111111111)
57
- print (seed)
58
  generate_kwargs = dict(
59
  temperature=1.0,
60
  max_new_tokens=2096,
@@ -64,7 +55,6 @@ def run_gpt(
64
  seed=seed,
65
  )
66
 
67
-
68
  content = PREFIX.format(
69
  date_time_str=date_time_str,
70
  purpose=purpose,
@@ -72,10 +62,9 @@ def run_gpt(
72
  ) + prompt_template.format(**prompt_kwargs)
73
  if VERBOSE:
74
  print(LOG_PROMPT.format(content))
75
-
76
-
77
- #formatted_prompt = format_prompt(f"{system_prompt}, {prompt}", history)
78
- #formatted_prompt = format_prompt(f'{content}', history)
79
 
80
  stream = client.text_generation(content, **generate_kwargs, stream=True, details=True, return_full_text=False)
81
  resp = ""
@@ -86,7 +75,6 @@ def run_gpt(
86
  print(LOG_RESPONSE.format(resp))
87
  return resp
88
 
89
-
90
  def compress_history(purpose, task, history, directory):
91
  resp = run_gpt(
92
  COMPRESS_HISTORY_PROMPT,
@@ -98,19 +86,18 @@ def compress_history(purpose, task, history, directory):
98
  )
99
  history = "observation: {}\n".format(resp)
100
  return history
101
-
102
  def call_search(purpose, task, history, directory, action_input):
103
  print("CALLING SEARCH")
104
  try:
105
-
106
  if "http" in action_input:
107
  if "<" in action_input:
108
  action_input = action_input.strip("<")
109
  if ">" in action_input:
110
  action_input = action_input.strip(">")
111
-
112
  response = i_s(action_input)
113
- #response = google(search_return)
114
  print(response)
115
  history += "observation: search result is: {}\n".format(response)
116
  else:
@@ -135,11 +122,10 @@ def call_main(purpose, task, history, directory, action_input):
135
  if line.startswith("thought: "):
136
  history += "{}\n".format(line)
137
  elif line.startswith("action: "):
138
-
139
  action_name, action_input = parse_action(line)
140
- print (f'ACTION_NAME :: {action_name}')
141
- print (f'ACTION_INPUT :: {action_input}')
142
-
143
  history += "{}\n".format(line)
144
  if "COMPLETE" in action_name or "COMPLETE" in action_input:
145
  task = "END"
@@ -148,12 +134,11 @@ def call_main(purpose, task, history, directory, action_input):
148
  return action_name, action_input, history, task
149
  else:
150
  history += "{}\n".format(line)
151
- #history += "observation: the following command did not produce any useful output: '{}', I need to check the commands syntax, or use a different command\n".format(line)
152
-
153
- #return action_name, action_input, history, task
154
- #assert False, "unknown action: {}".format(line)
155
- return "MAIN", None, history, task
156
 
 
 
 
157
 
158
  def call_set_task(purpose, task, history, directory, action_input):
159
  task = run_gpt(
@@ -176,46 +161,43 @@ NAME_TO_FUNC = {
176
  "UPDATE-TASK": call_set_task,
177
  "SEARCH": call_search,
178
  "COMPLETE": end_fn,
179
-
180
  }
181
 
182
  def run_action(purpose, task, history, directory, action_name, action_input):
183
  print(f'action_name::{action_name}')
184
  try:
185
  if "RESPONSE" in action_name or "COMPLETE" in action_name:
186
- action_name="COMPLETE"
187
- task="END"
188
  return action_name, "COMPLETE", history, task
189
-
190
  # compress the history when it is long
191
  if len(history.split("\n")) > MAX_HISTORY:
192
  if VERBOSE:
193
  print("COMPRESSING HISTORY")
194
  history = compress_history(purpose, task, history, directory)
195
  if not action_name in NAME_TO_FUNC:
196
- action_name="MAIN"
197
  if action_name == "" or action_name == None:
198
- action_name="MAIN"
199
  assert action_name in NAME_TO_FUNC
200
-
201
  print("RUN: ", action_name, action_input)
202
  return NAME_TO_FUNC[action_name](purpose, task, history, directory, action_input)
203
  except Exception as e:
204
  history += "observation: the previous command did not produce any useful output, I need to check the commands syntax, or use a different command\n"
205
-
206
  return "MAIN", None, history, task
207
 
208
- def run(purpose,history):
209
-
210
- #print(purpose)
211
- #print(hist)
212
- task=None
213
- directory="./"
214
  if history:
215
- history=str(history).strip("[]")
216
  if not history:
217
  history = ""
218
-
219
  action_name = "UPDATE-TASK" if task is None else "MAIN"
220
  action_input = None
221
  while True:
@@ -237,40 +219,38 @@ def run(purpose,history):
237
  action_input,
238
  )
239
  yield (history)
240
- #yield ("",[(purpose,history)])
241
  if task == "END":
242
  return (history)
243
- #return ("", [(purpose,history)])
244
-
245
-
246
 
247
  ################################################
248
 
249
  def format_prompt(message, history):
250
- prompt = "<s>"
251
- for user_prompt, bot_response in history:
252
- prompt += f"[INST] {user_prompt} [/INST]"
253
- prompt += f" {bot_response}</s> "
254
- prompt += f"[INST] {message} [/INST]"
255
- return prompt
256
- agents =[
 
257
  "WEB_DEV",
258
  "AI_SYSTEM_PROMPT",
259
  "PYTHON_CODE_DEV"
260
  ]
261
- def generate(
262
- prompt, history, agent_name=agents[0], sys_prompt="", temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0,
263
- ):
264
- seed = random.randint(1,1111111111111111)
265
 
266
- agent=prompts.WEB_DEV
 
 
 
267
  if agent_name == "WEB_DEV":
268
  agent = prompts.WEB_DEV
269
  if agent_name == "AI_SYSTEM_PROMPT":
270
  agent = prompts.AI_SYSTEM_PROMPT
271
  if agent_name == "PYTHON_CODE_DEV":
272
- agent = prompts.PYTHON_CODE_DEV
273
- system_prompt=agent
274
  temperature = float(temperature)
275
  if temperature < 1e-2:
276
  temperature = 1e-2
@@ -294,14 +274,13 @@ def generate(
294
  yield output
295
  return output
296
 
297
-
298
- additional_inputs=[
299
  gr.Dropdown(
300
  label="Agents",
301
- choices=[s for s in agents],
302
- value=agents[0],
303
  interactive=True,
304
- ),
305
  gr.Textbox(
306
  label="System Prompt",
307
  max_lines=1,
@@ -314,143 +293,48 @@ additional_inputs=[
314
  maximum=1.0,
315
  step=0.05,
316
  interactive=True,
317
- info="Higher values produce more diverse outputs",
318
  ),
319
-
320
  gr.Slider(
321
- label="Max new tokens",
322
- value=1048*10,
323
- minimum=0,
324
- maximum=1048*10,
325
  step=64,
326
  interactive=True,
327
- info="The maximum numbers of new tokens",
328
  ),
329
  gr.Slider(
330
- label="Top-p (nucleus sampling)",
331
  value=0.90,
332
  minimum=0.0,
333
  maximum=1,
334
  step=0.05,
335
  interactive=True,
336
- info="Higher values sample more low-probability tokens",
337
  ),
338
  gr.Slider(
339
- label="Repetition penalty",
340
  value=1.2,
341
  minimum=1.0,
342
  maximum=2.0,
343
  step=0.05,
344
  interactive=True,
345
- info="Penalize repeated tokens",
346
- ),
347
-
348
-
349
  ]
350
 
351
- examples=[
352
- ["Create a basic Python web app using Flask.", None, None, None, None, None, ],
353
- ["Build a simple Streamlit app to display a data visualization.", None, None, None, None, None, ],
354
- ["I need a Gradio interface for a machine learning model that takes an image as input and outputs a classification.", None, None, None, None, None, ],
355
- ["Generate a Python script to scrape data from a website.", None, None, None, None, None, ],
356
- ["I'm building a React app. How can I use Axios to make API calls?", None, None, None, None, None, ],
357
- ["Write a Python function to read data from a CSV file.", None, None, None, None, None, ],
358
- ["I want to deploy my Flask app to Heroku.", None, None, None, None, None, ],
359
- ["Explain the difference between Git and GitHub.", None, None, None, None, None, ],
360
- ["How can I use Docker to containerize my Python app?", None, None, None, None, None, ],
361
- ["I need a simple API endpoint for my web app using Flask.", None, None, None, None, None, ],
362
- ["Create a function in Python to calculate the factorial of a number.", None, None, None, None, None, ],
363
- ]
364
 
365
- '''
366
- gr.ChatInterface(
367
- fn=run,
368
- chatbot=gr.Chatbot(show_label=False, show_share_button=False, show_copy_button=True, likeable=True, layout="panel"),
369
- title="Mixtral 46.7B\nMicro-Agent\nInternet Search <br> development test",
370
- examples=examples,
371
- concurrency_limit=20,
372
- with gr.Blocks() as ifacea:
373
- gr.HTML("""TEST""")
374
- ifacea.launch()
375
- ).launch()
376
- with gr.Blocks() as iface:
377
- #chatbot=gr.Chatbot(show_label=False, show_share_button=False, show_copy_button=True, likeable=True, layout="panel"),
378
- chatbot=gr.Chatbot()
379
- msg = gr.Textbox()
380
- with gr.Row():
381
- submit_b = gr.Button()
382
- clear = gr.ClearButton([msg, chatbot])
383
- submit_b.click(run, [msg,chatbot],[msg,chatbot])
384
- msg.submit(run, [msg, chatbot], [msg, chatbot])
385
- iface.launch()
386
- '''
387
- gr.ChatInterface(
388
- fn=run,
389
- chatbot=gr.Chatbot(show_label=False, show_share_button=False, show_copy_button=True, likeable=True, layout="panel"),
390
- title="Mixtral 46.7B\nMicro-Agent\nInternet Search <br> development test",
391
- examples=examples,
392
- concurrency_limit=20,
393
- ).launch(show_api=False)
394
-
395
-
396
- Implementation of Next Steps:
397
-
398
- Terminal Integration:
399
-
400
- Install Libraries: Install either streamlit-terminal or gradio-terminal depending on your chosen framework.
401
- Integrate the Terminal: Use the library's functions to embed a terminal component within your Streamlit or Gradio app.
402
- Capture Input: Capture the user's input from the terminal and pass it to your command execution function.
403
- Display Output: Display the output of the terminal commands, including both standard output and errors.
404
- Code Generation:
405
-
406
- LLM Selection: Choose a Hugging Face Transformer model that is suitable for code generation (e.g., google/flan-t5-xl, Salesforce/codet5-base, microsoft/CodeGPT-small).
407
- Prompt Engineering: Develop effective prompts for the LLM to generate code based on natural language instructions.
408
- Code Translation Function: Create a function that takes natural language input, passes it to the LLM with the appropriate prompt, and then returns the generated code.
409
- Code Correction: You can explore ways to automatically correct code errors, perhaps using a combination of syntax checking and LLM assistance.
410
- Workspace Explorer:
411
-
412
- Streamlit or Gradio Filesystem Access: Use Streamlit's st.file_uploader or Gradio's gr.File component to allow users to upload files.
413
- File Management: Implement functions to create, edit, and delete files and directories within the workspace.
414
- Display Files: Use Streamlit's st.code or Gradio's gr.File component to display the contents of files in the workspace.
415
- Directory Structure: Display the directory structure of the workspace using a tree-like representation.
416
- Dependency Management:
417
-
418
- Package Installation: Create a function that takes a package name as input, installs it using pip, and updates the requirements.txt file.
419
- Workspace Population: Develop a function to create files and directories in the workspace based on installed packages.
420
- Application Build and Launch:
421
-
422
- Build Logic: Develop a function to build the web app based on the user's code and dependencies.
423
- Launch Functionality: Implement a mechanism to launch the built app.
424
- Error Correction: Identify and correct errors during the build and launch process.
425
- Automated Assistance: Provide automated assistance during the build and launch process, with a gradient slider to adjust the level of user override.
426
-
427
- Recommendations, Enhancements, Optimizations, and Workflow:
428
-
429
- 1. LLM Selection for Code Generation:
430
- * **Google/Flan-T5-XL:** Excellent for code generation, particularly for Python.
431
- * **Salesforce/CodeT5-Base:** Strong for code generation, with a focus on code summarization and translation.
432
- * **Microsoft/CodeGPT-Small:** A smaller model that is suitable for code generation tasks, especially if you have limited computational resources.
433
-
434
- 2. Prompt Engineering for Code Generation:
435
- * **Contextual Prompts:** Provide the LLM with as much context as possible, including the desired programming language, libraries, and any specific requirements.
436
- * **Code Snippets:** If possible, include code snippets as part of the prompt to guide the LLM's code generation.
437
- * **Iterative Refinement:** Use iterative prompting to refine the generated code. Start with a basic prompt and then provide feedback to the LLM to improve the code.
438
-
439
- 3. Workspace Exploration:
440
- * **Tree-Like View:** Use a tree-like representation to display the workspace's directory structure.
441
- * **Search Functionality:** Implement a search bar to allow users to quickly find specific files or directories.
442
- * **Code Highlighting:** Provide code highlighting for files in the workspace to improve readability.
443
-
444
- 4. Dependency Management:
445
- * **Virtual Environments:** Use virtual environments to isolate project dependencies and prevent conflicts.
446
- * **Automatic Updates:** Implement a mechanism to automatically update dependencies when new versions are available.
447
- * **Dependency Locking:** Use tools like `pip-tools` or `poetry` to lock dependencies to specific versions, ensuring consistent builds.
448
-
449
- 5. Application Build and Launch:
450
- * **Build Tool Integration:** Consider integrating a build tool like `poetry` or `pipenv` into your workflow to automate the build process.
451
- * **Containerization:** Containerize the app using Docker to ensure consistent deployments across different environments.
452
- * **Deployment Automation:** Explore tools like `Heroku`, `AWS Elastic Beanstalk`, or `Google App Engine` to automate the deployment process.
453
-
454
- 6. Automated Assistance:
455
- * **Error Detection and Correction:** Implement a system that can detect common coding errors and suggest corrections.
456
- * **Code Completion:** Use an LLM to provide code completion suggestions as the user types.
 
21
  )
22
  from utils import parse_action, parse_file_content, read_python_module_structure
23
  from datetime import datetime
24
+
25
  now = datetime.now()
26
  date_time_str = now.strftime("%Y-%m-%d %H:%M:%S")
27
 
 
31
 
32
  ############################################
33
 
 
34
  VERBOSE = True
35
  MAX_HISTORY = 100
36
+ # MODEL = "gpt-3.5-turbo" # "gpt-4"
 
37
 
38
  def format_prompt(message, history):
39
+ prompt = "<s>"
40
+ for user_prompt, bot_response in history:
41
+ prompt += f"[INST] {user_prompt} [/INST]"
42
+ prompt += f" {bot_response}</s> "
43
+ prompt += f"[INST] {message} [/INST]"
44
+ return prompt
45
+
46
+ def run_gpt(prompt_template, stop_tokens, max_tokens, purpose, **prompt_kwargs):
47
+ seed = random.randint(1, 1111111111111111)
48
+ print(seed)
 
 
 
 
 
 
 
 
49
  generate_kwargs = dict(
50
  temperature=1.0,
51
  max_new_tokens=2096,
 
55
  seed=seed,
56
  )
57
 
 
58
  content = PREFIX.format(
59
  date_time_str=date_time_str,
60
  purpose=purpose,
 
62
  ) + prompt_template.format(**prompt_kwargs)
63
  if VERBOSE:
64
  print(LOG_PROMPT.format(content))
65
+
66
+ # formatted_prompt = format_prompt(f"{system_prompt}, {prompt}", history)
67
+ # formatted_prompt = format_prompt(f'{content}', history)
 
68
 
69
  stream = client.text_generation(content, **generate_kwargs, stream=True, details=True, return_full_text=False)
70
  resp = ""
 
75
  print(LOG_RESPONSE.format(resp))
76
  return resp
77
 
 
78
  def compress_history(purpose, task, history, directory):
79
  resp = run_gpt(
80
  COMPRESS_HISTORY_PROMPT,
 
86
  )
87
  history = "observation: {}\n".format(resp)
88
  return history
89
+
90
  def call_search(purpose, task, history, directory, action_input):
91
  print("CALLING SEARCH")
92
  try:
 
93
  if "http" in action_input:
94
  if "<" in action_input:
95
  action_input = action_input.strip("<")
96
  if ">" in action_input:
97
  action_input = action_input.strip(">")
98
+
99
  response = i_s(action_input)
100
+ # response = google(search_return)
101
  print(response)
102
  history += "observation: search result is: {}\n".format(response)
103
  else:
 
122
  if line.startswith("thought: "):
123
  history += "{}\n".format(line)
124
  elif line.startswith("action: "):
 
125
  action_name, action_input = parse_action(line)
126
+ print(f'ACTION_NAME :: {action_name}')
127
+ print(f'ACTION_INPUT :: {action_input}')
128
+
129
  history += "{}\n".format(line)
130
  if "COMPLETE" in action_name or "COMPLETE" in action_input:
131
  task = "END"
 
134
  return action_name, action_input, history, task
135
  else:
136
  history += "{}\n".format(line)
137
+ # history += "observation: the following command did not produce any useful output: '{}', I need to check the commands syntax, or use a different command\n".format(line)
 
 
 
 
138
 
139
+ # return action_name, action_input, history, task
140
+ # assert False, "unknown action: {}".format(line)
141
+ return "MAIN", None, history, task
142
 
143
  def call_set_task(purpose, task, history, directory, action_input):
144
  task = run_gpt(
 
161
  "UPDATE-TASK": call_set_task,
162
  "SEARCH": call_search,
163
  "COMPLETE": end_fn,
 
164
  }
165
 
166
  def run_action(purpose, task, history, directory, action_name, action_input):
167
  print(f'action_name::{action_name}')
168
  try:
169
  if "RESPONSE" in action_name or "COMPLETE" in action_name:
170
+ action_name = "COMPLETE"
171
+ task = "END"
172
  return action_name, "COMPLETE", history, task
173
+
174
  # compress the history when it is long
175
  if len(history.split("\n")) > MAX_HISTORY:
176
  if VERBOSE:
177
  print("COMPRESSING HISTORY")
178
  history = compress_history(purpose, task, history, directory)
179
  if not action_name in NAME_TO_FUNC:
180
+ action_name = "MAIN"
181
  if action_name == "" or action_name == None:
182
+ action_name = "MAIN"
183
  assert action_name in NAME_TO_FUNC
184
+
185
  print("RUN: ", action_name, action_input)
186
  return NAME_TO_FUNC[action_name](purpose, task, history, directory, action_input)
187
  except Exception as e:
188
  history += "observation: the previous command did not produce any useful output, I need to check the commands syntax, or use a different command\n"
 
189
  return "MAIN", None, history, task
190
 
191
+ def run(purpose, history):
192
+ # print(purpose)
193
+ # print(hist)
194
+ task = None
195
+ directory = "./"
 
196
  if history:
197
+ history = str(history).strip("[]")
198
  if not history:
199
  history = ""
200
+
201
  action_name = "UPDATE-TASK" if task is None else "MAIN"
202
  action_input = None
203
  while True:
 
219
  action_input,
220
  )
221
  yield (history)
222
+ # yield ("",[(purpose,history)])
223
  if task == "END":
224
  return (history)
225
+ # return ("", [(purpose,history)])
 
 
226
 
227
  ################################################
228
 
229
  def format_prompt(message, history):
230
+ prompt = "<s>"
231
+ for user_prompt, bot_response in history:
232
+ prompt += f"[INST] {user_prompt} [/INST]"
233
+ prompt += f" {bot_response}</s> "
234
+ prompt += f"[INST] {message} [/INST]"
235
+ return prompt
236
+
237
+ AGENTS = [
238
  "WEB_DEV",
239
  "AI_SYSTEM_PROMPT",
240
  "PYTHON_CODE_DEV"
241
  ]
 
 
 
 
242
 
243
+ def generate(prompt, history, agent_name=AGENTS[0], sys_prompt="", temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0):
244
+ seed = random.randint(1, 1111111111111111)
245
+
246
+ agent = prompts.WEB_DEV
247
  if agent_name == "WEB_DEV":
248
  agent = prompts.WEB_DEV
249
  if agent_name == "AI_SYSTEM_PROMPT":
250
  agent = prompts.AI_SYSTEM_PROMPT
251
  if agent_name == "PYTHON_CODE_DEV":
252
+ agent = prompts.PYTHON_CODE_DEV
253
+ system_prompt = agent
254
  temperature = float(temperature)
255
  if temperature < 1e-2:
256
  temperature = 1e-2
 
274
  yield output
275
  return output
276
 
277
+ additional_inputs = [
 
278
  gr.Dropdown(
279
  label="Agents",
280
+ choices=[s for s in AGENTS],
281
+ value=AGENTS[0],
282
  interactive=True,
283
+ ),
284
  gr.Textbox(
285
  label="System Prompt",
286
  max_lines=1,
 
293
  maximum=1.0,
294
  step=0.05,
295
  interactive=True,
296
+ info="Higher values generate more diverse outputs.",
297
  ),
 
298
  gr.Slider(
299
+ label="Max New Tokens",
300
+ value=2048,
301
+ minimum=64,
302
+ maximum=4096,
303
  step=64,
304
  interactive=True,
305
+ info="The maximum number of new tokens to generate.",
306
  ),
307
  gr.Slider(
308
+ label="Top-p (Nucleus Sampling)",
309
  value=0.90,
310
  minimum=0.0,
311
  maximum=1,
312
  step=0.05,
313
  interactive=True,
314
+ info="Higher values sample more low-probability tokens.",
315
  ),
316
  gr.Slider(
317
+ label="Repetition Penalty",
318
  value=1.2,
319
  minimum=1.0,
320
  maximum=2.0,
321
  step=0.05,
322
  interactive=True,
323
+ info="Penalize repeated tokens.",
324
+ )
 
 
325
  ]
326
 
327
+ customCSS = """
328
+ #component-7 {
329
+ height: 1600px;
330
+ flex-grow: 4;
331
+ }
332
+ """
333
+
334
+ with gr.Blocks(theme='ParityError/Interstellar') as demo:
335
+ gr.ChatInterface(
336
+ generate,
337
+ additional_inputs=additional_inputs,
338
+ )
 
339
 
340
+ demo.queue().launch(debug=True)