
Most text-to-SQL systems treat the task as translation. Feyn AI (YC-backed startup) reframes it around inspection. The Feyn team has released SQRL, a family of models that turn natural language questions into SQL. Instead of generating a query immediately, SQRL can inspect the database first. This lets it resolve ambiguity and write only queries the data actually supports.
Feyn team reports that the flagship SQRL-35B-A3B reaches 70.6% execution accuracy on BIRD Dev. That figure edges Claude Opus 4.6 at 68.77% under the same evaluation. Three checkpoints ship openly on Hugging Face: SQRL-4B, SQRL-9B, and SQRL-35B-A3B.
A query can be valid SQL and still be wrong
Text-to-SQL is often described as a translation problem, but that framing misses the hardest part. A query can be perfectly valid SQL and still return the wrong answer. It can join the wrong tables, read an ambiguous column incorrectly, or filter for values that do not exist. None of these mistakes throws an error, so none is caught by execution alone.
Schema information does not prevent them. A schema lists tables, columns, types, and sometimes relationships. It does not reveal whether a county is stored as Alameda, Alameda County, or ALAMEDA. It cannot tell you which join produces duplicate rows.
The BIRD benchmark makes these failures measurable. Its databases span real domains and contain imperfect values, ambiguous columns, and nontrivial relationships. A system is scored by executing its SQL and comparing the returned rows against a reference result. For query languages, syntactic correctness is not enough. Feyn’s core insight is that the missing information already lives inside the database. The model simply needs permission to ask for it.
SQRL inspects before it answers
SQRL receives a question, its schema, and optional evidence about the database. If that context is enough, it returns a query at once. If something remains ambiguous, it runs read-only queries and uses the returned rows to draft its final answer. The decision to inspect is circumstantial. Counting rows in a single table needs no lookup, so SQRL answers directly.
The interaction uses two distinct actions. An block requests an observation from the database. An block commits to the final query. The harness executes exploration queries in read-only mode and returns their rows inside tags. SQRL can inspect up to five times, though most questions finish in fewer steps.
The explainer below walks through both behaviors on real examples, then compares the family against frontier models on BIRD Dev.
function run(){
var ex = examples[active];
var trace = document.getElementById(‘trace’);
trace.innerHTML = ”;
var runbtn = document.getElementById(‘runbtn’);
runbtn.disabled = true;
runbtn.textContent=”Running\u2026″;
ex.steps.forEach(function(s, idx){
var div = document.createElement(‘div’);
div.className=”step ” + s.type;
div.innerHTML = ‘‘
+ ‘
‘ + s.label + ‘
‘
+ ‘
‘ + s.desc + ‘
‘
+ ‘
' + s.code + '‘;
trace.appendChild(div);
setTimeout(function(){ div.classList.add(‘show’); resize(); }, 350 * (idx+1));
});
setTimeout(function(){
runbtn.disabled = false;
runbtn.textContent=”Replay”;
resize();
}, 350 * (ex.steps.length + 1));
}
document.getElementById(‘runbtn’).addEventListener(‘click’, run);
// —- tabs —-
Array.prototype.forEach.call(root.querySelectorAll(‘.tab’), function(t){
t.addEventListener(‘click’, function(){
var name = t.getAttribute(‘data-tab’);
Array.prototype.forEach.call(root.querySelectorAll(‘.tab’), function(x){ x.classList.remove(‘active’); });
t.classList.add(‘active’);
Array.prototype.forEach.call(root.querySelectorAll(‘.panel’), function(p){ p.classList.remove(‘active’); });
document.getElementById(‘panel-‘ + name).classList.add(‘active’);
if(name === ‘bench’){ drawChart(); }
resize();
});
});
// —- benchmark chart —-
var bench = [
{ name:”SQRL-35B-A3B”, val:70.60, sqrl:true },
{ name:”SQRL-9B”, val:69.80, sqrl:true },
{ name:”SQRL-4B”, val:68.80, sqrl:true },
{ name:”Claude Opus 4.6″, val:68.77, sqrl:false },
{ name:”Claude 4.5 Sonnet”, val:67.34, sqrl:false },
{ name:”Qwen3-Coder-480B-A35B”, val:66.17, sqrl:false },
{ name:”GLM-4.7″, val:63.82, sqrl:false },
{ name:”DeepSeek-R1″, val:61.67, sqrl:false },
{ name:”Kimi-K2-Thinking”, val:60.63, sqrl:false }
];
var chartDrawn = false;
function drawChart(){
var chart = document.getElementById(‘chart’);
chart.innerHTML = ”;
bench.forEach(function(b){
var row = document.createElement(‘div’);
row.className=”bar-row”;
row.innerHTML =
‘
‘ + b.name + ‘
‘ +
‘
‘;
chart.appendChild(row);
});
// animate widths (scale: 0-100 maps to full track)
setTimeout(function(){
Array.prototype.forEach.call(chart.querySelectorAll(‘.bar-fill’), function(f, i){
f.style.width = bench[i].val + ‘%’;
});
setTimeout(resize, 1100);
}, 60);
chartDrawn = true;
}
// —- auto-resize (component’s own height + 40, per house rule) —-
function resize(){
try {
var h = root.offsetHeight + 40;
parent.postMessage({ type:’sqrl-resize’, height: h }, ‘*’);
} catch(e){}
}
window.addEventListener(‘load’, function(){ render(); resize(); });
window.addEventListener(‘resize’, resize);
setTimeout(resize, 300);
})();






