dwehr's picture
Migrate action viewer to local Cosmos generation
9f818c5
Raw
History Blame Contribute Delete
2.58 kB
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: OpenMDW-1.1
"""Export config defaults and schemas."""
from cosmos_framework.inference.common.init import init_script
init_script(default_env={"COSMOS_TRAINING": "0"})
import argparse
import json
import pathlib
import textwrap
import typing
import pydantic
import yaml
from cosmos_framework.inference.args import OmniSampleOverrides, OmniSetupOverrides
MODELS: list[tuple[type[pydantic.BaseModel], dict[str, typing.Any]]] = [
(OmniSetupOverrides, {}),
(OmniSampleOverrides, {}),
]
def _nested_model_cls(field: pydantic.fields.FieldInfo) -> type[pydantic.BaseModel] | None:
"""Return the BaseModel subclass backing *field*, if any."""
ann = field.annotation
if isinstance(ann, type) and issubclass(ann, pydantic.BaseModel):
return ann
for arg in typing.get_args(ann):
if isinstance(arg, type) and issubclass(arg, pydantic.BaseModel):
return arg
return None
def _commented_yaml(model_cls: type, data: dict) -> str:
lines: list[str] = []
for name, field in sorted(model_cls.model_fields.items()):
if name not in data:
continue
if field.description:
for dl in field.description.strip().splitlines():
s = dl.strip()
lines.append(f"# {s}" if s else "#")
value = data[name]
nested = _nested_model_cls(field)
if nested and isinstance(value, dict):
lines.append(f"{name}:")
lines.append(textwrap.indent(_commented_yaml(nested, value).rstrip("\n"), " "))
else:
lines.append(yaml.dump({name: value}, default_flow_style=False, sort_keys=False).rstrip())
return "\n".join(lines) + "\n"
def export_schemas(output_dir: pathlib.Path) -> None:
output_dir.mkdir(parents=True, exist_ok=True)
for cls, defaults in MODELS:
data = cls.model_construct(**defaults).model_dump(mode="json")
(output_dir / f"{cls.__name__}.yaml").write_text(_commented_yaml(cls, data))
(output_dir / f"{cls.__name__}.schema.json").write_text(json.dumps(cls.model_json_schema(), indent=2) + "\n")
print(f"Saved {cls.__name__} -> {output_dir}")
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("-o", "--output", type=pathlib.Path, default="schemas", help="Output directory")
args = parser.parse_args()
export_schemas(args.output.absolute())
if __name__ == "__main__":
main()