Spaces:
Sleeping
Sleeping
import os | |
from openai import OpenAI | |
import gradio as gr | |
# Set up OpenAI client | |
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY")) | |
# Initialize conversation history and difficulty | |
conversation_history = [] | |
current_difficulty = "sedang" | |
# Predefined scenarios | |
predefined_scenarios = { | |
"Pilih skenario": "", | |
"Produk Cacat": "Saya baru saja membeli sebuah produk dari toko Anda, dan ternyata produk tersebut cacat.", | |
"Pengiriman Terlambat": "Saya memesan produk minggu lalu dan seharusnya sudah diterima kemarin, tapi belum sampai.", | |
"Harga Tidak Sesuai": "Harga yang tertera di rak berbeda dengan yang di kasir saat saya membayar.", | |
"Pelayanan Buruk": "Saya tidak puas dengan pelayanan yang saya terima dari salah satu staf Anda.", | |
"Pengembalian Barang": "Saya ingin mengembalikan produk yang saya beli, tapi kasir menolak permintaan saya." | |
} | |
def get_system_message(difficulty): | |
base_message = """ | |
Anda adalah asisten AI yang dirancang untuk mensimulasikan pelanggan dalam skenario pelatihan penjualan asuransi. | |
Peran Anda HANYA untuk berperan sebagai pelanggan dengan keluhan. JANGAN PERNAH merespons seolah-olah Anda adalah perwakilan penjualan. | |
Manusia yang berinteraksi dengan Anda akan berperan sebagai perwakilan penjualan asuransi. | |
Evaluasi respons perwakilan dan putuskan apakah akan melanjutkan percakapan atau mengakhirinya. | |
Jika perwakilan menangani keluhan Anda dengan baik, tanggapi secara positif sebagai pelanggan yang puas. | |
Jika perwakilan gagal mengatasi kekhawatiran Anda dengan memadai, tanggapi secara negatif dan tunjukkan bahwa Anda ingin mengakhiri percakapan. | |
Selalu tetap berperan sebagai pelanggan sepanjang percakapan. | |
Gunakan Bahasa Indonesia dalam semua respons Anda. | |
""" | |
difficulty_adjustments = { | |
"mudah": "Jadilah pelanggan yang mudah diatur, terbuka terhadap saran, dan cepat menerima solusi yang masuk akal.", | |
"sedang": "Jadilah pelanggan yang cukup menantang, membutuhkan sedikit bujukan tetapi akhirnya menerima solusi yang baik.", | |
"sulit": "Jadilah pelanggan yang sulit, skeptis terhadap solusi dan membutuhkan layanan luar biasa untuk merasa puas." | |
} | |
return base_message + difficulty_adjustments[difficulty] | |
def chat_with_gpt(user_message, history): | |
global conversation_history | |
try: | |
conversation_history.append({"role": "user", "content": user_message}) | |
messages = [ | |
{"role": "system", "content": get_system_message(current_difficulty)}, | |
*conversation_history | |
] | |
response = client.chat.completions.create( | |
model="gpt-4o-mini", | |
messages=messages, | |
max_tokens=300 | |
) | |
bot_response = response.choices[0].message.content.strip() | |
if "sebagai perwakilan penjualan" in bot_response.lower() or "saya bisa membantu anda dengan itu" in bot_response.lower(): | |
bot_response = "Maaf, tapi saya adalah pelanggan dalam skenario ini. Bisakah Anda menangani keluhan saya?" | |
conversation_history.append({"role": "assistant", "content": bot_response}) | |
conversation_ended = "percakapan berakhir" in bot_response.lower() or "mengakhiri" in bot_response.lower() | |
history.append((user_message, bot_response)) | |
if conversation_ended: | |
summary_feedback = generate_summary_feedback() | |
return history, history, "", summary_feedback | |
return history, history, "", None | |
except Exception as e: | |
error_msg = f"Terjadi kesalahan dalam chat_with_gpt: {str(e)}" | |
print(error_msg) | |
return history + [("Error", error_msg)], history + [("Error", error_msg)], "", None | |
def generate_summary_feedback(): | |
try: | |
summary_prompt = "Rangkum percakapan, evaluasi kinerja perwakilan penjualan, dan berikan umpan balik untuk perbaikan. Buat ringkas namun komprehensif." | |
messages = [ | |
{"role": "system", "content": "Anda adalah asisten AI yang memberikan umpan balik tentang interaksi penjualan Asuransi."}, | |
*conversation_history, | |
{"role": "user", "content": summary_prompt} | |
] | |
response = client.chat.completions.create( | |
model="gpt-4o-mini", | |
messages=messages, | |
max_tokens=1000 | |
) | |
return "Status: Selesai\n\n" + response.choices[0].message.content.strip() | |
except Exception as e: | |
return f"Kesalahan dalam menghasilkan ringkasan: {str(e)}" | |
def clear_conversation(): | |
global conversation_history | |
conversation_history = [] | |
return None, None, "", None | |
def start_new_conversation(difficulty, scenario): | |
global current_difficulty, conversation_history | |
current_difficulty = difficulty | |
try: | |
clear_conversation() | |
system_message = get_system_message(difficulty) | |
initial_prompt = f"Anda adalah pelanggan dengan keluhan berikut: {scenario}. Mulailah percakapan dengan menyampaikan keluhan ini kepada perwakilan penjualan." | |
conversation_history = [ | |
{"role": "system", "content": system_message}, | |
{"role": "user", "content": initial_prompt} | |
] | |
response = client.chat.completions.create( | |
model="gpt-4o-mini", | |
messages=conversation_history, | |
max_tokens=1500 | |
) | |
initial_response = response.choices[0].message.content.strip() | |
conversation_history.append({"role": "assistant", "content": initial_response}) | |
return [(None, initial_response)], [(None, initial_response)], "", None | |
except Exception as e: | |
error_msg = f"Terjadi kesalahan dalam memulai percakapan baru: {str(e)}" | |
print(error_msg) | |
return [("Error", error_msg)], [("Error", error_msg)], "", None | |
def end_conversation(history): | |
global conversation_history | |
conversation_history.append({"role": "user", "content": "Perwakilan penjualan telah mengakhiri percakapan."}) | |
summary_feedback = generate_summary_feedback() | |
history.append((None, "Perwakilan penjualan telah mengakhiri percakapan.")) | |
return history, history, "", summary_feedback | |
def update_scenario(choice): | |
return predefined_scenarios[choice] | |
# Set up Gradio interface | |
with gr.Blocks() as demo: | |
gr.Markdown("# BAWANA AI - Complain Handling Simulator") | |
gr.Markdown("Pilih tingkat kesulitan, pilih atau modifikasi skenario, dan mulai simulasi. Anda akan berperan sebagai perwakilan penjualan.") | |
difficulty_radio = gr.Radio(["mudah", "sedang", "sulit"], label="Tingkat Kesulitan Pelanggan", value="sedang") | |
scenario_dropdown = gr.Dropdown(choices=list(predefined_scenarios.keys()), label="Pilih Skenario", value="Pilih skenario") | |
scenario_input = gr.Textbox(label="Skenario Keluhan Pelanggan (Anda dapat memodifikasi)", lines=3) | |
new_scenario = gr.Button("Mulai Simulasi") | |
chatbot = gr.Chatbot() | |
msg = gr.Textbox(label="Respons Anda sebagai perwakilan penjualan") | |
with gr.Row(): | |
submit_btn = gr.Button("Kirim") | |
end_btn = gr.Button("Akhiri Percakapan") | |
summary = gr.Textbox(label="Ringkasan Percakapan dan Umpan Balik", lines=10, interactive=False) | |
clear = gr.Button("Bersihkan Percakapan") | |
scenario_dropdown.change(update_scenario, inputs=[scenario_dropdown], outputs=[scenario_input]) | |
new_scenario.click(start_new_conversation, inputs=[difficulty_radio, scenario_input], outputs=[chatbot, chatbot, msg, summary]) | |
submit_btn.click(chat_with_gpt, [msg, chatbot], [chatbot, chatbot, msg, summary]) | |
msg.submit(chat_with_gpt, [msg, chatbot], [chatbot, chatbot, msg, summary]) | |
end_btn.click(end_conversation, inputs=[chatbot], outputs=[chatbot, chatbot, msg, summary]) | |
clear.click(clear_conversation, inputs=None, outputs=[chatbot, msg, msg, summary]) | |
# Launch the interface | |
demo.launch() |