Para o Vercel AI SDK

Ferramentas de dados governadas para o Vercel AI SDK.

sqai.tools() adiciona exatamente três ferramentas de somente leitura ao generateText. O modelo descobre fontes, envia um plano tipado e retorna números calculados por um motor determinístico — com hashes que reproduzem cada resposta.

Nenhuma chave de API necessária para começarListado no AI SDK Tools Registryai ^7.0.0 · zod ^4.0.0 · Node ≥ 20

IIInstalação

Uma linha de dependência.

Lado do servidor, Node 20 ou superior — no Next.js, execute em um route handler com runtime = "nodejs". As dependências são ai ^7.0.0 e zod ^4.0.0, as versões contra as quais os planos são tipados. Sem conta, sem chave, sem arquivo de configuração.

IIIInício rápido

Primeira resposta governada.

import { generateText, isStepCount } from 'ai';
import { createSQAI } from '@thyn-ai/sqai-ai-sdk';

const sqai = createSQAI({
  sources: [{ name: 'orders', path: './orders.csv' }],
});

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4.5',
  tools: sqai.tools(),
  stopWhen: isStepCount(12),
  prompt: 'Total revenue in the east region?',
});

createSQAI() conecta de forma lazy — nada é lido até a primeira chamada de ferramenta. sqai.tools() retorna um SqaiToolSet tipado, sem necessidade de cast. isStepCount(12) dá ao modelo espaço para descobrir, planejar e executar.

Adicione fontes, não código de integração.

CSV, JSON, registros em memória e SQLite rodam em processo — nada sai do seu servidor. Postgres, Snowflake, BigQuery e os demais se conectam pelo motor. Cada fonte assume o mesmo formato tipado, de modo que as ferramentas não distinguem um CSV de Snowflake. Cada fonte, especificada

const sqai = createSQAI({
  sources: [
    { name: 'orders', path: './orders.csv' },
    { name: 'sessions', provider: 'sqlite',
      path: './app.db', table: 'sessions' },
    { name: 'quotes', records: quotes },
  ],
});

Cada opção restringe.

O truncamento é sempre declarado; linhas parciais nunca são exibidas. O input da ferramenta preenchido pelo modelo não carrega nenhum campo allowed* — a política é fixada em createSQAI() e verificada internamente, antes da execução. O modelo não pode ampliar o que lhe foi concedido. O modelo de governança completo

const sqai = createSQAI({
  sources,
  allowedSources: ['orders'],
  allowedFields: { orders: ['region', 'revenue'] },
  allowedFunctions: 'all-readonly',
  defaultLimit: 100,
  maxRowsToModel: 25,
});
opçãopadrãoefeito
sourcesobrigatório

Os únicos dados visíveis às ferramentas. Registradas uma vez — as fontes são imutáveis.

allowedSourcestodas registradas

Restringe quais fontes qualquer plano pode acessar.

allowedFieldstodos os campos

Lista de colunas permitidas por fonte. Todo o restante é invisível.

allowedFunctions"all-readonly"

Lista de capacidades permitidas — apenas restritiva. Nomear algo mais amplo lança unsupported_operation.

defaultLimit100

Linhas retornadas quando um plano não define seu próprio limite.

maxExecutionRows1.000

Limite máximo de linhas que uma única execução pode ler.

maxRowsToModel25

Linhas que o modelo chega a visualizar.

maxCellsToModel250

Células exibidas ao modelo.

maxBytesToModel32.000

Bytes do resultado exibidos ao modelo.

IVFerramentas

Exatamente três ferramentas.

Descoberta, execução, ensaio — uma ferramenta cada. A superfície nunca cresce às suas costas.

01

listSources

nunca executa

Retorna campos, tipos e contagens de linhas de cada fonte, além das operações suportadas por cada campo numérico. Três modos de detalhe mantêm o custo de tokens estável à medida que as fontes se multiplicam.

sum · avg · count · min · max · eq · in · gt · gte · lt · lte · is_null · is_not_null

02

queryData

a única que executa

Recebe um plano tipado — uma union discriminada, validada antes de qualquer execução. Quatro resultados possíveis, nunca uma exceção: o loop sempre recebe estrutura de volta, mesmo quando a resposta é não.

kind: "query" | "computation" · version: "1"
ok · needs_clarification · rejected · error

03

explainQuery

dry run

Valida e resolve um plano sem tocar nos dados. O invocation_hash retornado é uma prévia do que seria executado — não o hash de algo que já rodou.

invocation_hash = preview ≠ executed

VUma execução, impressa

Números reais de uma execução real.

generateText · um prompt · três etapas de ferramenta

usuário

Receita total na região leste — e o VPL do nosso cronograma de receitas a uma taxa de 10%?

ferramenta
listSources()orders · 12 linhas · region, revenue
ferramenta
queryData({ kind: "query", version: "1", … })sum(revenue) · region = "east"ok · 2130,50 · 5 pedidosplan_hash f87610d8afeb…
ferramenta
queryData({ kind: "computation", version: "1", … })finance.npv · rate 0.1 · values ← orders.revenueok · 3188,17 · 0,83 ms
assistente

A receita da região leste é 2.130,50 em 5 pedidos. A uma taxa de 10%, o VPL do cronograma de receitas é 3.188,17.

O modelo não fez nenhum cálculo. Ambos os números vieram do motor determinístico — e o hash os reproduz.

VIVersus ferramentas genéricas

Planos tipados não têm dias ruins.

uma ferramenta SQL genéricasqai.tools()
o modelo escreveuma ferramenta SQL genéricauma string SQL brutasqai.tools()um plano tipado — kind "query" ou "computation", version "1", validado com zod
uma chamada malformadauma ferramenta SQL genéricalança exceção, tenta novamente ou falha silenciosamentesqai.tools()retorna needs_clarification com opções — as ferramentas nunca lançam exceção
a mesma pergunta duas vezesuma ferramenta SQL genéricaSQL diferente, respostas diferentessqai.tools()o mesmo plano, o mesmo hash — reproduzível
o caminho de escritauma ferramenta SQL genéricao que a conexão permitirsqai.tools()nenhum por construção — 4.574 capacidades somente leitura, sem escape acessível ao modelo
provauma ferramenta SQL genéricanenhuma — um número plausívelsqai.tools()plan_hash e computation_hash em cada resposta

Os modos de falha à esquerda são documentados, não imaginados: vercel/ai #1905 · #2147 · #12020 · #6913

Projete o loop completo do agente

Entregue a caixa de ferramentas.

Sem chave de API. Sem conta. A primeira chamada de ferramenta simplesmente funciona.

Listado no AI SDK Tools Registry · ai ^7.0.0 · zod ^4.0.0 · Node ≥ 20 · server-side