यह कैसे काम करता है

मॉडल प्रस्ताव करता है।
SQAI निपटाता है।

एजेंट कभी SQL नहीं लिखता और कभी चलाने योग्य कोड नहीं भेजता। वह एक typed अनुरोध लिखता है — और हर अनुरोध एक ही मार्ग से गुज़रता है: एक pinned contract के विरुद्ध सत्यापित, आपकी policy के अनुसार जाँचा, एक deterministic engine पर निष्पादित, और उन hashes के साथ लौटाया जो उसे दोबारा चला सकें।

हर अनुरोध — ask(), compute(), या AI SDK tool call — एक ही मार्ग से चलता है। जब तक हर जाँच पास न हो, कुछ भी engine को नहीं छूता।

01Typed आशय

एक अनुरोध जिसे engine पार्स कर सके। कोई string नहीं जिस पर भरोसा करना पड़े।

मॉडल एक typed ऑब्जेक्ट भेजता है — कभी SQL नहीं, कभी कोड नहीं। एक query आशय QuerySpec होता है: किसी named source पर aggregate करने के लिए एक metric। एक computation आशय ComputationSpec होता है: contract से एक named function, arguments और bindings के साथ। एक discriminated union, दो आकार — और किसी में भी कोई जगह नहीं जहाँ कोई executable string छुप सके।

यही पूरी authoring surface है। जो आकार व्यक्त नहीं कर सकता, मॉडल माँग नहीं सकता।

QuerySpecसंरचना
{
"kind": "query",union tag — query या computation
"version": "1",spec संस्करण, pinned
"source_name": "sales",एक connected source, सटीक नाम से
"metric": "revenue",aggregate करने वाला column
"aggregation": "sum",sum · avg · count · min · max में से एक
"group_by": "region"वैकल्पिक — परिणाम को किसी field से विभाजित करें
}

यह भी वैकल्पिकfilter · limit · order

computation आकारmodule · function · args · kwargs · bindings · seed?

02Contract जाँच

एक contract, hash-pinned। अज्ञात को दिशा-निर्देश के साथ अस्वीकार किया जाता है।

Spec को capability contract के विरुद्ध सत्यापित किया जाता है — एक generated, hash-pinned फ़ाइल जिसमें हर operation, उसका सटीक signature, और उसके determinism flags सूचीबद्ध हैं। कोई capability तभी उपलब्ध है जब वह read-only और deterministic हो, या seeded होने पर deterministic हो। Write-capable और non-deterministic operations को runtime पर नहीं रोका जाता — वे surface में कभी generate ही नहीं हुए।

कोई अज्ञात function unsupported_operation के रूप में विफल होता है और उसी index से nearest_matches के साथ उत्तर देता है — मॉडल loop करने के बजाय स्वयं सुधार करता है।

क्षमता अनुबंध

contract_hashsha256:79f1c5a6c7164e7e9e1750e70a5c03292fa87eb52d8148a740c06695924be9a1

4,778
contract में सूचीबद्ध operations
4,574
SDK को उपलब्ध, read-only
4,564
पूर्णतः deterministic
10
बीज-आवश्यक सिमुलेशन
204
surface से बाहर

पात्रताread_only && (deterministic || deterministic_when_seeded)

अज्ञात नाम परunsupported_operation + nearest_matches

03Policy जाँच

आपकी allow-list तय करती है — चलेगा या नहीं, और कैसे।

Policy तब निर्धारित होती है जब createSQAI() instance बनाता है, और कुछ भी execute होने से पहले in-process लागू होती है — source पर, हर metric, group, filter, और bound column पर, और function नाम पर। यह contract को केवल संकुचित कर सकती है: eligible surface से बाहर की capability नामित करने पर भी unsupported_operation आता है।

मॉडल के tool input में कोई allowed* field नहीं होता। अनुरोध में कुछ भी access नहीं बढ़ा सकता — इसलिए prompt injection के पास बढ़ाने को कुछ है ही नहीं।

allowedSourcesवे sources जिन्हें मॉडल नाम दे सकता है

  • "sales"

allowedFieldsवे columns जो वह पढ़ सकता है, प्रति source

  • sales.region
  • sales.revenue
  • sales.order_date

allowedFunctionsडिफ़ॉल्ट — हर read-only capability, इससे अधिक कुछ नहीं

  • "all-readonly"

अस्वीकृति सटीक, attributed, और अंतिम होती है

  • policy_denied_source
  • policy_denied_field
  • policy_denied_function

source: "sqai" · पुनः प्रयास योग्य नहीं

04निर्धारक इंजन

चलने से पहले pinned: float64, एक thread, एक runtime।

पहले, bindings resolve होती हैं। मॉडल ने एक source और एक field नाम दिया; SQAI engine के row-aligned extractColumns primitive के ज़रिए वास्तविक मान खींचता है, nulls को pairwise संभाला जाता है। SQAI स्वयं arrays को zip नहीं करता — इसलिए जो input hash होता है वह ठीक वही input है जो execute हुआ।

अब जाकर अनुरोध engine को छूता है। Runtime signed, versioned, और pinned है: float64 precision, एक single thread। पहला compute() इसे एक बार provision करता है, लगभग 110 सेकंड में; उसके बाद यह resident रहता है — finance.npv warm में 0.83–0.93 ms मापता है।

निर्धारकता आवरण
runtime_bundle_version0.1.0
runtime_bundle_sha2564d64142e4c1ff63d299cfc8b172fdf97cb59169b545e1e02978e678a632ce6e1
platformdarwin
architecturearm64
precision_modefloat64
thread_count1
seed
input_hash2ea5ede72acd2912fe9e1230cef34afad4c9436bfa8a709bac2da02b478e3212

हर परिणाम के साथ दर्ज — envelope गारंटी की सीमा बताता है, अतिरंजित दावा नहीं करता।

05उत्तर + प्रमाण

दो hashes। एक पहले, एक बाद।

invocation_hash execution से पहले stamped होता है — module, function, arguments, resolved bindings, seed, contract, और scope पर। computation_hash बाद में stamped होता है: invocation hash को canonical result के साथ fold करके। Replay का अर्थ है इसे फिर चलाएँ और bytes की तुलना करें।

दोनों SDK एक canonical serializer साझा करते हैं, इसलिए एक ही computation TypeScript और Python में byte-identical hashes देता है। Query उत्तर भी यही अनुशासन रखते हैं: canonical resolved plan पर एक plan_hash, साथ में decision path और वह सटीक scope जिसमें वह चला।

3188.1687606249325finance.npv · एक live column से bound · 0.83 ms warm

execution से पहले stamped

invocation_hash

8223a694250fc751fcf8a7777b8e1f524c44ff1f0e7e83451467f554a6123950

मॉड्यूल · फ़ंक्शन · आर्ग्युमेंट · रिज़ॉल्व्ड बाइंडिंग · सीड · कॉन्ट्रैक्ट · स्कोप

निष्पादन के बाद मुद्रांकित

computation_hash

ff5280ea128113f528dd1e9a28b9bc4a81469075ed7c981c7176fb172d98085d

invocation hash, canonical परिणाम के साथ संयुक्त

TypeScript और Python में byte-identical — एक भाषा में की गई गणना दूसरी में replay और verify होती है।

दोनों की गणना इसके विरुद्धcontract_hash sha256:79f1c5a6…

query plane परplan_hash f87610d8afeb…decision_path "exact_spec"deterministic_scope "local_registered_source"

06Discovery loop

अनुमान नहीं। Discover करें, dry-run करें, फिर निष्पादित करें।

Field के नाम और function signatures खोजे जाते हैं, गढ़े नहीं। AI SDK केवल तीन tools उजागर करता है — और उनमें से सिर्फ एक निष्पादित करता है।

  1. 01listSources()

    मैं क्या access कर सकता हूँ?

    जुड़े हुए sources, सटीक field नामों, types और प्रति field अनुमत operations के साथ। कभी निष्पादित नहीं होता।

  2. 02listSources({ capabilitySearch: "npv" })

    मैं क्या compute कर सकता हूँ?

    वही tool, deterministic catalog में खोज करता है — मिलते modules, सटीक signatures, और यह कि seed आवश्यक है या नहीं।

  3. 03explainQuery({ … })

    क्या यह चलेगा?

    एक dry run। Resolved plan, confidence और एक preview invocation_hash लौटाता है — preview मात्र, निष्पादित hash नहीं।

  4. 04queryData({ … })

    चलाएँ।

    वह एकमात्र tool जो निष्पादित करता है। परिणाम और उसकी पूर्ण provenance लौटाता है; अत्यधिक बड़े परिणाम result_id द्वारा प्राप्त किए जा सकते हैं।

Tools कभी throw नहीं करते — हर outcome typed हैok · needs_clarification · rejected · error

Mechanics, field दर field।

Docs पढ़ें