import datetime import time import json import uuid import gradio as gr from pathlib import Path from .utils import * from .log_utils import build_logger from constants import IMAGE_DIR, EVALUATE_DIMS from model.model_registry import model_info t2s_logger = build_logger("gradio_web_server_text2shape", "gr_web_text2shape.log") # t2s = image generation, loggers for single model direct chat t2s_multi_logger = build_logger("gradio_web_server_text2shape_multi", "gr_web_text2shape_multi.log") # t2s_multi = image generation multi, loggers for side-by-side and battle i2s_logger = build_logger("gradio_web_server_image2shape", "gr_web_image2shape.log") # i2s = image editing, loggers for single model direct chat i2s_multi_logger = build_logger("gradio_web_server_image2shape_multi", "gr_web_image2shape_multi.log") # i2s_multi = image editing multi, loggers for side-by-side and battle def remove_suffix(name): if name.endswith("-t") or name.endswith("-i"): return name[:-2] else: return name def vote_last_response_t2s(state, dim, vote_type, model_selector, request: gr.Request): with open(get_conv_log_filename(), "a") as fout: data = { "tstamp": round(time.time(), 4), "dim": dim, "type": vote_type, "model": model_selector, "state": state.dict(), "ip": get_ip(request), } fout.write(json.dumps(data) + "\n") append_json_item_on_log_server(data, get_conv_log_filename()) def vote_last_response_t2s_multi(states, dim, vote_type, is_anony: bool, model_selectors, request: gr.Request): with open(get_conv_log_filename(), "a") as fout: data = { "tstamp": round(time.time(), 4), "dim": dim, "type": vote_type, "anony": is_anony, "models": [x for x in model_selectors], "states": [x.dict() for x in states], "ip": get_ip(request), } fout.write(json.dumps(data) + "\n") append_json_item_on_log_server(data, get_conv_log_filename()) # for state in states: # output_file = f'{IMAGE_DIR}/text2shape/{state.conv_id}.png' # with open(output_file, 'w') as f: # state.output.save(f, 'PNG') # save_image_file_on_log_server(output_file) def vote_last_response_i2s(state, dim, vote_type, model_selector, request: gr.Request): with open(get_conv_log_filename(), "a") as fout: data = { "tstamp": round(time.time(), 4), "dim": dim, "type": vote_type, "model": model_selector, "state": state.dict(), "ip": get_ip(request), } fout.write(json.dumps(data) + "\n") append_json_item_on_log_server(data, get_conv_log_filename()) # output_file = f'{IMAGE_DIR}/image2shape/{state.conv_id}.png' # source_file = f'{IMAGE_DIR}/image2shape/{state.conv_id}_source.png' # with open(output_file, 'w') as f: # state.output.save(f, 'PNG') # with open(source_file, 'w') as sf: # state.source_image.save(sf, 'PNG') # save_image_file_on_log_server(output_file) # save_image_file_on_log_server(source_file) def vote_last_response_i2s_multi(states, dim, vote_type, is_anony, model_selectors, request: gr.Request): with open(get_conv_log_filename(), "a") as fout: data = { "tstamp": round(time.time(), 4), "dim": dim, "type": vote_type, "anony": is_anony, "models": [x for x in model_selectors], "states": [x.dict() for x in states], "ip": get_ip(request), } fout.write(json.dumps(data) + "\n") append_json_item_on_log_server(data, get_conv_log_filename()) # for state in states: # output_file = f'{IMAGE_DIR}/image2shape/{state.conv_id}.png' # source_file = f'{IMAGE_DIR}/image2shape/{state.conv_id}_source.png' # with open(output_file, 'w') as f: # state.output.save(f, 'PNG') # with open(source_file, 'w') as sf: # state.source_image.save(sf, 'PNG') # save_image_file_on_log_server(output_file) # save_image_file_on_log_server(source_file) ## Text-to-Shape Generation (t2s) Single Model Direct Chat def upvote_last_response_t2s(state, model_selector, dim_md, request: gr.Request): ip = get_ip(request) state.evaluted_dims += 1 t2s_logger.info(f"upvote [{dim_md}]. ip: {ip}") vote_last_response_t2s(state, dim_md, "upvote", model_selector, request) return (state,) + (disable_btn,) * 3 def downvote_last_response_t2s(state, model_selector, dim_md, request: gr.Request): ip = get_ip(request) state.evaluted_dims += 1 t2s_logger.info(f"downvote [{dim_md}]. ip: {ip}") vote_last_response_t2s(state, dim_md, "downvote", model_selector, request) return (state,) + (disable_btn,) * 3 def flag_last_response_t2s(state, model_selector, dim_md, request: gr.Request): ip = get_ip(request) state.evaluted_dims += 1 t2s_logger.info(f"flag [{dim_md}]. ip: {ip}") vote_last_response_t2s(state, dim_md, "flag", model_selector, request) return (state,) + (disable_btn,) * 3 ## Text-to-Shape Generation Multi (t2s_multi) Side-by-Side and Battle def leftvote_last_response_t2s_named( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 t2s_multi_logger.info(f"leftvote [{dim_md}] (named). ip: {get_ip(request)}") vote_last_response_t2s_multi( [state0, state1], dim_md, "leftvote", False, [model_selector0, model_selector1], request ) return (state0, state1) + (disable_btn,) * 4 def rightvote_last_response_t2s_named( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 t2s_multi_logger.info(f"rightvote [{dim_md}] (named). ip: {get_ip(request)}") vote_last_response_t2s_multi( [state0, state1], dim_md, "rightvote", False, [model_selector0, model_selector1], request ) return (state0, state1) + (disable_btn,) * 4 def tievote_last_response_t2s_named( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 t2s_multi_logger.info(f"tievote [{dim_md}] (named). ip: {get_ip(request)}") vote_last_response_t2s_multi( [state0, state1], dim_md, "tievote", False, [model_selector0, model_selector1], request ) return (state0, state1) + (disable_btn,) * 4 def bothbad_vote_last_response_t2s_named( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 t2s_multi_logger.info(f"bothbad_vote [{dim_md}] (named). ip: {get_ip(request)}") vote_last_response_t2s_multi( [state0, state1], dim_md, "bothbad_vote", False, [model_selector0, model_selector1], request ) return (state0, state1) + (disable_btn,) * 4 def leftvote_last_response_t2s_anony( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 t2s_multi_logger.info(f"leftvote [{dim_md}] (anony). ip: {get_ip(request)}") vote_last_response_t2s_multi( [state0, state1], dim_md, "leftvote", True, [model_selector0, model_selector1], request ) # if state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=True), gr.Markdown(f"### Model B: {state1.model_name}", visible=True)) # return (state0, state1) + (disable_btn,) * 4 + names # else: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=False), gr.Markdown(f"### Model B: {state1.model_name}", visible=False)) # return (state0, state1) + (disable_btn,) * 4 + names is_visible = (state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS) return (state0, state1) \ + (disable_btn,) * 4 \ + (gr.Markdown(f"### Model A: {model_info[state0.model_name].simple_name}", visible=is_visible), gr.Markdown(f"### Model B: {model_info[state1.model_name].simple_name}", visible=is_visible)) def rightvote_last_response_t2s_anony( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 t2s_multi_logger.info(f"rightvote [{dim_md}] (anony). ip: {get_ip(request)}") vote_last_response_t2s_multi( [state0, state1], dim_md, "rightvote", True, [model_selector0, model_selector1], request ) # if state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=True), gr.Markdown(f"### Model B: {state1.model_name}", visible=True)) # return (state0, state1) + (disable_btn,) * 4 + names # else: # return (state0, state1) + (disable_btn,) * 4 + ("", "") is_visible = (state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS) return (state0, state1) \ + (disable_btn,) * 4 \ + (gr.Markdown(f"### Model A: {model_info[state0.model_name].simple_name}", visible=is_visible), gr.Markdown(f"### Model B: {model_info[state1.model_name].simple_name}", visible=is_visible)) def tievote_last_response_t2s_anony( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 t2s_multi_logger.info(f"tievote [{dim_md}] (anony). ip: {get_ip(request)}") vote_last_response_t2s_multi( [state0, state1], dim_md, "tievote", True, [model_selector0, model_selector1], request ) # if state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=True), gr.Markdown(f"### Model B: {state1.model_name}", visible=True)) # return (state0, state1) + (disable_btn,) * 4 + names # else: # return (state0, state1) + (disable_btn,) * 4 + ("", "") is_visible = (state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS) return (state0, state1) \ + (disable_btn,) * 4 \ + (gr.Markdown(f"### Model A: {model_info[state0.model_name].simple_name}", visible=is_visible), gr.Markdown(f"### Model B: {model_info[state1.model_name].simple_name}", visible=is_visible)) def bothbad_vote_last_response_t2s_anony( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 t2s_multi_logger.info(f"bothbad_vote [{dim_md}] (anony). ip: {get_ip(request)}") vote_last_response_t2s_multi( [state0, state1], dim_md, "bothbad_vote", True, [model_selector0, model_selector1], request ) # if state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=True), gr.Markdown(f"### Model B: {state1.model_name}", visible=True)) # return (state0, state1) + (disable_btn,) * 4 + names # else: # return (state0, state1) + (disable_btn,) * 4 + ("", "") is_visible = (state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS) return (state0, state1) \ + (disable_btn,) * 4 \ + (gr.Markdown(f"### Model A: {model_info[state0.model_name].simple_name}", visible=is_visible), gr.Markdown(f"### Model B: {model_info[state1.model_name].simple_name}", visible=is_visible)) ## Image-to-Shape (i2s) Single Model Direct Chat def upvote_last_response_i2s(state, model_selector, dim_md, request: gr.Request): ip = get_ip(request) state.evaluted_dims += 1 i2s_logger.info(f"upvote [{dim_md}]. ip: {ip}") vote_last_response_i2s(state, dim_md, "upvote", model_selector, request) return (state,) + (disable_btn,) * 3 def downvote_last_response_i2s(state, model_selector, dim_md, request: gr.Request): ip = get_ip(request) state.evaluted_dims += 1 i2s_logger.info(f"downvote [{dim_md}]. ip: {ip}") vote_last_response_i2s(state, dim_md, "downvote", model_selector, request) return (state,) + (disable_btn,) * 3 def flag_last_response_i2s(state, model_selector, dim_md, request: gr.Request): ip = get_ip(request) state.evaluted_dims += 1 i2s_logger.info(f"flag [{dim_md}]. ip: {ip}") vote_last_response_i2s(state, dim_md, "flag", model_selector, request) return (state,) + (disable_btn,) * 3 ## Image-to-Shape Multi (i2s_multi) Side-by-Side and Battle def leftvote_last_response_i2s_named( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 i2s_multi_logger.info(f"leftvote [{dim_md}] (named). ip: {get_ip(request)}") vote_last_response_i2s_multi( [state0, state1], dim_md, "leftvote", False, [model_selector0, model_selector1], request ) return (state0, state1) + (disable_btn,) * 4 def rightvote_last_response_i2s_named( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 i2s_multi_logger.info(f"rightvote [{dim_md}] (named). ip: {get_ip(request)}") vote_last_response_i2s_multi( [state0, state1], dim_md, "rightvote", False, [model_selector0, model_selector1], request ) return (state0, state1) + (disable_btn,) * 4 def tievote_last_response_i2s_named( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 i2s_multi_logger.info(f"tievote [{dim_md}] (named). ip: {get_ip(request)}") vote_last_response_i2s_multi( [state0, state1], dim_md, "tievote", False, [model_selector0, model_selector1], request ) return (state0, state1) + (disable_btn,) * 4 def bothbad_vote_last_response_i2s_named( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 i2s_multi_logger.info(f"bothbad_vote [{dim_md}] (named). ip: {get_ip(request)}") vote_last_response_i2s_multi( [state0, state1], dim_md, "bothbad_vote", False, [model_selector0, model_selector1], request ) return (state0, state1) + (disable_btn,) * 4 def leftvote_last_response_i2s_anony( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 i2s_multi_logger.info(f"leftvote [{dim_md}] (anony). ip: {get_ip(request)}") vote_last_response_i2s_multi( [state0, state1], dim_md, "leftvote", True, [model_selector0, model_selector1], request ) # if state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=True), gr.Markdown(f"### Model B: {state1.model_name}", visible=True)) # return (state0, state1) + (disable_btn,) * 4 + names # else: # return (state0, state1) + (disable_btn,) * 4 + ("", "") is_visible = (state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS) return (state0, state1) \ + (disable_btn,) * 4 \ + (gr.Markdown(f"### Model A: {model_info[state0.model_name].simple_name}", visible=is_visible), gr.Markdown(f"### Model B: {model_info[state1.model_name].simple_name}", visible=is_visible)) def rightvote_last_response_i2s_anony( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 i2s_multi_logger.info(f"rightvote [{dim_md}] (anony). ip: {get_ip(request)}") vote_last_response_i2s_multi( [state0, state1], dim_md, "rightvote", True, [model_selector0, model_selector1], request ) # if state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=True), gr.Markdown(f"### Model B: {state1.model_name}", visible=True)) # return (state0, state1) + (disable_btn,) * 4 + names # else: # return (state0, state1) + (disable_btn,) * 4 + ("", "") is_visible = (state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS) return (state0, state1) \ + (disable_btn,) * 4 \ + (gr.Markdown(f"### Model A: {model_info[state0.model_name].simple_name}", visible=is_visible), gr.Markdown(f"### Model B: {model_info[state1.model_name].simple_name}", visible=is_visible)) def tievote_last_response_i2s_anony( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 i2s_multi_logger.info(f"tievote [{dim_md}] (anony). ip: {get_ip(request)}") vote_last_response_i2s_multi( [state0, state1], dim_md, "tievote", True, [model_selector0, model_selector1], request ) # if state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=True), gr.Markdown(f"### Model B: {state1.model_name}", visible=True)) # return (state0, state1) + (disable_btn,) * 4 + names # else: # return (state0, state1) + (disable_btn,) * 4 + ("", "") is_visible = (state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS) return (state0, state1) \ + (disable_btn,) * 4 \ + (gr.Markdown(f"### Model A: {model_info[state0.model_name].simple_name}", visible=is_visible), gr.Markdown(f"### Model B: {model_info[state1.model_name].simple_name}", visible=is_visible)) def bothbad_vote_last_response_i2s_anony( state0, state1, model_selector0, model_selector1, dim_md, request: gr.Request ): state0.evaluted_dims += 1 state1.evaluted_dims += 1 i2s_multi_logger.info(f"bothbad_vote [{dim_md}] (anony). ip: {get_ip(request)}") vote_last_response_i2s_multi( [state0, state1], dim_md, "bothbad_vote", True, [model_selector0, model_selector1], request ) # if state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS: # names = (gr.Markdown(f"### Model A: {state0.model_name}", visible=True), gr.Markdown(f"### Model B: {state1.model_name}", visible=True)) # return (state0, state1) + (disable_btn,) * 4 + names # else: # return (state0, state1) + (disable_btn,) * 4 + ("", "") is_visible = (state0.evaluted_dims == state1.evaluted_dims == EVALUATE_DIMS) return (state0, state1) \ + (disable_btn,) * 4 \ + (gr.Markdown(f"### Model A: {model_info[state0.model_name].simple_name}", visible=is_visible), gr.Markdown(f"### Model B: {model_info[state1.model_name].simple_name}", visible=is_visible)) share_js = """ function (a, b, c, d) { const captureElement = document.querySelector('#share-region-named'); html2canvas(captureElement) .then(canvas => { canvas.style.display = 'none' document.body.appendChild(canvas) return canvas }) .then(canvas => { const image = canvas.toDataURL('image/png') const a = document.createElement('a') a.setAttribute('download', 'chatbot-arena.png') a.setAttribute('href', image) a.click() canvas.remove() }); return [a, b, c, d]; } """ def share_click_t2s_multi(state0, state1, model_selector0, model_selector1, request: gr.Request): t2s_multi_logger.info(f"share (anony). ip: {get_ip(request)}") if state0 is not None and state1 is not None: vote_last_response_t2s_multi( [state0, state1], "", "share", True, [model_selector0, model_selector1], request ) def share_click_i2s_multi(state0, state1, model_selector0, model_selector1, request: gr.Request): i2s_multi_logger.info(f"share (anony). ip: {get_ip(request)}") if state0 is not None and state1 is not None: vote_last_response_i2s_multi( [state0, state1], "", "share", True, [model_selector0, model_selector1], request )