pt-loader 0.1.4

Safe parser-based PyTorch checkpoint converter to safetensors
Documentation
# pt-loader User Skill

Use this package to safely read Torch zip `.pt` checkpoints and export tensors to safetensors.

This skill is for end users consuming the package APIs. It is not a contributor/developer workflow guide.

## Python

Install:

```bash
pip install pt-safe-loader
```

Basic usage:

```python
from pt_loader import PtCheckpoint

ckpt = PtCheckpoint.load("model.pt")

# Inspect metadata
meta = ckpt.metadata()
print(meta["tensor_count"])
print(meta["security"]["objects"])
print(meta["security"]["calls"])

# Export safetensors + yaml
result = ckpt.export(format="safetensors", dir="out")
print(result["weights_path"])
print(result["metadata_path"])

# Load tensors in memory
tensors = ckpt.state_dict(backend="numpy")
print(next(iter(tensors.items()))[0], next(iter(tensors.values())).shape)
```

Advanced root-key extraction:

```python
ckpt = PtCheckpoint.load(
  "model.pt",
  state_dict_root_keys=["model", "optimizer", "ema.model"],  # deep keys supported
  state_dict_root_strict=False,  # skip missing keys; fail if none succeed
)

result = ckpt.export(format="safetensors", dir="out")
print(result["weights_paths"])  # per-root files, e.g. *.model.safetensors
```

Notes:
- `state_dict_root_key="model"` is still accepted for backward compatibility.
- `state_dict_root_keys=[]` means extract from root only.

## Rust

Add dependency:

```toml
[dependencies]
pt-loader = "0.1"
```

Basic usage:

```rust
use pt_loader::{ExportFormat, ExportOptions, LoadOptions, PtCheckpoint};
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let input = "model.pt";
    let ckpt = PtCheckpoint::load(input, LoadOptions::default())?;

    let meta = ckpt.metadata();
    println!("tensor_count={}", meta.tensor_count);
    println!("objects={:?}", meta.security.objects);
    println!("calls={:?}", meta.security.calls);

    let out = ckpt.export(
        "out",
        ExportOptions::new(ExportFormat::Safetensors, Some(Path::new(input))),
    )?;
    println!("weights={}", out.weights_path.display());
    println!("metadata={}", out.metadata_path.unwrap().display());
    Ok(())
}
```

Root-key extraction options:

```rust
use pt_loader::LoadOptions;

let opts = LoadOptions {
    state_dict_root_keys: vec![
        "model".to_string(),
        "optimizer".to_string(),
        "ema.model".to_string(), // deep key
    ],
    state_dict_root_strict: false,
    ..LoadOptions::default()
};
```

Notes:
- Empty `state_dict_root_keys` extracts from root only.
- Non-empty keys extract only those roots (no fallback scan).
- Strict mode fails fast on missing/invalid roots.