CHARM
CHARM (CHannel-Aware Representation Model) is C3 AI's foundation model for
multivariate time series. It is served behind an API and consumed through the open-source
c3-charm Python SDK:
- Embeddings: turn
(T, C)windows into dense vectors for search, clustering, anomaly detection and features. - Zero-shot forecasting: quantile forecasts and backcasts with no training data.
- Toolkit (
charm_toolkit): anomaly-detection recipes, retrieval metrics, and small trainable heads for forecasting, reconstruction and classification.
The model is channel-aware (channel names are part of the input) and normalizes internally, so you send raw values. It runs server-side; the SDK is the client.
Availability: CHARM model weights and training/replication code are not publicly released. The model is served behind an API and consumed through the
c3-charmSDK.
Use it
π Docs & quickstart: c3aiia3c-charm-docs.static.hf.space β introduction, quick start, example use cases, and using CHARM with coding agents.
pip install c3-charm # Python >= 3.10
Full SDK documentation (install, data format, client, embeddings, forecasting, anomaly detection,
trained heads, HTTP API) ships inside the package β find it with
python -c "import charm.docs as d; print(d.get_docs_path())" and start at index.md.
Package: c3-charm on PyPI.
Getting access
CHARM is served behind an API. Set CHARM_BASE_URL and CHARM_API_KEY to point the SDK at an
endpoint. To obtain access, contact gerardo.pastrana@c3.ai and dhruv.mehta@c3.ai.
The model will also be available on Azure AI Foundry β deployment instructions will be added here.
Using an AI coding agent?
The CHARM agent skill teaches Claude Code, Cursor, Codex and others when and how to apply CHARM. Install it:
claude plugin marketplace add https://huggingface.co/c3aiia3c/CHARM.git
claude plugin install charm@c3-charm
Other agents, manual install, and example prompts: see the
docs site or
skills/charm/README.md.
Example notebooks
Runnable notebooks (with sample data) live in notebooks/. The notebooks use the
toolkit, which needs PyTorch β install the CPU wheel first, then the toolkit:
pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install "c3-charm[toolkit]"
Then set CHARM_BASE_URL / CHARM_API_KEY and run them locally.
| Notebook | What it covers |
|---|---|
| getting_started.ipynb | Client setup, first embeddings call, inspecting model_info() |
| charm_toolkit_demo.ipynb | Tour of the toolkit: datasets, precompute, trainer, each task head |
| demo_forecasting.ipynb | Zero-shot forecasting and the embedding-based ForecastingModel head |
| demo_reconstruction.ipynb | Backcast reconstruction and the ReconstructionModel head |
| demo_classification.ipynb | Time-series classification with the ClassificationModel head |
| demo_retrieval_anomaly_detection.ipynb | Embedding retrieval + kNN / zero-shot anomaly-detection recipes |
Model summary
| Parameters | ~63.3M (encoder ~59M) |
|---|---|
| Hidden size (d_model) | 384 |
| Projection | TCN-pool (patch size 16, causal conv stack + residual gate) |
| Backbone | Transformer encoder with RoPE attention |
| Decoder | Quantile decoder, 99 levels (0.01β0.99) |
| Max context length | 8192 |
| Output | Probabilistic (quantile) forecasts, multivariate-capable |
| Precision | float32 |
Intended use
Zero-shot probabilistic forecasting of univariate and multivariate time series across domains (energy, transport, sales, healthcare, nature, web/cloud-ops, econ/finance). The model is applied without any per-dataset fine-tuning.
GIFT-Eval results
Evaluated zero-shot on the full GIFT-Eval benchmark (97 dataset/frequency/term configurations) using the standard 11-metric protocol. Aggregate scores (geometric mean of per-config metrics normalized to the Seasonal Naive baseline; lower is better):
| Metric | Score (rel. Seasonal Naive) |
|---|---|
| MASE | 0.7582 |
| CRPS (mean weighted sum quantile loss) | 0.4776 |
Per-term (geometric mean, normalized to Seasonal Naive):
| Term | MASE | CRPS |
|---|---|---|
| short | 0.7463 | 0.5036 |
| medium | 0.7577 | 0.4452 |
| long | 0.7911 | 0.4460 |
Scores are the geometric mean of per-config metric / Seasonal Naive across all 97 GIFT-Eval configurations (lower is better; < 1.0 beats Seasonal Naive).
Evaluation protocol
- Benchmark: GIFT-Eval, 97 configs (short / medium / long terms).
- Metrics: MSE[mean], MSE[0.5], MAE[0.5], MASE[0.5], MAPE[0.5], sMAPE[0.5], MSIS, RMSE[mean],
NRMSE[mean], ND[0.5], mean_weighted_sum_quantile_loss (computed with gluonts
evaluate_forecasts). - Context length: 8192; forecasts are full quantile distributions.
- Zero-shot: no GIFT-Eval train/test data is seen during pretraining (
testdata_leakage = No).
Limitations
- Forecast quality varies by domain and horizon; very long horizons and highly non-stationary series remain challenging.
- Quantile calibration is learned and may drift on out-of-distribution scales.
Paper
Utsav Dutta, Gerardo Pastrana, Sina Khoshfetrat Pakazad, Henrik Ohlsson. Giving Sensors a Voice: Multimodal JEPA for Semantic Time-Series Embeddings. ICML 2026. arXiv:2605.31580 Β· Hugging Face Papers
Citation
@inproceedings{dutta2026charm,
title = {Giving Sensors a Voice: Multimodal JEPA for Semantic Time-Series Embeddings},
author = {Dutta, Utsav and Pastrana, Gerardo and Khoshfetrat Pakazad, Sina and Ohlsson, Henrik},
booktitle = {Proceedings of the 43rd International Conference on Machine Learning (ICML)},
series = {Proceedings of Machine Learning Research},
volume = {306},
year = {2026},
url = {https://arxiv.org/abs/2605.31580},
}
License
Apache License 2.0 for the SDK and skill. See c3-charm on PyPI. Model weights are not released.