listSources
কখনো কার্যকর হয় নাআবিষ্কার। টাইপড ফিল্ড সহ সংযুক্ত সোর্স, ক্যাপাবিলিটি মডিউল, ফাংশন সিগনেচার — একটি ইনপুট থেকে তিনটি মোড, যাতে স্পেক সঠিক নাম ব্যবহার করে।
এজেন্টের জন্য — নিয়ন্ত্রিত ডেটা টুল
SQAI একটি টুল-কলিং মডেলকে তিনটি নিয়ন্ত্রিত টুলের মাধ্যমে স্ট্রাকচার্ড ডেটায় রিড-অনলি অ্যাক্সেস দেয়। মডেল টাইপড ইন্টেন্ট রচনা করে। একটি কন্ট্র্যাক্ট ও আপনার নীতি তা যাচাই করে। একটি নির্ধারণবাদী ইঞ্জিন তা কার্যকর করে। প্রতিটি উত্তর একটি হ্যাশসহ ফেরে যা তা পুনরায় চালাতে পারে।
Iলুপের একটি পালা
“কোন অঞ্চলে মোট রাজস্ব সর্বোচ্চ ছিল?”পদক্ষেপ পরিকল্পনা করে। ইন্টেন্ট রচনা করে। ডেটা স্পর্শ করে না।
{ version:"1", kind:"query", spec:{ metric:"revenue", aggregation:"sum", group_by:"region", source:"sales" } }contractহ্যাশ-পিন করা ক্যাপাবিলিটি কন্ট্র্যাক্টpolicyআপনার অ্যালাউ-লিস্ট, এক্সিকিউশনের আগে যাচাই করাengineনির্ধারণবাদী, রিড-অনলি এক্সিকিউশনstatus: ok · needs_clarification · rejected · erroreast — 2,130.50 · plan_hash f87610d8afeb…okলুপ থেকে বের হয়। রো বা মান — এবং হ্যাশ যা তা পুনরায় চালায়।
needs_clarification ↺লুপে পুনরায় প্রবেশ করে। একটি প্রশ্ন ও এটি খুঁজে পাওয়া প্রার্থীগুলো — মডেল স্পেক পরিমার্জন করে আবার কল করে। এটি কখনো কলাম অনুমান করে না।
প্রত্যাখ্যাত ও ত্রুটি একই রিটার্ন লেনে চলে — টাইপড ফলাফল যা মডেল পড়তে পারে, এক্সেপশন নয় যা রান বাতিল করে।
IIটুলসেট
sqai.tools() ঠিক তিনটি টুল ফেরত দেয় — ইচ্ছাকৃতভাবে ছোট একটি সারফেস। ডিসকভারি ও ড্রাই রান কখনো কার্যকর হয় না; এক্সিকিউশন ঠিক একটি জায়গায় ঘটে।
listSourcesআবিষ্কার। টাইপড ফিল্ড সহ সংযুক্ত সোর্স, ক্যাপাবিলিটি মডিউল, ফাংশন সিগনেচার — একটি ইনপুট থেকে তিনটি মোড, যাতে স্পেক সঠিক নাম ব্যবহার করে।
queryDataএকটি ভার্সনড ইনপুট — kind-এ একটি discriminated union: একটি query বা computation। চারটি আউটকাম, সর্বদা টাইপড, কখনো throw নয়।
explainQueryকোনো কিছু চালানো ছাড়াই একটি intent রিজলভ ও যাচাই করে। মডেল এটি ব্যবহার করে clarification ডিবাগ করতে; আপনি ব্যবহার করেন পরিকল্পনা প্রিভিউ করতে।
সেটটি সরাসরি generateText বা streamText-এ যায় — টাইপড, কোনো cast ছাড়াই assignable। Vercel AI SDK সেটআপ →
IIIএরর চুক্তি
একটি exception এজেন্ট রান বন্ধ করে দেয়। তাই এখানে কিছুই throw করে না: অস্পষ্টতা, প্রত্যাখ্যান, এবং ব্যর্থতা টাইপড স্ট্যাটাস হিসেবে ফেরে — মডেল সেগুলো পড়তে এবং তার স্টেপ বাজেটের মধ্যে সংশোধন করতে পারে।
retryable ক্ষণস্থায়িগুলো চিহ্নিত করে — network_error · timeout · rate_limited · service_unavailable
queryData — চারটি আউটকাম
okফলাফল: rows বা value, provenance হ্যাশ, ঘোষিত truncation।plan_hash · invocation_hash · computation_hash · truncatedneeds_clarificationintent অস্পষ্ট ছিল। একটি প্রশ্ন এবং প্রার্থীরা — কখনো অনুমান নয়।question · candidates · explanationrejectedরিজলভার intent প্রত্যাখ্যান করেছে। কিছুই কার্যকর হয়নি।rejection_reason · candidates · explanationerrorএকটি স্থিতিশীল কোড সহ কাঠামোগত ব্যর্থতা — মডেল পড়ে এবং সমন্বয় করে।code · message · retryable · nearest_matches?প্রতিটি শাখা ডেটা। লুপ তার পালা রাখে।
নীতিমালা
কোডে নীতি · কোনো tool ইনপুটে policy ফিল্ড নেই · শুধু সংকীর্ণ
IVনীতি, প্রয়োগে
শিল্প এটি প্রোডাকশনে শিখেছে — একটি স্বায়ত্তশাসিত কোডিং এজেন্ট বিখ্যাতভাবে একটি লাইভ ডেটাবেস মুছে দিয়েছিল। SQAI-এর উত্তর কাঠামোগত, আচরণগত নয়: উন্মুক্ত পৃষ্ঠটি নির্মাণগতভাবে read-only। Write এবং non-deterministic ক্যাটাগরি কখনো এতে তৈরি হয় না, এবং কোনো ফ্ল্যাগ, নীতি বা মডেল ইনপুট সেগুলো পুনরায় চালু করে না।
Vসংযোগ
একটি প্যাকেজ ক্লায়েন্টকে tools-এ মোড়ে। সোর্সগুলো প্রথম কলে lazily সংযুক্ত হয়; প্রথম computation একবার runtime প্রভিশন করে, তারপর warm থাকে — পরিমাপ করা 0.83 ms।
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?",
});শুধু Server-side — Next.js-এ Node runtime রাখুন, Edge নয়।
মডেল যা পায়
Truncation সর্বদা ঘোষিত — truncated: true, returned_rows < total_rows। কখনো নীরব নয়। সম্পূর্ণ ফলাফল result_id দিয়ে অ্যাপ্লিকেশন কোডে পুনরুদ্ধারযোগ্য।
VIএজেন্টিক অ্যানালিটিক্স
এজেন্টিক অ্যানালিটিক্স পরিচিত উপায়ে ব্যর্থ হয়: ত্রুটিপূর্ণ tool call, মডেলের নিজস্ব গণনা, যাচাইযোগ্য নয় এমন সংখ্যা। প্রতিটির উত্তর কাঠামোগতভাবে দেওয়া হয়, ভালো prompt দিয়ে নয়।
একটি ভার্সনড ইনপুট, কিছু চালানোর আগে যাচাই করা হয়। ত্রুটিপূর্ণ বা অস্পষ্ট intent একটি টাইপড স্ট্যাটাস ফেরায় — লুপ crash-এর বদলে চলতে থাকে।
এখানে নয়। ইঞ্জিন গণনা করে। 16টি পরিমাণগত প্রশ্নের সেটে, একই মডেল 0/16 থেকে 16/16-তে গেছে যখন ইঞ্জিন গণনা করেছে।
প্রতিটি উত্তর তার হ্যাশ বহন করে। একই ডেটার বিপরীতে একই intent পুনরায় চালান এবং হ্যাশ মিলবে — TypeScript এবং Python-এ byte-identical।
একটি লুপ লেটেন্সি গুণ করে। query plane in-process-এ sub-millisecond-এ চলে; warm compute পরিমাপ করা 0.83 ms।
VIIপ্রশ্নাবলি
SQL ফিল্টার করবেন না — তৈরিই করবেন না। createSQAI()-এ সোর্স সংযুক্ত করুন এবং মডেলকে sqai.tools() দিন: এটি যে পৃষ্ঠে পৌঁছায় তা 4,574টি read-only ক্যাপাবিলিটি এবং আপনার সোর্স — নির্মাণগতভাবে কোনো write পথ নেই। ব্লক করার মতো কোনো write ক্যাটাগরি নেই, এবং কোনো মডেল ইনপুট নেই যা সেটি পুনরায় সক্রিয় করে।
queryData তখন needs_clarification ফেরত দেয় — একটি প্রশ্ন এবং যে candidate ফিল্ডগুলো পাওয়া গেছে তা সহ। এটি কখনো কোনো কলাম অনুমান করে না। মডেল প্রশ্নের উত্তর দিয়ে আবার কল করে — লুপের আরেকটি পালা।
না। প্রতিটি ব্যর্থতা একটি কাঠামোবদ্ধ ফলাফল হিসেবে আসে — স্থির কোড, বার্তা এবং retryable ফ্ল্যাগ সহ। অস্পষ্টতা, প্রত্যাখ্যান, নীতি-অস্বীকৃতি এবং ক্ষণস্থায়ী ত্রুটি — সবই মডেলের পাঠযোগ্য ডেটা হিসেবে ফেরত আসে।
না। allowedSources, allowedFields এবং allowedFunctions কোডে থাকে, createSQAI() কলের সময় নির্ধারিত হয় এবং execution-এর আগে যাচাই করা হয়। কোনো টুলের input schema-তে policy ফিল্ড নেই; অস্বীকৃত কোনো capability নাম দিলে কাঠামোবদ্ধ policy_denied ত্রুটি ফেরত আসে।
হ্যাঁ — @thyn-ai/sqai-ai-sdk তিনটি টুল generateText ও streamText-এর জন্য typed tool set হিসেবে সরবরাহ করে, peer হিসেবে ai ^7.0.0 ও zod ^4.0.0 সহ, Node 20 বা তার পরবর্তী সংস্করণে, server-side। অন্তর্নিহিত client সেই একই SDK যা যেকোনো এজেন্ট লুপে যুক্ত করা যায়।