Spaces:
Running
Running
File size: 8,167 Bytes
aa0eed8 bf9cd7f 92fb7b8 031211a 8279036 aa0eed8 99c5eee 8279036 99c5eee 8279036 99c5eee 8279036 99c5eee 8279036 99c5eee 8279036 99c5eee 8279036 99c5eee 8279036 99c5eee 8279036 99c5eee 8279036 99c5eee 8279036 99c5eee 348cc85 5295650 29455b5 53ed856 39bf620 53ed856 aaf4e3a 39bf620 aaf4e3a 881c209 39bf620 881c209 53ed856 453ee12 53ed856 9ea93d2 453ee12 d06678c 39bf620 453ee12 51c03d5 8f66d0d 51c03d5 cee6a57 39bf620 cee6a57 12c2b66 24755bb 38dfd80 24755bb 3017744 d42fd6b df144ba 7fd13ba 348cc85 53ed856 348cc85 53ed856 cee6a57 881c209 53ed856 51c03d5 a030fa6 377c496 24755bb 12c2b66 805ff2f 19797f3 8186c74 431abc0 c097c3c 39bf620 19797f3 8fae4d3 19797f3 c097c3c d42fd6b |
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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 |
import gradio as gr
import openai, os, time
from openai import OpenAI
from utils import function_to_schema, show_json
###
MODEL = "gpt-4o-mini"
current_agent, current_thread = None, None
def create_triage_agent(client):
return client.beta.assistants.create(
name="Triage Agent",
instructions=(
"You are a customer service bot for ACME Inc. "
"Introduce yourself. Always be very brief. "
"Gather information to direct the customer to the right department. "
"But make your questions subtle and natural."
),
model=MODEL,
tools=[{"type": "function", "function": function_to_schema(transfer_to_sales_agent)},
{"type": "function", "function": function_to_schema(transfer_to_issues_repairs_agent)},
{"type": "function", "function": function_to_schema(escalate_to_human)}],
)
def create_sales_agent(client):
return client.beta.assistants.create(
name="Sales Agent",
instructions=(
"You are a sales agent for ACME Inc."
"Always answer in a sentence or less."
"Follow the following routine with the user:"
"1. Ask them about any problems in their life related to catching roadrunners.\n"
"2. Casually mention one of ACME's crazy made-up products can help.\n"
" - Don't mention price.\n"
"3. Once the user is bought in, drop a ridiculous price.\n"
"4. Only after everything, and if the user says yes, "
"tell them a crazy caveat and execute their order.\n"
""
),
model=MODEL,
tools=[{"type": "function", "function": function_to_schema(execute_order)},
{"type": "function", "function": function_to_schema(transfer_to_triage_agent)}],
)
def create_issues_repairs_agent(client):
return client.beta.assistants.create(
name="Issues and Repairs Agent",
instructions=(
"You are a customer support agent for ACME Inc."
"Always answer in a sentence or less."
"Follow the following routine with the user:"
"1. First, ask probing questions and understand the user's problem deeper.\n"
" - unless the user has already provided a reason.\n"
"2. Propose a fix (make one up).\n"
"3. ONLY if not satesfied, offer a refund.\n"
"4. If accepted, search for the ID and then execute refund."
""
),
model=MODEL,
tools=[{"type": "function", "function": function_to_schema(look_up_item)},
{"type": "function", "function": function_to_schema(execute_refund)},
{"type": "function", "function": function_to_schema(transfer_to_triage_agent)}],
)
def set_current_agent(agent):
current_agent = agent
def set_current_thread(thread):
current_thread = thread
def get_current_agent():
return current_agent
def get_current_thread():
return current_thread
_client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
#_assistant, _thread = None, None
###
triage_agent = create_triage_agent(_client)
sales_agent = create_sales_agent(_client)
issues_repairs_agent = create_issues_repairs_agent(_client)
set_current_agent(triage_agent)
triage_thread = create_thread(_client)
sales_thread = create_thread(_client)
issues_repairs_thread = create_thread(_client)
set_current_thread(triage_thread)
#
def transfer_to_sales_agent():
"""Use for anything sales or buying related."""
set_current_agent(sales_agent)
def transfer_to_issues_repairs_agent():
"""Use for issues, repairs, or refunds."""
set_current_agent(issues_repairs_agent)
def transfer_to_triage_agent():
"""Call this if the user brings up a topic outside of your purview,
including escalating to human."""
set_current_agent(triage_agent)
#
def escalate_to_human(summary):
"""Only call this if explicitly asked to."""
print("Escalating to human agent...")
print("\n=== Escalation Report ===")
print(f"Summary: {summary}")
print("=========================\n")
exit()
#
def execute_order(product, price: int):
"""Price should be in USD."""
print("\n\n=== Order Summary ===")
print(f"Product: {product}")
print(f"Price: ${price}")
print("=================\n")
confirm = input("Confirm order? y/n: ").strip().lower()
if confirm == "y":
print("Order execution successful!")
return "Success"
else:
print(color("Order cancelled!", "red"))
return "User cancelled order."
def execute_refund(item_id, reason="not provided"):
print("\n\n=== Refund Summary ===")
print(f"Item ID: {item_id}")
print(f"Reason: {reason}")
print("=================\n")
print("Refund execution successful!")
return "Success"
def look_up_item(search_query):
"""Use to find item ID.
Search query can be a description or keywords."""
item_id = "item_132612938"
print("Found item:", item_id)
return item_id
###
#def create_assistant(client):
# assistant = client.beta.assistants.create(
# name="Math Tutor",
# instructions="You are a personal math tutor. Answer questions briefly, in a sentence or less.",
# model="gpt-4-1106-preview",
# tools=[{"type": "code_interpreter"}],
# )
# show_json("assistant", assistant)
# return assistant
def create_thread(client):
thread = client.beta.threads.create()
#show_json("thread", thread)
return thread
def create_message(client, thread, msg):
message = client.beta.threads.messages.create(
role="user",
thread_id=thread.id,
content=msg,
)
#show_json("message", message)
return message
def create_run(client, assistant, thread):
run = client.beta.threads.runs.create(
assistant_id=assistant.id,
thread_id=thread.id,
)
#show_json("run", run)
return run
def wait_on_run(client, thread, run):
while run.status == "queued" or run.status == "in_progress":
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id,
)
time.sleep(0.25)
#show_json("run", run)
return run
def list_run_steps(client, thread, run):
run_steps = client.beta.threads.runs.steps.list(
thread_id=thread.id,
run_id=run.id,
order="asc",
)
for step in run_steps.data:
step_details = step.step_details
show_json("step_details", step_details)
return run_steps
def list_messages(client, thread):
messages = client.beta.threads.messages.list(
thread_id=thread.id
)
#show_json("messages", messages)
return messages
def extract_content_values(data):
content_values = []
for item in data.data:
for content in item.content:
if content.type == 'text':
content_values.append(content.text.value)
return content_values
def chat(message, history, openai_api_key):
global _client, _assistant, _thread
#if _assistant == None:
# _assistant = create_assistant(_client)
#if _thread == None:
# _thread = create_thread(_client)
create_message(_client, _thread, message)
# async
run = create_run(_client, _assistant, _thread)
run = wait_on_run(_client, _thread, run)
list_run_steps(_client, _thread, run)
messages = list_messages(_client, _thread)
return extract_content_values(messages)[0]
gr.ChatInterface(
chat,
chatbot=gr.Chatbot(height=300),
textbox=gr.Textbox(placeholder="Question", container=False, scale=7),
title="Multi-Agent Orchestration",
description="Demo using hand-off pattern: triage agent, sales agent, and issues & repairs agent",
retry_btn=None,
undo_btn=None,
clear_btn="Clear",
#examples=[["Generate the first 10 Fibbonaci numbers with code.", "sk-<BringYourOwn>"]],
#cache_examples=False,
additional_inputs=[
gr.Textbox("sk-", label="OpenAI API Key", type = "password"),
],
).launch() |