1na37 commited on
Commit
91f1cea
·
verified ·
1 Parent(s): c087d78

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +111 -90
app.py CHANGED
@@ -1493,9 +1493,22 @@ CARA BERPIKIR — CHAIN OF THOUGHT (lakukan ini secara SILENT sebelum menjawab):
1493
  def _t(i, e, h):
1494
  return {'id': i, 'en': e, 'hi': h}[lang]
1495
 
 
 
 
 
 
 
 
 
 
 
 
1496
  # ① Who is Maya / greetings
1497
- if any(w in low for w in ['siapa','kamu','km','who are you','nama','you are','maya',
1498
- 'halo','hai','hei','hello','hi','perkenalan']):
 
 
1499
  response = _t(
1500
  "Hei! Aku **Maya**, AI Credit Advisor kamu Aku dirancang untuk bantu kamu pahami skor kredit dan strategi bisnis UMKM. "
1501
  "Skor PD kamu sekarang **" + str(round(pd_pct,1)) + "%** — " +
@@ -1532,6 +1545,94 @@ CARA BERPIKIR — CHAIN OF THOUGHT (lakukan ini secara SILENT sebelum menjawab):
1532
  adjustments['digital_presence_score'] = 75
1533
  adjustments['monthly_cash_flow'] = 25000000
1534
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1535
  # ③ How to improve / lower PD → triggers sliders
1536
  elif any(w in low for w in ['improve','better','lower','reduce','tingkatkan','kurangi',
1537
  'turunkan','cara','gimana','bagaimana','naik','turun',
@@ -1576,8 +1677,11 @@ CARA BERPIKIR — CHAIN OF THOUGHT (lakukan ini secara SILENT sebelum menjawab):
1576
  )
1577
 
1578
  # ④ Why high score / SHAP factors — CoT picks actual SHAP values
1579
- elif any(w in low for w in ['why','kenapa','mengapa','factor','faktor','shap','pengaruh',
1580
- 'driver','apa yang','jelasin','jelaskan','explain','definisi']):
 
 
 
1581
  ti = int(np.argsort(np.abs(shap_vals))[-1])
1582
  ti2 = int(np.argsort(np.abs(shap_vals))[-2])
1583
  fn = feature_names[ti]
@@ -1632,7 +1736,8 @@ CARA BERPIKIR — CHAIN OF THOUGHT (lakukan ini secara SILENT sebelum menjawab):
1632
  )
1633
 
1634
  # ⑤ Ideal loan amount → trigger loan_rp slider
1635
- elif any(w in low for w in ['pinjaman','loan','kredit','berapa','amount','besar',
 
1636
  'limit','ideal','rekomendasi pinjaman']):
1637
  if cf > 0:
1638
  dur_val = raw_input.get('duration', 24)
@@ -1663,40 +1768,6 @@ CARA BERPIKIR — CHAIN OF THOUGHT (lakukan ini secara SILENT sebelum menjawab):
1663
  "Sahi sujhaav ke liye pehle maasik naqad pravaah bharein!"
1664
  )
1665
 
1666
- # ⑥ Digital score targeted question → trigger slider
1667
- elif any(w in low for w in ['digital score','skor digital','digital presence',
1668
- 'naikin digital','naik digital','digital jadi','digital ke']):
1669
- target = 80
1670
- try:
1671
- nums = re.findall(r'\d+', user_msg)
1672
- if nums:
1673
- target = int(nums[-1])
1674
- except Exception:
1675
- pass
1676
- target = max(1, min(100, target))
1677
- adjustments['digital_presence_score'] = target
1678
- cur_dig = raw_input.get('digital_presence_score', 0)
1679
- response = _t(
1680
- "Digital score **" + str(cur_dig) + " → " + str(target) + "** sudah aku set di What-If!\n\n"
1681
- "Cara naik digital score:\n"
1682
- "1. **Google Business Profile** — verifikasi & lengkapi info\n"
1683
- "2. **Aktif di marketplace** — Tokopedia/Shopee/TikTok Shop\n"
1684
- "3. **Media sosial konsisten** — posting minimal 3x/minggu\n\n"
1685
- "Cek tab What-If untuk lihat dampak ke PD!",
1686
- "Digital score **" + str(cur_dig) + " → " + str(target) + "** set in What-If!\n\n"
1687
- "Ways to improve:\n"
1688
- "1. **Google Business Profile** — verify & complete\n"
1689
- "2. **Active marketplace** — Tokopedia/Shopee/TikTok Shop\n"
1690
- "3. **Consistent social media** — post 3x/week\n\n"
1691
- "Check the What-If tab for PD impact!",
1692
- "Digital score **" + str(cur_dig) + " → " + str(target) + "** What-If mein set!\n\n"
1693
- "Sudhaar ke tarike:\n"
1694
- "1. Google Business Profile verify karein\n"
1695
- "2. Marketplace active rahein\n"
1696
- "3. Social media niyamit rahein\n\n"
1697
- "What-If tab mein PD prabhav dekhein!"
1698
- )
1699
-
1700
  # ⑦ Savings / cash flow topics
1701
  elif any(w in low for w in ['tabungan','saving','nabung','menabung','savings',
1702
  'uang','keuangan','finance','financial','simpan']):
@@ -1723,6 +1794,7 @@ CARA BERPIKIR — CHAIN OF THOUGHT (lakukan ini secara SILENT sebelum menjawab):
1723
  adjustments['monthly_cash_flow'] = int(cf * 1.3)
1724
 
1725
  # ⑧ Credit history
 
1726
  elif any(w in low for w in ['riwayat kredit','credit history','kredit history',
1727
  'credit record','riwayat','history kredit']):
1728
  ch_val = raw_input.get('credit_history', '-')
@@ -1779,57 +1851,6 @@ CARA BERPIKIR — CHAIN OF THOUGHT (lakukan ini secara SILENT sebelum menjawab):
1779
  if dig < 75:
1780
  adjustments['digital_presence_score'] = 75
1781
 
1782
- # ⑩ Humor: absurd / animal / 6-month plan — CoT robustness
1783
- elif any(w in low for w in ['beruang','maling','jerapah','babi','kucing','lucu',
1784
- 'absurd','random','hewan','binatang']):
1785
- response = _t(
1786
- "Haha, oke oke! 😄 Tapi balik ke topik serius — bahkan si beruang pun butuh skor kredit bagus buat pinjam madu dari bank!\n\n"
1787
- "Profil kamu: PD **" + str(round(pd_pct,1)) + "%** — " +
1788
- ('udah bagus banget nih!' if pd_pct < 20 else 'masih ada yang bisa diperbaiki.') +
1789
- " Ada yang mau ditanyain soal kredit atau bisnis?",
1790
- "Haha, fair enough! 😄 But back to business — even a bear needs good credit to borrow honey from the bank!\n\n"
1791
- "Your profile: PD **" + str(round(pd_pct,1)) + "%** — " +
1792
- ('already looking great!' if pd_pct < 20 else 'some room to improve.') +
1793
- " Anything credit or business related?",
1794
- "Haha, theek hai! 😄 Lekin credit ki baat karein — bhaaloo ko bhi bank se madhu udhaarne ke liye achha score chahiye!\n\n"
1795
- "Aapka PD **" + str(round(pd_pct,1)) + "%** — " +
1796
- ('pehle se badhiya!' if pd_pct < 20 else 'kuch sudhaar ho sakta hai.') +
1797
- " Kuch aur poochna hai?"
1798
- )
1799
-
1800
- # ⑪ 6-month action plan
1801
- elif any(w in low for w in ['6 bulan','rencana','plan','action plan','ke depan',
1802
- 'persiapan','apply lagi','sebelum apply']):
1803
- rec_items = []
1804
- if not npwp:
1805
- rec_items.append(_t(
1806
- "**Bulan 1**: Urus NPWP di pajak.go.id (gratis, 1-3 hari)",
1807
- "**Month 1**: Register NPWP at pajak.go.id (free, 1-3 days)",
1808
- "**Maah 1**: NPWP register karein pajak.go.id par"
1809
- ))
1810
- if dig < 60:
1811
- rec_items.append(_t(
1812
- "**Bulan 1-2**: Aktifkan Google Business + daftar marketplace",
1813
- "**Month 1-2**: Activate Google Business + register on marketplace",
1814
- "**Maah 1-2**: Google Business activate + marketplace register karein"
1815
- ))
1816
- if cf < 15e6:
1817
- rec_items.append(_t(
1818
- "**Bulan 2-4**: Pisah rekening bisnis, dokumentasi semua pemasukan",
1819
- "**Month 2-4**: Separate business account, document all income",
1820
- "**Maah 2-4**: Vyapaar khaata alag karein, sabhi aay document karein"
1821
- ))
1822
- rec_items.append(_t(
1823
- "**Bulan 5-6**: Simulasikan ulang di What-If, ajukan kredit jika PD < 20%",
1824
- "**Month 5-6**: Re-simulate in What-If, apply when PD < 20%",
1825
- "**Maah 5-6**: What-If mein re-simulate karein, PD < 20% ho tab apply karein"
1826
- ))
1827
- response = _t(
1828
- "Action plan 6 bulan buat kamu (PD sekarang **" + str(round(pd_pct,1)) + "%**):\n\n",
1829
- "6-month action plan (current PD **" + str(round(pd_pct,1)) + "%**):\n\n",
1830
- "6 maah ka plan (abhi PD **" + str(round(pd_pct,1)) + "%**):\n\n"
1831
- ) + '\n'.join(rec_items[:4])
1832
-
1833
  # ⑫ Generic fallback
1834
  else:
1835
  top_issue = _get_top_issue(raw_input, pd_pct, lang)
 
1493
  def _t(i, e, h):
1494
  return {'id': i, 'en': e, 'hi': h}[lang]
1495
 
1496
+ # Helper: word-boundary check for short keywords (avoids 'hi' matching 'mempengaruhi')
1497
+ def _kw(msg_low, word_list):
1498
+ for w in word_list:
1499
+ if len(w) <= 3:
1500
+ if re.search(r'\b' + re.escape(w) + r'\b', msg_low):
1501
+ return True
1502
+ else:
1503
+ if w in msg_low:
1504
+ return True
1505
+ return False
1506
+
1507
  # ① Who is Maya / greetings
1508
+ # FIXED: removed 'kamu','km' (too broad — appears in almost every sentence)
1509
+ # FIXED: 'hi','hei','hai' use word-boundary via _kw helper
1510
+ if _kw(low, ['siapa','who are you','perkenalan','halo','hello','hei','hai','hi',
1511
+ 'maya','nama kamu','you are']):
1512
  response = _t(
1513
  "Hei! Aku **Maya**, AI Credit Advisor kamu Aku dirancang untuk bantu kamu pahami skor kredit dan strategi bisnis UMKM. "
1514
  "Skor PD kamu sekarang **" + str(round(pd_pct,1)) + "%** — " +
 
1545
  adjustments['digital_presence_score'] = 75
1546
  adjustments['monthly_cash_flow'] = 25000000
1547
 
1548
+ # ⑥ Digital score targeted — MOVED UP before ③ and ⑤
1549
+ # FIXED: was after ③improve which had 'naik' catching 'naikin digital score'
1550
+ elif any(w in low for w in ['digital score','skor digital','digital presence',
1551
+ 'naikin digital','naik digital','digital jadi','digital ke']):
1552
+ target = 80
1553
+ try:
1554
+ nums = re.findall(r'\d+', user_msg)
1555
+ if nums:
1556
+ target = int(nums[-1])
1557
+ except Exception:
1558
+ pass
1559
+ target = max(1, min(100, target))
1560
+ adjustments['digital_presence_score'] = target
1561
+ cur_dig = raw_input.get('digital_presence_score', 0)
1562
+ response = _t(
1563
+ "Digital score **" + str(cur_dig) + " → " + str(target) + "** sudah aku set di What-If!\n\n"
1564
+ "Cara naik digital score:\n"
1565
+ "1. **Google Business Profile** — verifikasi & lengkapi info\n"
1566
+ "2. **Aktif di marketplace** — Tokopedia/Shopee/TikTok Shop\n"
1567
+ "3. **Media sosial konsisten** — posting minimal 3x/minggu\n\n"
1568
+ "Cek tab What-If untuk lihat dampak ke PD!",
1569
+ "Digital score **" + str(cur_dig) + " → " + str(target) + "** set in What-If!\n\n"
1570
+ "Ways to improve:\n"
1571
+ "1. **Google Business Profile** — verify & complete\n"
1572
+ "2. **Active marketplace** — Tokopedia/Shopee/TikTok Shop\n"
1573
+ "3. **Consistent social media** — post 3x/week\n\n"
1574
+ "Check the What-If tab for PD impact!",
1575
+ "Digital score **" + str(cur_dig) + " → " + str(target) + "** What-If mein set!\n\n"
1576
+ "Sudhaar ke tarike:\n"
1577
+ "1. Google Business Profile verify karein\n"
1578
+ "2. Marketplace active rahein\n"
1579
+ "3. Social media niyamit rahein\n\n"
1580
+ "What-If tab mein PD prabhav dekhein!"
1581
+ )
1582
+
1583
+ # ⑩ Humor/absurd — MOVED UP before ⑤loan
1584
+ # FIXED: 'kredit' in ⑤loan was catching "beruang... minta kredit bisa gak?"
1585
+ elif any(w in low for w in ['beruang','maling','jerapah','babi','kucing','lucu',
1586
+ 'absurd','random','hewan','binatang','gajah','dinosaurus']):
1587
+ response = _t(
1588
+ "Haha, oke oke! 😄 Tapi balik ke topik serius — bahkan si beruang pun butuh skor kredit bagus buat pinjam madu dari bank!\n\n"
1589
+ "Profil kamu: PD **" + str(round(pd_pct,1)) + "%** — " +
1590
+ ('udah bagus banget nih!' if pd_pct < 20 else 'masih ada yang bisa diperbaiki.') +
1591
+ " Ada yang mau ditanyain soal kredit atau bisnis?",
1592
+ "Haha, fair enough! 😄 But back to business — even a bear needs good credit to borrow honey from the bank!\n\n"
1593
+ "Your profile: PD **" + str(round(pd_pct,1)) + "%** — " +
1594
+ ('already looking great!' if pd_pct < 20 else 'some room to improve.') +
1595
+ " Anything credit or business related?",
1596
+ "Haha, theek hai! 😄 Lekin credit ki baat karein — bhaaloo ko bhi bank se madhu udhaarne ke liye achha score chahiye!\n\n"
1597
+ "Aapka PD **" + str(round(pd_pct,1)) + "%** — " +
1598
+ ('pehle se badhiya!' if pd_pct < 20 else 'kuch sudhaar ho sakta hai.') +
1599
+ " Kuch aur poochna hai?"
1600
+ )
1601
+
1602
+ # ⑪ 6-month action plan — MOVED UP before ④shap
1603
+ # FIXED: 'apa yang perlu' was triggering ④shap via 'apa yang' substring
1604
+ elif any(w in low for w in ['6 bulan','rencana','plan','action plan','ke depan',
1605
+ 'persiapan','apply lagi','sebelum apply']):
1606
+ rec_items = []
1607
+ if not npwp:
1608
+ rec_items.append(_t(
1609
+ "**Bulan 1**: Urus NPWP di pajak.go.id (gratis, 1-3 hari)",
1610
+ "**Month 1**: Register NPWP at pajak.go.id (free, 1-3 days)",
1611
+ "**Maah 1**: NPWP register karein pajak.go.id par"
1612
+ ))
1613
+ if dig < 60:
1614
+ rec_items.append(_t(
1615
+ "**Bulan 1-2**: Aktifkan Google Business + daftar marketplace",
1616
+ "**Month 1-2**: Activate Google Business + register on marketplace",
1617
+ "**Maah 1-2**: Google Business activate + marketplace register karein"
1618
+ ))
1619
+ if cf < 15e6:
1620
+ rec_items.append(_t(
1621
+ "**Bulan 2-4**: Pisah rekening bisnis, dokumentasi semua pemasukan",
1622
+ "**Month 2-4**: Separate business account, document all income",
1623
+ "**Maah 2-4**: Vyapaar khaata alag karein, sabhi aay document karein"
1624
+ ))
1625
+ rec_items.append(_t(
1626
+ "**Bulan 5-6**: Simulasikan ulang di What-If, ajukan kredit jika PD < 20%",
1627
+ "**Month 5-6**: Re-simulate in What-If, apply when PD < 20%",
1628
+ "**Maah 5-6**: What-If mein re-simulate karein, PD < 20% ho tab apply karein"
1629
+ ))
1630
+ response = _t(
1631
+ "Action plan 6 bulan buat kamu (PD sekarang **" + str(round(pd_pct,1)) + "%**):\n\n",
1632
+ "6-month action plan (current PD **" + str(round(pd_pct,1)) + "%**):\n\n",
1633
+ "6 maah ka plan (abhi PD **" + str(round(pd_pct,1)) + "%**):\n\n"
1634
+ ) + '\n'.join(rec_items[:4])
1635
+
1636
  # ③ How to improve / lower PD → triggers sliders
1637
  elif any(w in low for w in ['improve','better','lower','reduce','tingkatkan','kurangi',
1638
  'turunkan','cara','gimana','bagaimana','naik','turun',
 
1677
  )
1678
 
1679
  # ④ Why high score / SHAP factors — CoT picks actual SHAP values
1680
+ # FIXED: removed 'apa yang' (matched 'berapa yang'), 'factor' (too broad)
1681
+ # Use specific phrases instead
1682
+ elif any(w in low for w in ['why','kenapa','mengapa','shap','pengaruh','faktor risiko',
1683
+ 'driver','jelasin','jelaskan','explain','definisi',
1684
+ 'kenapa skor','mengapa skor','yang mempengaruhi','apa penyebab']):
1685
  ti = int(np.argsort(np.abs(shap_vals))[-1])
1686
  ti2 = int(np.argsort(np.abs(shap_vals))[-2])
1687
  fn = feature_names[ti]
 
1736
  )
1737
 
1738
  # ⑤ Ideal loan amount → trigger loan_rp slider
1739
+ # FIXED: removed 'besar' (too broad); ⑥digit and ⑩humor now come before this
1740
+ elif any(w in low for w in ['pinjaman','loan','kredit','berapa','amount',
1741
  'limit','ideal','rekomendasi pinjaman']):
1742
  if cf > 0:
1743
  dur_val = raw_input.get('duration', 24)
 
1768
  "Sahi sujhaav ke liye pehle maasik naqad pravaah bharein!"
1769
  )
1770
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1771
  # ⑦ Savings / cash flow topics
1772
  elif any(w in low for w in ['tabungan','saving','nabung','menabung','savings',
1773
  'uang','keuangan','finance','financial','simpan']):
 
1794
  adjustments['monthly_cash_flow'] = int(cf * 1.3)
1795
 
1796
  # ⑧ Credit history
1797
+
1798
  elif any(w in low for w in ['riwayat kredit','credit history','kredit history',
1799
  'credit record','riwayat','history kredit']):
1800
  ch_val = raw_input.get('credit_history', '-')
 
1851
  if dig < 75:
1852
  adjustments['digital_presence_score'] = 75
1853
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1854
  # ⑫ Generic fallback
1855
  else:
1856
  top_issue = _get_top_issue(raw_input, pd_pct, lang)