listSources
nunca executaDescoberta. Fontes conectadas com campos tipados, módulos de capacidade, assinaturas de função — três modos a partir de uma entrada, para que as specs usem nomes exatos.
Para agentes — a ferramenta de dados governada
O SQAI oferece a um modelo com chamada de ferramentas acesso somente leitura a dados estruturados por meio de três ferramentas governadas. O modelo expressa intenção tipada. Um contrato e sua política a verificam. Um motor determinístico a executa. Cada resposta retorna com um hash que a reproduz.
IUma volta do loop
“Qual região teve a maior receita total?”Planeja as etapas. Expressa intenção. Nunca toca nos dados.
{ version:"1", kind:"query", spec:{ metric:"revenue", aggregation:"sum", group_by:"region", source:"sales" } }contractcontrato de capacidade fixado por hashpolicysuas listas de permissão, verificadas antes da execuçãoengineexecução determinística e somente leiturastatus: ok · needs_clarification · rejected · erroreast — 2,130.50 · plan_hash f87610d8afeb…okSai do loop. As linhas ou o valor — e o hash que os reproduz.
needs_clarification ↺Retorna ao loop. Uma pergunta e os candidatos encontrados — o modelo refina a spec e chama novamente. Nunca adivinha uma coluna.
rejeição e erro percorrem o mesmo caminho de retorno — resultados tipados que o modelo pode ler, não exceções que abortam a execução.
IIAs ferramentas
sqai.tools() retorna exatamente três ferramentas — uma superfície deliberadamente pequena. Descoberta e simulações nunca executam; a execução ocorre em exatamente um lugar.
listSourcesDescoberta. Fontes conectadas com campos tipados, módulos de capacidade, assinaturas de função — três modos a partir de uma entrada, para que as specs usem nomes exatos.
queryDataUma entrada versionada — uma union discriminada em kind: uma query ou uma computação. Quatro resultados, sempre tipados, sem exceções.
explainQueryResolve e valida uma intenção sem executá-la. O modelo usa para depurar clarificações; você usa para visualizar um plano.
O conjunto entra diretamente em generateText ou streamText — tipado, atribuível sem cast. Configuração do Vercel AI SDK →
IIIO contrato de erros
Uma exceção aborta uma execução de agente. Por isso nada aqui lança exceções: ambiguidade, recusa e falha retornam como status tipados que o modelo pode ler — e corrigir — dentro do seu orçamento de passos.
retryable marca os transitórios — network_error · timeout · rate_limited · service_unavailable
queryData — os quatro resultados
okO resultado: linhas ou valor, hashes de proveniência, truncamento declarado.plan_hash · invocation_hash · computation_hash · truncatedneeds_clarificationA intenção era ambígua. Uma pergunta com os candidatos — nunca uma suposição.question · candidates · explanationrejectedO resolver recusou a intenção. Nada foi executado.rejection_reason · candidates · explanationerrorUma falha estruturada com código estável — o modelo lê e ajusta.code · message · retryable · nearest_matches?Cada ramificação é dado. O loop mantém seu turno.
O princípio
política em código · nenhum campo de política em qualquer entrada de tool · somente restrição
IVO princípio, aplicado
A indústria aprendeu isso em produção — um agente de codificação autônomo famosamente deletou um banco de dados em produção. A resposta do SQAI é estrutural, não comportamental: a superfície exposta é somente leitura por construção. Categorias de escrita e não determinísticas nunca são geradas nela, e nenhum flag, política ou entrada do modelo as reativa.
VA conexão
Um pacote encapsula o cliente em tools. As fontes conectam de forma lazy na primeira chamada; a primeira computação provisiona o runtime uma vez e permanece aquecido — 0,83 ms medidos.
import { generateText } from "ai";
import { createSQAI } from "@thyn-ai/sqai-ai-sdk";
const sqai = createSQAI({
sources: [{ data: "./data/sales.csv", name: "sales" }],
});
const { text, steps } = await generateText({
model, // any AI SDK model
tools: sqai.tools(), // listSources · queryData · explainQuery
prompt: "Which region had the highest total revenue?",
});Somente server-side — no Next.js, mantenha o runtime Node, não Edge.
O que chega ao modelo
O truncamento é sempre declarado — truncated: true, returned_rows < total_rows. Nunca silencioso. Os resultados completos permanecem recuperáveis no código da aplicação via result_id.
VIAnalytics agêntico
O analytics agêntico falha de formas conhecidas: chamadas de tool malformadas, modelos fazendo sua própria aritmética, números plausíveis que ninguém consegue verificar. Cada uma é respondida estruturalmente, não com um prompt melhor.
Uma entrada versionada, validada antes de qualquer execução. Intenção malformada ou ambígua retorna um status tipado — o loop continua em vez de travar.
Não aqui. O engine computa. Em um conjunto quantitativo de 16 perguntas, o mesmo modelo passou de 0/16 para 16/16 quando o engine assumiu os cálculos.
Cada resposta carrega seu hash. Reproduza a mesma intenção contra os mesmos dados e o hash bate — byte a byte idêntico em TypeScript e Python.
Um loop multiplica a latência. O plano de queries roda em processo em submilissegundo; computação aquecida medida em 0,83 ms.
VIIPerguntas
Não filtre SQL — não o gere. Conecte fontes ao createSQAI() e entregue ao modelo sqai.tools(): a superfície que ele alcança são 4.574 capacidades somente leitura mais suas fontes, sem caminho de escrita por construção. Não há categoria de escrita a bloquear, nem entrada do modelo que a reative.
queryData retorna needs_clarification com uma pergunta e os campos candidatos encontrados. Nunca infere uma coluna. O modelo responde à pergunta e chama novamente — mais uma volta no loop.
Não. Toda falha é um resultado estruturado com um código estável, uma mensagem e um indicador de nova tentativa. Ambiguidade, recusa, negação de política e falhas transitórias retornam como dados que o modelo pode ler.
Não. allowedSources, allowedFields e allowedFunctions vivem no código, definidos no momento de createSQAI() e verificados antes da execução. Nenhum esquema de entrada de ferramenta contém um campo de política; nomear uma capacidade negada retorna um erro estruturado policy_denied.
Sim — @thyn-ai/sqai-ai-sdk entrega as três ferramentas como um conjunto tipado para generateText e streamText, com ai ^7.0.0 e zod ^4.0.0 como peers, Node 20 ou superior, lado servidor. O cliente subjacente é o mesmo SDK que pode ser integrado a qualquer loop de agente.