File size: 3,206 Bytes
c48128e
cac4e7b
a5ab504
4d969ce
60b2a69
6d51c46
562af8d
a768bed
 
 
 
 
9ea371a
 
 
 
6141f1b
 
 
 
 
9ea371a
6141f1b
 
0e9c24d
5bcc2da
 
 
 
c48128e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ea371a
409696f
722929d
ed306c8
4d969ce
 
 
ed306c8
cac4e7b
4d969ce
 
0636c57
4d969ce
d8a9c24
9cdbe75
ed306c8
cac4e7b
4d969ce
 
722929d
6ee9937
 
4d969ce
722929d
 
a768bed
 
 
 
f99d688
ac5e022
a768bed
 
 
 
d56f6b1
05c2b03
 
409696f
b532f92
05c2b03
b1c069d
230a192
2194d18
230a192
 
2194d18
 
 
409696f
c48128e
230a192
409696f
9ea371a
d8f2386
230a192
e90039b
49eb139
 
 
cac4e7b
576e7cf
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
import base64, datetime, json, os

from autogen import ConversableAgent, AssistantAgent, register_function
from autogen.coding import LocalCommandLineCodeExecutor
from datetime import date
from typing_extensions import Annotated

###
def get_today() -> Annotated[str, "Get today's date"]:
    return str(date.today())
###

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=llm_config,
        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,
        system_message="You are a Sr. Python Programmer, an expert in writing Pylint-compliant code. "
            "If needed, call get_today() to get today's date.",
        code_execution_config=False,
        human_input_mode="NEVER",
    )

    ###
    register_function(
        get_today,
        caller=code_executor_agent,
        executor=code_writer_agent,
        name="get_today",
        description="Call this tool to get today's date.",
    )    
    ###
    
    chat_result = code_executor_agent.initiate_chat(
        code_writer_agent,
        message=task,
        max_turns=15
    )

    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