skills/pufferlib/references/integration.md
Research snapshot: 2026-07-23.
| Need | Published pufferlib==3.0.0 | Current 4.0 source |
|---|---|---|
| Gymnasium instance adaptation | pufferlib.emulation.GymnasiumPufferEnv | Removed from current source |
| PettingZoo Parallel adaptation | pufferlib.emulation.PettingZooPufferEnv | Removed from current source |
| Python vector backends | pufferlib.vector | Removed from current source |
Native Python PufferEnv | Supported | Replaced by current C/Ocean interface |
| Trainer | pufferlib.pufferl.PuffeRL | Native backend or pufferlib.torch_pufferl.PuffeRL |
| External logging | W&B and Neptune | W&B in current CLI |
| Primary config | merged INI sections | different INI schema |
| Checkpoints | Torch state dict plus trainer state | native .bin; Torch fallback state dict |
Pin a profile. Do not import from a floating branch or blend examples across columns.
import gymnasium
import pufferlib.emulation
import pufferlib.vector
def make_env():
raw = gymnasium.make("CartPole-v1")
return pufferlib.emulation.GymnasiumPufferEnv(raw)
vecenv = pufferlib.vector.make(
make_env,
backend=pufferlib.vector.Serial,
num_envs=2,
seed=42,
)
try:
observations, infos = vecenv.reset(seed=42)
actions = vecenv.action_space.sample()
observations, rewards, terminals, truncations, infos = vecenv.step(actions)
finally:
vecenv.close()
This example is an API pattern, not authorization to install or execute
CartPole-v1 or another plug-in. Review the exact environment and dependencies
first.
Use a reviewed Parallel environment instance:
wrapped = pufferlib.emulation.PettingZooPufferEnv(reviewed_parallel_env)
The stable source does not document automatic AEC-to-Parallel conversion in this adapter. Convert explicitly with PettingZoo's supported utilities only when the environment's turn semantics permit it, then test action ordering, dead-agent handling, masks, and termination/truncation dictionaries.
Subclass pufferlib.PufferEnv, define single_observation_space,
single_action_space, and num_agents before super().__init__, then update
the provided arrays in place. Native Puffer environments are already vector
interfaces; do not return Gym's scalar four-tuple.
Remove or migrate these historical patterns:
| Historical pattern | Current guidance |
|---|---|
pufferlib.make("name", ...) | Stable: import an audited creator and use pufferlib.vector.make; 4.0: build/configure a named native environment |
pufferlib.emulate(...) | Stable: instantiate GymnasiumPufferEnv or PettingZooPufferEnv explicitly |
pufferlib.vectorization.Serial | Stable module is pufferlib.vector.Serial |
from pufferlib import PuffeRL | Stable trainer is pufferlib.pufferl.PuffeRL; 4.0 fallback is in torch_pufferl |
define native observation_space/action_space | Stable native class requires single_observation_space/single_action_space before super() |
return (obs, reward, done, info) | Return separate termination and truncation values |
native multi-agent dictionaries and dones["__all__"] | Use stable vector buffers or a reviewed PettingZoo Parallel adapter |
arbitrary dotted entry_point registration | Import an audited callable directly; bundled tools reject dotted paths |
top-level WandbLogger/NeptuneLogger | Stable logger classes live in pufferlib.pufferl; prefer the CLI and sanitized config |
| assume Atari/Procgen/NetHack names exist everywhere | Verify the chosen version's config/source and install the separately reviewed environment |
This is a redesign, not a drop-in upgrade:
emulation, vector, PufferEnv, third-party environments,
policy wrappers, INI keys, logger flags, and Torch checkpoints.[vec], [policy], [torch], and [train]
keys. Do not mechanically rename old keys..pt and new .bin files as incompatible unless an official,
tested converter says otherwise. Do not improvise binary conversion.The default branch contains some stale 3.0-style examples even though the corresponding modules are absent. Prefer current implementation and docs over those copied examples.
Environment extras can pull old Gym versions, native libraries, renderers, emulators, datasets, model opponents, and ROM tooling. A package name in a PufferLib optional extra is not a security or license endorsement.
Before install/import/build:
For Atari and similar systems, the user must supply legally obtained assets. Never download ROM sets or auto-accept a license on the user's behalf.
External tracking is disabled by default. The stable logger implementations can log the full argument mapping and can upload model artifacts. Therefore:
WANDB_API_KEY and NEPTUNE_API_TOKEN only in an approved environment
injection or secret manager;Do not print all environment variables or recursively discover .env files.
Checking whether one explicitly named credential variable exists can be
acceptable; reading or logging its value is not.
For each reviewed environment/profile:
Only then consider GPU training, external logging, or larger parallelism.