Spaces:
Running
Running
| import json | |
| import gradio as gr | |
| from pingpong import PingPong | |
| from pingpong.gradio import GradioAlpacaChatPPManager | |
| STYLE = """ | |
| .custom-btn { | |
| border: none !important; | |
| background: none !important; | |
| box-shadow: none !important; | |
| display: block !important; | |
| text-align: left !important; | |
| } | |
| .custom-btn:hover { | |
| background: rgb(243 244 246) !important; | |
| } | |
| .custom-btn-highlight { | |
| border: none !important; | |
| background: rgb(243 244 246) !important; | |
| box-shadow: none !important; | |
| display: block !important; | |
| text-align: left !important; | |
| } | |
| #prompt-txt > label > span { | |
| display: none !important; | |
| } | |
| #prompt-txt > label > textarea { | |
| border: transparent; | |
| box-shadow: none; | |
| } | |
| #chatbot { | |
| height: 800px; | |
| overflow: auto; | |
| box-shadow: none !important; | |
| border: none !important; | |
| } | |
| #chatbot > .wrap { | |
| max-height: 780px; | |
| } | |
| #chatbot + div { | |
| border-radius: 35px; | |
| width: 80% !important; | |
| margin: auto !important; | |
| } | |
| #left-pane { | |
| background-color: #f9fafb; | |
| border-radius: 15px; | |
| padding: 10px; | |
| } | |
| #left-top { | |
| padding-left: 10px; | |
| padding-right: 10px; | |
| text-align: center; | |
| font-weight: bold; | |
| font-size: large; | |
| } | |
| #chat-history-accordion { | |
| background: transparent; | |
| border: 0.8px !important; | |
| } | |
| #right-pane { | |
| margin-left: 20px; | |
| margin-right: 70px; | |
| } | |
| #initial-popup { | |
| z-index: 100; | |
| position: absolute; | |
| width: 50%; | |
| top: 50%; | |
| height: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| border-radius: 35px; | |
| padding: 15px; | |
| } | |
| #initial-popup-title { | |
| text-align: center; | |
| font-size: 18px; | |
| font-weight: bold; | |
| } | |
| #initial-popup-left-pane { | |
| min-width: 150px !important; | |
| } | |
| #initial-popup-right-pane { | |
| text-align: right; | |
| } | |
| .example-btn { | |
| padding-top: 20px !important; | |
| padding-bottom: 20px !important; | |
| padding-left: 5px !important; | |
| padding-right: 5px !important; | |
| background: linear-gradient(to bottom right, #f7faff, #ffffff) !important; | |
| box-shadow: none !important; | |
| border-radius: 20px !important; | |
| } | |
| .example-btn:hover { | |
| box-shadow: 0.3px 0.3px 0.3px gray !important | |
| } | |
| #example-title { | |
| margin-bottom: 15px; | |
| } | |
| """ | |
| get_local_storage = """ | |
| function() { | |
| globalThis.setStorage = (key, value)=>{ | |
| localStorage.setItem(key, JSON.stringify(value)); | |
| } | |
| globalThis.getStorage = (key, value)=>{ | |
| return JSON.parse(localStorage.getItem(key)); | |
| } | |
| var local_data = getStorage('local_data'); | |
| var history = []; | |
| if(local_data) { | |
| local_data[0].pingpongs.forEach(element =>{ | |
| history.push([element.ping, element.pong]); | |
| }); | |
| } | |
| else { | |
| local_data = []; | |
| for (let step = 0; step < 10; step++) { | |
| local_data.push({'ctx': '', 'pingpongs':[]}); | |
| } | |
| setStorage('local_data', local_data); | |
| } | |
| if(history.length == 0) { | |
| document.querySelector("#initial-popup").classList.remove('hide'); | |
| } | |
| return [history, local_data]; | |
| } | |
| """ | |
| update_left_btns_state = """ | |
| (v)=>{ | |
| document.querySelector('.custom-btn-highlight').classList.add('custom-btn'); | |
| document.querySelector('.custom-btn-highlight').classList.remove('custom-btn-highlight'); | |
| const elements = document.querySelectorAll(".custom-btn"); | |
| for(var i=0; i < elements.length; i++) { | |
| const element = elements[i]; | |
| if(element.textContent == v) { | |
| console.log(v); | |
| element.classList.add('custom-btn-highlight'); | |
| element.classList.remove('custom-btn'); | |
| break; | |
| } | |
| } | |
| }""" | |
| def add_pingpong(idx, ld, ping): | |
| res = [ | |
| GradioAlpacaChatPPManager.from_json(json.dumps(ppm)) | |
| for ppm in ld | |
| ] | |
| ppm = res[idx] | |
| ppm.add_pingpong(PingPong(ping, "dang!!!!!!!")) | |
| return "", ppm.build_uis(), str(res) | |
| def channel_num(btn_title): | |
| choice = 0 | |
| if btn_title == "1st Channel": | |
| choice = 0 | |
| elif btn_title == "2nd Channel": | |
| choice = 1 | |
| elif btn_title == "3rd Channel": | |
| choice = 2 | |
| elif btn_title == "4th Channel": | |
| choice = 3 | |
| elif btn_title == "5th Channel": | |
| choice = 4 | |
| elif btn_title == "6th Channel": | |
| choice = 5 | |
| elif btn_title == "7th Channel": | |
| choice = 6 | |
| elif btn_title == "8th Channel": | |
| choice = 7 | |
| elif btn_title == "9th Channel": | |
| choice = 8 | |
| elif btn_title == "10th Channel": | |
| choice = 9 | |
| return choice | |
| def set_chatbot(btn, ld): | |
| choice = channel_num(btn) | |
| res = [ | |
| GradioAlpacaChatPPManager.from_json(json.dumps(ppm_str)) | |
| for ppm_str in ld | |
| ] | |
| empty = len(res[choice].pingpongs) == 0 | |
| return ( | |
| res[choice].build_uis(), | |
| choice, | |
| gr.update(visible=empty) | |
| ) | |
| def set_example(btn): | |
| return btn, gr.update(visible=False) | |
| def set_popup_visibility(ld, example_block): | |
| print(ld) | |
| return example_block | |
| with gr.Blocks(css=STYLE, elem_id='container-col') as block: | |
| idx = gr.State(0) | |
| local_data = gr.JSON({},visible=False) | |
| with gr.Row(): | |
| with gr.Column(scale=1, min_width=180): | |
| gr.Markdown("GradioChat", elem_id="left-top") | |
| with gr.Column(elem_id="left-pane"): | |
| with gr.Accordion("Histories", elem_id="chat-history-accordion"): | |
| first = gr.Button("1st Channel", elem_classes=["custom-btn-highlight"]) | |
| second = gr.Button("2nd Channel", elem_classes=["custom-btn"]) | |
| third = gr.Button("3rd Channel", elem_classes=["custom-btn"]) | |
| fourth = gr.Button("4th Channel", elem_classes=["custom-btn"]) | |
| fifth = gr.Button("5th Channel", elem_classes=["custom-btn"]) | |
| sixth = gr.Button("6th Channel", elem_classes=["custom-btn"]) | |
| seventh = gr.Button("7th Channel", elem_classes=["custom-btn"]) | |
| eighth = gr.Button("8th Channel", elem_classes=["custom-btn"]) | |
| nineth = gr.Button("9th Channel", elem_classes=["custom-btn"]) | |
| tenth = gr.Button("10th Channel", elem_classes=["custom-btn"]) | |
| with gr.Column(scale=8, elem_id="right-pane"): | |
| with gr.Column(elem_id="initial-popup", visible=False) as example_block: | |
| with gr.Row(scale=1): | |
| with gr.Column(elem_id="initial-popup-left-pane"): | |
| gr.Markdown("GradioChat", elem_id="initial-popup-title") | |
| gr.Markdown("Making the community's best AI chat models available to everyone.") | |
| with gr.Column(elem_id="initial-popup-right-pane"): | |
| gr.Markdown("Chat UI is now open sourced on Hugging Face Hub") | |
| gr.Markdown("check out the [↗ repository](https://huggingface.co/spaces/chansung/test-multi-conv)") | |
| with gr.Column(scale=1): | |
| gr.Markdown("Examples") | |
| with gr.Row(): | |
| ex_btn1 = gr.Button("hello world", elem_classes=["example-btn"]) | |
| ex_btn2 = gr.Button("what's up?", elem_classes=["example-btn"]) | |
| ex_btn3 = gr.Button("this is GradioChat", elem_classes=["example-btn"]) | |
| chatbot = gr.Chatbot(elem_id='chatbot') | |
| instruction_txtbox = gr.Textbox( | |
| placeholder="Ask anything", label="", | |
| elem_id="prompt-txt" | |
| ) | |
| btns = [ | |
| first, second, third, fourth, fifth, | |
| sixth, seventh, eighth, nineth, tenth | |
| ] | |
| for btn in btns: | |
| btn.click( | |
| set_chatbot, | |
| [btn, local_data], | |
| [chatbot, idx, example_block] | |
| ).then( | |
| None, btn, None, | |
| _js=update_left_btns_state | |
| ) | |
| ex_btns = [ex_btn1, ex_btn2, ex_btn3] | |
| for btn in ex_btns: | |
| btn.click( | |
| set_example, | |
| [btn], | |
| [instruction_txtbox, example_block] | |
| ) | |
| instruction_txtbox.submit( | |
| lambda: gr.update(visible=False), | |
| None, | |
| example_block | |
| ).then( | |
| add_pingpong, | |
| [idx, local_data, instruction_txtbox], | |
| [instruction_txtbox, chatbot, local_data] | |
| ).then( | |
| None, local_data, None, | |
| _js="(v)=>{ setStorage('local_data',v) }" | |
| ) | |
| block.load( | |
| None, | |
| inputs=None, | |
| outputs=[chatbot, local_data], | |
| _js=get_local_storage, | |
| ) | |
| block.queue().launch(debug=True) |