Vercel AI SDK-এর জন্য

নিয়ন্ত্রিত ডেটা টুলস Vercel AI SDK-এর জন্য।

sqai.tools() ঠিক তিনটি রিড-অনলি টুল generateText-এ যোগ করে। মডেল উৎস আবিষ্কার করে, একটি টাইপড প্ল্যান জমা দেয়, এবং একটি নির্ধারণবাদী ইঞ্জিনের গণনা করা সংখ্যা ফেরত দেয় — হ্যাশসহ যা প্রতিটি উত্তর পুনরায় চালাতে পারে।

শুরু করতে কোনো API key লাগবে নাAI SDK Tools Registry-তে তালিকাভুক্তai ^7.0.0 · zod ^4.0.0 · Node ≥ 20

IIইনস্টল

একটিমাত্র ডিপেন্ডেন্সি লাইন।

সার্ভার-সাইড, Node 20 বা তার নতুন সংস্করণ — Next.js-এ runtime = "nodejs" সহ একটি route handler-এ চালান। Peer হলো ai ^7.0.0 এবং zod ^4.0.0, যে সংস্করণগুলোর বিপরীতে প্ল্যানগুলো টাইপ করা। কোনো অ্যাকাউন্ট, key, বা কনফিগ ফাইল নেই।

IIIদ্রুত শুরু

প্রথম নিয়ন্ত্রিত উত্তর।

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() অলসভাবে সংযুক্ত হয় — প্রথম টুল কলের আগে কিছু পড়া হয় না। sqai.tools() একটি টাইপড SqaiToolSet ফেরত দেয়, কোনো cast দরকার নেই। isStepCount(12) মডেলকে আবিষ্কার, পরিকল্পনা ও এক্সিকিউশনের জন্য যথেষ্ট জায়গা দেয়।

উৎস যোগ করুন, গ্লু কোড নয়।

CSV, JSON, ইন-মেমোরি রেকর্ড এবং SQLite ইন-প্রসেসে চলে — কিছুই আপনার সার্ভার ছাড়ে না। Postgres, Snowflake, BigQuery এবং বাকিগুলো ইঞ্জিনের মাধ্যমে সংযুক্ত হয়। প্রতিটি উৎস একই টাইপড আকারে আসে, তাই ডাউনস্ট্রিমে টুলগুলো CSV আর Snowflake-এর পার্থক্য বুঝতে পারে না। প্রতিটি উৎস, নির্দিষ্টভাবে

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

প্রতিটি অপশন সংকুচিত করে।

ট্রাংকেশন সর্বদা ঘোষিত হয়; আংশিক সারি কখনো দেখানো হয় না। মডেল যে টুল ইনপুট পূরণ করে তাতে কোনো allowed* ফিল্ড থাকে না — নীতি createSQAI()-এর সময় নির্ধারিত হয় এবং এক্সিকিউশনের আগে প্রক্রিয়ার মধ্যেই যাচাই করা হয়। মডেল যা দেওয়া হয়েছে তার সীমা বাড়াতে পারে না। পূর্ণ গভর্ন্যান্স মডেল

const sqai = createSQAI({
  sources,
  allowedSources: ['orders'],
  allowedFields: { orders: ['region', 'revenue'] },
  allowedFunctions: 'all-readonly',
  defaultLimit: 100,
  maxRowsToModel: 25,
});
অপশনডিফল্টপ্রভাব
sourcesআবশ্যক

টুলগুলো কেবল এই ডেটাই দেখতে পারে। একবার নিবন্ধিত — উৎসগুলো অপরিবর্তনীয়।

allowedSourcesসব নিবন্ধিত

কোনো প্ল্যান কোন উৎস স্পর্শ করতে পারবে তা সংকুচিত করে।

allowedFieldsসব ফিল্ড

প্রতি-উৎস কলাম allow-list। বাকি সব অদৃশ্য।

allowedFunctions"all-readonly"

সক্ষমতার allow-list — কেবল সংকোচনযোগ্য। এর চেয়ে বিস্তৃত কিছু নাম দিলে unsupported_operation ছুড়ে দেয়।

defaultLimit100

প্ল্যান নিজস্ব সীমা না দিলে যত সারি ফেরত আসে।

maxExecutionRows1,000

একটি এক্সিকিউশন সর্বোচ্চ যত সারি পড়তে পারে।

maxRowsToModel25

মডেলকে সর্বোচ্চ যত সারি দেখানো হয়।

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, কিছু চালানোর আগেই যাচাইকৃত। চারটি ফলাফল, কখনো exception নয়: উত্তর না হলেও লুপ সর্বদা কাঠামো ফেরত পায়।

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

03

explainQuery

ড্রাই রান

ডেটা স্পর্শ না করেই একটি প্ল্যান যাচাই ও রিজলভ করে। এটি যে invocation_hash ফেরত দেয় তা চালানো হবে তার পূর্বরূপ — চালানো হয়েছে এমন কিছুর হ্যাশ নয়।

invocation_hash = preview ≠ executed

Vএকটি রান, মুদ্রিত

একটি বাস্তব রানের বাস্তব সংখ্যা।

generateText · একটি প্রম্পট · তিনটি টুল স্টেপ

user

পূর্বাঞ্চলের মোট রাজস্ব — এবং 10% হারে আমাদের রাজস্ব সময়সূচির NPV?

tool
listSources()orders · 12 সারি · region, revenue
tool
queryData({ kind: "query", version: "1", … })sum(revenue) · region = "east"ok · 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
assistant

পূর্বাঞ্চলের রাজস্ব 5টি অর্ডারে 2,130.50। 10% হারে রাজস্ব সময়সূচির NPV হলো 3,188.17।

মডেল কোনো গাণিতিক হিসাব করেনি। উভয় সংখ্যাই এসেছে নির্ধারণবাদী ইঞ্জিন থেকে — এবং হ্যাশ সেগুলো পুনরায় চালানোর সুযোগ দেয়।

VIজেনেরিক টুলের তুলনায়

টাইপড প্ল্যান ব্যর্থ হয় না।

একটি জেনেরিক SQL টুলsqai.tools()
মডেল লেখেএকটি জেনেরিক SQL টুলএকটি কাঁচা SQL স্ট্রিংsqai.tools()একটি টাইপড প্ল্যান — kind "query" বা "computation", version "1", zod-validated
একটি ত্রুটিপূর্ণ কলএকটি জেনেরিক SQL টুলthrows, রিট্রাই করে, বা নীরবে no-op হয়sqai.tools()needs_clarification ও বিকল্পসহ ফেরত দেয় — টুলগুলো কখনো throw করে না
একই প্রশ্ন দুইবারএকটি জেনেরিক SQL টুলভিন্ন SQL, ভিন্ন উত্তরsqai.tools()একই প্ল্যান, একই হ্যাশ — পুনরায় চালানোযোগ্য
রাইট পাথএকটি জেনেরিক SQL টুলকানেকশন যা অনুমতি দেয় তাইsqai.tools()নির্মাণগতভাবে নেই — 4,574টি রিড-অনলি সক্ষমতা, মডেল-অ্যাক্সেসযোগ্য কোনো এস্কেপ হ্যাচ নেই
প্রমাণএকটি জেনেরিক SQL টুলকিছু নেই — একটি সম্ভাব্য সংখ্যাsqai.tools()প্রতিটি উত্তরে plan_hash ও computation_hash

বাম দিকের ব্যর্থতার ধরনগুলো নথিভুক্ত, কল্পিত নয়: vercel/ai #1905 · #2147 · #12020 · #6913

পূর্ণ এজেন্ট লুপ ডিজাইন করুন

টুলবক্স শিপ করুন।

কোনো API কি নেই। কোনো অ্যাকাউন্ট নেই। প্রথম টুল কলেই কাজ করে।

AI SDK Tools Registry-তে তালিকাভুক্ত · ai ^7.0.0 · zod ^4.0.0 · Node ≥ 20 · server-side