a83dbf3f16
Replace AGENTS.md / claude-skill/ with a proper agentskills.io-compliant
skill directory. Any AI agent that supports the open Agent Skills standard
(Claude Code, OpenCode, Cursor, Codex, etc.) can now install and use this
skill generically.
Changes:
- Remove AGENTS.md (was Claude-specific convention)
- Remove claude-skill/ directory (was Claude-specific naming)
- Add timesfm-forecasting/SKILL.md with compliant frontmatter:
name: timesfm-forecasting
description: ...
license: Apache-2.0
metadata: author, version
- Rename claude-skill/examples/ → timesfm-forecasting/examples/
- Rename claude-skill/scripts/ → timesfm-forecasting/scripts/
- Rename claude-skill/references/ → timesfm-forecasting/references/
- Update .gitattributes paths to match new directory
Skill installs via:
cp -r timesfm-forecasting/ ~/.claude/skills/
cp -r timesfm-forecasting/ ~/.cursor/skills/
# or any agent that supports agentskills.io
Spec: https://agentskills.io/specification
232 lines
7.8 KiB
Markdown
232 lines
7.8 KiB
Markdown
# TimesFM API Reference
|
||
|
||
## Model Classes
|
||
|
||
### `timesfm.TimesFM_2p5_200M_torch`
|
||
|
||
The primary model class for TimesFM 2.5 (200M parameters, PyTorch backend).
|
||
|
||
#### `from_pretrained()`
|
||
|
||
```python
|
||
model = timesfm.TimesFM_2p5_200M_torch.from_pretrained(
|
||
"google/timesfm-2.5-200m-pytorch",
|
||
cache_dir=None, # Optional: custom cache directory
|
||
force_download=True, # Re-download even if cached
|
||
)
|
||
```
|
||
|
||
| Parameter | Type | Default | Description |
|
||
| --------- | ---- | ------- | ----------- |
|
||
| `model_id` | str | `"google/timesfm-2.5-200m-pytorch"` | Hugging Face model ID |
|
||
| `revision` | str \| None | None | Specific model revision |
|
||
| `cache_dir` | str \| Path \| None | None | Custom cache directory |
|
||
| `force_download` | bool | True | Force re-download of weights |
|
||
|
||
**Returns**: Initialized `TimesFM_2p5_200M_torch` instance (not yet compiled).
|
||
|
||
#### `compile()`
|
||
|
||
Compiles the model with the given forecast configuration. **Must be called before `forecast()`.**
|
||
|
||
```python
|
||
model.compile(
|
||
timesfm.ForecastConfig(
|
||
max_context=1024,
|
||
max_horizon=256,
|
||
normalize_inputs=True,
|
||
per_core_batch_size=32,
|
||
use_continuous_quantile_head=True,
|
||
force_flip_invariance=True,
|
||
infer_is_positive=True,
|
||
fix_quantile_crossing=True,
|
||
)
|
||
)
|
||
```
|
||
|
||
**Raises**: Nothing (but `forecast()` will raise `RuntimeError` if not compiled).
|
||
|
||
#### `forecast()`
|
||
|
||
Run inference on one or more time series.
|
||
|
||
```python
|
||
point_forecast, quantile_forecast = model.forecast(
|
||
horizon=24,
|
||
inputs=[array1, array2, ...],
|
||
)
|
||
```
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `horizon` | int | Number of future steps to forecast |
|
||
| `inputs` | list[np.ndarray] | List of 1-D numpy arrays (each is a time series) |
|
||
|
||
**Returns**: `tuple[np.ndarray, np.ndarray]`
|
||
|
||
- `point_forecast`: shape `(batch_size, horizon)` — median (0.5 quantile)
|
||
- `quantile_forecast`: shape `(batch_size, horizon, 10)` — [mean, q10, q20, ..., q90]
|
||
|
||
**Raises**: `RuntimeError` if model is not compiled.
|
||
|
||
**Key behaviors**:
|
||
|
||
- Leading NaN values are stripped automatically
|
||
- Internal NaN values are linearly interpolated
|
||
- Series longer than `max_context` are truncated (last `max_context` points used)
|
||
- Series shorter than `max_context` are padded
|
||
|
||
#### `forecast_with_covariates()`
|
||
|
||
Run inference with exogenous variables (requires `timesfm[xreg]`).
|
||
|
||
```python
|
||
point, quantiles = model.forecast_with_covariates(
|
||
inputs=inputs,
|
||
dynamic_numerical_covariates={"temp": [temp_array1, temp_array2]},
|
||
dynamic_categorical_covariates={"dow": [dow_array1, dow_array2]},
|
||
static_categorical_covariates={"region": ["east", "west"]},
|
||
xreg_mode="xreg + timesfm",
|
||
)
|
||
```
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `inputs` | list[np.ndarray] | Target time series |
|
||
| `dynamic_numerical_covariates` | dict[str, list[np.ndarray]] | Time-varying numeric features |
|
||
| `dynamic_categorical_covariates` | dict[str, list[np.ndarray]] | Time-varying categorical features |
|
||
| `static_categorical_covariates` | dict[str, list[str]] | Fixed categorical features per series |
|
||
| `xreg_mode` | str | `"xreg + timesfm"` or `"timesfm + xreg"` |
|
||
|
||
**Note**: Dynamic covariates must have length `context + horizon` for each series.
|
||
|
||
---
|
||
|
||
## `timesfm.ForecastConfig`
|
||
|
||
Immutable dataclass controlling all forecast behavior.
|
||
|
||
```python
|
||
@dataclasses.dataclass(frozen=True)
|
||
class ForecastConfig:
|
||
max_context: int = 0
|
||
max_horizon: int = 0
|
||
normalize_inputs: bool = False
|
||
per_core_batch_size: int = 1
|
||
use_continuous_quantile_head: bool = False
|
||
force_flip_invariance: bool = True
|
||
infer_is_positive: bool = True
|
||
fix_quantile_crossing: bool = False
|
||
return_backcast: bool = False
|
||
quantiles: list[float] = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
|
||
decode_index: int = 5
|
||
```
|
||
|
||
### Parameter Details
|
||
|
||
#### `max_context` (int, default=0)
|
||
|
||
Maximum number of historical time points to use as context.
|
||
|
||
- **0**: Use the model's maximum supported context (16,384 for v2.5)
|
||
- **N**: Truncate series to last N points
|
||
- **Best practice**: Set to the length of your longest series, or 512–2048 for speed
|
||
|
||
#### `max_horizon` (int, default=0)
|
||
|
||
Maximum forecast horizon.
|
||
|
||
- **0**: Use the model's maximum
|
||
- **N**: Forecasts up to N steps (can still call `forecast(horizon=M)` where M ≤ N)
|
||
- **Best practice**: Set to your expected maximum forecast length
|
||
|
||
#### `normalize_inputs` (bool, default=False)
|
||
|
||
Whether to z-normalize each series before feeding to the model.
|
||
|
||
- **True** (RECOMMENDED): Normalizes each series to zero mean, unit variance
|
||
- **False**: Raw values are passed directly
|
||
- **When False is OK**: Only if your series are already normalized or very close to scale 1.0
|
||
|
||
#### `per_core_batch_size` (int, default=1)
|
||
|
||
Number of series processed per device in each batch.
|
||
|
||
- Increase for throughput, decrease if OOM
|
||
- See `references/system_requirements.md` for recommended values by hardware
|
||
|
||
#### `use_continuous_quantile_head` (bool, default=False)
|
||
|
||
Use the 30M-parameter continuous quantile head for better interval calibration.
|
||
|
||
- **True** (RECOMMENDED): More accurate prediction intervals, especially for longer horizons
|
||
- **False**: Uses fixed quantile buckets (faster but less accurate intervals)
|
||
|
||
#### `force_flip_invariance` (bool, default=True)
|
||
|
||
Ensures the model satisfies `f(-x) = -f(x)`.
|
||
|
||
- **True** (RECOMMENDED): Mathematical consistency — forecasts are invariant to sign flip
|
||
- **False**: Slightly faster but may produce asymmetric forecasts
|
||
|
||
#### `infer_is_positive` (bool, default=True)
|
||
|
||
Automatically detect if all input values are positive and clamp forecasts ≥ 0.
|
||
|
||
- **True**: Safe for sales, demand, counts, prices, volumes
|
||
- **False**: Required for temperature, returns, PnL, any series that can be negative
|
||
|
||
#### `fix_quantile_crossing` (bool, default=False)
|
||
|
||
Post-process quantiles to ensure monotonicity (q10 ≤ q20 ≤ ... ≤ q90).
|
||
|
||
- **True** (RECOMMENDED): Guarantees well-ordered quantiles
|
||
- **False**: Slightly faster but quantiles may occasionally cross
|
||
|
||
#### `return_backcast` (bool, default=False)
|
||
|
||
Return the model's reconstruction of the input (backcast) in addition to forecast.
|
||
|
||
- **True**: Used for covariate workflows and diagnostics
|
||
- **False**: Only return forecast
|
||
|
||
---
|
||
|
||
## Available Model Checkpoints
|
||
|
||
| Model ID | Version | Params | Backend | Context |
|
||
| -------- | ------- | ------ | ------- | ------- |
|
||
| `google/timesfm-2.5-200m-pytorch` | 2.5 | 200M | PyTorch | 16,384 |
|
||
| `google/timesfm-2.5-200m-flax` | 2.5 | 200M | JAX/Flax | 16,384 |
|
||
| `google/timesfm-2.5-200m-transformers` | 2.5 | 200M | Transformers | 16,384 |
|
||
| `google/timesfm-2.0-500m-pytorch` | 2.0 | 500M | PyTorch | 2,048 |
|
||
| `google/timesfm-2.0-500m-jax` | 2.0 | 500M | JAX | 2,048 |
|
||
| `google/timesfm-1.0-200m-pytorch` | 1.0 | 200M | PyTorch | 2,048 |
|
||
| `google/timesfm-1.0-200m` | 1.0 | 200M | JAX | 2,048 |
|
||
|
||
---
|
||
|
||
## Output Shape Reference
|
||
|
||
| Output | Shape | Description |
|
||
| ------ | ----- | ----------- |
|
||
| `point_forecast` | `(B, H)` | Median forecast for B series, H steps |
|
||
| `quantile_forecast` | `(B, H, 10)` | Full quantile distribution |
|
||
| `quantile_forecast[:,:,0]` | `(B, H)` | Mean |
|
||
| `quantile_forecast[:,:,1]` | `(B, H)` | 10th percentile |
|
||
| `quantile_forecast[:,:,5]` | `(B, H)` | 50th percentile (= point_forecast) |
|
||
| `quantile_forecast[:,:,9]` | `(B, H)` | 90th percentile |
|
||
|
||
Where `B` = batch size (number of input series), `H` = forecast horizon.
|
||
|
||
---
|
||
|
||
## Error Handling
|
||
|
||
| Error | Cause | Fix |
|
||
| ----- | ----- | --- |
|
||
| `RuntimeError: Model is not compiled` | Called `forecast()` before `compile()` | Call `model.compile(ForecastConfig(...))` first |
|
||
| `torch.cuda.OutOfMemoryError` | Batch too large for GPU | Reduce `per_core_batch_size` |
|
||
| `ValueError: inputs must be list` | Passed array instead of list | Wrap in list: `[array]` |
|
||
| `HfHubHTTPError` | Download failed | Check internet, set `HF_HOME` to writable dir |
|