Skip to content

feat: add support for T0 (theforecastingcompany/t0-alpha)#350

Closed
GeoffNN wants to merge 2 commits into
TimeCopilot:mainfrom
theforecastingcompany:feat/add-t0
Closed

feat: add support for T0 (theforecastingcompany/t0-alpha)#350
GeoffNN wants to merge 2 commits into
TimeCopilot:mainfrom
theforecastingcompany:feat/add-t0

Conversation

@GeoffNN

@GeoffNN GeoffNN commented Jun 16, 2026

Copy link
Copy Markdown

Summary

Adds T0, The Forecasting Company's open-weights time series foundation model, as a new foundation forecaster. T0 (t0-alpha, ~102M params, Apache-2.0) is a decoder-style patch transformer producing probabilistic multi-horizon quantile forecasts — currently #1 on the fev-bench leaderboard (skill score 42.2) and CRPS 0.4941 on GIFT-Eval.

(Disclosure: I work at The Forecasting Company.)

Changes

  • timecopilot/models/foundation/t0.pyT0 forecaster wrapping the tfc-t0 package, following the existing foundation-model pattern (_get_model context manager, TimeSeriesDataset batching, QuantileConverter for levels/quantiles). The model predicts 5 quantile knots and interpolates arbitrary requested levels in a single forward pass; the median is the point forecast. Ragged batches are left-padded with NaN, which T0 treats as missing.
  • pyproject.tomltfc-t0>=0.1.2 for Python 3.11–3.13 (the package's supported range), mirroring the TiRex/uni2ts marker pattern.
  • tests/models/conftest.pyT0(context_length=256, batch_size=2) added to the model matrix under a version guard, plus a test_t0_import_fails guard test mirroring TiRex/Sundial.
  • Docs: API reference entry + Model Hub listing.

Validation

Run locally on macOS / Python 3.12. The lock resolves to tfc-t0 0.1.2 + einops 0.7.0 + jaxtyping 0.2.38:

  • forecast with defaults, quantiles=[0.1, 0.5, 0.9], and level=[80] on multi-series daily data: correct columns, finite values, monotone quantiles, median == point forecast.
  • cross_validation(df, h=6): correct shape and columns.
  • uv run pytest tests/models/test_models.py::test_t0_import_fails (skips on 3.11–3.13, asserts ImportError outside).
  • ruff check + ruff format --check pass on the new/changed files.

Note

tfc-t0 0.1.2 (the version this depends on) is published to PyPI; uv.lock is regenerated and committed. Ready for review.

🤖 Generated with Claude Code

GeoffNN and others added 2 commits June 15, 2026 02:39
Adds The Forecasting Company's open-weights T0 foundation model as a
foundation forecaster, via the tfc-t0 package (Python 3.11–3.13).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Regenerated after tfc-t0 0.1.2 (metadata-only floor relaxation) was
published to PyPI. Resolves to tfc-t0 0.1.2 + einops 0.7.0 +
jaxtyping 0.2.38 — the combo the T0 adapter is verified against.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 16, 2026 09:50
@GeoffNN

GeoffNN commented Jun 16, 2026

Copy link
Copy Markdown
Author

Closing — keeping the original #348 from the personal fork, where a contributor already has a PR open.

@GeoffNN GeoffNN closed this Jun 16, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds support for The Forecasting Company’s T0 foundation model to TimeCopilot, including dependency wiring, documentation, and import/version gating.

Changes:

  • Introduces T0 forecaster implementation with quantile/interval output support.
  • Adds tfc-t0 dependency and Python-version-based import/test gating.
  • Updates model hub and API docs to list T0.

Reviewed changes

Copilot reviewed 6 out of 7 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
timecopilot/models/foundation/t0.py New T0 forecaster implementation and Python version guard
tests/models/test_models.py Adds test ensuring import fails on unsupported Python versions
tests/models/conftest.py Registers T0 in the model test matrix for supported Python versions
pyproject.toml Adds tfc-t0 dependency with Python version markers
docs/model-hub.md Lists T0 in the model hub
docs/api/models/foundation/models.md Exposes T0 in generated API docs

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +93 to +95
finally:
del model
torch.cuda.empty_cache()
Comment on lines +89 to +90
def _get_model(self) -> T0Forecaster:
model = T0Forecaster.from_pretrained(self.repo_id).to(self.device).eval()
Comment on lines +103 to +111
context = torch.full(
(len(batch), max_len),
float("nan"),
dtype=torch.float32,
)
for idx, ts in enumerate(batch):
ts = ts[-max_len:]
context[idx, -len(ts) :] = ts.to(dtype=torch.float32)
return context
Comment on lines +179 to +183
out = model.predict(
self._to_context(batch),
horizon=h,
quantiles=pred_quantiles,
)
Comment on lines +187 to +192
fcst_df[self.alias] = fcsts_np[..., median_idx].reshape(-1, 1)
if qc.quantiles is not None:
for q in qc.quantiles:
fcst_df[f"{self.alias}-q-{int(q * 100)}"] = fcsts_np[
..., pred_quantiles.index(q)
].reshape(-1, 1)
Comment on lines +88 to +95
@contextmanager
def _get_model(self) -> T0Forecaster:
model = T0Forecaster.from_pretrained(self.repo_id).to(self.device).eval()
try:
yield model
finally:
del model
torch.cuda.empty_cache()
Comment on lines +113 to +120
def forecast(
self,
df: pd.DataFrame,
h: int,
freq: str | None = None,
level: list[int | float] | None = None,
quantiles: list[float] | None = None,
) -> pd.DataFrame:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants