Spaces:
Sleeping
Sleeping
import gradio as gr | |
import datetime, os, threading | |
import base64, json | |
from autogen import ConversableAgent, AssistantAgent | |
from autogen.coding import LocalCommandLineCodeExecutor | |
def read_file(file_path: str) -> str: | |
with open(file_path, "r", encoding="utf-8") as file: | |
return file.read() | |
def read_image_file(image_file_path: str) -> str: | |
with open(image_file_path, "rb") as image_file: | |
image_data = image_file.read() | |
return base64.b64encode(image_data).decode("utf-8") | |
def generate_markdown_image(image_data: str) -> str: | |
return f"![Image](data:image/png;base64,{image_data})" | |
def format_as_markdown(code: str) -> str: | |
markdown_code = '```\n' | |
markdown_code += code | |
markdown_code += '\n```' | |
return markdown_code | |
def get_latest_file(directory, file_extension): | |
latest_file = None | |
latest_date = datetime.datetime.min | |
for file in os.listdir(directory): | |
if file: | |
_, file_ext = os.path.splitext(file) | |
if file_ext == file_extension: | |
file_path = os.path.join(directory, file) | |
file_date = datetime.datetime.fromtimestamp(os.path.getmtime(file_path)) | |
if file_date > latest_date: | |
latest_date = file_date | |
latest_file = file | |
return latest_file | |
def run_multi_agent(llm, task): | |
llm_config = {"model": llm} | |
executor = LocalCommandLineCodeExecutor( | |
timeout=60, | |
work_dir="coding", | |
) | |
code_executor_agent = ConversableAgent( | |
name="code_executor_agent", | |
llm_config=False, | |
code_execution_config={"executor": executor}, | |
human_input_mode="NEVER", | |
default_auto_reply="TERMINATE", | |
) | |
code_writer_agent = AssistantAgent( | |
name="code_writer_agent", | |
llm_config=llm_config, | |
code_execution_config=False, | |
human_input_mode="NEVER", | |
) | |
chat_result = code_executor_agent.initiate_chat( | |
code_writer_agent, | |
message=task, | |
max_turns=10 | |
) | |
chat = "" | |
first_message = True | |
for message in chat_result.chat_history: | |
if not first_message: | |
chat += f"**{message['role'].replace('assistant', 'Code Executor').replace('user', 'Code Writer')}**\n{message['content']}\n\n" | |
first_message = False | |
file_name_png = get_latest_file("coding", ".png") | |
image_data = read_image_file(f"/home/user/app/coding/{file_name_png}") | |
markdown_code_png = generate_markdown_image(image_data) | |
result = f"{markdown_code_png}\n\n{chat}" | |
print("===") | |
print(result) | |
print("===") | |
return result | |
lock = threading.Lock() | |
LLM = "gpt-4o-mini" | |
def invoke(openai_api_key, openai_api_base, task): | |
if not openai_api_key: | |
raise gr.Error("OpenAI API Key is required.") | |
if not task: | |
raise gr.Error("Task is required.") | |
# raise gr.Error("Please clone space due to local code execution.") | |
with lock: | |
os.environ["OPENAI_API_KEY"] = openai_api_key | |
result = run_multi_agent(LLM, task) | |
del os.environ["OPENAI_API_KEY"] | |
return result | |
gr.close_all() | |
demo = gr.Interface(fn = invoke, | |
inputs = [gr.Textbox(label = "OpenAI API Key", type = "password", lines = 1), | |
gr.Textbox(label = "Task", value = f"Today is {datetime.date.today()}. {os.environ['INPUT']}")], | |
outputs = [gr.Markdown(label = "Output", value = os.environ["OUTPUT"], line_breaks = True, sanitize_html = False)], | |
title = "Multi-Agent AI: Coding", | |
description = os.environ["DESCRIPTION"]) | |
demo.launch() |