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() |