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: استعلام أو حساب. أربع نتائج، مكتوبة دائمًا، لا استثناء قط.
explainQueryيحلّ النية ويتحقق منها دون تشغيلها. يستخدمه النموذج لتصحيح الاستيضاحات؛ وتستخدمه أنت لمعاينة الخطة.
تنزل المجموعة مباشرةً في generateText أو streamText — مكتوبة، قابلة للإسناد دون تحويل. إعداد Vercel AI SDK →
IIIعقد الأخطاء
الاستثناء يُوقف تشغيل الوكيل. لذا لا شيء هنا يُطلق استثناءً: الغموض والرفض والفشل تعود كحالات مكتوبة يستطيع النموذج قراءتها — وتصحيحها — ضمن ميزانية خطواته.
retryable يُميِّز العابرة منها — network_error · timeout · rate_limited · service_unavailable
queryData — النتائج الأربع
okالنتيجة: صفوف أو قيمة، تجزئات المصدر، والاقتطاع المُعلَن.plan_hash · invocation_hash · computation_hash · truncatedneeds_clarificationالنية كانت غامضة. سؤال مع المرشحين — لا تخمين قط.question · candidates · explanationrejectedرفض المحلِّل النية. لم يُنفَّذ شيء.rejection_reason · candidates · explanationerrorفشل منظَّم برمز ثابت — يقرأه النموذج ويُعدِّل.code · message · retryable · nearest_matches?كل فرع بيانات. تحتفظ الحلقة بدورها.
المبدأ
السياسة في الكود · لا حقل سياسة في أي مدخل أداة · تضييق فقط
IVالمبدأ مُطبَّقًا
تعلّمت الصناعة هذا في الإنتاج — وكيل برمجة مستقل حذف قاعدة بيانات حية في حادثة شهيرة. إجابة SQAI بنيوية لا سلوكية: السطح المكشوف للقراءة فقط بالتصميم. فئات الكتابة وغير الحتمية لا تُولَّد فيه أبدًا، ولا علامة ولا سياسة ولا مدخل نموذج يُعيد تفعيلها.
Vالتوصيل
حزمة واحدة تُغلِّف العميل في أدوات. تتصل المصادر كسولًا عند أول استدعاء؛ أول حساب يُهيِّئ وقت التشغيل مرة واحدة ثم يبقى دافئًا — 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?",
});جانب الخادم فقط — في Next.js، احتفظ بوقت تشغيل Node لا Edge.
ما يصل إلى النموذج
الاقتطاع مُعلَن دائمًا — truncated: true، وreturned_rows < total_rows. لا صمت أبدًا. تبقى النتائج الكاملة قابلة للاسترداد في كود التطبيق عبر result_id.
VIتحليلات وكيلة
تفشل التحليلات الوكيلة بطرق معروفة: استدعاءات أدوات مشوَّهة، ونماذج تُجري حساباتها بنفسها، وأرقام معقولة لا يمكن لأحد التحقق منها. كل واحدة تُعالَج بنيويًا، لا بتحسين الموجِّه.
مدخل واحد بإصدار محدد، يُتحقق منه قبل أي تشغيل. النية المشوَّهة أو الغامضة تُعيد حالة مكتوبة — تستمر الحلقة بدلًا من الانهيار.
ليس هنا. المحرك يحسب. على مجموعة كمية من 16 سؤالًا، انتقل النموذج ذاته من 0/16 إلى 16/16 حين تولّى المحرك الحساب.
كل إجابة تحمل تجزئتها. أعِد تشغيل النية ذاتها على البيانات ذاتها وستتطابق التجزئة — متطابقة بايتًا في TypeScript وPython.
الحلقة تُضاعف الكمون. مستوى الاستعلام يعمل داخل العملية بأقل من ميلي ثانية؛ الحساب الدافئ مقاس عند 0.83 ms.
VIIأسئلة
لا تُصفِّ SQL — لا تُولِّدها. صِل المصادر بـ createSQAI() وسلِّم النموذج sqai.tools(): السطح الذي يصله 4,574 قدرة للقراءة فقط إضافةً إلى مصادرك، بلا مسار كتابة بالتصميم. لا توجد فئة كتابة لحجبها، ولا مدخل نموذج يُعيد تفعيلها.
يُعيد queryData نتيجة needs_clarification تتضمن سؤالاً والحقول المرشحة التي رصدها. لا يخمّن عموداً قط. يُجيب النموذج على السؤال ويستدعي الأداة مجدداً — دورة واحدة إضافية في الحلقة.
لا. كل إخفاق يُعاد كنتيجة منظّمة تحمل رمزاً ثابتاً ورسالةً وعلامةً تشير إلى إمكانية إعادة المحاولة. الغموض والرفض وحظر السياسة والأعطال العابرة — كلها تصل بوصفها بيانات يقرأها النموذج.
لا. تعيش allowedSources وallowedFields وallowedFunctions في الكود، وتُضبط عند استدعاء createSQAI() وتُفحص قبل التنفيذ. لا يحتوي مخطط إدخال أي أداة على حقل سياسة؛ تسمية قدرة محظورة يُعيد خطأ policy_denied منظّماً.
نعم — يُوفّر @thyn-ai/sqai-ai-sdk الأدوات الثلاث كمجموعة أدوات مكتوبة بأنواع لـ generateText وstreamText، مع ai ^7.0.0 وzod ^4.0.0 كاعتماديات نظيرة، وNode 20 أو أحدث، من جانب الخادم. العميل الأساسي هو ذات SDK الذي يمكن توصيله بأي حلقة وكيل.