jiangjiechen's picture
update description
fb1f434
import os
import gradio as gr
from app_modules.presets import *
from app_modules.overwrites import *
from app_modules.utils import *
from src.item_base import create_items
from src.bidder_base import Bidder
from src.human_bidder import HumanBidder
from src.auctioneer_base import Auctioneer
from auction_workflow import run_auction, make_auction_hash
from utils import chunks, reset_state_list
BIDDER_NUM = 4
items = create_items('data/items_demo.jsonl')
def auction_loop_app(*args):
global items
bidder_list = args[0] # gr.State() -> session state
items_id = args[1]
os.environ['OPENAI_API_KEY'] = args[2] if args[2] != '' else os.environ.get('OPENAI_API_KEY', '')
os.environ['ANTHROPIC_API_KEY'] = args[3] if args[3] != '' else os.environ.get('ANTHROPIC_API_KEY', '')
thread_num = args[4]
item_shuffle = args[5]
enable_discount = args[6]
min_markup_pct = args[7]
args = args[8:]
auction_hash = make_auction_hash()
items_to_bid = [items[i] for i in items_id]
auctioneer = Auctioneer(enable_discount=enable_discount, min_markup_pct=min_markup_pct)
auctioneer.init_items(items_to_bid)
if item_shuffle:
auctioneer.shuffle_items()
# must correspond to the order in app's parameters
input_keys = [
'chatbot',
'model_name',
'desire',
'plan_strategy',
'budget',
'correct_belief',
'enable_learning',
'temperature',
'overestimate_percent',
]
# convert flatten list into a json list
input_jsl = []
for i, chunk in enumerate(chunks(args, len(input_keys))):
js = {'name': f"Bidder {i+1}", 'auction_hash': auction_hash}
for k, v in zip(input_keys, chunk):
js[k] = v
input_jsl.append(js)
for js in input_jsl:
js.pop('chatbot')
if 'human' in js['model_name']:
bidder_list.append(HumanBidder.create(**js))
else:
bidder_list.append(Bidder.create(**js))
yield from run_auction(auction_hash, auctioneer, bidder_list, thread_num, yield_for_demo=True)
with open("assets/custom.css", "r", encoding="utf-8") as f:
customCSS = f.read()
with gr.Blocks(css=customCSS, theme=small_and_beautiful_theme) as demo:
with gr.Row():
gr.HTML(title)
# gr.Markdown(description_top)
with gr.Row():
with gr.Column(scale=6):
# item_file = gr.File(label="Upload Item File", file_types=[".jsonl"])
items_checkbox = gr.CheckboxGroup(
choices=[item.info() for item in items[:20]],
label="Items in Auction",
info="Select the items you want to include in the auction.",
value=[item.info() for item in items[:8]],
type="index",
)
with gr.Column(scale=4):
with gr.Row():
openai_key = gr.Textbox(label="OpenAI API Key", value="", type="password", placeholder="sk-..")
anthropic_key = gr.Textbox(label="Anthropic API Key", value="", type="password", placeholder="sk-ant-..")
with gr.Row():
with gr.Row():
item_shuffle = gr.Checkbox(
label="Shuffle Items",
value=False,
info='Shuffle the order of items in the auction.')
enable_discount = gr.Checkbox(
label="Enable Discount",
value=False,
info='When an item fails to sell at auction, it can be auctioned again at a reduced price.')
with gr.Column():
min_markup_pct = gr.Slider(
minimum=0.1,
maximum=0.5,
value=0.1,
step=0.1,
interactive=True,
label='Min Increase',
info="The minimum percentage to increase a bid.",
)
thread_num = gr.Slider(
minimum=1,
maximum=BIDDER_NUM,
value=min(5, BIDDER_NUM),
step=1,
interactive=True,
label='Thread Number',
info="More threads, faster bidding, but will run into RateLimitError quicker."
)
with gr.Row():
bidder_info_gr = []
chatbots = []
monitors = []
textbox_list = []
for i in range(BIDDER_NUM):
with gr.Tab(label=f"Bidder {i+1}"):
with gr.Row().style(equal_height=True):
with gr.Column(scale=6):
with gr.Row():
chatbot = gr.Chatbot(elem_id="chuanhu_chatbot", height=600, label='Auction Log')
input_box = gr.Textbox(label="Human Bidder Input", interactive=False, placeholder="Please wait a moment before engaging in the auction.", visible=False)
chatbots.append(chatbot)
textbox_list.append(input_box)
with gr.Column(scale=4):
with gr.Tab(label=f'Parameters'):
model_name = gr.Dropdown(
choices=[
'rule',
'human',
'gpt-3.5-turbo-0613',
'gpt-3.5-turbo-16k-0613',
'gpt-4-0613',
# 'claude-instant-1.1',
'claude-instant-1.2',
# 'claude-1.3',
'claude-2.0',
# 'chat-bison-001',
],
value='gpt-3.5-turbo-16k-0613',
label="Model Selection",
)
budget = gr.Number(
value=10000,
label='Budget ($)'
)
with gr.Row():
plan_strategy = gr.Dropdown(
choices=[
'none',
'static',
'adaptive',
],
value='adaptive',
label='Planning Strategy',
info='None: no plan. Static: plan only once. Adaptive: replan for the remaining items.'
)
desire = gr.Dropdown(
choices=[
# 'default',
'maximize_profit',
'maximize_items',
# 'specific_items',
],
value='maximize_profit',
label='Desire',
info='Default desires: spending all the budget, stay within budget. All desires include the default one.',
)
overestimate_percent = gr.Slider(
minimum=-100,
maximum=100,
value=10,
step=10,
interactive=True,
label='Overestimate Percent (%)',
info="Overestimate the true value of items by this percentage.",
)
with gr.Row():
correct_belief = gr.Checkbox(
label='Correct Wrong Beliefs',
value=True,
info='Forceful beliefs correction about self and others.',
)
enable_learning = gr.Checkbox(
label='Enable Learning',
value=False,
info='Learn from past auctions for future guidance. Only for adaptive bidder.',
visible=False
)
temperature = gr.Slider(
minimum=0.,
maximum=2.0,
value=0.7,
step=0.1,
interactive=True,
label="Temperature",
)
# deprecated
# special_items = gr.CheckboxGroup(
# value = [],
# label='Special Items',
# info='Special items add 20% value for you personally.',
# visible=False,
# )
# hedge_percent = gr.Slider(
# minimum=0,
# maximum=100,
# value=90,
# step=1,
# interactive=True,
# label='Strategy (Hedging %)',
# info="The maximum percentage of the estimated value to bid on an item.",
# visible=False
# )
with gr.Tab(label='Monitors'):
with gr.Row():
budget_monitor = gr.Number(label='Budget Left ($)', interactive=False)
profit_monitor = gr.Number(label='Profit ($)', interactive=False)
with gr.Row():
engagement_monitor = gr.Number(
label='Engagement',
interactive=False,
info='The number of times the bidder has bid.'
)
failure_monitor = gr.Number(
label='Failed Bids',
info='Out-of-budget, or less than the previous highest bid.',
interactive=False
)
items_own_monitor = gr.DataFrame(
label='Items Owned',
headers=['Item', 'Bid ($)', 'Value ($)'],
datatype=['str', 'number', 'number'],
interactive=False,
)
with gr.Row():
tokens_monitor = gr.Number(
label='Token Used',
interactive=False,
info='Tokens used in the last call.'
)
money_monitor = gr.Number(
label='API Cost ($)',
info='Only OpenAI cost for now.',
interactive=False
)
plan_change_monitor = gr.DataFrame(
label='Plan Changes',
headers=['Round', 'Changed', 'New Plan'],
datatype=['str', 'bool', 'str'],
interactive=False,
)
plot_monitor = gr.Plot(
label='Budget-Profit Plot',
interactive=False
)
with gr.Tab(label='Belief Errors'):
with gr.Row():
self_belief_error_cnt_monitor = gr.Number(
label='Wrong Beliefs of Self',
info='Not knowing its own budget, bid items, or won items.',
interactive=False,
)
other_belief_error_cnt_monitor = gr.Number(
label='Wrong Beliefs of Others',
info='Not knowing other bidders\' profits.',
interactive=False,
)
budget_belief_monitor = gr.DataFrame(
label='Wrong Belief of Budget ($)',
headers=['Round', 'Belief', 'Truth'],
datatype=['str', 'number', 'number'],
interactive=False,
)
profit_belief_monitor = gr.DataFrame(
label='Wrong Belief of Profit ($)',
headers=['Bidder (Round)', 'Belief', 'Truth'],
datatype=['str', 'number', 'number'],
interactive=False,
)
win_bid_belief_monitor = gr.DataFrame(
label='Wrong Belief of Items Won',
headers=['Bidder (Round)',
'Belief', 'Truth'],
datatype=['str', 'str', 'str'],
interactive=False,
)
monitors += [
budget_monitor,
profit_monitor,
items_own_monitor,
tokens_monitor,
money_monitor,
failure_monitor,
self_belief_error_cnt_monitor,
other_belief_error_cnt_monitor,
engagement_monitor,
plot_monitor,
plan_change_monitor,
budget_belief_monitor,
profit_belief_monitor,
win_bid_belief_monitor,
]
bidder_info_gr += [
chatbot,
model_name,
desire,
plan_strategy,
budget,
correct_belief,
enable_learning,
temperature,
overestimate_percent,
]
with gr.Row():
with gr.Column():
startBtn = gr.Button('Start Bidding', variant='primary', interactive=True)
with gr.Column():
clearBtn = gr.Button('New Auction', variant='secondary', interactive=False)
btn_list = [startBtn, clearBtn]
with gr.Accordion(label='Bidding Log (click to open)', open=True):
with gr.Row():
bidding_log = gr.Markdown(value="")
gr.Markdown(description)
bidder_list_state = gr.State([]) # session state
start_args = dict(
fn=auction_loop_app,
inputs=[bidder_list_state, items_checkbox, openai_key, anthropic_key, thread_num, item_shuffle, enable_discount, min_markup_pct] + bidder_info_gr,
outputs=[bidder_list_state] + chatbots + monitors + [bidding_log] + btn_list + textbox_list, # TODO: handle textbox_list interactivity
show_progress=True,
)
start_event = startBtn.click(**start_args)
def bot(user_message, bidder_list, id):
if len(bidder_list) > 0:
bidder = bidder_list[int(id)]
if bidder.need_input:
bidder.input_box = user_message
bidder.semaphore += 1
return '', bidder_list
# handle user input from time to time
for i in range(len(textbox_list)):
_dummy_id = gr.Number(i, visible=False, interactive=False)
textbox_list[i].submit(
bot,
[textbox_list[i], bidder_list_state, _dummy_id],
[textbox_list[i], bidder_list_state])
clearBtn.click(reset_state_list,
inputs=[bidder_list_state] + chatbots + monitors + [bidding_log],
outputs=[bidder_list_state] + chatbots + monitors + [bidding_log],
show_progress=True).then(lambda: gr.update(interactive=True), outputs=[startBtn])
demo.title = 'Auction Arena'
demo.queue(max_size=64, concurrency_count=16).launch(
# server_name='0.0.0.0',
# ssl_verify=False,
# share=True,
# debug=True,
show_api=False,
)
demo.close()