Releases: porespellar/Zer0Fit
Release list
Zer0Fit v1.2.4 — Updated Agent Guidance
Changes since v1.2.3
- Updates
AGENTS.mdandCLAUDE.mdto describe the TimesFM 3.0 integration. - Replaces obsolete TimesFM 2.5, CUDA 12.4,
ForecastConfig, and 1,024-token guidance with the current TimesFM 3.0, CUDA 12.6/cu124, evaluator-managed decode, and 15,360-point context guidance. - Aligns runtime version metadata and release verification documentation to v1.2.4.
Verification
- Full pytest suite: 4 passed.
- Python compilation, shell syntax, dependency check, Compose rendering, and
git diff --check: passed. - Explicit
linux/amd64andlinux/arm64Docker builds: passed. - Exact v1.2.4 containers on both architectures: health/version
1.2.4, model imports, and cache writes passed. - TimesFM 3.0.1 pinned-checkpoint smoke test remains passing with forecast shape
(3,)and quantile shape(3, 9).
The model and TabFM status are unchanged from v1.2.3: TimesFM uses the pinned revision 43046b85ec22d584a13f8098c2ed39c889e129c2; TabFM remains at verified upstream commit fbb665569425fd2f490c6576b3af967876fe11ff with v1.0.0 pretrained weights.
Zer0Fit v1.2.3 — Release Audit Corrections
Changes since v1.2.2
This corrective release incorporates the delayed independent release audit.
- Corrects the README license summary so TimesFM 3.0 source/package licensing is clearly separated from its non-commercial, non-production checkpoint license.
- Raises the documented free-disk recommendation to 40GB and records the verified approximate checkpoint sizes: 1.32GB TimesFM, 6.56GB TabFM classification, and 6.59GB TabFM regression (14.47GB combined).
- Corrects the documented default upload directory to
/app/uploads. - Clarifies that the installer preloads the TabFM classification checkpoint; regression weights are downloaded on first regression use because the VRAM governor keeps one model/task hot at a time.
- Adds
requirements-dev.txtand a GitHub Actions offline regression workflow. - Adds the reproducible opt-in
tests/smoke_timesfm3.pyscript for the pinned TimesFM checkpoint. - Updates runtime version metadata and release verification documentation to v1.2.3.
Model status
- TimesFM:
timesfm==3.0.1, checkpointgoogle/timesfm-3.0-pytorch, pinned revision43046b85ec22d584a13f8098c2ed39c889e129c2. - TabFM: source commit
fbb665569425fd2f490c6576b3af967876fe11ff, verified as current official upstreammainat audit time; v1.0.0 pretrained weights remain current, with no newer official model-weight release found.
Verification
- Full offline pytest suite: 4 passed.
requirements-dev.txtinstallation resolved successfully;uv pip check: all 74 packages compatible.- Live pinned TimesFM smoke script: passed with forecast shape
(3,)and quantile shape(3, 9). - Python compilation, shell syntax, Compose rendering, and
git diff --check: passed. - Fresh explicit
linux/amd64andlinux/arm64builds: passed. - Exact v1.2.3 containers on both architectures: health/version
1.2.3, model-library imports, and non-root cache writes passed. - Streamable HTTP initialize returned a session ID; session-aware
tools/listreturned all four registered tools.
Known limitation
AGENTS.md and CLAUDE.md remain protected instruction files containing stale TimesFM 2.5/CUDA 12.4 text. Their edits were blocked by the repository protection prompt and were not bypassed.
Zer0Fit v1.2.2 — Reproducible TimesFM Release
Changes since v1.2.1
- Pins the TimesFM 3.0 checkpoint to the tested Hugging Face revision
43046b85ec22d584a13f8098c2ed39c889e129c2instead of mutablemain. - Keeps
timesfm==3.0.1and thetimesfm3.TimesFM3EvaluatorAPI. - Rejects empty, all-NaN, and non-finite-only time-series contexts with a clear validation error.
- Tightens declared runtime requirements to TimesFM 3.0.1 minimums:
huggingface_hub>=0.28.0,safetensors>=0.5.3, andnumpy>=1.26.4,<2.0.0. - Corrects datetime documentation: Zer0Fit uses datetime columns for sorting and time-aware downsampling; timestamps are not passed to TimesFM.
- Updates release/version documentation to v1.2.2.
Model status
- TimesFM:
timesfm==3.0.1, checkpointgoogle/timesfm-3.0-pytorch, pinned revision43046b85ec22d584a13f8098c2ed39c889e129c2. - TabFM: latest verified official source remains commit
fbb665569425fd2f490c6576b3af967876fe11ff(current upstreammainwhen checked), with v1.0.0 pretrained weights. No newer official TabFM model-weight release was found.
Verification
- Full pytest suite: 4 passed.
- Targeted migration tests: 4 passed.
uv pip check: all 74 installed packages compatible.- Python compilation, shell syntax, Compose rendering, and
git diff --check: passed. - Live pinned TimesFM smoke test: passed; forecast shape
(3,), quantiles(3, 9), all values finite. - Explicit
linux/amd64andlinux/arm64image builds: passed. - Fresh v1.2.2 containers on both architectures: health/version
1.2.2, TimesFM/Hugging Face/safetensors imports, and default-user cache writes passed. - Fresh Streamable HTTP initialize returned a session ID; session-aware
tools/listreturned all four registered tools.
Licensing
Zer0Fit source remains Apache-2.0. TimesFM 3.0 and TabFM pretrained weights retain their separate non-commercial restrictions. Review ATTRIBUTION.md and DISCLAIMER.md before deployment.
Zer0Fit v1.2.1 — Deployment Hardening
Fixes since v1.2.0
- Adds a Compose-managed persistent Hugging Face cache volume so TimesFM and TabFM weights survive container recreation.
- Documents the architecture-specific
.envrequired for manual Compose builds;./install.shremains the recommended path. - Replaces the installer’s unsupported
./install.sh --preloadrecovery instruction with the supportedcurl -X POST /preloadcommand. - Updates storage requirements and deployment documentation for the 1.32 GB TimesFM 3.0 checkpoint and persistent cache.
- Reports server/installer version
1.2.1.
Included model update
- TimesFM:
timesfm==3.0.1, checkpointgoogle/timesfm-3.0-pytorch,timesfm3.TimesFM3EvaluatorAPI. - TabFM: latest verified official source state at
fbb665569425fd2f490c6576b3af967876fe11ff(current upstreammainas checked on 2026-09-03), with v1.0.0 pretrained weights; no newer official model-weight release found.
Verification
pytest -q: 3 passed.uv pip check: 74 packages compatible.- Python compilation, shell syntax, Compose rendering, and
git diff --check: passed. - Live TimesFM 3.0.1 checkpoint smoke test: passed; forecast
(3,), quantiles(3, 9). - Explicit ARM64 and x86_64 builds: passed.
- Exact v1.2.1 ARM64/x86_64 images: imports, health
1.2.1, and cache-volume write test passed. - Streamable HTTP initialize and session-aware
tools/list: passed.
License note
TimesFM 3.0 pretrained weights remain restricted by Google’s TimesFM Non-Commercial License v1.0. See ATTRIBUTION.md and DISCLAIMER.md before deployment.
Zer0Fit v1.2.0 — TimesFM 3.0 Migration
Highlights
- Migrates forecasting from TimesFM 2.5 to Google TimesFM 3.0.
- Pins
timesfm==3.0.1and uses thegoogle/timesfm-3.0-pytorchcheckpoint throughtimesfm3.TimesFM3Evaluator. - Uses the TimesFM 3.0
predict_batch/ForecastOutputAPI with quantile output. - Keeps the Zer0Fit service horizon safety cap at 1–256 and updates the context pipeline to the 15,360-point evaluator ceiling.
- Keeps TabFM on the latest verified upstream source state: v1.0.1-compatible commit
fbb665569425fd2f490c6576b3af967876fe11ff; no newer official TabFM model-weight release was found. - Updates Docker, Compose, installer, attribution, license, architecture, deployment, README, and workflow documentation.
- Updates the x86_64 base image to the published
nvidia/cuda:12.6.3-base-ubuntu24.04; ARM64 remains CUDA 13.2 / cu130.
Verification
pytest -q: 3 passed.uv pip check: 74 packages compatible.- Python compilation, shell syntax, Compose rendering, and
git diff --check: passed. - Live TimesFM 3.0.1 checkpoint smoke test: passed; forecast
(3,), quantiles(3, 9). - ARM64 release image: built and health-checked; TimesFM 3.0.1, Torch cu130.
- x86_64 release image: built and health-checked; TimesFM 3.0.1, Torch cu124.
- Streamable HTTP initialize and session-aware
tools/list: passed.
License note
TimesFM 3.0 pretrained weights remain restricted by Google’s TimesFM Non-Commercial License v1.0. See ATTRIBUTION.md and DISCLAIMER.md before deployment.
Zer0Fit v1.0.1 — Code Review Hardening Release
Zer0Fit v1.0.1 — Code Review Hardening Release
This release incorporates findings from two rounds of Claude Opus 4.6 code review covering security hardening, performance improvements, and bug fixes across all source files.
🔒 Security
- IDOR prefix strengthened: WebUI file ID matching now requires 32+ character prefixes (was 8), preventing brute-force file discovery in multi-user environments
- Symlink escape prevention: Upload directory lookups now verify realpath containment (matching the existing WebUI upload path check)
- TOCTOU race hardened: WebUI upload symlink check now rejects symlinks outright with
os.path.islink()before resolving, preventing time-of-check-time-of-use attacks - Dockerfile non-root user: The server now runs as
zer0fituser instead ofroot, reducing blast radius from container escapes - Specific exception handling: File parse errors now catch specific exceptions (ParserError, EmptyDataError, etc.) instead of bare
except Exception
🐛 Bug Fixes
- Install.sh orphaned processes: Fixed subshell scoping bug that prevented
LOG_PIDfrom being captured — backgrounddocker compose logsprocesses are now properly killed and waited on - Model inference blocking event loop: TimesFM forecast and TabFM inference are now wrapped in
asyncio.to_thread()with timeouts (120s / 300s), preventing event-loop blocking and hung requests - JSON/JSONL OOM risk:
_read_tabular_filenow enforcesnrowstruncation for JSON formats (was already enforced for CSV/Excel), preventing unbounded RAM consumption on large uploads - Trailing-separator consistency:
_cleanup_uploadssymlink escape check now adds trailing separator on both sides for correct path matching _cleanup_uploadssilent error masking: BareOSErrorcatch refined to distinguishFileNotFoundError(benign race) from other errors (logged as warnings)
🛠️ Infrastructure
- Fixed JAX/numpy incompatibility preventing TabFM preload: TabFM's
classifier_and_regressor.pyimports JAX at module level (wrapped in try/except ImportError). JAX v0.10+ requires numpy 2.0+ (StringDType), but the project pins numpy <2.0.0 for TimesFM compatibility. Since the PyTorch backend doesn't need JAX at all, the Dockerfile now uninstalls jax/jaxlib after installing TabFM dependencies, allowing the try/except fallback to activate. Removed chex, optax, and orbax-checkpoint (the transitive deps pulling in JAX) from the dependency list. - HF cache path mismatch fixed: Dockerfile now sets
HF_HOME=/app/.cache/huggingfacefor a deterministic cache path regardless of container user; install.sh health check updated to match (was checking/root/.cache/which doesn't exist with thezer0fituser) .env.exampledefaults: Changed from ARM64 to x86_64 (amd64) to match docker-compose.yml defaults, with comments explaining both architectures
🧹 Cleanup
_json_saferenamed to_json_safe_scalar— now handlesnp.ndarrayvia.tolist()andnp.str_viastr()conversion- Removed unused
fastapidependency (server uses Starlette directly) - Deprecated pandas alias:
"H"→"h"frequency alias for pandas 2.2+ compatibility - Late imports moved to top:
StreamableHTTPSessionManagerandasynccontextmanagernow imported at the top ofserver.py - docker-compose.yml defaults: Architecture defaults changed from ARM64 to x86_64 (more common for GPU servers)
- install.sh version: Added
ZER0FIT_VERSIONvariable shown in banner, build summary, and success message
🩺 Performance
- Inference timeout: TimesFM forecast now has a 2-minute timeout, TabFM inference has a 5-minute timeout — prevents model hangs from blocking VRAM
Full diff: v1.0.0...v1.0.1
Zer0Fit v1.0.0 — Initial Release
Zer0Fit v1.0.0 — Zero-Shot Forecasting & Tabular MCP Server
Zer0Fit exposes Google's TimesFM 2.5 (time-series forecasting) and TabFM v1.0.0 (tabular classification/regression) foundation models to AI assistants via the Model Context Protocol (SSE/Streamable HTTP).
Zero-shot means no training required — just attach a CSV and describe what you want to predict.
Features
- 📈 Time-series forecasting via Google TimesFM 2.5 (200M params)
- 📊 Tabular classification & regression via Google TabFM v1.0.0
- 💬 Chat-attached file support — use Open WebUI file IDs directly
- 📤 File upload tool for files not attached in chat (CSV, XLSX, XLS, JSON, JSONL)
- 🔍 Automatic file inspection — column names, types, row counts
- 📋 Pre-computed metrics — accuracy, per-class F1, confusion matrix, R², MAE, RMSE, MAPE
- 🧹 Automatic file cleanup — uploads auto-delete after 6 hours (configurable)
- 🔒 Security — path traversal protection, UUID-based filenames, allowed-directory restriction
- 🖥️ VRAM management — TTL-based auto-unload, mutual exclusion, asyncio.to_thread offloading
- 🏗️ Multi-architecture — ARM64 (DGX Spark / Blackwell) and x86_64 (RTX 3090 / H100)
- 🚀 One-command install —
./install.shdetects architecture, builds, and launches
Clients Supported
- Open WebUI (primary) — SSE + Streamable HTTP
- Claude Code — SSE transport, includes auto-loaded
CLAUDE.md+ skill - Codex CLI — Streamable HTTP, includes auto-loaded
AGENTS.md
Quick Start
git clone https://github.com/porespellar/Zer0Fit.git
cd Zer0Fit
./install.shInference Limits
| Limit | Default | Configurable |
|---|---|---|
| Forecast horizon | 1–256 steps | Yes (model_manager.py) |
| Max tabular chunks | 10 (10K rows) | Yes (server.py) |
| Chunk size | 1,000 rows | Yes (pipelines.py) |
| In-context size | 512 rows | Yes (pipelines.py) |
| VRAM TTL | 300 seconds | Yes (env var) |
| Upload TTL | 6 hours | Yes (env var) |
See Limits & Configurability for tuning guide.
Security & Code Review
Two full code reviews were conducted using Google Antigravity (Gemini 3.1 Pro). All findings were addressed:
- ✅ Path traversal vulnerability (Critical) — fixed
- ✅ Event-loop blocking during model loads (High) — fixed via
asyncio.to_thread - ✅ Race condition in TabFM task-type state (High) — fixed,
task_typepassed as parameter - ✅ Thread-unsafe state access outside lock (High) — fixed, all checks inside
asyncio.Lock - ✅ Unbounded predictions OOM risk (High) — fixed,
max_chunkscapped at 10 - ✅ Empty basename file resolution (High) — fixed
- ✅ Unbounded forecast horizon (Medium) — fixed, validated 1–256
- ✅ Blocking I/O in upload cleanup (Medium) — fixed, offloaded to thread
- ✅ Unhandled NaNs in target column (Medium) — fixed,
dropnabefore chunking - ✅ Weak upload filename entropy (Low) — fixed, full UUID
Disclaimer
Zer0Fit is provided "AS IS" without warranties of any kind, and is intended for research and educational purposes only. The developer is not responsible for the accuracy of predictions, classifications, or forecasts produced by the underlying models or the LLM interpreting them. TabFM model weights are non-commercial — see the full Disclaimer (DISCLAIMER.md).
License
- Zer0Fit source code — Apache License 2.0
- TimesFM 2.5 model weights — Apache License 2.0
- TabFM v1.0.0 model weights — TabFM Non-Commercial License v1.0