Finish-him commited on
Commit
141e8a2
·
verified ·
1 Parent(s): 8c73181

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +353 -0
app.py ADDED
@@ -0,0 +1,353 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ 🚗 Agente DETRAN-RJ - Assistente Virtual
3
+ =========================================
4
+ Assistente virtual do Departamento de Trânsito do Estado do Rio de Janeiro.
5
+ Ajuda cidadãos com informações sobre habilitação, veículos, multas, taxas e serviços.
6
+
7
+ Template Version: 1.0.0
8
+ Based on: Prometheus Agent Pattern
9
+ """
10
+
11
+ import gradio as gr
12
+ import json
13
+ from pathlib import Path
14
+
15
+ # ============================================================================
16
+ # BASE DE CONHECIMENTO
17
+ # ============================================================================
18
+
19
+ class KnowledgeBase:
20
+ """Sistema de busca na base de conhecimento do DETRAN-RJ."""
21
+
22
+ def __init__(self):
23
+ self.faqs = []
24
+ self.faqs_duda = []
25
+ self.loaded = False
26
+ self.load_data()
27
+
28
+ def load_data(self):
29
+ """Carrega as FAQs do arquivo JSON."""
30
+ try:
31
+ # Carrega FAQs gerais
32
+ faqs_path = Path("data/faqs.json")
33
+ if faqs_path.exists():
34
+ with open(faqs_path, "r", encoding="utf-8") as f:
35
+ data = json.load(f)
36
+ self.faqs = data.get("faqs", [])
37
+
38
+ # Carrega FAQs de DUDA/taxas
39
+ duda_path = Path("data/faqs-duda.json")
40
+ if duda_path.exists():
41
+ with open(duda_path, "r", encoding="utf-8") as f:
42
+ data = json.load(f)
43
+ self.faqs_duda = data.get("faqs", [])
44
+
45
+ total = len(self.faqs) + len(self.faqs_duda)
46
+ if total > 0:
47
+ self.loaded = True
48
+ print(f"✅ Carregadas {total} FAQs ({len(self.faqs)} gerais + {len(self.faqs_duda)} DUDA)")
49
+ except Exception as e:
50
+ print(f"⚠️ Erro ao carregar FAQs: {e}")
51
+
52
+ def search(self, query: str) -> str:
53
+ """Busca resposta nas FAQs baseado em palavras-chave."""
54
+ query_lower = query.lower()
55
+ query_words = set(query_lower.split())
56
+
57
+ best_match = None
58
+ best_score = 0
59
+
60
+ # Busca em todas as FAQs
61
+ all_faqs = self.faqs + self.faqs_duda
62
+
63
+ for faq in all_faqs:
64
+ keywords = faq.get("keywords", [])
65
+ question = faq.get("question", "").lower()
66
+
67
+ # Score por keywords
68
+ score = sum(2 for kw in keywords if kw.lower() in query_lower)
69
+ # Score por palavras na pergunta
70
+ score += sum(1 for word in query_words if word in question and len(word) > 3)
71
+
72
+ if score > best_score:
73
+ best_score = score
74
+ best_match = faq.get("answer", "")
75
+
76
+ return best_match if best_score >= 2 else None
77
+
78
+ # Inicializa a base de conhecimento
79
+ kb = KnowledgeBase()
80
+
81
+ # ============================================================================
82
+ # RESPOSTAS PRÉ-DEFINIDAS
83
+ # ============================================================================
84
+
85
+ RESPONSES = {
86
+ "saudacao": """Olá! 👋 Sou o assistente virtual do **DETRAN-RJ**.
87
+
88
+ Posso ajudá-lo com informações sobre:
89
+ - 🚗 **CNH** - Primeira habilitação, renovação, segunda via
90
+ - 🚙 **Veículos** - Licenciamento, transferência, vistoria
91
+ - 🪪 **Identidade** - RG, CIN, segunda via
92
+ - ⚠️ **Multas** - Consulta, recursos, pontuação
93
+ - 💰 **Taxas** - Valores DUDA 2026, formas de pagamento
94
+ - 📍 **Postos** - Localização e agendamento
95
+
96
+ Como posso ajudá-lo hoje?""",
97
+
98
+ "contato": """## 📞 Contatos Oficiais DETRAN-RJ
99
+
100
+ | Canal | Informação |
101
+ |-------|------------|
102
+ | **Site** | [www.detran.rj.gov.br](https://www.detran.rj.gov.br) |
103
+ | **Telefone** | (21) 3460-4040 / 3460-4041 / 3460-4042 |
104
+ | **Horário** | Segunda a sexta, 6h às 21h |
105
+ | **Posto Digital** | Serviços online 24h |
106
+
107
+ Para agendamento de atendimento presencial, acesse o site oficial.""",
108
+
109
+ "primeira_habilitacao": """## 🚗 Primeira Habilitação (CNH)
110
+
111
+ **Requisitos:**
112
+ - Ter no mínimo 18 anos
113
+ - Ser alfabetizado
114
+ - Possuir RG e CPF
115
+
116
+ **Etapas do processo:**
117
+ 1. Abertura do processo no DETRAN ou autoescola
118
+ 2. Exame médico de aptidão física e mental
119
+ 3. Exame psicológico (avaliação psicotécnica)
120
+ 4. Curso teórico-técnico (45 horas/aula)
121
+ 5. Exame teórico sobre legislação
122
+ 6. Curso prático de direção (20 horas/aula)
123
+ 7. Exame prático de direção
124
+
125
+ **Valores 2026:**
126
+ | Item | Valor |
127
+ |------|-------|
128
+ | Taxa DUDA (código 201-1) | R$ 419,55 |
129
+ | Exame médico | R$ 100 a R$ 200 |
130
+ | Exame psicológico | R$ 100 a R$ 200 |
131
+ | Autoescola (média) | R$ 800 a R$ 1.500 |
132
+
133
+ **Custo total estimado:** R$ 1.700 a R$ 2.800""",
134
+
135
+ "renovacao_cnh": """## 🔄 Renovação da CNH
136
+
137
+ **Prazos de validade por idade:**
138
+ | Idade | Validade |
139
+ |-------|----------|
140
+ | Até 49 anos | 10 anos |
141
+ | 50 a 69 anos | 5 anos |
142
+ | 70 anos ou mais | 3 anos |
143
+
144
+ **Como renovar:**
145
+ 1. Agende pelo site do DETRAN-RJ
146
+ 2. Realize o exame médico em clínica credenciada
147
+ 3. Pague a taxa DUDA (código 203-8): **R$ 209,78**
148
+ 4. Aguarde a nova CNH (Correios ou retirada)
149
+
150
+ **Importante:** Inicie o processo até 30 dias antes do vencimento.""",
151
+
152
+ "licenciamento": """## 📋 Licenciamento Anual 2026
153
+
154
+ **Calendário por final de placa:**
155
+ | Final da Placa | Prazo |
156
+ |----------------|-------|
157
+ | 0, 1, 2 | Até 31/05 |
158
+ | 3, 4, 5 | Até 30/06 |
159
+ | 6, 7, 8, 9 | Até 31/07 |
160
+
161
+ **Valor total:** R$ 293,71
162
+ - Taxa de licenciamento: R$ 209,78
163
+ - Emissão CRLV-e: R$ 83,93
164
+
165
+ **Como pagar:**
166
+ - Site do DETRAN-RJ
167
+ - App Carteira Digital de Trânsito (CDT)
168
+ - Rede bancária autorizada
169
+
170
+ O CRLV digital fica disponível automaticamente no app CDT após o pagamento.""",
171
+
172
+ "transferencia": """## 🔄 Transferência de Veículo
173
+
174
+ **Prazo:** 30 dias após a compra
175
+
176
+ **Documentos necessários:**
177
+ - CRV preenchido e assinado (firma reconhecida)
178
+ - RG e CPF do comprador
179
+ - Comprovante de residência
180
+ - Vistoria do veículo
181
+
182
+ **Valores 2026:**
183
+ | Serviço | Código DUDA | Valor |
184
+ |---------|-------------|-------|
185
+ | Transferência | 014-0 | R$ 209,78 |
186
+ | Gravame (se financiado) | 018-3 | R$ 233,09 |
187
+ | Placas Mercosul (veículo) | 037-0 | R$ 240,34 |
188
+ | Placas Mercosul (moto) | 041-8 | R$ 120,17 |
189
+
190
+ **Importante:** O vendedor deve fazer a Comunicação de Venda em até 30 dias.""",
191
+
192
+ "multas": """## ⚠️ Multas e Infrações
193
+
194
+ **Consultar multas:**
195
+ - Site: www.detran.rj.gov.br
196
+ - App: Carteira Digital de Trânsito (CDT)
197
+ - Informe placa e Renavam
198
+
199
+ **Pontuação na CNH:**
200
+ | Gravidade | Pontos |
201
+ |-----------|--------|
202
+ | Leve | 3 pontos |
203
+ | Média | 4 pontos |
204
+ | Grave | 5 pontos |
205
+ | Gravíssima | 7 pontos |
206
+
207
+ **Limite para suspensão:** 40 pontos em 12 meses (ou 20 pontos para PPD)
208
+
209
+ **Prazos para recurso:**
210
+ - Defesa prévia: 30 dias após notificação
211
+ - Recurso JARI: 30 dias após penalidade
212
+ - Recurso CETRAN: 30 dias após decisão JARI""",
213
+
214
+ "duda_valores": """## 💰 Tabela DUDA 2026 - Principais Valores
215
+
216
+ | Serviço | Código | Valor |
217
+ |---------|--------|-------|
218
+ | Primeira habilitação | 201-1 | R$ 419,55 |
219
+ | Reexame (prova) | 202-0 | R$ 156,80 |
220
+ | Renovação CNH | 203-8 | R$ 209,78 |
221
+ | Mudança/adição categoria | 204-6 | R$ 209,78 |
222
+ | Segunda via CNH | 205-4 | R$ 209,78 |
223
+ | Transferência veículo | 014-0 | R$ 209,78 |
224
+ | Gravame/financiamento | 018-3 | R$ 233,09 |
225
+ | Placas Mercosul (veículo) | 037-0 | R$ 240,34 |
226
+ | Placas Mercosul (moto) | 041-8 | R$ 120,17 |
227
+ | PID (internacional) | 207-0 | R$ 209,78 |
228
+
229
+ **Onde pagar:** Banco Bradesco (site ou agência) ou rede autorizada.
230
+ **Prazo compensação:** 48h (Bradesco) ou 96h (outros bancos).""",
231
+
232
+ "identidade": """## 🪪 Carteira de Identidade (CIN/RG)
233
+
234
+ **Documentos necessários:**
235
+ - Certidão de nascimento ou casamento
236
+ - CPF (obrigatório para CIN)
237
+ - Comprovante de residência
238
+
239
+ **Valores:**
240
+ - Primeira via: **Gratuita**
241
+ - Segunda via: Taxa aplicável (exceto roubo/furto com B.O.)
242
+
243
+ **Prazo de entrega:** Até 15 dias úteis
244
+
245
+ **Diferença RG x CIN:**
246
+ A CIN (Carteira de Identidade Nacional) é o novo documento que usa o CPF como número único, tem QR Code e validade nacional. Os RGs antigos são válidos até 2032.
247
+
248
+ **Agendamento:** Site ou app do DETRAN-RJ""",
249
+
250
+ "default": """Obrigado pela sua pergunta!
251
+
252
+ Para informações mais específicas, recomendo:
253
+
254
+ 📱 **Site oficial:** [www.detran.rj.gov.br](https://www.detran.rj.gov.br)
255
+ 📞 **Telefone:** (21) 3460-4040
256
+ 🏢 **Posto Digital:** Serviços online 24h
257
+
258
+ **Posso ajudar com:**
259
+ - CNH (renovação, primeira habilitação, segunda via)
260
+ - Veículos (licenciamento, transferência, vistoria)
261
+ - Identidade (RG, CIN)
262
+ - Multas e infrações
263
+ - Taxas e valores DUDA 2026
264
+ - Localização de postos
265
+
266
+ Como posso ajudá-lo?"""
267
+ }
268
+
269
+ # ============================================================================
270
+ # DETECÇÃO DE INTENÇÃO
271
+ # ============================================================================
272
+
273
+ INTENT_KEYWORDS = {
274
+ "saudacao": ["olá", "oi", "hello", "hi", "bom dia", "boa tarde", "boa noite", "hey", "opa"],
275
+ "contato": ["telefone", "contato", "endereço", "horário", "site", "falar com"],
276
+ "primeira_habilitacao": ["primeira habilitação", "tirar carteira", "tirar cnh", "primeira cnh", "como tirar"],
277
+ "renovacao_cnh": ["renovar", "renovação", "vencida", "vencimento cnh", "prazo cnh"],
278
+ "licenciamento": ["licenciamento", "licenciar", "crlv", "documento do carro", "calendario"],
279
+ "transferencia": ["transferir", "transferência", "comprei carro", "vender carro", "comunicação de venda"],
280
+ "multas": ["multa", "infração", "pontos", "recurso", "jari", "suspensão", "lei seca"],
281
+ "duda_valores": ["duda", "valor", "preço", "quanto custa", "taxa", "tabela", "código"],
282
+ "identidade": ["identidade", "rg", "cin", "documento", "carteira de identidade"],
283
+ }
284
+
285
+ def detect_intent(message: str) -> str:
286
+ """Detecta a intenção do usuário baseado em palavras-chave."""
287
+ msg = message.lower()
288
+
289
+ for intent, keywords in INTENT_KEYWORDS.items():
290
+ if any(kw in msg for kw in keywords):
291
+ return intent
292
+
293
+ return "default"
294
+
295
+ # ============================================================================
296
+ # FUNÇÃO DE RESPOSTA
297
+ # ============================================================================
298
+
299
+ def respond(message: str, history: list) -> str:
300
+ """Gera resposta para o chatbot."""
301
+ if not message or not message.strip():
302
+ return "Por favor, digite uma mensagem para que eu possa ajudá-lo."
303
+
304
+ # Detecta intenção
305
+ intent = detect_intent(message)
306
+
307
+ # Se for default, tenta buscar nas FAQs
308
+ if intent == "default" and kb.loaded:
309
+ faq_response = kb.search(message)
310
+ if faq_response:
311
+ return faq_response
312
+
313
+ # Retorna resposta pré-definida
314
+ return RESPONSES.get(intent, RESPONSES["default"])
315
+
316
+ # ============================================================================
317
+ # INTERFACE GRADIO
318
+ # ============================================================================
319
+
320
+ EXAMPLES = [
321
+ "Olá!",
322
+ "Como tirar a primeira habilitação?",
323
+ "Quanto custa renovar a CNH?",
324
+ "Qual o prazo do licenciamento 2026?",
325
+ "Como transferir um veículo?",
326
+ "Quais os valores do DUDA 2026?",
327
+ "Como consultar multas?",
328
+ "Como tirar a carteira de identidade?",
329
+ ]
330
+
331
+ demo = gr.ChatInterface(
332
+ fn=respond,
333
+ title="🚗 Agente DETRAN-RJ",
334
+ description="""**Assistente Virtual do Departamento de Trânsito do Rio de Janeiro**
335
+
336
+ Posso ajudar com informações sobre CNH, veículos, multas, taxas DUDA e serviços.
337
+
338
+ 📞 **Contato:** (21) 3460-4040 | 🌐 **Site:** [www.detran.rj.gov.br](https://www.detran.rj.gov.br)""",
339
+ examples=EXAMPLES,
340
+ theme=gr.themes.Soft(
341
+ primary_hue="blue",
342
+ secondary_hue="green",
343
+ ),
344
+ retry_btn=None,
345
+ undo_btn=None,
346
+ )
347
+
348
+ # ============================================================================
349
+ # EXECUÇÃO
350
+ # ============================================================================
351
+
352
+ if __name__ == "__main__":
353
+ demo.launch()