Files
BrainWind/app/src/lib/audit/prompt-builder.ts
T

91 lines
4.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { INVARIANTES_NBR6123 } from './invariantes';
import { NORM_REFERENCE } from './norm-reference';
import { serializeScenario } from './serializer';
import type { AuditScenario } from './types';
const SYSTEM_PROMPT = `Você é um engenheiro estrutural especialista na norma brasileira NBR 6123:2023 (Ação do Vento em Edificações). Sua tarefa é AUDITAR os resultados de um aplicativo de cálculo de pressões de vento.
Você receberá uma lista de cenários de teste. Para cada cenário, o aplicativo calculou valores usando as fórmulas e tabelas da NBR 6123:2023.
Sua missão é atuar como um auditor cego: primeiro, recalcule matematicamente os resultados com base nas entradas (Inputs) usando APENAS as tabelas e fórmulas fornecidas abaixo. Depois, verifique se os seus cálculos batem com os valores fornecidos nos 'outputs' e 'intermediates'.
Você DEVE demonstrar seu raciocínio matemático no campo 'calculation_steps' ANTES de emitir o veredito.
## Regras da NBR 6123:2023 (invariantes)
${INVARIANTES_NBR6123}
## Dados das Tabelas da NBR 6123:2023
Estes são os dados numéricos oficiais das tabelas da norma. Use-os como referência para verificar os valores calculados.
${NORM_REFERENCE}
## Suas tarefas para cada cenário
1. Verificar se as fórmulas fundamentais estão corretas (q = 0.613 × Vk² / 1000, Vk = V0 × S1 × S2 × S3)
2. Verificar se Cpi está no intervalo [-0.9, +0.9]
3. Recalcular e verificar se os coeficientes de pressão (Cpe) batem perfeitamente com os ângulos e dimensões tabelados
4. Verificar se as relações físicas fazem sentido (ex: Cpe barlavento > 0, Cpe sotavento < 0 para cilindros)
5. Verificar se os limites normativos são respeitados
6. Verificar coerência entre inputs e outputs
## Formato da resposta
Retorne EXATAMENTE um JSON válido (sem markdown, sem code blocks) com o seguinte formato:
{
"results": [
{
"scenarioId": "id-do-cenario",
"calculation_steps": "AQUI VOCÊ DEVE DEMONSTRAR A MATEMÁTICA PASSO A PASSO. Ex: Vk = 40 * 1.0 * 1.04 * 1.0 = 41.6. q = 0.613 * (41.6)^2 / 1000 = 1.060. Cpe_A (h/b = 0.5) = -0.8...",
"verdict": "PASS" | "WARN" | "FAIL",
"checks": [
{
"name": "nome do check (ex: Pressão Dinâmica q)",
"status": "PASS" | "WARN" | "FAIL",
"expected": "o valor que VOCÊ calculou",
"actual": "valor calculado no app",
"explanation": "explicação curta da diferença se houver"
}
],
"summary": "resumo em 1 linha do resultado",
"llmNotes": "observações adicionais"
}
]
}
## Regras importantes
- status "PASS" = tudo correto ou empate técnico (variação insignificante < 1% ou diferença absoluta < 0.05)
- status "WARN" = imprecisão numérica moderada (entre 1% e 2%), ou desvio de método sem impacto grave
- status "FAIL" = erro real ou diferença grosseira (variação > 2%)
- verdict "FAIL" = pelo menos 1 check FAIL
- verdict "WARN" = pelo menos 1 check WARN e nenhum FAIL
- verdict "PASS" = todos checks PASS
- Seja preciso com números: compare os valores fornecidos pelo app com os que você deduziu matematicamente das tabelas e fórmulas
- EMPATE TÉCNICO: Se o seu cálculo diferir do app em menos de 1% (ex: 1.04 vs 1.05) devido a interpolação ou arredondamentos de passos intermediários, isso é considerado um empate técnico. Você DEVE classificar obrigatoriamente como "PASS". NUNCA marque como "WARN" nem como "FAIL" nessas situações.
- Só marque "FAIL" se a diferença for claramente um erro de fórmula, módulo errado ou leitura errada de tabela.
- IMPORTANTE: Cpi DEVE estar em [-0.9, +0.9] — qualquer valor fora é FAIL
- q deve ser sempre >= 0
- Verifique a fórmula q = 0.613 × Vk² / 1000 para cada cenário`;
function buildScenariosSection(scenarios: AuditScenario[]): string {
return scenarios.map(s => serializeScenario(s)).join('\n\n=== CENÁRIO ===\n\n');
}
export function buildPrompt(scenarios: AuditScenario[]): { system: string; user: string } {
const scenariosText = buildScenariosSection(scenarios);
return {
system: SYSTEM_PROMPT,
user: `## Cenários para auditar
Abaixo estão ${scenarios.length} cenários de teste. Para cada um, os campos são:
- scenarioId: identificador único
- description: descrição do cenário
- module: qual módulo do app (galpao, cilindro, etc.)
- inputs: todos os dados de entrada fornecidos pelo usuário
- intermediates: cálculos intermediários calculados pelo app (S2, Vk, q, Cpi, etc.)
- outputs: resultados finais calculados pelo app
- nbrSection: seção da NBR 6123 aplicável
=== CENÁRIO ===
${scenariosText}
Retorne o JSON com os resultados da auditoria para TODOS os ${scenarios.length} cenários listados acima.`,
};
}