Autogen Agentchat#
The agentic framework autogen allows combining functions/tools, memory and LLMs to so called “agents”. These agents can solve tasks prompted using human language.
Read more
import autogen_core
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import TextMessage
from autogen_core import CancellationToken
from autogen_ext.models.openai import OpenAIChatCompletionClient
import random
from IPython.display import Markdown, display
import asyncio
from agent_tools import print_messages
For demonstration purposes we define two math functions. To ensure that the LLM does not try to do math by itself, we define a new operator, where the LLM cannot know what it does and has to call the function.
# Define tools that do fantasy math
async def generate_random_number() -> int:
"""Generate a random number between 0 and 100"""
return random.randint(0, 100)
async def roberts_operator(a:int, b:int) -> int:
"""Apply Robert's operator to a and b"""
return a * b + 1
We furthermore define an agent. Agents consist of a list of tools, a connector/client to an LLM and a system message.
# Create an agent that uses the OpenAI GPT-4o model.
model_client = OpenAIChatCompletionClient(
model="gpt-4o",
# api_key="YOUR_API_KEY",
)
agent = AssistantAgent(
name="fantasy_math_expert",
model_client=model_client,
tools=[generate_random_number, roberts_operator],
system_message="Use tools to solve tasks.",
)
We can then directly communicate with the agent.
result = await agent.on_messages(
[TextMessage(content="Give me a random number.", source="user")],
cancellation_token=CancellationToken(),
)
result.chat_message.content
'63'
Alternatively, we can define an async function that calls the agent and returns the result.
async def assistant_run(task_description, verbose=False) -> None:
response = await agent.on_messages(
[TextMessage(content=task_description, source="user")],
cancellation_token=CancellationToken(),
)
if verbose:
display(Markdown("## Inner messages"))
print_messages(response.inner_messages)
display(Markdown("## Chat messages"))
print_messages([response.chat_message])
return response
# Use asyncio.run(assistant_run()) when running in a script.
await assistant_run("What is Robert's operator result on two random numbers?", verbose=True);
Inner messages
fantasy_math_expert:
generate_random_number()
generate_random_number()
fantasy_math_expert:
= 30
= 45
Chat messages
fantasy_math_expert:
‘30 45’
await assistant_run("What is Robert's operator result on 3 and 4?", verbose=True);
Inner messages
fantasy_math_expert:
roberts_operator(a=3, b=4)
fantasy_math_expert:
= 13
Chat messages
fantasy_math_expert:
‘13’
Note that the assistant has memory:
memory = await agent.save_state()
memory["llm_messages"]
[{'content': 'Give me a random number.',
'source': 'user',
'type': 'UserMessage'},
{'content': [{'id': 'call_nC19Sx9jHlV9IqY0gGWNj6Me',
'arguments': '{}',
'name': 'generate_random_number'}],
'source': 'fantasy_math_expert',
'type': 'AssistantMessage'},
{'content': [{'content': '63', 'call_id': 'call_nC19Sx9jHlV9IqY0gGWNj6Me'}],
'type': 'FunctionExecutionResultMessage'},
{'content': "What is Robert's operator result on two random numbers?",
'source': 'user',
'type': 'UserMessage'},
{'content': [{'id': 'call_KIvs9uK1gXCipoYKPi7eCf8w',
'arguments': '{}',
'name': 'generate_random_number'},
{'id': 'call_NXRo0zwvGGjxEEL546Oa4XjS',
'arguments': '{}',
'name': 'generate_random_number'}],
'source': 'fantasy_math_expert',
'type': 'AssistantMessage'},
{'content': [{'content': '30', 'call_id': 'call_KIvs9uK1gXCipoYKPi7eCf8w'},
{'content': '45', 'call_id': 'call_NXRo0zwvGGjxEEL546Oa4XjS'}],
'type': 'FunctionExecutionResultMessage'},
{'content': "What is Robert's operator result on 3 and 4?",
'source': 'user',
'type': 'UserMessage'},
{'content': [{'id': 'call_EdRQ65BV686cEp6VCm8ZdTP3',
'arguments': '{"a":3,"b":4}',
'name': 'roberts_operator'}],
'source': 'fantasy_math_expert',
'type': 'AssistantMessage'},
{'content': [{'content': '13', 'call_id': 'call_EdRQ65BV686cEp6VCm8ZdTP3'}],
'type': 'FunctionExecutionResultMessage'}]