|
import chess, chess.svg, math |
|
from autogen import ConversableAgent, register_function |
|
from typing_extensions import Annotated |
|
|
|
board = None |
|
board_svgs = None |
|
made_move = None |
|
|
|
def get_legal_moves() -> Annotated[str, "A list of legal moves in UCI format"]: |
|
return "Possible moves are: " + ",".join( |
|
[str(move) for move in board.legal_moves] |
|
) |
|
|
|
def make_move(move: Annotated[str, "A move in UCI format."]) -> Annotated[str, "Result of the move."]: |
|
move = chess.Move.from_uci(move) |
|
board.push_uci(str(move)) |
|
global made_move |
|
made_move = True |
|
|
|
board_svgs.append(chess.svg.board( |
|
board, |
|
arrows=[(move.from_square, move.to_square)], |
|
fill={move.from_square: "gray"}, |
|
size=250 |
|
)) |
|
|
|
piece = board.piece_at(move.to_square) |
|
piece_symbol = piece.unicode_symbol() |
|
piece_name = ( |
|
chess.piece_name(piece.piece_type).capitalize() |
|
if piece_symbol.isupper() |
|
else chess.piece_name(piece.piece_type) |
|
) |
|
|
|
return f"Moved {piece_name} ({piece_symbol}) from "\ |
|
f"{chess.SQUARE_NAMES[move.from_square]} to "\ |
|
f"{chess.SQUARE_NAMES[move.to_square]}." |
|
|
|
def check_made_move(msg): |
|
global made_move |
|
|
|
if made_move: |
|
made_move = False |
|
return True |
|
else: |
|
return False |
|
|
|
def get_num_turns(num_moves): |
|
|
|
|
|
|
|
|
|
num_turns = math.ceil(num_moves / 2) |
|
|
|
if num_moves % 2 == 0: |
|
num_turns += 1 |
|
|
|
return num_turns |
|
|
|
def initialize(): |
|
global board, board_svgs, made_move |
|
board = chess.Board() |
|
board_svgs = [] |
|
made_move = False |
|
|
|
def run_multi_agent(llm, task): |
|
|
|
|
|
llm_config = {"model": llm} |
|
|
|
user_proxy = autogen.ConversableAgent( |
|
name="Admin", |
|
system_message="Give the task, and send " |
|
"instructions to writer to refine the blog post.", |
|
code_execution_config=False, |
|
llm_config=llm_config, |
|
human_input_mode="ALWAYS", |
|
) |
|
|
|
planner = autogen.ConversableAgent( |
|
name="Planner", |
|
system_message="Given a task, please determine " |
|
"what information is needed to complete the task. " |
|
"Please note that the information will all be retrieved using" |
|
" Python code. Please only suggest information that can be " |
|
"retrieved using Python code. " |
|
"After each step is done by others, check the progress and " |
|
"instruct the remaining steps. If a step fails, try to " |
|
"workaround", |
|
description="Planner. Given a task, determine what " |
|
"information is needed to complete the task. " |
|
"After each step is done by others, check the progress and " |
|
"instruct the remaining steps", |
|
llm_config=llm_config, |
|
) |
|
|
|
engineer = autogen.AssistantAgent( |
|
name="Engineer", |
|
llm_config=llm_config, |
|
description="An engineer that writes code based on the plan " |
|
"provided by the planner.", |
|
) |
|
|
|
executor = autogen.ConversableAgent( |
|
name="Executor", |
|
system_message="Execute the code written by the " |
|
"engineer and report the result.", |
|
human_input_mode="NEVER", |
|
code_execution_config={ |
|
"last_n_messages": 3, |
|
"work_dir": "coding", |
|
"use_docker": False, |
|
}, |
|
) |
|
|
|
writer = autogen.ConversableAgent( |
|
name="Writer", |
|
llm_config=llm_config, |
|
system_message="Writer." |
|
"Please write blogs in markdown format (with relevant titles)" |
|
" and put the content in pseudo ```md``` code block. " |
|
"You take feedback from the admin and refine your blog.", |
|
description="Writer." |
|
"Write blogs based on the code execution results and take " |
|
"feedback from the admin to refine the blog." |
|
) |
|
|
|
groupchat = autogen.GroupChat( |
|
agents=[user_proxy, engineer, writer, executor, planner], |
|
messages=[], |
|
max_round=10, |
|
) |
|
|
|
manager = autogen.GroupChatManager( |
|
groupchat=groupchat, llm_config=llm_config |
|
) |
|
|
|
groupchat_result = user_proxy.initiate_chat( |
|
manager, |
|
message=task, |
|
) |
|
|
|
return groupchat_result |