thinkall commited on
Commit
b78f0b0
·
1 Parent(s): e11ba6d

Add code generation

Browse files
Files changed (3) hide show
  1. app.py +7 -2
  2. autogen_utils.py +158 -2
  3. requirements.txt +1 -0
app.py CHANGED
@@ -10,15 +10,16 @@ from autogen_utils import (
10
  MathUserProxyAgent,
11
  RetrieveUserProxyAgent,
12
  check_termination_and_human_reply,
 
13
  get_retrieve_config,
14
  initialize_agents,
15
  )
16
  from configs import Q1, Q2, Q3, TIMEOUT, TITLE
17
  from custom_widgets import RowAgentWidget
18
  from panel.chat import ChatInterface
19
- from panel.widgets import Button, PasswordInput, Switch, TextAreaInput, TextInput
20
 
21
- pn.extension(design="material")
22
 
23
  template = pn.template.BootstrapTemplate(title=TITLE)
24
 
@@ -233,6 +234,7 @@ async def reply_chat(contents, user, instance):
233
 
234
  if not init_sender:
235
  init_sender = agents[0]
 
236
  await agents_chat(init_sender, manager, contents, agents)
237
  return "The task is done. Please start a new task."
238
 
@@ -443,4 +445,7 @@ btn_example2.on_click(load_example)
443
  btn_example3.on_click(load_example)
444
  btn_example4.on_click(load_example)
445
 
 
 
 
446
  template.servable(title=TITLE)
 
10
  MathUserProxyAgent,
11
  RetrieveUserProxyAgent,
12
  check_termination_and_human_reply,
13
+ generate_code,
14
  get_retrieve_config,
15
  initialize_agents,
16
  )
17
  from configs import Q1, Q2, Q3, TIMEOUT, TITLE
18
  from custom_widgets import RowAgentWidget
19
  from panel.chat import ChatInterface
20
+ from panel.widgets import Button, CodeEditor, PasswordInput, Switch, TextInput
21
 
22
+ pn.extension("codeeditor")
23
 
24
  template = pn.template.BootstrapTemplate(title=TITLE)
25
 
 
234
 
235
  if not init_sender:
236
  init_sender = agents[0]
237
+ await generate_code(agents, manager, contents, code_editor)
238
  await agents_chat(init_sender, manager, contents, agents)
239
  return "The task is done. Please start a new task."
240
 
 
445
  btn_example3.on_click(load_example)
446
  btn_example4.on_click(load_example)
447
 
448
+ code_editor = CodeEditor(value="", sizing_mode="stretch_width", language="python", height=300)
449
+ template.main.append(code_editor)
450
+
451
  template.servable(title=TITLE)
autogen_utils.py CHANGED
@@ -1,11 +1,13 @@
1
  import asyncio
2
  import sys
 
3
  import threading
4
  import time
5
  from ast import literal_eval
6
 
7
  import autogen
8
  import chromadb
 
9
  import panel as pn
10
  from autogen import Agent, AssistantAgent, UserProxyAgent
11
  from autogen.agentchat.contrib.compressible_agent import CompressibleAgent
@@ -17,7 +19,6 @@ from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProx
17
  from autogen.agentchat.contrib.teachable_agent import TeachableAgent
18
  from autogen.code_utils import extract_code
19
  from configs import Q1, Q2, Q3, TIMEOUT, TITLE
20
- from panel.widgets import TextAreaInput
21
 
22
  try:
23
  from termcolor import colored
@@ -160,7 +161,7 @@ async def get_human_input(name, prompt: str, instance=None) -> str:
160
  """Get human input."""
161
  if instance is None:
162
  return input(prompt)
163
- get_input_widget = TextAreaInput(placeholder=prompt, name="", sizing_mode="stretch_width")
164
  get_input_checkbox = pn.widgets.Checkbox(name="Check to Submit Feedback")
165
  instance.send(pn.Row(get_input_widget, get_input_checkbox), user=name, respond=False)
166
  ts = time.time()
@@ -258,3 +259,158 @@ async def check_termination_and_human_reply(
258
  print(colored("\n>>>>>>>> USING AUTO REPLY...", "red"), flush=True)
259
 
260
  return False, None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import asyncio
2
  import sys
3
+ import textwrap
4
  import threading
5
  import time
6
  from ast import literal_eval
7
 
8
  import autogen
9
  import chromadb
10
+ import isort
11
  import panel as pn
12
  from autogen import Agent, AssistantAgent, UserProxyAgent
13
  from autogen.agentchat.contrib.compressible_agent import CompressibleAgent
 
19
  from autogen.agentchat.contrib.teachable_agent import TeachableAgent
20
  from autogen.code_utils import extract_code
21
  from configs import Q1, Q2, Q3, TIMEOUT, TITLE
 
22
 
23
  try:
24
  from termcolor import colored
 
161
  """Get human input."""
162
  if instance is None:
163
  return input(prompt)
164
+ get_input_widget = pn.widgets.TextAreaInput(placeholder=prompt, name="", sizing_mode="stretch_width")
165
  get_input_checkbox = pn.widgets.Checkbox(name="Check to Submit Feedback")
166
  instance.send(pn.Row(get_input_widget, get_input_checkbox), user=name, respond=False)
167
  ts = time.time()
 
259
  print(colored("\n>>>>>>>> USING AUTO REPLY...", "red"), flush=True)
260
 
261
  return False, None
262
+
263
+
264
+ async def generate_code(agents, manager, contents, code_editor):
265
+ code = """import autogen
266
+ import os
267
+ from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProxyAgent
268
+ from autogen.agentchat.contrib.math_user_proxy_agent import MathUserProxyAgent
269
+
270
+ config_list = autogen.config_list_from_json(
271
+ "OAI_CONFIG_LIST",
272
+ file_location=".",
273
+ )
274
+ if not config_list:
275
+ os.environ["MODEL"] = "<your model name>"
276
+ os.environ["OPENAI_API_KEY"] = "<your openai api key>"
277
+ os.environ["OPENAI_BASE_URL"] = "<your openai base url>" # optional
278
+
279
+ config_list = autogen.config_list_from_models(
280
+ model_list=[os.environ.get("MODEL", "gpt-35-turbo")],
281
+ )
282
+
283
+ llm_config = {
284
+ "timeout": 60,
285
+ "cache_seed": 42,
286
+ "config_list": config_list,
287
+ "temperature": 0,
288
+ }
289
+
290
+ def termination_msg(x):
291
+ _msg = str(x.get("content", "")).upper().strip().strip("\\n").strip(".")
292
+ return isinstance(x, dict) and (_msg.endswith("TERMINATE") or _msg.startswith("TERMINATE"))
293
+
294
+ agents = []
295
+
296
+ """
297
+
298
+ for agent in agents:
299
+ if isinstance(agent, RetrieveUserProxyAgent):
300
+ _code = f"""from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProxyAgent
301
+
302
+ agent = RetrieveUserProxyAgent(
303
+ name="{agent.name}",
304
+ is_termination_msg=termination_msg,
305
+ human_input_mode="TERMINATE",
306
+ max_consecutive_auto_reply=5,
307
+ retrieve_config={agent._retrieve_config},
308
+ code_execution_config={agent._code_execution_config}, # set to False if you don't want to execute the code
309
+ default_auto_reply="Please reply exactly `TERMINATE` to me if the task is done.",
310
+ )
311
+
312
+ """
313
+ elif isinstance(agent, GPTAssistantAgent):
314
+ _code = f"""from auotgen.agentchat.contrib.gpt_assistant_agent import GPTAssistantAgent
315
+
316
+ agent = GPTAssistantAgent(
317
+ name="{agent.name}",
318
+ instructions="{agent.system_message}",
319
+ llm_config=llm_config,
320
+ is_termination_msg=termination_msg,
321
+ )
322
+
323
+ """
324
+ elif isinstance(agent, CompressibleAgent):
325
+ _code = f"""from autogen.agentchat.contrib.compressible_agent import CompressibleAgent
326
+
327
+ compress_config = {{
328
+ "mode": "COMPRESS",
329
+ "trigger_count": 600, # set this to a large number for less frequent compression
330
+ "verbose": True, # to allow printing of compression information: contex before and after compression
331
+ "leave_last_n": 2,
332
+ }}
333
+
334
+ agent = CompressibleAgent(
335
+ name="{agent.name}",
336
+ system_message={agent.system_msg},
337
+ llm_config=llm_config,
338
+ compress_config=compress_config,
339
+ is_termination_msg=termination_msg,
340
+ )
341
+
342
+ """
343
+ elif isinstance(agent, UserProxyAgent):
344
+ _code = f"""from autogen import UserProxyAgent
345
+
346
+ agent = UserProxyAgent(
347
+ name="{agent.name}",
348
+ is_termination_msg=termination_msg,
349
+ human_input_mode="TERMINATE",
350
+ default_auto_reply="Please reply exactly `TERMINATE` to me if the task is done.",
351
+ max_consecutive_auto_reply=5,
352
+ code_execution_config={agent._code_execution_config},
353
+ )
354
+
355
+ """
356
+ elif isinstance(agent, RetrieveAssistantAgent):
357
+ _code = f"""from autogen.agentchat.contrib.retrieve_assistant_agent import RetrieveAssistantAgent
358
+
359
+ agent = RetrieveAssistantAgent(
360
+ name="{agent.name}",
361
+ system_message="{agent.system_message}",
362
+ llm_config=llm_config,
363
+ is_termination_msg=termination_msg,
364
+ retrieve_config={agent._retrieve_config},
365
+ )
366
+
367
+ """
368
+ elif isinstance(agent, AssistantAgent):
369
+ _code = f"""from autogen import AssistantAgent
370
+
371
+ agent = AssistantAgent(
372
+ name="{agent.name}",
373
+ system_message="{agent.system_message}",
374
+ llm_config=llm_config,
375
+ is_termination_msg=termination_msg,
376
+ )
377
+
378
+ """
379
+ code += _code + "\n" + "agents.append(agent)\n\n"
380
+
381
+ _code = """
382
+ for agent in agents:
383
+ if "UserProxy" in str(type(agent)):
384
+ init_sender = agent
385
+ break
386
+
387
+ if not init_sender:
388
+ init_sender = agents[0]
389
+
390
+ """
391
+ code += _code
392
+
393
+ if manager:
394
+ _code = """
395
+ groupchat = autogen.GroupChat(
396
+ agents=agents, messages=[], max_round=12, speaker_selection_method="round_robin", allow_repeat_speaker=False
397
+ ) # todo: auto, sometimes message has no name
398
+ manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
399
+
400
+ recipient = manager
401
+ """
402
+ else:
403
+ _code = """
404
+ recipient = agents[1] if agents[1] != init_sender else agents[0]
405
+ """
406
+ code += _code
407
+
408
+ _code = f"""
409
+ if isinstance(init_sender, (RetrieveUserProxyAgent, MathUserProxyAgent)):
410
+ init_sender.initiate_chat(recipient, problem="{contents}")
411
+ else:
412
+ init_sender.initiate_chat(recipient, message="{contents}")
413
+ """
414
+ code += _code
415
+ code = textwrap.dedent(code)
416
+ code_editor.value = isort.code(code)
requirements.txt CHANGED
@@ -3,3 +3,4 @@ panel>=1.3.1
3
  cloudpickle
4
  diskcache
5
  yfinance
 
 
3
  cloudpickle
4
  diskcache
5
  yfinance
6
+ isort