Spaces:
Sleeping
Sleeping
| import os | |
| import gradio as gr | |
| from huggingface_hub import InferenceClient | |
| import json | |
| HF_TOKEN = os.getenv("HF_TOKEN") | |
| client = InferenceClient( | |
| model="google/gemma-2-9b-it", | |
| token=HF_TOKEN | |
| ) | |
| # Seu AGENTE_JSON completo | |
| AGENTE_JSON = """ | |
| { | |
| "nome_agente": "IndenizaAI", | |
| "objetivo": "Calcular indenizações trabalhistas automaticamente usando TODOS os dados fornecidos pelo usuário, sem solicitar informações adicionais quando já estiverem presentes.", | |
| "regras_gerais": [ | |
| "Nunca pedir informações extras se os dados já incluem idade, renda, data do acidente, sequelas, custos médicos, tempo de afastamento e dados contratuais.", | |
| "Sempre realizar TODOS os cálculos com base SOMENTE nos dados enviados pelo usuário.", | |
| "Se algum dado realmente estiver faltando, pedir apenas o dado específico e uma única vez.", | |
| "Nunca repetir perguntas já respondidas pelo usuário.", | |
| "Nunca devolver a responsabilidade do cálculo ao usuário." | |
| ], | |
| "calculos_obrigatorios": [ | |
| "Cálculo de pensão mensal (sem projetar valor vitalício total)", | |
| "Cálculo de danos morais", | |
| "Cálculo de danos estéticos", | |
| "Cálculo de danos materiais", | |
| "Cálculo de lucros cessantes", | |
| "Tabela final com todos os valores calculados", | |
| "Total geral da indenização" | |
| ], | |
| "comportamento_resposta": { | |
| "estilo": "técnico, claro e organizado", | |
| "estrutura": [ | |
| "👉 Resumo inicial do caso", | |
| "👉 Tabela detalhada de cada cálculo", | |
| "👉 Total geral", | |
| "👉 Fundamentação jurídica resumida" | |
| ], | |
| "proibicoes": [ | |
| "Não pedir dados que já estão no texto do usuário", | |
| "Não afirmar que faltam informações quando elas já foram fornecidas", | |
| "Não delegar cálculos ao usuário" | |
| ] | |
| } | |
| } | |
| """ | |
| # Campos que queremos armazenar do usuário | |
| CAMPOS_NECESSARIOS = [ | |
| "nome_trabalhador", "idade", "cargo", "tempo_servico", | |
| "renda_mensal", "contrato_trabalho", | |
| "data_acidente", "tipo_acidente", "descricao_acidente", "tempo_afastamento", | |
| "sequelas", "custos_medicos", "perda_capacidade", | |
| "gastos_tratamento", "perda_rendimentos" | |
| ] | |
| # Armazenamento em memória (pode ser substituído por DB) | |
| usuarios_dados = {} | |
| def montar_mensagem_usuario(msg, dados_completos): | |
| return ( | |
| "Você é o IndenizaAI.\n" | |
| "Siga integralmente todas as instruções do JSON abaixo:\n" | |
| "### CONFIGURAÇÃO DO AGENTE ###\n" | |
| + AGENTE_JSON + | |
| "\n### DADOS COLETADOS DO USUÁRIO ###\n" | |
| + json.dumps(dados_completos, indent=2) + | |
| "\n### MENSAGEM DO USUÁRIO ###\n" | |
| + msg + | |
| "\n### INSTRUÇÃO CRÍTICA ###\n" | |
| "- Se o usuário fornecer dados suficientes, execute TODOS os cálculos automaticamente.\n" | |
| "- Se faltar algum dado, peça apenas o que estiver faltando.\n" | |
| "- Sempre incluir cálculos de pensão vitalícia, danos morais, estéticos e materiais.\n" | |
| "- Sempre entregar uma tabela final e o total geral da indenização.\n" | |
| "Responda como **IndenizaAI**." | |
| ) | |
| def verificar_dados_completos(dados): | |
| faltando = [campo for campo in CAMPOS_NECESSARIOS if campo not in dados or not dados[campo]] | |
| return faltando | |
| def responder(mensagem, historico, usuario_id="default"): | |
| # Recupera dados armazenados do usuário | |
| dados_usuario = usuarios_dados.get(usuario_id, {}) | |
| # Tenta atualizar dados a partir de JSON enviado pelo usuário | |
| try: | |
| dados_parciais = json.loads(mensagem) | |
| dados_usuario.update(dados_parciais) | |
| except: | |
| pass # mensagem normal, sem dados estruturados | |
| usuarios_dados[usuario_id] = dados_usuario | |
| faltando = verificar_dados_completos(dados_usuario) | |
| if faltando: | |
| resposta = f"⚠️ Ainda faltam os seguintes dados para realizar o cálculo: {', '.join(faltando)}" | |
| else: | |
| prompt = montar_mensagem_usuario(mensagem, dados_usuario) | |
| messages = [ | |
| {"role": "system", "content": "Você é o IndenizaAI, especialista em cálculos de indenizações trabalhistas."}, | |
| {"role": "user", "content": prompt} | |
| ] | |
| result = client.chat_completion( | |
| messages=messages, | |
| max_tokens=1200, | |
| temperature=0.1, | |
| top_p=0.9 | |
| ) | |
| resposta = result.choices[0].message["content"] | |
| historico.append({"role": "user", "content": mensagem}) | |
| historico.append({"role": "assistant", "content": resposta}) | |
| return historico, "" | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## ⚖️ IndenizaAI — Assistente Jurídico Especializado") | |
| chat = gr.Chatbot(type="messages") | |
| inp = gr.Textbox(label="Digite sua mensagem") | |
| inp.submit(responder, [inp, chat], [chat, inp]) | |
| demo.launch() | |