| """ |
| app.py - Agente CBMGO - Interface Principal Gradio |
| Sistema Inteligente de Prevencao de Incendio - NT-01/2025 |
| CERCON - Corpo de Bombeiros Militar de Goias |
| """ |
|
|
| import gradio as gr |
| import math |
| from datetime import datetime |
|
|
| |
| try: |
| from modules.classificador import ClassificadorOcupacao |
| _classificador = ClassificadorOcupacao() |
| USE_CLASSIFICADOR = True |
| except Exception as e: |
| print(f"[WARN] Modulo classificador nao disponivel: {e}") |
| USE_CLASSIFICADOR = False |
|
|
| try: |
| from modules.calculadora import CalculadoraIncendio |
| _calculadora = CalculadoraIncendio() |
| USE_CALCULADORA = True |
| except Exception as e: |
| print(f"[WARN] Modulo calculadora nao disponivel: {e}") |
| USE_CALCULADORA = False |
|
|
| try: |
| from modules.rag_normas import RAGNormas |
| _rag = RAGNormas() |
| USE_RAG = True |
| except Exception as e: |
| print(f"[WARN] Modulo RAG nao disponivel: {e}") |
| USE_RAG = False |
|
|
| try: |
| from modules.auditor import AuditorProjetos |
| _auditor = AuditorProjetos() |
| USE_AUDITOR = True |
| except Exception as e: |
| print(f"[WARN] Modulo auditor nao disponivel: {e}") |
| USE_AUDITOR = False |
|
|
| try: |
| from modules.memorial_generator import MemorialGenerator |
| _memorial = MemorialGenerator() |
| USE_MEMORIAL = True |
| except Exception as e: |
| print(f"[WARN] Modulo memorial nao disponivel: {e}") |
| USE_MEMORIAL = False |
|
|
| try: |
| from modules.submissao import SubmissaoSIAPI |
| _submissao = SubmissaoSIAPI() |
| USE_SUBMISSAO = True |
| except Exception as e: |
| print(f"[WARN] Modulo submissao nao disponivel: {e}") |
| USE_SUBMISSAO = False |
|
|
|
|
| |
| |
| |
|
|
| GRUPOS_OCUPACAO = { |
| "A-1": "Residencial unifamiliar (casa, sobrado)", |
| "A-2": "Residencial multifamiliar (apartamento, flat)", |
| "B-1": "Hospedagem transitoria (hotel, motel, pousada)", |
| "B-2": "Hospedagem longa permanencia (apart-hotel)", |
| "C-1": "Comercio pequeno porte (loja, farmacia, padaria)", |
| "C-2": "Comercio medio/grande porte (supermercado, shopping)", |
| "D-1": "Reuniao publica - esporte/lazer (ginasio, estadio)", |
| "D-2": "Reuniao publica - cultura/religiao (teatro, igreja)", |
| "D-3": "Reuniao publica - ensino (escola, universidade)", |
| "E-1": "Saude e assistencia (hospital, clinica, UBS)", |
| "F-1": "Servico profissional (escritorio, banco, consultorio)", |
| "F-2": "Servico de transporte (aeroporto, rodoviaria)", |
| "G-1": "Servicos automotivos (garagem, posto, oficina)", |
| "H-1": "Industrial baixo risco (alimenticio, textil)", |
| "H-2": "Industrial medio risco (metalurgica, moveleira)", |
| "H-3": "Industrial alto risco (quimica, petroquimica)", |
| "I-1": "Deposito baixo risco (arquivo, papel)", |
| "I-2": "Deposito medio risco (madeira, borracha)", |
| "I-3": "Deposito alto risco (inflamaveis, quimicos)", |
| "J-1": "Explosivos e inflamaveis especiais (refinaria)", |
| } |
|
|
|
|
| def calcular_extintores_fallback(area_m2, grupo): |
| letra = grupo.split("-")[0] if "-" in grupo else grupo[0] |
| risco = "alto" if letra in ["H","I","J"] else ("medio" if letra in ["C","D","G"] else "baixo") |
| area_por_ext = 150 if risco == "alto" else (250 if risco == "medio" else 500) |
| quantidade = max(2, math.ceil(area_m2 / area_por_ext)) |
| return { |
| "risco": risco, "area_por_extintor": area_por_ext, |
| "quantidade": quantidade, "tipo": "ABC 6kg" |
| } |
|
|
|
|
| def verificar_sistemas_fallback(area_m2, pavimentos, grupo): |
| altura = pavimentos * 3.0 |
| letra = grupo.split("-")[0] if "-" in grupo else grupo[0] |
| return { |
| "hidrante": area_m2 > 750 or pavimentos >= 3, |
| "spda": altura > 15 or area_m2 > 1000, |
| "iluminacao_emergencia": area_m2 > 200 or pavimentos >= 2, |
| "sprinkler": altura > 30 or (letra in ["H","I"] and area_m2 > 2500), |
| "brigada": area_m2 > 750, |
| "alarme": letra in ["E","B"] or area_m2 > 1500, |
| } |
|
|
|
|
| |
| |
| |
|
|
| def calcular_medidas(area_m2, pavimentos, grupo_codigo): |
| """Calcula todas as medidas de seguranca para a edificacao""" |
| try: |
| if USE_CALCULADORA: |
| return _calculadora.calcular_completo(area_m2, pavimentos, grupo_codigo) |
| except Exception as e: |
| print(f"Erro no modulo calculadora: {e}") |
| |
| |
| ext = calcular_extintores_fallback(area_m2, grupo_codigo) |
| sis = verificar_sistemas_fallback(area_m2, pavimentos, grupo_codigo) |
| altura = pavimentos * 3.0 |
| |
| resultado = f"""CALCULOS DE SEGURANCA CONTRA INCENDIO - NT-01/2025 CBMGO |
| {"="*60} |
| |
| EDIFICACAO: |
| Grupo de Ocupacao: {grupo_codigo} |
| Area Total: {area_m2:.1f} m2 |
| Pavimentos: {pavimentos} |
| Altura Estimada: {altura:.1f} m |
| Risco: {ext["risco"].upper()} |
| |
| EXTINTORES DE INCENDIO: |
| Quantidade minima: {ext["quantidade"]} extintores |
| Tipo: {ext["tipo"]} (Classe ABC) |
| Area por extintor: {ext["area_por_extintor"]} m2 |
| Base: ABNT NBR 12693 |
| |
| SISTEMAS OBRIGATORIOS: |
| Hidrantes/Mangotinhos: {"OBRIGATORIO" if sis["hidrante"] else "Nao obrigatorio"} |
| SPDA (Para-raios): {"OBRIGATORIO" if sis["spda"] else "Verificar necessidade"} |
| Iluminacao Emergencia: {"OBRIGATORIA" if sis["iluminacao_emergencia"] else "Recomendada"} |
| Sprinklers: {"OBRIGATORIO" if sis["sprinkler"] else "Nao obrigatorio para esta area"} |
| Brigada de Incendio: {"OBRIGATORIA" if sis["brigada"] else "Recomendada"} |
| Sistema de Alarme: {"OBRIGATORIO" if sis["alarme"] else "Verificar necessidade"} |
| |
| SAIDAS DE EMERGENCIA (ABNT NBR 9077): |
| Largura minima: 1,20 m |
| Distancia maxima: 30 m (baixo risco) / 20 m (alto risco) |
| |
| {"="*60} |
| Nota: Estes calculos sao estimativas. O PPCI completo deve ser |
| elaborado por profissional habilitado com ART/RRT registrada. |
| Data: {datetime.now().strftime("%d/%m/%Y %H:%M")}""" |
| |
| return resultado |
|
|
|
|
| def consultar_normas(pergunta): |
| """Consulta o RAG de normas NT-01/2025""" |
| if not pergunta.strip(): |
| return "Por favor, digite uma pergunta sobre as normas de prevencao de incendio." |
| |
| try: |
| if USE_RAG: |
| return _rag.consultar(pergunta) |
| except Exception as e: |
| print(f"Erro no modulo RAG: {e}") |
| |
| |
| pergunta_lower = pergunta.lower() |
| |
| if any(w in pergunta_lower for w in ["extintor", "extintores"]): |
| return """EXTINTORES DE INCENDIO - NT-01/2025 CBMGO |
| |
| Conforme NT-01/2025 e ABNT NBR 12693: |
| - BAIXO RISCO (A, B, F): 1 extintor a cada 500 m2 |
| - MEDIO RISCO (C, D, G): 1 extintor a cada 250 m2 |
| - ALTO RISCO (H, I, J): 1 extintor a cada 150 m2 |
| - Minimo: 2 extintores por pavimento |
| - Tipo: ABC (po quimico) para uso geral |
| - Manutencao: Anual obrigatoria |
| - Sinalizar conforme ABNT NBR 13434""" |
| |
| elif any(w in pergunta_lower for w in ["hidrante", "hidrantes"]): |
| return """SISTEMA DE HIDRANTES - NT-01/2025 CBMGO |
| |
| Obrigatorio quando: |
| - Area total > 750 m2, OU |
| - Altura > 12 metros (aprox. 4 pavimentos) |
| |
| Especificacoes (ABNT NBR 13714): |
| - Pressao minima: 10 m.c.a. no ponto mais desfavoravel |
| - Vazao minima: 300 L/min por hidrante |
| - Mangueira: DN 65mm para hidrante externo |
| - Distancia maxima entre hidrantes: 30 metros""" |
| |
| elif any(w in pergunta_lower for w in ["spda", "para-raios", "pararaios"]): |
| return """SPDA - SISTEMA DE PROTECAO CONTRA DESCARGAS ATMOSFERICAS |
| |
| Obrigatorio conforme ABNT NBR 5419 quando: |
| - Altura > 15 metros |
| - Area construida > 1.000 m2 |
| - Edificacoes em areas de alta densidade de raios |
| |
| O SPDA deve ser projetado por engenheiro eletricista habilitado.""" |
| |
| elif any(w in pergunta_lower for w in ["memorial", "ppci"]): |
| return """MEMORIAL DESCRITIVO (PPCI) - NT-01/2025 CBMGO |
| |
| O PPCI deve conter: |
| 1. Identificacao da edificacao e responsavel tecnico |
| 2. Classificacao de ocupacao (Tabela 1 - NT-01/2025) |
| 3. Medidas de seguranca adotadas |
| 4. Memorial de calculos |
| 5. Plantas tecnicas (planta baixa, cortes, fachadas) |
| 6. ART/RRT do responsavel tecnico |
| |
| Elaborado por: Engenheiro (CREA) ou Arquiteto (CAU) habilitado. |
| Aprovacao: CBMGO antes do inicio das obras.""" |
| |
| else: |
| return f"""CONSULTA NT-01/2025 CBMGO |
| |
| Sua pergunta: "{pergunta}" |
| |
| Nao encontrei uma resposta especifica para esta consulta. |
| |
| Para perguntas sobre a NT-01/2025, voce pode pesquisar sobre: |
| - Classificacao de ocupacao (grupos A a J) |
| - Extintores de incendio (NBR 12693) |
| - Sistema de hidrantes (NBR 13714) |
| - Saidas de emergencia (NBR 9077) |
| - Iluminacao de emergencia (NBR 10898) |
| - PPCI e memorial descritivo |
| |
| Para consultas especificas, entre em contato com o CBMGO: |
| Site: www.bombeiros.go.gov.br""" |
|
|
|
|
| def auditar_projeto(descricao_projeto): |
| """Audita um projeto contra as normas NT-01/2025""" |
| if not descricao_projeto.strip(): |
| return "Por favor, descreva o projeto para auditoria." |
| |
| try: |
| if USE_AUDITOR: |
| return _auditor.auditar(descricao_projeto) |
| except Exception as e: |
| print(f"Erro no modulo auditor: {e}") |
| |
| |
| verificacoes = [] |
| desc_lower = descricao_projeto.lower() |
| |
| checks = [ |
| ("extintor", "Extintores de incendio", "Verificar quantidade e distribuicao conforme NBR 12693"), |
| ("saida", "Saidas de emergencia", "Verificar largura minima 1,20m e sinalizar conforme NBR 9077"), |
| ("iluminacao", "Iluminacao de emergencia", "Autonomia minima 1h, 30 lux nas rotas de saida"), |
| ("sinaliza", "Sinalizacao de seguranca", "Placas conforme ABNT NBR 13434"), |
| ("hidrante", "Sistema de hidrantes", "Verificar obrigatoriedade pela area/altura"), |
| ("spda", "SPDA para-raios", "Verificar necessidade pela altura/area"), |
| ] |
| |
| for keyword, item, obs in checks: |
| if keyword in desc_lower: |
| verificacoes.append(f"[OK] {item}: Mencionado no projeto") |
| else: |
| verificacoes.append(f"[ATENCAO] {item}: Nao mencionado - {obs}") |
| |
| itens_str = chr(10).join(verificacoes) |
| return f"""AUDITORIA DO PROJETO - NT-01/2025 CBMGO |
| {"="*60} |
| |
| PROJETO ANALISADO: |
| {descricao_projeto[:300]}{"..." if len(descricao_projeto) > 300 else ""} |
| |
| VERIFICACOES: |
| {itens_str} |
| |
| RECOMENDACOES: |
| - Verifique todos os itens marcados como [ATENCAO] |
| - Consulte a NT-01/2025 CBMGO para requisitos especificos |
| - O PPCI completo deve ser aprovado pelo CBMGO |
| |
| Data: {datetime.now().strftime("%d/%m/%Y %H:%M")}""" |
|
|
|
|
| def gerar_memorial_func(tipo_edificacao, area, pavimentos, cidade, responsavel): |
| """Gera memorial descritivo de PPCI""" |
| if not tipo_edificacao.strip(): |
| return "Por favor, informe o tipo de edificacao." |
| |
| try: |
| if USE_MEMORIAL: |
| return _memorial.gerar(tipo_edificacao, float(area), int(pavimentos), cidade, responsavel) |
| except Exception as e: |
| print(f"Erro no modulo memorial: {e}") |
| |
| |
| grupo = "F-1" |
| for cod, desc in GRUPOS_OCUPACAO.items(): |
| if any(w in tipo_edificacao.lower() for w in desc.lower().split()): |
| grupo = cod |
| break |
| |
| area_f = float(area) if area else 200.0 |
| pav_i = int(pavimentos) if pavimentos else 1 |
| altura = pav_i * 3.0 |
| ext = calcular_extintores_fallback(area_f, grupo) |
| sis = verificar_sistemas_fallback(area_f, pav_i, grupo) |
| |
| return f"""MEMORIAL DESCRITIVO DE PREVENCAO E PROTECAO CONTRA INCENDIO E PANICO |
| PLANO DE PREVENCAO CONTRA INCENDIO - PPCI |
| {"="*70} |
| |
| 1. IDENTIFICACAO DO PROJETO |
| Edificacao: {tipo_edificacao} |
| Endereco: [Endereco completo], {cidade} - GO |
| Ocupacao: Grupo {grupo} - {GRUPOS_OCUPACAO.get(grupo, "Verificar classificacao")} |
| Area Total: {area_f:.2f} m2 | Pavimentos: {pav_i} | Altura: {altura:.2f} m |
| Data: {datetime.now().strftime("%d/%m/%Y")} |
| Responsavel Tecnico: {responsavel} |
| ART/RRT No: [A PREENCHER] |
| |
| 2. BASE LEGAL |
| - NT-01/2025 CBMGO (Norma Tecnica 01/2025) |
| - ABNT NBR 9077:2001 (Saidas de emergencia) |
| - Lei Estadual n. 15.802/2006 |
| |
| 3. CLASSIFICACAO |
| - Grupo: {grupo} | Risco: {ext["risco"].upper()} |
| |
| 4. MEDIDAS DE SEGURANCA |
| 4.1 Extintores: {ext["quantidade"]} extintores {ext["tipo"]} |
| (1 a cada {ext["area_por_extintor"]}m2, conforme NBR 12693) |
| 4.2 Hidrantes: {"Sistema de hidrantes obrigatorio (NBR 13714)" if sis["hidrante"] else "Verificar necessidade com CBMGO"} |
| 4.3 SPDA: {"Obrigatorio (ABNT NBR 5419)" if sis["spda"] else "Verificar necessidade"} |
| 4.4 Iluminacao Emergencia: {"Obrigatoria - 1h autonomia (NBR 10898)" if sis["iluminacao_emergencia"] else "Recomendada"} |
| 4.5 Sinalizacao: Conforme ABNT NBR 13434 |
| 4.6 Saidas de Emergencia: Largura minima 1,20m (ABNT NBR 9077) |
| |
| 5. RESPONSABILIDADE TECNICA |
| {cidade}, {datetime.now().strftime("%d/%m/%Y")} |
| {responsavel} |
| ART/RRT No: [A PREENCHER] |
| {"="*70} |
| FIM DO MEMORIAL DESCRITIVO""" |
|
|
|
|
| def preparar_siapi(tipo_edificacao, area, responsavel, cpf_responsavel, crea_cau): |
| """Prepara documentos para submissao no SIAPI""" |
| try: |
| if USE_SUBMISSAO: |
| return _submissao.preparar_documentos(tipo_edificacao, float(area), responsavel, cpf_responsavel, crea_cau) |
| except Exception as e: |
| print(f"Erro no modulo submissao: {e}") |
| |
| |
| protocolo = f"CBMGO-{datetime.now().strftime('%Y%m%d')}-{hash(tipo_edificacao) % 10000:04d}" |
| |
| return f"""PREPARACAO PARA SUBMISSAO SIAPI - CBMGO |
| {"="*60} |
| |
| PROTOCOLO PROVISORIO: {protocolo} |
| Data: {datetime.now().strftime("%d/%m/%Y %H:%M")} |
| |
| DADOS DA EDIFICACAO: |
| - Tipo: {tipo_edificacao} |
| - Area: {area} m2 |
| - Responsavel Tecnico: {responsavel} |
| - Registro Profissional: {crea_cau} |
| |
| DOCUMENTOS NECESSARIOS: |
| [x] PPCI completo (memorial + plantas) |
| [x] ART/RRT do responsavel tecnico |
| [x] Requerimento padrao CBMGO |
| [x] DARM quitado (taxa de vistoria) |
| [ ] Laudo de aprovacao do corpo tecnico |
| |
| CHECKLIST DE PLANTAS: |
| [ ] Planta baixa cotada (escala 1:100 ou 1:50) |
| [ ] Planta de situacao e localizacao |
| [ ] Cortes transversal e longitudinal |
| [ ] Memorial descritivo assinado |
| [ ] Especificacoes tecnicas dos sistemas |
| |
| COMO SUBMETER NO SIAPI: |
| 1. Acesse: https://siapi.goias.gov.br |
| 2. Faca login com CPF/CNPJ |
| 3. Selecione "Novo Protocolo de Analise" |
| 4. Preencha os dados da edificacao |
| 5. Anexe os documentos em PDF (max 10MB cada) |
| 6. Confirme e salve o protocolo |
| 7. Aguarde analise do CBMGO (prazo: 30 dias) |
| |
| Para duvidas: (62) 3201-5959 | cbmgo@bombeiros.go.gov.br |
| {"="*60}""" |
|
|
|
|
| |
| |
| |
|
|
| with gr.Blocks( |
| title="CERCON - Agente CBMGO", |
| theme=gr.themes.Soft(primary_hue="red"), |
| ) as demo: |
| |
| gr.Markdown(""" |
| # CERCON - Agente CBMGO |
| ### Sistema Inteligente de Prevencao e Protecao contra Incendio e Panico |
| **Base normativa: NT-01/2025 | CBMGO - Corpo de Bombeiros Militar de Goias** |
| """) |
| |
| with gr.Tabs(): |
| |
| |
| with gr.Tab("Calculadora de Seguranca"): |
| gr.Markdown("### Calcule as medidas de seguranca obrigatorias para sua edificacao") |
| with gr.Row(): |
| with gr.Column(): |
| area_input = gr.Number(label="Area Total (m2)", value=200.0, minimum=1) |
| pav_input = gr.Number(label="Numero de Pavimentos", value=1, minimum=1, step=1) |
| grupo_input = gr.Dropdown( |
| choices=list(GRUPOS_OCUPACAO.keys()), |
| value="F-1", |
| label="Grupo de Ocupacao (NT-01/2025)" |
| ) |
| calc_btn = gr.Button("Calcular Medidas de Seguranca", variant="primary") |
| with gr.Column(): |
| calc_output = gr.Textbox(label="Resultado", lines=25, show_copy_button=True) |
| calc_btn.click(calcular_medidas, inputs=[area_input, pav_input, grupo_input], outputs=calc_output) |
| |
| |
| with gr.Tab("Consulta NT-01/2025"): |
| gr.Markdown("### Tire duvidas sobre a NT-01/2025 e normas de prevencao de incendio") |
| with gr.Row(): |
| with gr.Column(): |
| norma_input = gr.Textbox( |
| label="Sua pergunta", |
| placeholder="Ex: Quantos extintores preciso para um escritorio de 300m2?", |
| lines=3 |
| ) |
| norma_btn = gr.Button("Consultar", variant="primary") |
| gr.Examples( |
| examples=[ |
| ["Quantos extintores preciso para um escritorio de 500m2?"], |
| ["Quando e obrigatorio instalar hidrantes?"], |
| ["O que e SPDA e quando e obrigatorio?"], |
| ["Como elaborar um PPCI para um hotel?"], |
| ], |
| inputs=norma_input |
| ) |
| with gr.Column(): |
| norma_output = gr.Textbox(label="Resposta", lines=20, show_copy_button=True) |
| norma_btn.click(consultar_normas, inputs=norma_input, outputs=norma_output) |
| |
| |
| with gr.Tab("Gerar Memorial PPCI"): |
| gr.Markdown("### Gere um memorial descritivo de PPCI automaticamente") |
| with gr.Row(): |
| with gr.Column(): |
| mem_tipo = gr.Textbox(label="Tipo de Edificacao", placeholder="Ex: Escritorio comercial, Hotel, Escola") |
| mem_area = gr.Number(label="Area Total (m2)", value=200.0) |
| mem_pav = gr.Number(label="Pavimentos", value=1, step=1) |
| mem_cidade = gr.Textbox(label="Cidade", value="Goiania") |
| mem_resp = gr.Textbox(label="Responsavel Tecnico (Nome - CREA/CAU)") |
| mem_btn = gr.Button("Gerar Memorial", variant="primary") |
| with gr.Column(): |
| mem_output = gr.Textbox(label="Memorial Descritivo", lines=30, show_copy_button=True) |
| mem_btn.click(gerar_memorial_func, inputs=[mem_tipo, mem_area, mem_pav, mem_cidade, mem_resp], outputs=mem_output) |
| |
| |
| with gr.Tab("Auditoria de Projeto"): |
| gr.Markdown("### Audite seu projeto contra os requisitos da NT-01/2025") |
| with gr.Row(): |
| with gr.Column(): |
| audit_input = gr.Textbox( |
| label="Descreva seu projeto", |
| placeholder="Descreva os sistemas de seguranca previstos...", |
| lines=8 |
| ) |
| audit_btn = gr.Button("Auditar Projeto", variant="primary") |
| with gr.Column(): |
| audit_output = gr.Textbox(label="Resultado da Auditoria", lines=20, show_copy_button=True) |
| audit_btn.click(auditar_projeto, inputs=audit_input, outputs=audit_output) |
| |
| |
| with gr.Tab("Preparar SIAPI"): |
| gr.Markdown("### Prepare a documentacao para submissao no SIAPI/CBMGO") |
| with gr.Row(): |
| with gr.Column(): |
| siapi_tipo = gr.Textbox(label="Tipo de Edificacao") |
| siapi_area = gr.Number(label="Area Total (m2)", value=200.0) |
| siapi_resp = gr.Textbox(label="Nome do Responsavel Tecnico") |
| siapi_cpf = gr.Textbox(label="CPF do Responsavel (apenas numeros)", placeholder="00000000000") |
| siapi_reg = gr.Textbox(label="Registro Profissional (CREA/CAU)", placeholder="CREA-GO 12345-D") |
| siapi_btn = gr.Button("Preparar Documentacao", variant="primary") |
| with gr.Column(): |
| siapi_output = gr.Textbox(label="Checklist de Submissao", lines=25, show_copy_button=True) |
| siapi_btn.click(preparar_siapi, inputs=[siapi_tipo, siapi_area, siapi_resp, siapi_cpf, siapi_reg], outputs=siapi_output) |
| |
| |
| with gr.Tab("Sobre o CERCON"): |
| gr.Markdown(""" |
| ## CERCON - Agente CBMGO |
| |
| **Versao:** 1.0.0 | **Base normativa:** NT-01/2025 CBMGO |
| |
| ### Funcionalidades |
| - **Calculadora de Seguranca**: Calcula extintores, hidrantes, SPDA e sistemas obrigatorios |
| - **Consulta NT-01/2025**: RAG sobre normas de prevencao de incendio |
| - **Gerador de Memorial**: Cria memoriais PPCI conforme NT-01/2025 |
| - **Auditoria de Projetos**: Verifica conformidade com as normas |
| - **Preparacao SIAPI**: Checklists para submissao ao CBMGO |
| |
| ### Tecnologia |
| - Interface: Gradio | Busca: FAISS + Sentence Transformers |
| - LLM: Llama-3.1-8B (com GPU) | Fallback: Regras declarativas (sem GPU) |
| - Repositorio: https://huggingface.co/carlosh10/CERCON |
| |
| ### Importante |
| Este agente e uma ferramenta de apoio tecnico. O PPCI oficial deve |
| sempre ser elaborado por profissional habilitado com ART/RRT. |
| |
| **CBMGO**: www.bombeiros.go.gov.br | (62) 3201-5959 |
| """) |
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|