Python SDK for ProgramAsWeights — compile natural language specs into neural programs that run locally
See the codeCompile natural language specs into tiny neural functions that run locally.
Define what a function should do in plain English. PAW compiles it into a small neural program that runs on your machine — no API keys at runtime, no internet needed after setup, fully deterministic.
pip install programasweights --extra-index-url https://pypi.programasweights.com/simple/
import programasweights as paw
# Use a pre-compiled function (downloads once, runs locally forever)
fn = paw.function("email-triage")
fn("Urgent: the server is down!") # "immediate"
fn("Newsletter: spring picnic") # "wait"
# Compile your own from a description
program = paw.compile(
"Fix malformed JSON: repair missing quotes and trailing commas",
slug="json-fixer" # optional: creates username/json-fixer handle
)
fn = paw.function(program.slug) # or paw.function(program.id)
fn("{name: 'Alice',}") # '{"name":"Alice"}'
# Or compile and load in one step
fn = paw.compile_and_load("Classify sentiment as positive or negative")
fn("I love this!") # "positive"
If you specifically want the smaller browser-compatible runtime, pass compiler="paw-4b-gpt2". Otherwise, omit compiler and let the server default decide.
Use the hosted API for fast inference in around 150 ms, without a local model download.
See the REST API reference for an example.
| Standard (Qwen3 0.6B) | Compact (GPT-2 124M) | |
|---|---|---|
| Compiler name | paw-4b-qwen3-0.6b | paw-4b-gpt2 |
| Accuracy | Higher | Lower |
| Base model size | 594 MB | 134 MB |
| Program size | ~22 MB | ~5 MB |
| Local inference | ~0.05-0.5s per call | ~0.03-0.3s per call |
| Runs in browser | No | Yes (WebAssembly) |
The current server default is Standard (paw-4b-qwen3-0.6b). Use Compact (paw-4b-gpt2) when you need smaller files or browser deployment.
If you need to inspect available compiler aliases programmatically, use paw.list_compilers().
GPU acceleration is enabled by default (Metal on Mac, CUDA on Linux, falls back to CPU). Set PAW_GPU_LAYERS=0 to force CPU if GPU causes issues.
In SDK 0.4.6+, a call accepts an optional logits_processor: an advanced hook for caller-supplied llama.cpp-compatible token constraints, not built-in regex or JSON-schema validation. It runs at every generation step. The default, None, keeps sampling unchanged.
import llama_cpp
# my_processor is your compatible callable: (input_ids, scores) -> scores.
fn("Office line: +1-555-666-7777", logits_processor=llama_cpp.LogitsProcessorList([my_processor]))
Processors see the full prompt and generated-token history, not just the output. Create or reset stateful processors for each call. Token limits and output whitespace trimming still apply, so validate the returned result.
Prepare and inspect validated local assets without keeping a model loaded:
prepared = paw.prepare_program("da03/my-classifier")
assert prepared["offline_ready"]
fn = paw.function("da03/my-classifier", offline=True)
cached = paw.list_cached_programs()
offline=True (or PAW_OFFLINE=1) makes zero network calls and fails clearly
if a required validated program, runtime, adapter, or base model is missing. Long-running
finetune compiles can be queued with
paw.compile_async(spec, compiler="paw-ft-bs48"); an explicit finetune
compiler is required.
Load a saved current GGUF ZIP .paw bundle directly (SDK 0.4.5+):
from pathlib import Path
fn = paw.function(Path("classifier.paw"))
Local files are validated into a separate SHA-256 cache without changing the
source or falling back to Hub lookup. Runtime metadata or the shared base model
may still download; offline=True prohibits those requests. Legacy tensor-format
.paw files are unsupported. Local-file inputs are supported by function,
not prepare_program or is_offline_ready.
Advanced adapter-free inference is available with
paw.function(None, interpreter="gpt2"); see the
Python API reference
for its intentionally strict semantics.
Programs compiled with GPT-2 also run in the browser via WebAssembly. The initial model and program assets download automatically; inference then runs client-side.
npm install @programasweights/web
import paw from '@programasweights/web';
const fn = await paw.function('email-triage-browser');
const result = await fn('Urgent: the server is down!');
// result: "immediate"
If you load by program ID, browser inference only depends on Hugging Face-hosted assets. Slugs still need one PAW API lookup.
New browser-compatible programs are uploaded to Hugging Face asynchronously after compile. They are usually ready within a minute or two, but under load can take a few minutes, so a freshly compiled browser program may need a short wait before the JS SDK can load it.
See the browser SDK repo for full documentation.
PAW works with Cursor, Claude, Codex, and other AI coding assistants. Paste this into your agent's chat:
I want to use ProgramAsWeights (PAW) to create fuzzy text functions that run locally. Read the instructions at https://programasweights.com/AGENTS.md and help me integrate it.
Or save [AGENTS.md](https://programasweights.com/agents) to your project root — agents read it automatically.
# Option 1: environment variable (recommended)
export PAW_API_KEY=paw_sk_...
# Option 2: CLI login (opens browser to generate key)
paw login
Generate API keys at programasweights.com/settings. Authenticated users get higher rate limits.
paw compile --spec "Extract error lines from logs" --json
paw run --program <program_id> --input "[ERROR] timeout" --json
paw run --program <program_id> --input "[ERROR] timeout" --offline --json
paw login
--json gives structured output for programmatic use.
MIT
Python
99.3%
Python SDK for ProgramAsWeights — compile natural language specs into neural programs that run locally
See the codeCompile natural language specs into tiny neural functions that run locally.
Define what a function should do in plain English. PAW compiles it into a small neural program that runs on your machine — no API keys at runtime, no internet needed after setup, fully deterministic.
pip install programasweights --extra-index-url https://pypi.programasweights.com/simple/
import programasweights as paw
# Use a pre-compiled function (downloads once, runs locally forever)
fn = paw.function("email-triage")
fn("Urgent: the server is down!") # "immediate"
fn("Newsletter: spring picnic") # "wait"
# Compile your own from a description
program = paw.compile(
"Fix malformed JSON: repair missing quotes and trailing commas",
slug="json-fixer" # optional: creates username/json-fixer handle
)
fn = paw.function(program.slug) # or paw.function(program.id)
fn("{name: 'Alice',}") # '{"name":"Alice"}'
# Or compile and load in one step
fn = paw.compile_and_load("Classify sentiment as positive or negative")
fn("I love this!") # "positive"
If you specifically want the smaller browser-compatible runtime, pass compiler="paw-4b-gpt2". Otherwise, omit compiler and let the server default decide.
Use the hosted API for fast inference in around 150 ms, without a local model download.
See the REST API reference for an example.
| Standard (Qwen3 0.6B) | Compact (GPT-2 124M) | |
|---|---|---|
| Compiler name | paw-4b-qwen3-0.6b | paw-4b-gpt2 |
| Accuracy | Higher | Lower |
| Base model size | 594 MB | 134 MB |
| Program size | ~22 MB | ~5 MB |
| Local inference | ~0.05-0.5s per call | ~0.03-0.3s per call |
| Runs in browser | No | Yes (WebAssembly) |
The current server default is Standard (paw-4b-qwen3-0.6b). Use Compact (paw-4b-gpt2) when you need smaller files or browser deployment.
If you need to inspect available compiler aliases programmatically, use paw.list_compilers().
GPU acceleration is enabled by default (Metal on Mac, CUDA on Linux, falls back to CPU). Set PAW_GPU_LAYERS=0 to force CPU if GPU causes issues.
In SDK 0.4.6+, a call accepts an optional logits_processor: an advanced hook for caller-supplied llama.cpp-compatible token constraints, not built-in regex or JSON-schema validation. It runs at every generation step. The default, None, keeps sampling unchanged.
import llama_cpp
# my_processor is your compatible callable: (input_ids, scores) -> scores.
fn("Office line: +1-555-666-7777", logits_processor=llama_cpp.LogitsProcessorList([my_processor]))
Processors see the full prompt and generated-token history, not just the output. Create or reset stateful processors for each call. Token limits and output whitespace trimming still apply, so validate the returned result.
Prepare and inspect validated local assets without keeping a model loaded:
prepared = paw.prepare_program("da03/my-classifier")
assert prepared["offline_ready"]
fn = paw.function("da03/my-classifier", offline=True)
cached = paw.list_cached_programs()
offline=True (or PAW_OFFLINE=1) makes zero network calls and fails clearly
if a required validated program, runtime, adapter, or base model is missing. Long-running
finetune compiles can be queued with
paw.compile_async(spec, compiler="paw-ft-bs48"); an explicit finetune
compiler is required.
Load a saved current GGUF ZIP .paw bundle directly (SDK 0.4.5+):
from pathlib import Path
fn = paw.function(Path("classifier.paw"))
Local files are validated into a separate SHA-256 cache without changing the
source or falling back to Hub lookup. Runtime metadata or the shared base model
may still download; offline=True prohibits those requests. Legacy tensor-format
.paw files are unsupported. Local-file inputs are supported by function,
not prepare_program or is_offline_ready.
Advanced adapter-free inference is available with
paw.function(None, interpreter="gpt2"); see the
Python API reference
for its intentionally strict semantics.
Programs compiled with GPT-2 also run in the browser via WebAssembly. The initial model and program assets download automatically; inference then runs client-side.
npm install @programasweights/web
import paw from '@programasweights/web';
const fn = await paw.function('email-triage-browser');
const result = await fn('Urgent: the server is down!');
// result: "immediate"
If you load by program ID, browser inference only depends on Hugging Face-hosted assets. Slugs still need one PAW API lookup.
New browser-compatible programs are uploaded to Hugging Face asynchronously after compile. They are usually ready within a minute or two, but under load can take a few minutes, so a freshly compiled browser program may need a short wait before the JS SDK can load it.
See the browser SDK repo for full documentation.
PAW works with Cursor, Claude, Codex, and other AI coding assistants. Paste this into your agent's chat:
I want to use ProgramAsWeights (PAW) to create fuzzy text functions that run locally. Read the instructions at https://programasweights.com/AGENTS.md and help me integrate it.
Or save [AGENTS.md](https://programasweights.com/agents) to your project root — agents read it automatically.
# Option 1: environment variable (recommended)
export PAW_API_KEY=paw_sk_...
# Option 2: CLI login (opens browser to generate key)
paw login
Generate API keys at programasweights.com/settings. Authenticated users get higher rate limits.
paw compile --spec "Extract error lines from logs" --json
paw run --program <program_id> --input "[ERROR] timeout" --json
paw run --program <program_id> --input "[ERROR] timeout" --offline --json
paw login
--json gives structured output for programmatic use.
MIT
Python
99.3%