permanence-training / permanence /common /serialization.py
chane35's picture
PERMANENCE: reversibility-aware RL environment for training LLM agents
796da7c verified
Raw
History Blame Contribute Delete
930 Bytes
from __future__ import annotations
from dataclasses import asdict, is_dataclass
from enum import Enum
from typing import Any
def to_jsonable(value: Any) -> Any:
"""Recursively convert values into JSON-serializable primitives."""
if value is None:
return None
if isinstance(value, (str, int, float, bool)):
return value
if isinstance(value, Enum):
return value.value
if is_dataclass(value):
return to_jsonable(asdict(value))
if isinstance(value, dict):
return {str(key): to_jsonable(item) for key, item in value.items()}
if isinstance(value, (list, tuple)):
return [to_jsonable(item) for item in value]
if isinstance(value, set):
return [to_jsonable(item) for item in sorted(value, key=lambda item: repr(item))]
if hasattr(value, "to_dict") and callable(value.to_dict):
return to_jsonable(value.to_dict())
return str(value)