Spaces:
Build error
Build error
import gradio as gr | |
import pandas as pd | |
import os | |
import atexit | |
from fastrtc import WebRTC, ReplyOnPause, get_stt_model, get_tts_model | |
from settings import Settings | |
from pydantic_ai.messages import ( | |
ModelMessage, | |
ModelRequest, | |
ModelResponse, | |
UserPromptPart, | |
TextPart | |
) | |
from agents import form_agent, response_agent | |
# Config and Globals | |
settings = Settings() | |
stt_model = get_stt_model() | |
tts_model = get_tts_model() | |
messages: list[ModelMessage] = [] | |
DATA_PATH = "data.csv" | |
df = pd.read_csv(DATA_PATH) if os.path.exists(DATA_PATH) else pd.DataFrame(columns=["customer_name", "request_type", "issue", "emotion"]) | |
def save_data_on_exit(): | |
df.to_csv(DATA_PATH, index=False) | |
atexit.register(save_data_on_exit) | |
def df_update(): | |
global df | |
try: | |
form_response = form_agent.run_sync(user_prompt="Do your thing", message_history=messages) | |
new_row = { | |
"customer_name": form_response.data.customername, | |
"request_type": form_response.data.requesttype, | |
"issue": form_response.data.issue, | |
"emotion": form_response.data.emotion | |
} | |
df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True) | |
df.to_csv(DATA_PATH, index=False) | |
return "β DataFrame updated successfully!" | |
except Exception as e: | |
return f"β Update failed: {str(e)}" | |
def update_table(): | |
global df | |
if os.path.exists(DATA_PATH): | |
df = pd.read_csv(DATA_PATH) | |
else: | |
df = pd.DataFrame(columns=["customer_name", "request_type", "issue", "emotion"]) | |
return df | |
def reset_memory(): | |
global messages | |
messages = [] | |
return "π§ Memory reset successfully." | |
async def handle_audio(audio): | |
prompt = stt_model.stt(audio) | |
response_text = await response_agent.run(user_prompt=prompt, message_history=messages) | |
messages.append(ModelRequest(parts=[UserPromptPart(content=prompt)])) | |
messages.append(ModelResponse(parts=[TextPart(content=response_text.data)])) | |
for chunk in tts_model.stream_tts(response_text.data): | |
yield chunk | |
async def handle_text_chat(user_text, history): | |
response = await response_agent.run(user_prompt=user_text, message_history=messages) | |
messages.append(ModelRequest(parts=[UserPromptPart(content=user_text)])) | |
messages.append(ModelResponse(parts=[TextPart(content=response.data)])) | |
history = history + [[user_text, response.data]] | |
return "", history | |
# Gradio UI | |
with gr.Blocks(css=""" | |
.toolbox { display: flex; gap: 0.5rem; margin-top: 0.5rem; } | |
.footer-note { text-align: center; font-size: 0.85rem; color: #666; margin-top: 1rem; } | |
""") as demo: | |
gr.Markdown("<h2 style='text-align: center;'>π¬ Customer Support Assistant</h2>") | |
debug_box = gr.Textbox(visible=False) | |
with gr.Tabs(): | |
with gr.Tab("Chat"): | |
with gr.Row(): | |
with gr.Column(scale=3): | |
chatbot = gr.Chatbot(label="Chat Interface") | |
user_input = gr.Textbox(placeholder="Type your message...", show_label=False) | |
user_input.submit(fn=handle_text_chat, inputs=[user_input, chatbot], outputs=[user_input, chatbot]) | |
with gr.Column(scale=1): | |
mic_button = WebRTC(mode="send-receive", modality="audio") | |
mic_button.stream(fn=ReplyOnPause(handle_audio), inputs=[mic_button], outputs=[mic_button], time_limit=60) | |
with gr.Tab("Customer Data"): | |
gr.Markdown("### Customer Information Table") | |
data_frame = gr.Dataframe( | |
headers=["customer_name", "request_type", "issue", "emotion"], | |
interactive=False, | |
wrap=True | |
) | |
with gr.Row(elem_classes="toolbox"): | |
update_button = gr.Button("π€ Update DataFrame") | |
refresh_button = gr.Button("π Refresh Table") | |
reset_button = gr.Button("πͺΉ Reset Memory") | |
update_button.click(fn=df_update, outputs=[debug_box]) | |
refresh_button.click(fn=update_table, outputs=[data_frame]) | |
reset_button.click(fn=reset_memory, outputs=[debug_box]) | |
# Toast feedback | |
def show_toast(msg: str): | |
if msg: | |
gr.Info(msg) | |
debug_box.change(fn=show_toast, inputs=[debug_box]) | |
# Footer | |
gr.Markdown("<div class='footer-note'>π Made with β€οΈ by Rikhil</div>") | |
demo.load(fn=update_table, outputs=[data_frame]) | |
if __name__ == "__main__": | |
demo.launch() | |