Source code for nemo_evaluator.cli.example

# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#!/usr/bin/env python3

"""
CLI script to set up NVIDIA Eval Factory framework files in a destination folder.
"""

import argparse
import os
from importlib.resources import files
from pathlib import Path

import jinja2

from nemo_evaluator.logging.utils import logger


[docs] def add_example_files(package_name: str, destination_folder: str | None = None) -> None: """ Set up NVIDIA framework files in the specified destination folder. Args: package_name: Package name for the framework destination_folder: Path to the destination folder where to create the framework. If not provided, current working directory will be used. """ if not package_name.isidentifier(): raise ValueError( f"Package name {package_name} is not a valid Python identifier." ) if destination_folder is None: destination_folder = os.getcwd() dest_path = Path(destination_folder).resolve() dest_path.mkdir(parents=True, exist_ok=True) nvidia_path: Path = dest_path / "core_evals" / package_name nvidia_path.mkdir(parents=True, exist_ok=True) # Use importlib.resources to access package resources resources_dir = files("nemo_evaluator.resources") template_files = { "framework_tpl.yml": "framework.yml", "output_tpl.py": "output.py", "init_tpl.py": "__init__.py", } for template_name, target_name in template_files.items(): template_path = resources_dir / template_name target_path = nvidia_path / target_name if target_path.exists(): with open(target_path, "r") as f: content = f.read().strip() if content != "": logger.warning( f"Target exists and is not empty, not copying: {target_path}" ) continue with template_path.open() as in_f: template_rendered = ( jinja2.Environment() .from_string(in_f.read()) .render(framework_name=package_name) ) with target_path.open("w") as out_f: out_f.write(template_rendered) logger.info(f"Created: {target_path}") logger.info( "The Eval Factory compatibility package was initialized! Please ensure the following:\n" + f"1) Implement the core_evals/{package_name}/framework.yml according to contributing guide\n" + "2) Add core_evals module in your build config to be included in your wheel\n" + f"3) Implement output parsing logic in core_evals/{package_name}/output.py\n" + "4) Add `nemo_evaluator` to your package dependencies\n" + "Please also consult the documentation. Good luck and happy packaging!\n" )
[docs] def main(): """Main entry point for the CLI script.""" parser = argparse.ArgumentParser( description="Set up NVIDIA framework files in a destination folder", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: nemo_evaluator_example my_package /path/to/destination """, ) parser.add_argument( "package_name", help="Python package-like name for the NVIDIA Eval Factory framework", ) parser.add_argument( "destination", help="Destination folder where to create the NVIDIA Eval Factory framework files." " If not provided, current working directory will be used.", ) args = parser.parse_args() add_example_files(args.package_name, args.destination)
if __name__ == "__main__": main()