Typical Python SDK soup
client = OpenAI(...)
resp = client.chat.completions.create(...)
# separate train script, eval notebook,
# CI secrets, ad-hoc shell glue…
SparkLang
A language beats another Python SDK because one reviewable
.spark file covers train → eval → ship,
with dry-run fixtures you can run in CI without API keys.
For solo and small teams who want reviewable AI train→eval pipelines in PRs — without maintaining SDK glue.
Offline-first by default:
./spark --dry-run.
backend "http" means Spark POSTs to a
trainer service you run at
SPARK_TRAIN_URL — not a magic cloud.
Dry-run shows the job path; live needs your trainer.
Library glue scatters prompts, training scripts, and eval harnesses
across repos. A .spark program is one
reviewable surface — same file for dry-run CI and live ops.
client = OpenAI(...)
resp = client.chat.completions.create(...)
# separate train script, eval notebook,
# CI secrets, ad-hoc shell glue…
model train dataset "data.jsonl" base "base" out "out/job-1" backend "http" -> job
model status "job-1" -> status
model compare ["fast", "code", "best"] on suite "examples/eval_suite.json" -> comparison
print comparison
# ./spark --dry-run train_eval.spark
./spark --dry-run uses offline
fixtures — no keys, no network. Pass
--live only when you want real
calls.
./spark --dry-run examples/model_train.spark
model train /
model build submit via
backend "http" to your trainer at
SPARK_TRAIN_URL. Dry-run shown
below; live requires that service.
model train dataset "…" base "…" out "…" backend "http" -> job
model status "job-id" -> status
After train, score aliases on a suite with
model compare — or
classify labels with a confidence
floor. One program for the loop.
model compare ["fast", "code", "best"]
on suite "examples/eval_suite.json" -> comparison
print comparison
Dry-run writes fixture artifact paths (no GPU). Live POSTs to the
trainer at
SPARK_TRAIN_URL
(backend "http"), or an allowlisted
local-yield unit.
# examples/train_eval.spark — dry-run first
model train dataset "examples/fixtures/train/dataset.jsonl" base "fixture-base" out "out/train/job-dry-001" backend "http" -> job
model status "job-dry-001" -> status
model compare ["fast", "code", "best"] on suite "examples/eval_suite.json" -> comparison
print comparison
Analyze / improve are additional eval helpers. Model training docs · Build a Model · honesty checklist in Adoption bar.
IDE ops, embed/retrieve, voice demos, HTTP get/post, and network/browser surfaces live in the language reference and adoption bar — not the homepage thesis.
Follow the trail: install → first dry-run → train→eval loop → ship a job.
Install the runtime and verify with
./spark --dry-run.
A minimal train → status → compare loop you can dry-run in CI.
Write train_eval.spark →Train, compare, classify, extract — the train→eval→ship primitives.
Quick tour →Submit a dry-run train job, poll status, then compare on a suite.
Open wizard →# Dry-run train → eval — no network, no API key
./spark --dry-run examples/train_eval.spark
# Optional live train — your trainer at SPARK_TRAIN_URL
export SPARK_TRAIN_URL=http://127.0.0.1:8090/v1
./spark --live examples/model_train.spark
See programming guide and language reference.