TinyQuery-140M / tinyquery /audit_data.py
karmx's picture
Release TinyQuery 139.7M from scratch with frozen weights, reproducible Mac evaluations and runtime source
b296ad4 verified
Raw
History Blame Contribute Delete
3.53 kB
"""Audit every reference action and execute each distinct SQL case on two fixtures."""
import argparse
import hashlib
import json
import sqlite3
from pathlib import Path
import time
from jsonschema import Draft202012Validator
from tinyquery.data import SQL_OPS,compact,serialize,validate_sql,sqlite_sql
from tinyquery.evaluate import check_action
def main():
p=argparse.ArgumentParser();p.add_argument('--data',required=True);p.add_argument('--out',required=True)
args=p.parse_args();start=time.time();ids=set();prompts=set();queries=set();context_queries=set();validators={};errors=[];count=0;sql_rows=0
for line in Path(args.data).open():
row=json.loads(line);count+=1
try:
assert row['id'] not in ids,'Duplicate ID'
ids.add(row['id']);fingerprint=hashlib.sha256(row['prompt'].encode()).hexdigest()
assert fingerprint not in prompts,'Duplicate prompt'
prompts.add(fingerprint)
assert row['prompt']==serialize(row['context'],row['question']),'Prompt serialization differs'
assert row['response']==compact(row['target']),'Response serialization differs'
action=row['target']
if action['action']=='call':
assert set(action)=={'action','name','arguments'}
tool=next(t for t in row['context']['tools'] if t['name']==action['name'])
schema=compact(tool['inputSchema'])
if schema not in validators:validators[schema]=Draft202012Validator(tool['inputSchema'])
validators[schema].validate(action['arguments'])
else:check_action(action,row['context'])
if row['operation'] in SQL_OPS:
sql_rows+=1;a=action['arguments'];sql=a.get('sql',a.get('query'))
context_key=hashlib.sha256(compact([row['backend'],row['context']['schema'],sql]).encode()).hexdigest()
if context_key not in context_queries:
import sqlglot
db=sqlite3.connect(':memory:');db.create_function('YEAR',1,lambda x:0);db.create_function('MONTH',1,lambda x:0)
try:
for ddl in row['context']['schema']:db.execute(ddl)
db.execute(sqlite_sql(sqlglot.parse_one(sql,read='postgres' if row['backend']=='supabase' else 'mysql')))
finally:db.close()
context_queries.add(context_key)
key=hashlib.sha256(compact([row['backend'],row['slots'],sql]).encode()).hexdigest()
if key not in queries:
validate_sql(sql,row['backend'],row['slots']);queries.add(key)
except Exception as exc:
errors.append({'id':row['id'],'error':type(exc).__name__+': '+str(exc)})
if len(errors)>=20:break
if count%10000==0:print(json.dumps({'rows':count,'unique_sql':len(queries),'seconds':time.time()-start}),flush=True)
report={'rows':count,'unique_ids':len(ids),'unique_prompts':len(prompts),'sql_rows':sql_rows,'unique_sql_cases':len(queries),
'distinct_context_sql_compilations':len(context_queries),
'fixtures_per_sql_case':2,'sql_engine':'SQLite after dialect parsing/adaptation; native coverage reported separately',
'seconds':time.time()-start,'errors':errors,'passed':not errors}
Path(args.out).write_text(json.dumps(report,indent=2));print(json.dumps(report),flush=True)
if errors:raise SystemExit(1)
if __name__=='__main__':main()