import os import gradio as gr import requests PORT = 7860 API_BASE_URL = f"http://localhost:{PORT}" # Function: Get nurse response def get_nurse_response(user_input, model_name, chat_history): try: start_time = time.time() # Send user input to the API response = requests.post( f"{API_BASE_URL}/nurse_response", json={"user_input": user_input, "model_name": model_name}, timeout=15 ) response.raise_for_status() end_time = time.time() elapsed_time = end_time - start_time nurse_response = response.json().get("nurse_response", "No response received.") # Append user and nurse messages to the chat history chat_history.append((f"👤 {user_input}", f"🤖 {nurse_response} ({elapsed_time:.2f} s.)")) return chat_history, "" # Clear the user input after sending except requests.exceptions.RequestException as e: chat_history.append(("⚠️ Error", str(e))) return chat_history, "" # Function: Reset chat history def reset_history(): response = requests.post(f"{API_BASE_URL}/reset") return [], "", response.text # Function: View chat history def view_chat_history(): try: response = requests.get(f"{API_BASE_URL}/history") response.raise_for_status() chat_history = response.json().get("chat_history", []) if not chat_history: return "No chat history available." # Properly format chat history for display formatted_history = [] for message in chat_history: if message.get("role") == "user": formatted_history.append(f"👤 User: {message.get('content', '')}") elif message.get("role") == "assistant": formatted_history.append(f"🤖 Nurse: {message.get('content', '')}") return "\n".join(formatted_history) except requests.exceptions.RequestException as e: return f"Error: {str(e)}" import json import time # Function: View EHR details def view_ehr_details(view): try: time.sleep(2.5) response = requests.get(f"{API_BASE_URL}/details") response.raise_for_status() ehr_data = response.json() if view == "details": ehr_data = ehr_data["ehr_data"] elif view == "prompt": ehr_data.pop("ehr_data", None) ehr_data = json.dumps(ehr_data, indent=4, ensure_ascii=False) return ehr_data except requests.exceptions.RequestException as e: return f"Error: {str(e)}" # -------------------------------------------------------------------------------------------- def call_botnoi_tts(text, speaker, volume, speed): url = f"{API_BASE_URL}/tts/generate_voice_botnoi/" payload = { "text": text, "speaker": speaker, "volume": volume, "speed": speed, "token": os.getenv("BOTNOI_API_TOKEN") } response = requests.post(url, json=payload) if response.status_code == 200: return response.content, "output.mp3" else: return f"Error: {response.status_code} - {response.json().get('detail', 'Unknown error')}", None # Helper function to call VAJA9 API def call_vaja9_tts(text, speaker, phrase_break, audiovisual): url = f"{API_BASE_URL}/tts/generate_voice_vaja9/" payload = { "text": text, "speaker": speaker, "phrase_break": phrase_break, "audiovisual": audiovisual } response = requests.post(url, json=payload) if response.status_code == 200: return response.content, "output.wav" else: return f"Error: {response.status_code} - {response.json().get('detail', 'Unknown error')}", None # -------------------------------------------------------------------------------------------- def gradio_tts_interface(): with gr.Tabs() as tabs: # Tab for Botnoi TTS API with gr.TabItem("Botnoi TTS"): gr.Markdown("### Generate Voice with Botnoi API") botnoi_text = gr.Textbox(label="Text", placeholder="Enter text to synthesize") botnoi_speaker = gr.Textbox(label="Speaker ID", value="52", placeholder="Default: 52") botnoi_volume = gr.Slider(label="Volume", minimum=0, maximum=100, value=100) botnoi_speed = gr.Slider(label="Speed", minimum=0.5, maximum=2.0, step=0.1, value=1.0) botnoi_generate = gr.Button("Generate Audio") botnoi_output = gr.Audio(label="Generated Audio") botnoi_error = gr.Textbox(label="Error", interactive=False, visible=False) def generate_botnoi_voice(text, speaker, volume, speed): result, file_name = call_botnoi_tts(text, speaker, volume, speed) if file_name: return gr.update(value=result), "" else: return None, result botnoi_generate.click(generate_botnoi_voice, inputs=[botnoi_text, botnoi_speaker, botnoi_volume, botnoi_speed], outputs=[botnoi_output, botnoi_error]) # Tab for VAJA9 TTS API with gr.TabItem("VAJA9 TTS"): gr.Markdown("### Generate Voice with VAJA9 API") vaja9_text = gr.Textbox(label="Text", placeholder="Enter text to synthesize") vaja9_speaker = gr.Radio(label="Speaker", choices=["0 - Male", "1 - Female", "2 - Boy", "3 - Girl"], value="1 - Female") vaja9_phrase_break = gr.Radio(label="Phrase Break", choices=["0 - Auto", "1 - None"], value="0 - Auto") vaja9_audiovisual = gr.Radio(label="Audiovisual", choices=["0 - Audio", "1 - Audio + Visual"], value="0 - Audio") vaja9_generate = gr.Button("Generate Audio") vaja9_output = gr.Audio(label="Generated Audio") vaja9_error = gr.Textbox(label="Error", interactive=False, visible=False) def generate_vaja9_voice(text, speaker, phrase_break, audiovisual): speaker_id = int(speaker.split(" - ")[0]) phrase_break_id = int(phrase_break.split(" - ")[0]) audiovisual_id = int(audiovisual.split(" - ")[0]) result, file_name = call_vaja9_tts(text, speaker_id, phrase_break_id, audiovisual_id) if file_name: return gr.update(value=result), "" else: return None, result vaja9_generate.click(generate_vaja9_voice, inputs=[vaja9_text, vaja9_speaker, vaja9_phrase_break, vaja9_audiovisual], outputs=[vaja9_output, vaja9_error]) return tabs # -------------------------------------------------------------------------------------------- # Chatbot Interface def create_gradio_interface(): with gr.Blocks() as interface: # Title and description gr.Markdown( """ # MALI_NURSE Gradio Interface ### A User-Friendly Interface to Interact with the MALI_NURSE API Select a model, input your question, and view nurse responses or manage chat history and EHR details. """ ) # Main Input Section with gr.Row(): with gr.Column(scale=2): chat_box = gr.Chatbot(label="Chat with MALI Nurse", scale=1) send_button = gr.Button("Send", variant="primary", size="lg", scale=1) with gr.Row(): user_input = gr.Textbox( label="Your Message", placeholder="Type your question or message here...", lines=2, ) model_name = gr.Radio( choices=["typhoon-v1.5x-70b-instruct", "openthaigpt", "llama-3.3-70b-versatile"], value="typhoon-v1.5x-70b-instruct", label="Model Selection", ) with gr.Column(scale=1): output_selector = gr.Dropdown( choices=["Chat History", "EHR Details"], value="Chat History", label="Select Output to Display", ) chat_history_output = gr.Textbox( label="Chat History Output", interactive=False, lines=6, scale=1, visible=True, # Initially visible ) ehr_details_output = gr.Textbox( label="EHR Details Output", interactive=False, lines=6, scale=1, visible=False, # Initially hidden ) # Function to toggle visibility def switch_output(selected_output): if selected_output == "Chat History": return gr.update(visible=True), gr.update(visible=False) elif selected_output == "EHR Details": return gr.update(visible=False), gr.update(visible=True) # Set up the change event output_selector.change( fn=switch_output, inputs=[output_selector], outputs=[chat_history_output, ehr_details_output], # Update visibility of both components ) notification_box = gr.Textbox(label="Error", interactive=False, lines=2) # Bind Get Nurse Response button send_button.click( fn=get_nurse_response, inputs=[user_input, model_name, chat_box], outputs=[chat_box, user_input], # Update chat box and clear input ) # Advanced Options with gr.Accordion("Advanced Options", open=False): with gr.Row(): reset_button = gr.Button("Reset Data", variant="primary") chat_history_button = gr.Button("View Chat History") ehr_details_button = gr.Button("View EHR Details") with gr.Column(): ehr_prompt_output = gr.Textbox( label="Outputs", interactive=False, lines=6, ) # Bind buttons to respective functions reset_button.click( fn=reset_history, inputs=[], outputs=[chat_box, user_input, notification_box], # Clear chat box and input ) chat_history_button.click( fn=view_chat_history, inputs=[], outputs=chat_history_output, ) send_button.click( fn=view_chat_history, inputs=[], outputs=chat_history_output, ) send_button.click( fn=view_ehr_details, inputs=[gr.Textbox(value="details", visible=False)], outputs=ehr_details_output ) send_button.click( fn=view_ehr_details, inputs=[gr.Textbox(value="prompt", visible=False)], outputs=ehr_prompt_output ) gr.Markdown( """ --- """ ) # TTS -------------------------------------------------------------------------------------------- gr.Markdown("# Text-to-Speech (TTS) API Test Interface") tts_interface = gradio_tts_interface() # Footer gr.Markdown( """ --- Built With ❤️ by **[Piang](https://github.com/microhum)** 🚀 Powered by Typhoon v1.5x and OpenThaiGPT Models. """ ) return interface # Run the Gradio Interface if __name__ == "__main__": gr_interface = create_gradio_interface() gr_interface.launch(server_name="0.0.0.0", server_port=7860)