Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import re | |
| import inspect | |
| import numpy as np | |
| from sentence_transformers import SentenceTransformer | |
| from sentence_transformers.util import cos_sim | |
| from sentence_transformers import CrossEncoder | |
| codes = """001 - Vehicle Registration (New) | |
| 002 - Vehicle Registration Renewal | |
| 003 - Vehicle Ownership Transfer | |
| 004 - Vehicle De-registration | |
| 005 - Lost Registration Certificate Replacement | |
| 006 - Address Change Update | |
| 007 - Vehicle Data Correction | |
| 008 - Ownership Name Correction | |
| 009 - Vehicle Tax Payment | |
| 010 - Late Payment Fee Processing | |
| 011 - Vehicle Type/Specification Update | |
| 012 - BBNKB (Transfer Fee of Vehicle Ownership) | |
| 013 - STNK Issuance (Vehicle Registration Certificate) | |
| 014 - STNK Renewal | |
| 015 - Motor Vehicle Roadworthiness Inspection | |
| 016 - Plate Number Renewal | |
| 017 - Lost Plate Replacement | |
| 018 - Vehicle Export Registration | |
| 019 - Vehicle Import Registration | |
| 020 - Fleet Vehicle Registration | |
| 021 - Bulk Vehicle Registration Update | |
| 022 - Vehicle Insurance Assistance | |
| 023 - Vehicle Accident Reporting | |
| 024 - Vehicle Usage Change Declaration (e.g., personal to commercial) | |
| 025 - Legal Document Verification | |
| 026 - Ownership Transfer for Inherited Vehicle | |
| 027 - STNK Temporary Suspension | |
| 028 - Proof of Ownership Document Update | |
| 029 - Vehicle Ownership History Check | |
| 030 - Vehicle Tax Recalculation Request | |
| 031 - Tax Exemption Application (for special cases) | |
| 032 - Deceased Owner’s Vehicle Ownership Transfer""".split("\n") | |
| undetected = "099 - Other/Undetected" | |
| # codes = """001 - Pendaftaran Kendaraan (Baru) | |
| # 002 - Pembaruan Pendaftaran Kendaraan | |
| # 003 - Alih Kepemilikan Kendaraan | |
| # 004 - Pembatalan Pendaftaran Kendaraan | |
| # 005 - Penggantian Sertifikat Pendaftaran Kendaraan yang Hilang | |
| # 006 - Pembaruan Perubahan Alamat | |
| # 007 - Koreksi Data Kendaraan | |
| # 008 - Koreksi Nama Kepemilikan | |
| # 009 - Pembayaran Pajak Kendaraan | |
| # 010 - Proses Denda Keterlambatan Pembayaran | |
| # 011 - Pembaruan Jenis/Spesifikasi Kendaraan | |
| # 012 - Pembayaran Pajak Kendaraan Melalui E-Samsat | |
| # 013 - Penerbitan STNK (Sertifikat Pendaftaran Kendaraan) | |
| # 014 - Pembaruan STNK | |
| # 015 - Pemeriksaan Kelayakan Jalan Kendaraan Bermotor | |
| # 016 - Pembaruan Nomor Plat Kendaraan | |
| # 017 - Penggantian Plat yang Hilang | |
| # 018 - Pendaftaran Ekspor Kendaraan | |
| # 019 - Pendaftaran Impor Kendaraan | |
| # 020 - Pendaftaran Kendaraan Armada | |
| # 021 - Pembaruan Pendaftaran Kendaraan Massal | |
| # 022 - Bantuan Asuransi Kendaraan | |
| # 023 - Pelaporan Kecelakaan Kendaraan | |
| # 024 - Deklarasi Perubahan Penggunaan Kendaraan (misalnya, pribadi ke komersial) | |
| # 025 - Verifikasi Dokumen Hukum | |
| # 026 - Alih Kepemilikan Kendaraan Warisan | |
| # 027 - Penangguhan Sementara STNK | |
| # 028 - Pembaruan Dokumen Bukti Kepemilikan | |
| # 029 - Pemeriksaan Riwayat Kepemilikan Kendaraan | |
| # 030 - Permintaan Perhitungan Ulang Pajak Kendaraan | |
| # 031 - Permohonan Pembebasan Pajak (untuk kasus khusus) | |
| # 032 - Alih Kepemilikan Kendaraan Pemilik yang Meninggal""".split("\n") | |
| codes = """001 - Pendaftaran Kendaraan | |
| 002 - Pembaruan Data Kendaraan | |
| 003 - Alih Kepemilikan atau Balik Nama Kendaraan | |
| 004 - Pelaporan Dokumen atau Plat yang Hilang | |
| 005 - Pembayaran dan Pengelolaan Pajak Kendaraan | |
| 006 - Pemeriksaan dan Verifikasi Kendaraan | |
| 007 - Pendaftaran Kendaraan Ekspor, Impor, atau Armada | |
| 008 - Pelaporan dan Bantuan Terkait Kendaraan | |
| 009 - Penangguhan atau Deklarasi Perubahan Penggunaan Kendaraan""".split("\n") | |
| # documents = """Vehicle Registration | |
| # Vehicle Data Update | |
| # Vehicle Ownership or Change of Name | |
| # Reporting of Lost Documents or Plates | |
| # Vehicle Tax Payment and Management | |
| # Vehicle Inspection and Verification | |
| # Registration of Export, Import, or Fleet Vehicles | |
| # Reporting and Assistence of Vehicles Insurance | |
| # Suspension or Declaration of Change of Vehicle Use""".split("\n") | |
| # examples = [ | |
| # {"code": "001", "examples": [ | |
| # "Register a new vehicle", | |
| # "Vehicle registration application", | |
| # "Apply for vehicle registration", | |
| # "Submit new vehicle registration", | |
| # "New vehicle registration request" | |
| # ]}, | |
| # {"code": "002", "examples": [ | |
| # "Update vehicle information", | |
| # "Change details of a registered vehicle", | |
| # "Submit updated vehicle data", | |
| # "Request vehicle data update", | |
| # "Modify vehicle registration information" | |
| # ]}, | |
| # {"code": "003", "examples": [ | |
| # "Transfer vehicle ownership", | |
| # "Apply for vehicle name change", | |
| # "Request ownership transfer for a vehicle", | |
| # "Submit vehicle ownership change", | |
| # "Process vehicle title transfer" | |
| # ]}, | |
| # {"code": "004", "examples": [ | |
| # "Report lost vehicle documents (STNK, BPKB, etc)", | |
| # "Declare missing license plates", | |
| # "File a report for lost vehicle papers", | |
| # "Lost vehicle documents reporting", | |
| # "Inform authorities about missing vehicle documents" | |
| # ]}, | |
| # {"code": "005", "examples": [ | |
| # "Pay vehicle tax", | |
| # "Manage vehicle tax payments", | |
| # "Submit vehicle tax payment", | |
| # "Request vehicle tax management services", | |
| # "Complete annual vehicle tax" | |
| # ]}, | |
| # {"code": "006", "examples": [ | |
| # "Conduct vehicle inspection", | |
| # "Request vehicle verification check", | |
| # "Submit vehicle for verification", | |
| # "Schedule vehicle examination", | |
| # "Apply for vehicle inspection and verification" | |
| # ]}, | |
| # {"code": "007", "examples": [ | |
| # "Register an imported vehicle", | |
| # "Submit registration for export vehicle", | |
| # "Apply for fleet vehicle registration", | |
| # "Register new vehicle for export or import", | |
| # "Fleet vehicle registration application" | |
| # ]}, | |
| # {"code": "008", "examples": [ | |
| # "Report vehicle-related issues", | |
| # "Request assistance for a vehicle problem", | |
| # "Submit report concerning a vehicle", | |
| # "File for vehicle-related support", | |
| # "Seek help with vehicle concerns" | |
| # ]}, | |
| # {"code": "009", "examples": [ | |
| # "Suspend vehicle usage", | |
| # "Declare change of vehicle usage purpose", | |
| # "Request a hold on vehicle usage", | |
| # "Submit application for vehicle usage change", | |
| # "File for suspension of vehicle operations" | |
| # ]} | |
| # ] | |
| examples = [ | |
| {"code": "001", "examples": [ | |
| "Daftarkan kendaraan baru", | |
| "Pengajuan pendaftaran kendaraan", | |
| "Ajukan pendaftaran kendaraan", | |
| "Serahkan pendaftaran kendaraan baru", | |
| "Permintaan pendaftaran kendaraan baru" | |
| ]}, | |
| {"code": "002", "examples": [ | |
| "Perbarui informasi kendaraan", | |
| "Ubah detail kendaraan yang terdaftar", | |
| "Ajukan pembaruan data kendaraan", | |
| "Permintaan pembaruan data kendaraan", | |
| "Modifikasi informasi pendaftaran kendaraan" | |
| ]}, | |
| {"code": "003", "examples": [ | |
| "Alihkan kepemilikan kendaraan", | |
| "Ajukan perubahan nama kendaraan", | |
| "Permintaan pengalihan kepemilikan kendaraan", | |
| "Serahkan perubahan kepemilikan kendaraan", | |
| "Proses alih nama kendaraan" | |
| ]}, | |
| {"code": "004", "examples": [ | |
| "Laporkan dokumen kendaraan hilang (STNK, BPKB, dll)", | |
| "Nyatakan plat nomor hilang", | |
| "Ajukan laporan dokumen kendaraan hilang", | |
| "Pelaporan dokumen kendaraan yang hilang", | |
| "Informasikan pihak berwenang tentang dokumen kendaraan yang hilang" | |
| ]}, | |
| {"code": "005", "examples": [ | |
| "Bayar pajak kendaraan", | |
| "Kelola pembayaran pajak kendaraan", | |
| "Ajukan pembayaran pajak kendaraan", | |
| "Permintaan layanan manajemen pajak kendaraan", | |
| "Selesaikan pajak tahunan kendaraan" | |
| ]}, | |
| {"code": "006", "examples": [ | |
| "Lakukan pemeriksaan kendaraan", | |
| "Ajukan pemeriksaan verifikasi kendaraan", | |
| "Serahkan kendaraan untuk verifikasi", | |
| "Jadwalkan pemeriksaan kendaraan", | |
| "Ajukan inspeksi dan verifikasi kendaraan" | |
| ]}, | |
| {"code": "007", "examples": [ | |
| "Daftarkan kendaraan impor", | |
| "Ajukan pendaftaran kendaraan ekspor", | |
| "Ajukan pendaftaran kendaraan armada", | |
| "Daftarkan kendaraan baru untuk ekspor atau impor", | |
| "Pengajuan pendaftaran kendaraan armada" | |
| ]}, | |
| {"code": "008", "examples": [ | |
| "Laporkan masalah terkait kendaraan", | |
| "Permintaan bantuan untuk masalah kendaraan", | |
| "Ajukan laporan mengenai kendaraan", | |
| "Ajukan dukungan terkait kendaraan", | |
| "Cari bantuan terkait permasalahan kendaraan" | |
| ]}, | |
| {"code": "009", "examples": [ | |
| "Tangguhkan penggunaan kendaraan", | |
| "Nyatakan perubahan tujuan penggunaan kendaraan", | |
| "Ajukan penangguhan penggunaan kendaraan", | |
| "Ajukan perubahan penggunaan kendaraan", | |
| "Ajukan penangguhan operasional kendaraan" | |
| ]} | |
| ] | |
| # examples = [ | |
| # {"code": "001", "examples": [ | |
| # codes[0][6:], | |
| # "Pendaftaran kendaraan", | |
| # "Daftar baru untuk plat kendaraan", | |
| # "Registrasi kendaraan" | |
| # ]}, | |
| # {"code": "002", "examples": [ | |
| # codes[1][6:], | |
| # "Perubahan alamat, warna, komponnen kendaraan", | |
| # "Update informasi kendaraan", | |
| # "Perubahan data pemilik", | |
| # ]}, | |
| # {"code": "003", "examples": [ | |
| # codes[2][6:], | |
| # "Alih kepemilikan kendaraan", | |
| # "Balik nama untuk kendaraan", | |
| # "Perubahan pemilik pada kendaraan" | |
| # ]}, | |
| # {"code": "004", "examples": [ | |
| # codes[3][6:], | |
| # "Laporan kehilangan dokumen kendaraan", | |
| # "Hilangnya plat nomor kendaraan", | |
| # "Dokumen kendaraan dilaporkan hilang" | |
| # ]}, | |
| # {"code": "005", "examples": [ | |
| # codes[4][6:], | |
| # "Pembayaran pajak kendaraan", | |
| # "Kelola pajak tahunan kendaraan", | |
| # "Pajak kendaraan" | |
| # ]}, | |
| # {"code": "006", "examples": [ | |
| # codes[5][6:], | |
| # "Pemeriksaan fisik kendaraan", | |
| # "Verifikasi kendaraan", | |
| # "Cek kondisi kendaraan" | |
| # ]}, | |
| # {"code": "007", "examples": [ | |
| # codes[6][6:], | |
| # "Pendaftaran kendaraan impor", | |
| # "Registrasi armada baru", | |
| # "Kendaraan ekspor didaftarkan" | |
| # ]}, | |
| # {"code": "008", "examples": [ | |
| # codes[7][6:], | |
| # "Pelaporan terkait kendaraan", | |
| # "Bantuan atau Asuransi atas kendaraan", | |
| # "Laporkan masalah kendaraan" | |
| # ]}, | |
| # {"code": "009", "examples": [ | |
| # codes[8][6:], | |
| # "Penangguhan penggunaan kendaraan", | |
| # "Deklarasi perubahan fungsi kendaraan", | |
| # "Penggunaan baru untuk kendaraan" | |
| # ]} | |
| # ] | |
| vehicle_tax_info = { | |
| "B 1234 BCA": { | |
| "no_rangka": "1237191234", | |
| "type": "SUV", | |
| "tanggal": "23 Desember 2024", | |
| "status": "Belum Bayar", | |
| "harga_jual": 500_000_000 # In Rupiah | |
| }, | |
| "B 5678 XYZ": { | |
| "no_rangka": "9876543210", | |
| "type": "Sedan", | |
| "tanggal": "15 Januari 2025", | |
| "status": "Belum Bayar", | |
| "harga_jual": 375_800_000 # In Rupiah | |
| }, | |
| "D 3456 DEF": { | |
| "no_rangka": "4561237890", | |
| "type": "MPV", | |
| "tanggal": "10 Februari 2025", | |
| "status": "Sudah Bayar", | |
| "harga_jual": 400_000_000 # In Rupiah | |
| } | |
| } | |
| # Table for detail calculations (perhitungan) | |
| detail_perhitungan = { | |
| "001": { | |
| "name": "Pendaftaran Kendaraan", | |
| "formula": lambda harga_jual: harga_jual * 0.1, | |
| # Example formula: 10% of harga_jual | |
| }, | |
| "002": { | |
| "name": "Pembaruan Data Kendaraan", | |
| "formula": lambda harga_jual: harga_jual * 0.05, | |
| # Example formula: 5% of harga_jual | |
| }, | |
| "003": { | |
| "name": "Alih Kepemilikan (Balik Nama) Kendaraan", | |
| "formula": lambda harga_jual: harga_jual * 0.1, | |
| # Example formula: 10% of harga_jual | |
| }, | |
| "004": { | |
| "name": "Penggantian Dokumen atau Plat yang Hilang", | |
| "formula": lambda harga_jual: harga_jual * 0.03, | |
| # Example formula: 3% of harga_jual | |
| }, | |
| "005": { | |
| "name": "Pembayaran dan Pengelolaan Pajak Kendaraan", | |
| "formula": lambda harga_jual: harga_jual * 0.12, | |
| # Example formula: 12% of harga_jual | |
| }, | |
| "006": { | |
| "name": "Pemeriksaan dan Verifikasi Kendaraan", | |
| "formula": lambda harga_jual: 100000, | |
| # Example formula: 2% of harga_jual | |
| }, | |
| "007": { | |
| "name": "Pendaftaran Kendaraan Ekspor, Impor, atau Armada", | |
| "formula": lambda harga_jual: harga_jual * 0.15, | |
| # Example formula: 15% of harga_jual | |
| }, | |
| "008": { | |
| "name": "Pelaporan dan Bantuan Terkait Kendaraan", | |
| "formula": lambda harga_jual: harga_jual * 0.04, | |
| # Example formula: 4% of harga_jual | |
| }, | |
| "009": { | |
| "name": "Penangguhan atau Deklarasi Perubahan Penggunaan Kendaraan", | |
| "formula": lambda harga_jual: harga_jual * 0.06, | |
| # Example formula: 6% of harga_jual | |
| } | |
| } | |
| undetected = "099 - Lainnya/Tidak Terdeteksi" | |
| model_ids = [ | |
| "BAAI/bge-m3", | |
| "sentence-transformers/paraphrase-multilingual-mpnet-base-v2", | |
| "intfloat/multilingual-e5-small", | |
| "sentence-transformers/distiluse-base-multilingual-cased-v2", | |
| "Alibaba-NLP/gte-multilingual-base", | |
| "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2", | |
| "jinaai/jina-reranker-v2-base-multilingual", | |
| "BAAI/bge-reranker-v2-m3", | |
| ] | |
| # model_id = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" | |
| # model_id = "Alibaba-NLP/gte-multilingual-base" | |
| # model_id = "BAAI/bge-m3" | |
| # model_id = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2" | |
| # model_id = "intfloat/multilingual-e5-small" | |
| # model_id = "sentence-transformers/distiluse-base-multilingual-cased-v2" | |
| model_id = model_ids[-1] | |
| model = None | |
| codes_emb = None | |
| def load_model(model_id): | |
| # global model | |
| # global codes_emb | |
| if model_id in model_ids[-2:]: | |
| model = CrossEncoder( | |
| # "jinaai/jina-reranker-v2-base-multilingual", | |
| # "BAAI/bge-reranker-v2-m3", | |
| model_id, | |
| automodel_args={"torch_dtype": "auto"}, | |
| trust_remote_code=True, | |
| ) | |
| return model, None | |
| else: | |
| model = SentenceTransformer(model_id, trust_remote_code=True) | |
| # codes_emb = model.encode([x[6:] for x in codes]) | |
| codes_emb = model.encode([x["examples"] for x in examples])#.mean(axis=1) | |
| # codes_emb = np.mean([model.encode(x["examples"]) for x in examples], axis=1) | |
| return model, codes_emb | |
| model, codes_emb = load_model(model_id) | |
| # for x in examples: | |
| # codes_emb.append(model.encode(x["examples"])) | |
| # codes_emb = np.mean(codes_emb, axis=1) | |
| def censor_middle(number, num_to_hide=4): | |
| number_str = str(number) | |
| middle_index = len(number_str) // 2 | |
| start_index = middle_index - num_to_hide // 2 | |
| end_index = middle_index + num_to_hide // 2 | |
| censored_part = "*" * num_to_hide | |
| censored_number = number_str[:start_index] + censored_part + number_str[end_index:] | |
| return censored_number | |
| def get_calculation(request_code, plate_number): | |
| print(request_code, plate_number, "GET CALC") | |
| calc = detail_perhitungan.get(request_code) | |
| vehicle = vehicle_tax_info.get(plate_number) | |
| if vehicle != None and calc != None: | |
| harga_jual = vehicle.get("harga_jual") | |
| formula = calc.get("formula") | |
| result = formula(harga_jual) | |
| description = inspect.getsource(formula).split(":", 2)[-1].strip() | |
| result_detail = request_code + " - " + calc.get("name") | |
| return result, str(description), result_detail | |
| elif calc != None: | |
| formula = calc.get("formula") | |
| description = inspect.getsource(formula).split(":", 2)[-1].strip() | |
| result_detail = request_code + " - " + calc.get("name") | |
| return None, str(description), result_detail | |
| else: | |
| return None, None, None | |
| def build_output_formula(descriptions, result_details): | |
| out = "----------------------------------------------------\n\n" | |
| out = "Daftar Kode Permohonan:\n" | |
| for i, (desc,detail) in enumerate(zip(descriptions, result_details)): | |
| # harga_jual = str(vehicle.get("harga_jual")) | |
| out += f"{i+1}. {detail}\nRumus: {desc}\n" | |
| return out | |
| def build_output_vehicle(plate_number): | |
| vehicle = vehicle_tax_info.get(plate_number).copy() | |
| out = "----------------------------------------------------\n\n" | |
| out = "Nomor Polisi: " + plate_number + "\n" | |
| vehicle["no_rangka"] = censor_middle(vehicle["no_rangka"]) | |
| vehicle["harga_jual"] = "Rp{:,}".format(vehicle["harga_jual"]) | |
| out += "\n".join([k + " : " + str(v) for k,v in vehicle.items()]) | |
| return out | |
| def build_output(result, description, result_detail, plate_number): | |
| return build_outputs([result], [description], [result_detail], plate_number) | |
| def build_outputs(results, descriptions, result_details, plate_number): | |
| vehicle = vehicle_tax_info.get(plate_number).copy() | |
| vehicle["harga_jual"] = "Rp{:,}".format(vehicle["harga_jual"]) | |
| out = "----------------------------------------------------\n\n" | |
| out = "Nomor Polisi: " + plate_number + "\n" | |
| out += "\n".join([k + " : " + str(v) if k != "no_rangka" else k + " : " + censor_middle(v) for k,v in vehicle.items()]) | |
| # out += "\n----------------------------------------------" | |
| # out += f"\nWajib Pajak dengan NoPol {plate_number} ingin melakukan proses berikut:\n" | |
| out += "\n\nDaftar Kode Permohonan:\n" | |
| for i, (res,desc,detail) in enumerate(zip(results, descriptions, result_details)): | |
| harga_jual = vehicle["harga_jual"] | |
| res_str = "{:,}".format(res) | |
| out += f"{i+1}. {detail}\nRumus: {desc}\nDetail perhitungan: {desc.replace('harga_jual', harga_jual)} = Rp{res_str}\n" | |
| # out += "----------------------------\nEstimasi biaya: " | |
| out += "\n\n\nEstimasi Biaya: " | |
| if len(results) > 1: | |
| out += " + ".join(["Rp{:,}".format(x) for x in results]) | |
| out += " = Rp{:,}".format(sum(results)) | |
| else: | |
| out += "Rp{:,}".format(results[0]) | |
| out += "\n\n----------------------------" | |
| # out += "\n----------------------------\n\n--------------------------------" | |
| return out | |
| def respond( | |
| message, | |
| history: list[tuple[str, str]], | |
| threshold, | |
| is_multiple, | |
| n_num, | |
| ): | |
| global codes_emb | |
| global undetected | |
| undetected_code = undetected[:3] | |
| # if history and history[-1][-1][21:24] == undetected_code: | |
| # list_his = "" | |
| # for his in history[::-1]: | |
| # if his[-1][21:24] != undetected_code: | |
| # break | |
| # list_his = his[0] + "\n" + list_his | |
| # message += "\n" + list_his | |
| # pattern = r'\b([A-Z]{1,2})\s?(\d{4})\s?([A-Z]{3})\b' | |
| # pattern = r'\b([A-Z]{1,2})\s?(\d{4})\s?([A-Z]{1,3})\b' | |
| pattern = r'\b([A-Za-z]{1,2})\s?(\d{4})\s?([A-Za-z]{1,3})\b' | |
| matches = re.findall(pattern, message) | |
| plates = [" ".join(x).upper() for i,x in enumerate(matches)] | |
| plate_numbers = ", ".join(plates) | |
| # if model.config._name_or_path in model_ids[-2:]: | |
| if type(model) == CrossEncoder: | |
| # documents = [v["name"] for v in detail_perhitungan.values()] | |
| sentence_pairs = [[message, v["name"]] for v in detail_perhitungan.values()] | |
| # sentence_pairs = [[message, doc] for doc in documents] | |
| scores = model.predict(sentence_pairs, convert_to_tensor=True) | |
| weights = [1,1,1,1,1,1,1,1,1] | |
| # scores = [x["score"] for x in model.rank(message, documents)] | |
| else: | |
| text_emb = model.encode(message) | |
| scores = cos_sim(codes_emb, text_emb).mean(axis=-1)#[:,0] | |
| weights = [19,8,7,6,5,4,3,2,1] | |
| scores_argsort = scores.argsort(descending=True) | |
| # if n_num == 0: | |
| # std = scores.std() | |
| # else: | |
| # std = 0 | |
| if n_num == 0: | |
| # w_avg = np.average(scores[scores_argsort].numpy(), weights=range(len(scores),0,-1)) | |
| w_avg = np.average(scores[scores_argsort].numpy(), weights=weights) | |
| else: | |
| w_avg = 9999 | |
| #[::-1] | |
| if is_multiple: | |
| request_details = [] | |
| request_numbers = [] | |
| request_scores = [] | |
| # request_undetected = False | |
| # for i,score in enumerate(scores): | |
| if scores[scores_argsort[0]] < threshold: | |
| request_details.append(undetected[6:]) | |
| request_numbers.append(undetected_code) | |
| else: | |
| for i in scores_argsort: | |
| # if scores[scores_argsort[0]] - std <= scores[i]: | |
| if scores[i] > w_avg: | |
| request_details.append(codes[i][6:]) | |
| request_numbers.append(codes[i][:3]) | |
| request_scores.append(str( round(scores[i].tolist(), 3) ) ) | |
| else: | |
| if len(request_scores) >= n_num: | |
| break | |
| if scores[i] > threshold: | |
| request_details.append(codes[i][6:]) | |
| request_numbers.append(codes[i][:3]) | |
| request_scores.append(str( round(scores[i].tolist(), 3) ) ) | |
| request_numbers_copy = request_numbers | |
| request_details_copy = request_details | |
| request_numbers = "\n".join(request_numbers) | |
| request_details = "\n".join(request_details) | |
| request_scores = "\n".join(request_scores) | |
| # if len(request_numbers_copy) > 0: | |
| # for code, detail in zip(request_numbers_copy, request_details_copy): | |
| # kode_mohon = detail_perhitungan.get(code) | |
| # formula = kode_mohon.get("formula") | |
| # description = inspect.getsource(formula).split(":", 2)[-1].strip() | |
| # if request_undetected and len(plates) == 0: | |
| # + f"\n\nConfidence score:\n{request_scores}" | |
| # return "Request code number:\n" + request_numbers + "\n\nRequest detail:\n" + request_details + "\n\nPlate numbers: " + plate_numbers | |
| print(request_scores) | |
| out = "" | |
| for plate in plates: | |
| results, descriptions, result_details = [], [], [] | |
| for code in request_numbers_copy: | |
| result, description, result_detail = get_calculation(code, plate) | |
| if result != None: | |
| results.append(result) | |
| if descriptions != None: | |
| descriptions.append(description) | |
| result_details.append(result_detail) | |
| if results: | |
| out += "\n\n" + build_outputs(results, descriptions, result_details, plate) | |
| elif vehicle_tax_info.get(plate): | |
| out += "\n\n" + build_output_vehicle(plate) | |
| if out == "": | |
| descriptions, result_details = [], [] | |
| for code in request_numbers_copy: | |
| result, description, result_detail = get_calculation(code, "") | |
| if description != None: | |
| descriptions.append(description) | |
| result_details.append(result_detail) | |
| if descriptions: | |
| out += "\n\n" + build_output_formula(descriptions, result_details) | |
| else: | |
| return "Request code number: " + request_numbers + "\nRequest detail: " + request_details + "\nPlate numbers: " + plate_numbers | |
| return out | |
| # result, description, result_detailget_calculation(request_code, plate_number) | |
| s_max = scores.argmax() | |
| if scores[s_max] < threshold: | |
| # request_code = "033 - Other/Undetected" | |
| request_code = undetected | |
| else: | |
| request_code = codes[scores.argmax()] | |
| # "{:.2f}".format(a) | |
| # out = "Request code number: " + request_code[:3] + "\nRequest detail: " + request_code[6:] + f"\nConfidence score: {round(scores[s_max].tolist(),3)}" + "\nPlate numbers: " + plate_numbers | |
| out = "" | |
| for plate in plates: | |
| results, descriptions, result_details = [], [], [] | |
| result, description, result_detail = get_calculation(request_code[:3], plate) | |
| if result != None: | |
| results.append(result) | |
| descriptions.append(description) | |
| result_details.append(result_detail) | |
| out += "\n\n" + build_outputs(results, descriptions, result_details, plate) | |
| elif vehicle_tax_info.get(plate): | |
| out += "\n\n" + build_output_vehicle(plate) | |
| elif description != None: | |
| descriptions.append(description) | |
| result_details.append(result_detail) | |
| out += "\n\n" + build_output_formula(descriptions, result_details) | |
| # else: | |
| # # + f"\nConfidence score: {round(scores[s_max].tolist(),3)}" | |
| # out += "Request code number: " + request_code[:3] + "\nRequest detail: " + "\nPlate numbers: " + plate_numbers | |
| if out == "": | |
| if request_code[:3] == undetected_code: | |
| return "Request code number: " + request_code[:3] + "\nRequest detail: " + request_code[6:] + "\nPlate numbers: " + plate_numbers | |
| else: | |
| result, description, result_detail = get_calculation(request_code[:3], "") | |
| out += build_output_formula([description], [result_detail]) | |
| return out | |
| # if vehicle_tax_info.get(request_detail) | |
| # for val in history: | |
| # if val[0]: | |
| # messages.append({"role": "user", "content": val[0]}) | |
| # if val[1]: | |
| # messages.append({"role": "assistant", "content": val[1]}) | |
| # messages.append({"role": "user", "content": message}) | |
| # response = "" | |
| # for message in client.chat_completion( | |
| # messages, | |
| # max_tokens=max_tokens, | |
| # stream=True, | |
| # temperature=temperature, | |
| # top_p=top_p, | |
| # ): | |
| # token = message.choices[0].delta.content | |
| # response += token | |
| # yield response | |
| """ | |
| For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface | |
| """ | |
| # demo = gr.ChatInterface( | |
| # respond, | |
| # ) | |
| def reload(chosen_model_id): | |
| global model | |
| global model_id | |
| global codes_emb | |
| if chosen_model_id != model_id: | |
| model, codes_emb = load_model(chosen_model_id) | |
| # model = SentenceTransformer(chosen_model_id, trust_remote_code=True) | |
| # model_id = chosen_model_id | |
| # codes_emb = model.encode([x[6:] for x in codes]) | |
| # codes_emb = model.encode([x["examples"] for x in examples])#.mean(axis=1) | |
| # codes_emb = np.mean([model.encode(x["examples"]) for x in examples], axis=1) | |
| return f"Model {chosen_model_id} has been succesfully loaded!" | |
| return f"Model {chosen_model_id} is ready!" | |
| with gr.Blocks() as demo: | |
| # Add header title and description | |
| gr.Markdown("# List of Request Numbers") | |
| gr.Markdown("<br>".join(codes) + "<br>" + undetected) | |
| gr.Markdown("# Valid License Plate Number Criteria:") | |
| gr.Markdown("(1-2 letters) (4 numbers) (1-3 letters)") | |
| gr.Markdown("# Example Valid Plate Numbers") | |
| gr.Markdown("<br>".join(vehicle_tax_info.keys())) | |
| gr.Markdown("# Choose & Load Model:") | |
| reload_model = gr.Interface( | |
| fn=reload, | |
| inputs=[gr.Dropdown(choices=model_ids, value=model_id)], | |
| outputs="text", | |
| # gr.HighlightedText( | |
| # label="status", | |
| # combine_adjacent=True, | |
| # show_legend=True, | |
| # color_map={"+": "red", "-": "green"} | |
| # ), | |
| ) | |
| gr.Markdown("# Chatbot Interface:") | |
| chat_interface = gr.ChatInterface( | |
| respond, | |
| additional_inputs=[ | |
| gr.Number(0.44, label="confidence threshold", show_label=True, minimum=0., maximum=1.0, step=0.1), | |
| gr.Checkbox(True, label="multiple", info="Allow multiple request code numbers"), | |
| gr.Number(3, label="maximum number of request codes", show_label=True, minimum=0, step=1, precision=0) | |
| ], | |
| # type="messages", | |
| chatbot=gr.Chatbot(height=800), | |
| # textbox=gr.Textbox(placeholder="Ask me a yes or no question", container=False, scale=7), | |
| # title="SamSat Virtual Assistant", | |
| # description="Ask Yes Man any question", | |
| # theme="soft", | |
| # examples=["balik nama D 3456 DEF", "bayar pajak B 1234 BCA", "halo, selamat pagi!"], | |
| # cache_examples=True, | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |