|
import json |
|
import openai |
|
from gradio import ChatMessage |
|
|
|
class SantaAgent: |
|
|
|
def __init__(self, system_prompt: str): |
|
self.system_prompt = system_prompt |
|
self.client = openai.OpenAI() |
|
self.tools = [ |
|
{ |
|
"type": "function", |
|
"function": { |
|
"name": "buy_item", |
|
"description": "Buy an item from the store.", |
|
"parameters": { |
|
"type": "object", |
|
"properties": { |
|
"item": { |
|
"type": "string", |
|
"description": "The item to buy from the store." |
|
} |
|
}, |
|
"required": ["item"] |
|
} |
|
} |
|
}, |
|
{ |
|
"type": "function", |
|
"function": { |
|
"name": "give_present", |
|
"description": "Give a present to a person.", |
|
"parameters": { |
|
"type": "object", |
|
"properties": { |
|
"person": { |
|
"type": "string", |
|
"description": "The person to give the present to." |
|
}, |
|
"item": { |
|
"type": "string", |
|
"description": "The item to give to the person." |
|
} |
|
}, |
|
"required": ["person", "item"] |
|
} |
|
} |
|
}, |
|
{ |
|
"type": "function", |
|
"function": { |
|
"name": "stop", |
|
"description": "Use this tool if you are finished and want to stop." |
|
} |
|
} |
|
] |
|
|
|
def buy_item(self, item: str): |
|
"""Buy an item from the store.""" |
|
return f"Bought {item} from the store." |
|
|
|
def give_present(self, person: str, item: str): |
|
"""Give a present to a person.""" |
|
return f"Gave {item} to {person}." |
|
|
|
def stop(self): |
|
return "STOP" |
|
|
|
def mock_run_santa_agent(self): |
|
messages = [ |
|
{"role": "user", "content": "Hi there"}, |
|
{"role": "assistant", "content": "Bye bye"}, |
|
] |
|
gradio_messages = [ |
|
ChatMessage(role="user", content="Hi there"), |
|
ChatMessage(role="assistant", content="Bye bye"), |
|
] |
|
return messages, gradio_messages |
|
|
|
def run_santa_agent(self, user_prompt: str): |
|
"""Run the Santa agent.""" |
|
messages = [ |
|
{"role": "system", "content": self.system_prompt}, |
|
{"role": "user", "content": user_prompt}, |
|
] |
|
gradio_messages = [ |
|
ChatMessage(role="system", content=self.system_prompt), |
|
ChatMessage(role="user", content=user_prompt), |
|
] |
|
while True: |
|
response = self.client.chat.completions.create( |
|
messages=messages, |
|
model="gpt-4o-mini", |
|
tools=self.tools, |
|
tool_choice="auto", |
|
) |
|
messages.append(response.choices[0].message.to_dict()) |
|
content = response.choices[0].message.content |
|
if content is not None: |
|
gradio_messages.append(ChatMessage(role="assistant", content=content)) |
|
tool_calls = response.choices[0].message.tool_calls |
|
|
|
should_stop = False |
|
if tool_calls: |
|
for tool_call in tool_calls: |
|
arguments = json.loads(tool_call.function.arguments) |
|
if tool_call.function.name == "buy_item": |
|
item = arguments["item"] |
|
gradio_messages.append(ChatMessage(role="assistant", content=f"buy_item({item})", metadata={"title": "π§ Tool Call: buy_item"})) |
|
output = self.buy_item(item) |
|
elif tool_call.function.name == "give_present": |
|
person, item = arguments["person"], arguments["item"] |
|
gradio_messages.append(ChatMessage(role="assistant", content=f"give_present({person}, {item})", metadata={"title": "π§ Tool Call: give_present"})) |
|
output = self.give_present(person, item) |
|
elif tool_call.function.name == "stop": |
|
output = self.stop() |
|
should_stop = True |
|
messages.append({"role": "tool", "content": output, "tool_call_id": tool_call.id}) |
|
if not should_stop: |
|
gradio_messages.append(ChatMessage(role="assistant", content=output, metadata={"title": f"π§ Tool Output: {tool_call.function.name}"})) |
|
if should_stop or len(messages) > 10: |
|
break |
|
return messages, gradio_messages |
|
|