autogen/python/examples/coder_reviewer.py

99 lines
3.7 KiB
Python
Raw Normal View History

import argparse
2024-06-13 00:10:35 -07:00
import asyncio
import logging
import logging.handlers
import os
import sys
2024-06-13 00:10:35 -07:00
from agnext.application import SingleThreadedAgentRuntime
from agnext.chat.agents import ChatCompletionAgent
from agnext.chat.memory import BufferedChatMemory
from agnext.chat.patterns import GroupChatManager
from agnext.components.models import OpenAI, SystemMessage
from agnext.core import AgentRuntime
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
from utils import TextualChatApp, TextualUserAgent, start_runtime
2024-06-13 00:10:35 -07:00
def coder_reviewer(runtime: AgentRuntime, app: TextualChatApp) -> None:
runtime.register(
"Human",
lambda: TextualUserAgent(
description="A human user that provides a problem statement.",
app=app,
),
)
coder = runtime.register_and_get_proxy(
"Coder",
lambda: ChatCompletionAgent(
description="An agent that writes code",
system_messages=[
SystemMessage(
"You are a coder. You can write code to solve problems.\n"
"Work with the reviewer to improve your code."
)
],
model_client=OpenAI(model="gpt-4-turbo"),
memory=BufferedChatMemory(buffer_size=10),
),
2024-06-13 00:10:35 -07:00
)
reviewer = runtime.register_and_get_proxy(
"Reviewer",
lambda: ChatCompletionAgent(
description="An agent that reviews code",
system_messages=[
SystemMessage(
"You are a code reviewer. You focus on correctness, efficiency and safety of the code.\n"
"Respond using the following format:\n"
"Code Review:\n"
"Correctness: <Your comments>\n"
"Efficiency: <Your comments>\n"
"Safety: <Your comments>\n"
"Approval: <APPROVE or REVISE>\n"
"Suggested Changes: <Your comments>"
)
],
model_client=OpenAI(model="gpt-4-turbo"),
memory=BufferedChatMemory(buffer_size=10),
),
2024-06-13 00:10:35 -07:00
)
runtime.register(
"Manager",
lambda: GroupChatManager(
description="A manager that orchestrates a back-and-forth converation between a coder and a reviewer.",
runtime=runtime,
participants=[coder.id, reviewer.id], # The order of the participants indicates the order of speaking.
memory=BufferedChatMemory(buffer_size=10),
termination_word="APPROVE",
),
2024-06-13 00:10:35 -07:00
)
app.welcoming_notice = f"""Welcome to the coder-reviewer demo with the following roles:
1. 🤖 {coder.metadata['name']}: {coder.metadata['description']}
2. 🧐 {reviewer.metadata['name']}: {reviewer.metadata['description']}
The coder will write code to solve a problem, and the reviewer will review the code.
The conversation will end when the reviewer approves the code.
Let's get started by providing a problem statement.
"""
2024-06-13 00:10:35 -07:00
async def main() -> None:
runtime = SingleThreadedAgentRuntime()
app = TextualChatApp(runtime, user_name="You")
coder_reviewer(runtime, app)
asyncio.create_task(start_runtime(runtime))
await app.run_async()
2024-06-13 00:10:35 -07:00
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Coder-reviewer pattern for code writing and review.")
parser.add_argument("--verbose", action="store_true", help="Enable verbose logging.")
args = parser.parse_args()
if args.verbose:
logging.basicConfig(level=logging.WARNING)
logging.getLogger("agnext").setLevel(logging.DEBUG)
handler = logging.FileHandler("coder_reviewer.log")
logging.getLogger("agnext").addHandler(handler)
asyncio.run(main())