Files
compras/resources/js/components/ai-preparation-preview.tsx
T
nala c6373365bf
tests / ci (push) Canceled after 0s
commit9
2026-10-30 20:02:30 +02:00

69 lines
2.5 KiB
TypeScript

export type AiPreparation = {
status:
| 'not_configured'
| 'outside_scope'
| 'no_permitted_facts'
| 'input_exceeds_limit'
| 'draft';
external_execution_enabled: false;
usage_checked: false;
policy_revision: number;
provider: string;
model: string;
max_input_bytes: number;
max_output_tokens: number;
input_bytes: number;
facts: {
id: string;
text: string;
source: { label: string; href: string; pointer: string };
}[];
};
export function AiPreparationPreview({ data }: { data: AiPreparation }) {
if (data.status === 'not_configured') return null;
const messages = {
outside_scope:
'Este percurso não está abrangido pelo plano da empresa.',
no_permitted_facts:
'Não há factos autorizados pelas categorias escolhidas para este relatório.',
input_exceeds_limit:
'Os dados excedem o limite planeado por pedido. Reveja o âmbito em Administração.',
draft: 'Pré-visualização do âmbito planeado. Nenhum dado foi enviado.',
};
return (
<details className="rounded-xl border p-4 text-sm print:hidden">
<summary className="cursor-pointer font-medium">
Pré-visualização de IA — plano da empresa
</summary>
<div className="mt-4 space-y-3">
<p>{messages[data.status]}</p>
<p>
Revisão {data.policy_revision} · Fornecedor pretendido:{' '}
{data.provider} · Modelo: {data.model}
</p>
<p>
Dados pré-visualizados: {data.input_bytes} /{' '}
{data.max_input_bytes} bytes. Limite de saída pretendido:{' '}
{data.max_output_tokens} tokens.
</p>
<ul className="space-y-3">
{data.facts.map((fact) => (
<li key={fact.id}>
<p>{fact.text}</p>
<a className="underline" href={fact.source.href}>
Fonte: {fact.source.label}
</a>
</li>
))}
</ul>
<p>
Os limites mensais de consumo ainda não foram conferidos. O
plano não autoriza execução externa; os relatórios e
decisões mantêm o seu circuito.
</p>
</div>
</details>
);
}