Vercel AI SDK के लिए

नियंत्रित डेटा टूल्स Vercel AI SDK के लिए।

sqai.tools() ठीक तीन read-only tools generateText में जोड़ता है। model sources खोजता है, एक typed plan सबमिट करता है, और deterministic engine द्वारा computed संख्याएँ लौटाता है — साथ में hashes जो हर उत्तर replay कर सकें।

शुरू करने के लिए कोई API key आवश्यक नहींAI SDK Tools Registry में सूचीबद्धai ^7.0.0 · zod ^4.0.0 · Node ≥ 20

IIइंस्टॉल

एक dependency लाइन।

Server-side, Node 20 या नया — Next.js में, इसे `runtime = "nodejs"` वाले route handler में चलाएँ। Peers हैं ai ^7.0.0 और zod ^4.0.0, वे versions जिनके विरुद्ध plans typed हैं। कोई account नहीं, कोई key नहीं, कोई config file नहीं।

IIIत्वरित शुरुआत

पहला governed उत्तर।

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() lazily कनेक्ट होता है — पहले tool call तक कुछ नहीं पढ़ा जाता। sqai.tools() एक typed SqaiToolSet लौटाता है, कोई cast आवश्यक नहीं। isStepCount(12) model को discover, plan, और execute करने की पर्याप्त गुंजाइश देता है।

Sources जोड़ें, glue code नहीं।

CSV, JSON, in-memory records, और SQLite in-process चलते हैं — कुछ भी आपके server से बाहर नहीं जाता। Postgres, Snowflake, BigQuery और बाकी engine के ज़रिए जुड़ते हैं। हर source एक ही typed shape में आता है, इसलिए downstream tools CSV और Snowflake में फ़र्क नहीं कर सकते। हर source, निर्दिष्ट

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

हर option सीमित करता है।

ट्रंकेशन सदैव घोषित होता है; आंशिक पंक्तियाँ कभी नहीं दिखाई जातीं। मॉडल जो टूल इनपुट भरता है उसमें कोई allowed* फ़ील्ड नहीं होती — नीति createSQAI() के समय निर्धारित होती है और निष्पादन से पहले इन-प्रोसेस जाँची जाती है। मॉडल जो दिया गया है उसे विस्तृत नहीं कर सकता। पूर्ण गवर्नेंस मॉडल

const sqai = createSQAI({
  sources,
  allowedSources: ['orders'],
  allowedFields: { orders: ['region', 'revenue'] },
  allowedFunctions: 'all-readonly',
  defaultLimit: 100,
  maxRowsToModel: 25,
});
optiondefaultप्रभाव
sourcesआवश्यक

केवल वही डेटा जो tools देख सकते हैं। एक बार registered — sources अपरिवर्तनीय हैं।

allowedSourcesसभी registered

कोई भी plan किन sources को छू सकता है, यह सीमित करता है।

allowedFieldsसभी fields

Per-source column allow-list। बाकी सब अदृश्य है।

allowedFunctions"all-readonly"

Capability allow-list — केवल संकुचित। इससे व्यापक कुछ भी नाम लेने पर unsupported_operation फेंका जाता है।

defaultLimit100

जब plan अपनी limit स्वयं न दे, तब लौटाई जाने वाली rows।

maxExecutionRows1,000

एक execution में पढ़ी जाने वाली rows की अधिकतम सीमा।

maxRowsToModel25

model को कभी दिखाई जाने वाली rows।

maxCellsToModel250

मॉडल को दिखाई देने वाले सेल।

maxBytesToModel32,000

मॉडल को दिखाए जाने वाले परिणाम के बाइट।

IVटूलबॉक्स

ठीक तीन टूल।

डिस्कवरी, निष्पादन, रिहर्सल — एक-एक टूल। सतह आपकी पीठ पीछे कभी नहीं बढ़ती।

01

listSources

कभी निष्पादित नहीं करता

प्रत्येक सोर्स के फ़ील्ड, प्रकार और पंक्ति गणना लौटाता है, साथ ही हर संख्यात्मक फ़ील्ड द्वारा समर्थित ऑपरेशन भी। तीन डिटेल मोड टोकन लागत को स्थिर रखते हैं, चाहे सोर्स कितने भी बढ़ें।

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

02

queryData

एकमात्र जो निष्पादित करता है

एक टाइप्ड प्लान लेता है — एक discriminated union, जो कुछ भी चलने से पहले validate होती है। चार परिणाम, कभी कोई exception नहीं: लूप को हमेशा संरचना वापस मिलती है, तब भी जब उत्तर नकारात्मक हो।

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

03

explainQuery

dry run

डेटा को छुए बिना प्लान को validate और resolve करता है। यह जो invocation_hash लौटाता है वह उस चीज़ का पूर्वावलोकन है जो चलती — किसी चली हुई चीज़ का hash नहीं।

invocation_hash = preview ≠ executed

Vएक रन, मुद्रित

एक वास्तविक रन के वास्तविक आँकड़े।

generateText · एक प्रॉम्प्ट · तीन टूल चरण

उपयोगकर्ता

पूर्वी क्षेत्र का कुल राजस्व — और 10% दर पर हमारे राजस्व शेड्यूल का NPV?

tool
listSources()ऑर्डर · 12 पंक्तियाँ · क्षेत्र, राजस्व
tool
queryData({ kind: "query", version: "1", … })sum(revenue) · region = "east"सफल · 2130.50 · 5 ऑर्डरplan_hash f87610d8afeb…
tool
queryData({ kind: "computation", version: "1", … })finance.npv · rate 0.1 · values ← orders.revenueसफल · 3188.17 · 0.83 ms
असिस्टेंट

पूर्वी क्षेत्र का राजस्व 5 ऑर्डर में 2,130.50 है। 10% दर पर राजस्व शेड्यूल का NPV 3,188.17 है।

मॉडल ने कोई अंकगणित नहीं किया। दोनों संख्याएँ deterministic इंजन से आईं — और hash उन्हें replay करता है।

VIजेनेरिक टूल से तुलना

टाइप्ड प्लान कभी नहीं चूकते।

एक जेनेरिक SQL टूलsqai.tools()
मॉडल लिखता हैएक जेनेरिक SQL टूलएक raw SQL स्ट्रिंगsqai.tools()एक टाइप्ड प्लान — kind "query" या "computation", version "1", zod-validated
एक त्रुटिपूर्ण कॉलएक जेनेरिक SQL टूलthrows, retries, या चुपचाप no-opssqai.tools()needs_clarification विकल्पों सहित लौटाता है — टूल कभी throw नहीं करते
एक ही प्रश्न दो बारएक जेनेरिक SQL टूलअलग SQL, अलग उत्तरsqai.tools()वही प्लान, वही hash — replayable
राइट पाथएक जेनेरिक SQL टूलजो कनेक्शन अनुमति देsqai.tools()निर्माण से ही कोई नहीं — 4,574 read-only क्षमताएँ, कोई model-reachable escape hatch नहीं
प्रमाणएक जेनेरिक SQL टूलकोई नहीं — एक संभावित संख्याsqai.tools()हर उत्तर पर plan_hash और computation_hash

बाईं ओर की विफलता के तरीके दर्ज हैं, कल्पित नहीं: vercel/ai #1905 · #2147 · #12020 · #6913

पूर्ण एजेंट लूप डिज़ाइन करें

टूलबॉक्स शिप करें।

कोई API key नहीं। कोई अकाउंट नहीं। पहली टूल कॉल बस काम करती है।

AI SDK Tools Registry में सूचीबद्ध · ai ^7.0.0 · zod ^4.0.0 · Node ≥ 20 · server-side