惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
宝玉的分享
宝玉的分享
量子位
博客园 - 叶小钗
博客园_首页
Know Your Adversary
Know Your Adversary
S
Schneier on Security
罗磊的独立博客
C
Cyber Attacks, Cyber Crime and Cyber Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Simon Willison's Weblog
Simon Willison's Weblog
美团技术团队
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
Hacker News: Ask HN
Hacker News: Ask HN
Application and Cybersecurity Blog
Application and Cybersecurity Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Security Latest
Security Latest
月光博客
月光博客
Spread Privacy
Spread Privacy
C
Cybersecurity and Infrastructure Security Agency CISA
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
C
CERT Recently Published Vulnerability Notes
Last Week in AI
Last Week in AI
Attack and Defense Labs
Attack and Defense Labs
NISL@THU
NISL@THU
H
Hacker News: Front Page
N
News and Events Feed by Topic
小众软件
小众软件
T
Threatpost
V2EX - 技术
V2EX - 技术
T
Tailwind CSS Blog
阮一峰的网络日志
阮一峰的网络日志
Project Zero
Project Zero
L
LINUX DO - 热门话题
Apple Machine Learning Research
Apple Machine Learning Research
C
CXSECURITY Database RSS Feed - CXSecurity.com
TaoSecurity Blog
TaoSecurity Blog
P
Privacy International News Feed
Latest news
Latest news
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Shipping a Local LLM API with FastAPI and Ollama
Nur Ahmad · 2026-06-25 · via DEV Community

Phase 2 of the de-swarm project — how I turned a 3B text-to-SQL model into a production API for $0.


The setup

Three weeks ago, I distilled a 120B+ text-to-SQL pipeline into a 3B QLoRA fine-tune of Qwen2.5-Coder-3B-Instruct. The model hit 90% in-domain accuracy and 55.5% on Spider, ran on a laptop CPU via Ollama, and cost $0 to train and $0 to inference. I wrote about it in Phase 1.

But "I have a model that runs on my laptop" is a different category of deliverable than "I have an API anyone can call." The first is a research artifact. The second is a product.

Phase 2 was about crossing that gap. This post is the story.


What I built

A FastAPI gateway around the Ollama model with six endpoints:

Method Path What it does
GET /health Liveness + Ollama reachability + available schemas
GET /schemas List of SQLite DBs the API can execute against
GET /schemas/{name} Tables, columns, and sample values for a given schema
POST /query Natural language → SQL (no execution)
POST /execute SQL → rows (read-only, sandboxed)
POST /query-and-execute NL → SQL → rows (the magic endpoint)

The full code is at github.com/nurahmad-data/de-swarm-api. About 800 lines of Python across 7 files, 15 tests, Dockerized, deployable to a $5 VPS.


The hero query

Let me start with the most impressive thing the API does, then work backwards into how it works.

I have a SaaS schema with 16 tables — organizations, users, plans, subscriptions, invoices, support tickets, NPS surveys, API usage logs, webhooks, feature flags, etc. Standard B2B SaaS data model.

I asked the API:

"Count of NPS promoters, passives, and detractors by plan"

The model generated this SQL:

SELECT p.plan_name,
  COUNT(CASE WHEN n.score >= 9 THEN 1 END) AS promoters,
  COUNT(CASE WHEN n.score BETWEEN 7 AND 8 THEN 1 END) AS passives,
  COUNT(CASE WHEN n.score <= 6 THEN 1 END) AS detractors
FROM organizations o
JOIN subscriptions s ON o.org_id = s.org_id
JOIN plans p ON s.plan_id = p.plan_id
JOIN nps_surveys n ON o.org_id = n.org_id
WHERE n.survey_date >= DATE('now', '-30 days')
  AND s.status = 'active'
GROUP BY p.plan_name
ORDER BY p.plan_name ASC;

And returned:

plan_name promoters passives detractors
Enterprise 1 0 0
Pro 4 1 0
Starter 6 3 0

Total time: 31.7 seconds. Total cost: $0.

Let's unpack what the model did:

  1. Knew NPS thresholds from training. The standard NPS scoring is promoters (9-10), passives (7-8), detractors (0-6). This wasn't in the schema context. The model learned it from the training data.

  2. Navigated a 4-table JOIN chain. nps_surveysorganizationssubscriptionsplans. Foreign keys all the way down.

  3. Added an intelligent filter. WHERE s.status = 'active' — excluding churned accounts from the NPS breakdown. This wasn't asked for, but it's what an analyst would actually want.

  4. Used CASE WHEN correctly. Three CASE expressions with the right thresholds, wrapped in COUNT. Textbook SQL.

  5. Ran on a 3B model on CPU. No GPU, no cloud API, no OpenAI bill.

That's the moment I knew Phase 2 was working. A 3B model on a laptop wrote SQL that an experienced analyst would write, in 31 seconds, for free.


Architecture

The API is two containers in production:

┌──────────────────────────────────────────────────┐
│  $5 VPS (Hetzner CX22, 2 vCPU, 4 GB RAM + swap)  │
│                                                  │
│  ┌────────────┐         ┌────────────────────┐  │
│  │   Caddy    │────────▶│   de-swarm-api     │  │
│  │  (TLS 443) │  :8000  │  (FastAPI + uvicorn)│  │
│  └────────────┘         └─────────┬──────────┘  │
│                                   │              │
│                          http://ollama:11434     │
│                                   │              │
│                         ┌─────────▼──────────┐  │
│                         │      Ollama         │  │
│                         │  de-sql-3b-q8       │  │
│                         │  (3.3 GB q8_0 GGUF) │  │
│                         └────────────────────┘  │
└──────────────────────────────────────────────────┘

Locally, it's just uvicorn app.main:app --reload talking to ollama serve on localhost.

The API itself is structured into 7 modules:

  • config.py — Pydantic settings, all env-driven
  • auth.py — X-API-Key middleware with constant-time compare
  • ollama.py — async HTTP client wrapping Ollama's /api/generate
  • schema_fetcher.py — read-only SQLite schema introspection with smart sampling
  • executor.py — read-only SQL executor with 5-layer safety
  • models.py — Pydantic request/response contracts
  • main.py — FastAPI app, 6 routes, lifespan hooks

No LangGraph, no LangChain, no orchestrator. The training pipeline uses all of that; the API doesn't need to. It's just an HTTP server that calls another HTTP server.


The 5-layer safety model

The hardest part of shipping a SQL-generating API wasn't the model — it was the safety story. If the model writes DROP TABLE customers;, the API needs to refuse to execute it. Even if the model is having a bad day.

I ended up with 5 layers, in order:

Layer 1: Forbidden-pattern regex

The first thing executor.py does is regex-scan the SQL for forbidden keywords:

_FORBIDDEN_PATTERNS = [
    (r"\bDROP\b",     "DROP statement detected"),
    (r"\bDELETE\b",   "DELETE statement detected"),
    (r"\bUPDATE\b",   "UPDATE statement detected"),
    (r"\bINSERT\b",   "INSERT statement detected"),
    (r"\bALTER\b",    "ALTER statement detected"),
    (r"\bTRUNCATE\b", "TRUNCATE statement detected"),
    (r"\bCREATE\b",   "CREATE statement detected"),
    (r"\bATTACH\b",   "ATTACH statement detected"),
    (r"\bDETACH\b",   "DETACH statement detected"),
    (r"\bPRAGMA\b",   "PRAGMA statement detected"),
    (r"\bVACUUM\b",   "VACUUM statement detected"),
    (r"\bREINDEX\b",  "REINDEX statement detected"),
]

Word boundaries (\b) prevent false positives on identifiers like updated_at or delete_flag. If anything matches, the request is rejected with HTTP 422.

Layer 2: Single-statement enforcement

Even if the SQL is benign, the executor splits on ; and keeps only the first non-empty statement. This kills the classic SELECT 1; DROP TABLE customers; injection pattern — the DROP never runs.

if ";" in sql:
    first = sql.split(";", 1)[0].strip()
    if first:
        sql = first + ";"

Layer 3: Read-only SQLite connection

This is the belt-and-suspenders layer. Even if regex misses something and the single-statement enforcement fails, the SQLite connection itself is opened with mode=ro:

conn = sqlite3.connect(
    f"file:{db_path}?mode=ro",
    uri=True,
    timeout=self._timeout_s,
)

SQLite will physically refuse to execute any write operation on a mode=ro connection, regardless of what the SQL says. The filesystem layer enforces it.

Layer 4: Per-query timeout

PRAGMA busy_timeout = 5000 plus a connection timeout. Prevents a slow query from hanging the API.

Layer 5: Row limit cap

If the query lacks a LIMIT clause, the executor applies a post-hoc cap (default 100 rows, hard max 10,000). Prevents the model from accidentally writing SELECT * FROM huge_table and shipping 10 million rows back to the client.

Verification

I ran 22 production queries plus 6 adversarial tests (DROP, DELETE, UPDATE, multi-statement injection, unknown schema, empty SQL). Zero security violations. The 5-layer model held.


The schema sampling optimization

Here's a debugging story that taught me something fundamental about small-model inference.

The SaaS schema has 16 tables, 135 columns. Initially, my schema fetcher would sample up to 10 distinct values per TEXT column, to give the model concrete examples of categorical values (statuses, plan names, countries, etc.). Total schema context: 14,800 characters, 536 sample values.

Every SaaS query timed out. 60 seconds. 120 seconds. 300 seconds. Nothing worked.

I tried cutting samples to 3 per column. Still timed out. The schema was still 9,800 characters.

I tried cutting samples to 0. That would have worked, but it would have gutted the model's accuracy — the samples are how it knows status = 'delivered' instead of status = 'completed'.

The actual fix was smart sampling — two-stage filtering:

Stage 1: Name-based blocklist. Columns whose names match known free-text patterns are never sampled, regardless of cardinality. The blocklist includes: email, name, url, description, feedback, comment, user_agent, ip_address, uuid, token, secret, hash, json, metadata, payload, body, content, text, subject, message, note, label, tag, invoice_number, order_number, reference, key_name, key_prefix, scopes, version, event_triggers, triggers.

Stage 2: Cardinality check. For remaining TEXT columns, fetch COUNT(DISTINCT col). If it's > 20, skip — it's free text even though the name didn't match the blocklist.

Result: SaaS schema dropped from 9,800 chars → 8,200 chars, sample count from 202 → 96. Every sample the model actually uses (statuses, plan types, regions, priorities) was preserved. Every useless sample (emails, names, URLs, IPs, JSON blobs) was dropped.

After the fix, every SaaS query completed in 10-32 seconds.

The lesson: on CPU inference, prompt size is the dominant cost. A 3B model on a GPU can chew through 5,000 input tokens in a second. The same model on CPU takes 100-150ms per token — 5000 tokens = 500-750 seconds just for prompt evaluation. Trimming the prompt isn't a micro-optimization; it's the difference between the API working and not working.


The benchmark

I ran 22 queries across three schemas (ecommerce, retail, SaaS), spanning simple 1-table GROUP BYs up to 4-table JOINs with CASE expressions and NOT EXISTS subqueries.

Results

Metric Value
Textbook-perfect SQL 16 / 22 (73%)
Partial (returned data, missed nuance) 3 / 22 (14%)
Wrong (over-filtered, 0 rows) 1 / 22 (5%)
Hit 3B model ceiling (window functions) 3 / 22 (14%)
Timeouts 0
Syntax errors 0
Security violations 0
Median latency 17s
Range 9s – 61s
Cost per query $0

Latency distribution

Range Count Notes
<15s 5 Simple 1-2 table queries, warm cache
15-25s 10 Most queries — the sweet spot
25-35s 4 Complex 4-table JOINs, CASE expressions
35-60s 2 Cold cache or very large output
>60s 1 Cold-cache outlier

For a 3B model on CPU with no GPU, this is genuinely usable. You wouldn't put it behind a chatbot — 17 seconds is too long for a conversational UX. But for an analytics API where the user clicks "Generate Report" and waits, 17 seconds is fine. Tableau queries take longer.

Where the model excels

  • Multi-table JOINs up to 4 tables — flawless foreign-key navigation
  • Aggregations with HAVING — perfect COUNT / AVG / SUM + filter combos
  • Anti-joins (NOT EXISTS) — textbook subquery patterns
  • CASE WHEN logic — the NPS query is the standout example
  • Date/time filtering — correct strftime() + DATE('now', '-N days') usage
  • Star schema queries — navigated fact_sales + dim_store correctly

Where the model hits the wall

Three queries asked for window functions. The model dodged all three.

Query: "Running total of revenue by month for the last 12 months"
Asked for: SUM(amount) OVER (ORDER BY month) — running total
Model generated: SELECT month, SUM(amount) FROM ... GROUP BY month — monthly totals, no running total

Query: "Top revenue-generating organization in each industry"
Asked for: ROW_NUMBER() OVER (PARTITION BY industry ORDER BY revenue DESC) — top per group
Model generated: SELECT org_name, SUM(amount) FROM ... GROUP BY org_name ORDER BY revenue DESC — all orgs ranked, not top-per-industry

This is a well-documented limitation of 3B-parameter models. Even 7B models struggle with window functions without explicit training data. The model recognizes what's being asked (it generates SQL in the right shape) but avoids the window-function syntax.

The honest fix is on the roadmap: a 7B validator fine-tuned on window-function training data, planned for Phase 2.5.


What I learned

1. CPU inference is dominated by prompt size

On a GPU, a 3B model is fast — sub-second responses regardless of prompt size. On CPU, prompt evaluation is 100-150ms per token. A 5,000-token prompt takes 500-750 seconds just for prefill, before the model generates a single output token.

This means schema context size isn't a nice-to-have optimization — it's the difference between the API working and not working. Smart sampling (cutting useless samples while preserving useful ones) took my SaaS schema from "every query times out" to "every query completes in 15-30 seconds."

2. Safety in depth works

Five layers of defense feels excessive until you watch the model actually try to generate DROP TABLE (it never did, but it could have). Each layer catches a different failure mode. The regex catches obvious attacks. The single-statement enforcement catches injection patterns. The mode=ro connection catches anything the regex missed. Together, they make the API safe to expose publicly.

3. The honest limitations section is the most compelling part

I was tempted to only show the queries that worked. But the window-function failures and the over-eager date filters are more interesting than the perfect queries. They show that I understand the model's ceiling — and that I have a plan to push it.

A hiring manager who reads "the model writes perfect SQL every time" thinks "marketing BS." A hiring manager who reads "the model handles 4-table JOINs and CASE expressions flawlessly but dodges window functions — here's why, here's the fix on the roadmap" thinks "this person actually understands what they built."

4. "I have an API" is a categorical shift from "I have a model"

The Phase 1 deliverable was a model on HuggingFace. Impressive, but it requires the visitor to install Ollama, download 3.3 GB, copy a Modelfile, and run a CLI command to see anything.

The Phase 2 deliverable is curl https://api.yourdomain.com/query-and-execute -d '{"question":"..."}'. Anyone can try it in 5 seconds. That's a categorical difference in accessibility — for recruiters, for hiring managers, for anyone who might want to use it.


What's next

Phase 2.3 — Schema RAG. Instead of dumping all 16 tables into the prompt, retrieve only the 2-4 tables relevant to the question. For "Total users by plan," the model only needs users, organizations, subscriptions, plans — not webhooks, deployments, audit_log. Brings SaaS inference down to 5-10s and enables any-DB support.

Phase 2.5 — 7B validator. Fine-tune Qwen2.5-Coder-7B on RCA-labeled failed prompts. Build a complexity router: simple queries go to the 3B, complex ones (window functions, multi-step aggregations) go to the 7B + 3B + validator.

VPS deploy. The Docker compose file is ready. Next weekend I'll spin up a Hetzner CX22, point a domain at it, and have a live demo URL for the portfolio.


Try it

The code is at github.com/nurahmad-data/de-swarm-api. The model is at huggingface.co/nurahmad-data/de-sql-3b-v2-gguf. The full test results (22 queries with SQL, latency, and verdicts) are in TEST_RESULTS.md.

If you want to reproduce the benchmark locally:

git clone https://github.com/<your-username>/de-swarm-api.git
cd de-swarm-api
pip install -r requirements.txt
ollama pull hf.co/nurahmad-data/de-sql-3b-v2-gguf
ollama cp hf.co/nurahmad-data/de-sql-3b-v2-gguf de-sql-3b-q8
# add your SQLite DBs to ./data/
uvicorn app.main:app --port 8000

curl -X POST http://localhost:8000/query-and-execute \
  -H "Content-Type: application/json" \
  -d '{"question": "Count of NPS promoters, passives, and detractors by plan", "schema": "saas"}'

31 seconds later, you'll have your answer. For $0.


This is the second post in the de-swarm series. Phase 1 covered distilling the 120B teacher pipeline into the 3B student model. Phase 3 will cover scaling the dataset to 140 schemas via Spider. Follow along on [LinkedIn] or GitHub for updates.