> For the complete documentation index, see [llms.txt](https://docs.rhinofcp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rhinofcp.com/rhino-sdk/creating-a-new-nvflare-code-object-using-the-rhino-sdk.md).

# Creating a New NVFlare Code Object Using the Rhino SDK

To create new NVFlare Code or a Code version using the Rhino SDK, complete the following steps.

**Note:** To learn how to create new NVFlare Code or a Code versions with the Rhino FCP UI, see [Creating and Running NVFlare Code and Running Inference](/creating-and-running-code-objects/creating-and-running-nvflare-code-and-running-inference.md).

### Prerequisites

Before starting this process, you should have already:

1. Created a Project using the Rhino SDK or the User Interface (UI).
2. Created an Input Data Schema using the Rhino SDK or UI.
3. \[Optional] Created an Output Data Schema using the Rhino SDK or UI. If you choose not to create an output Data Schema, the system will auto-generate the Data Schema of the output for your Code.

### Import your Python Dependencies

```python
import rhino_health as rh
from rhino_health.lib.endpoints.code.code_objects_dataclass import (
    CodeObject,
    CodeObjectCreateInput,
    CodeTypes,
    CodeRunType
)
import getpass
```

**Note:** Remember to change all lines with CHANGE\_ME comments above them in all the blocks below.

### Log into the Rhino SDK using your FCP Credentials

Your username will be the email address you log into the Rhino FCP platform with.

```python
print("Logging In")
# CHANGE_ME: MY_USERNAME
my_username = "MY_USERNAME"

session = rh.login(username=my_username, password=getpass.getpass())
print("Logged In")
```

#### Getting Started Creating Your NVFlare *Code*

To create NVFlare *Code* using the Rhino SDK, you will need to first push a container to your workgroup's ECR. Note the name you use for your container image while pushing; you will need to include it in your code below. You will also need your ECR workgroup. If you need help with client storage setup, please refer to [Mounting Storage to Your Rhino Client](/getting-started/quick-start-guide/mounting-storage-to-your-rhino-client.md)

#### Get Supporting FCP Information Needed to Create Your *Code*

At this point, you will need the name of your project, your *input Data Schema* name, optionally, your *output Data Schema* name, and your ECR workgroup name. For guidance related to client storage setup, please refer to [Mounting Storage to Your Rhino Client](/getting-started/quick-start-guide/mounting-storage-to-your-rhino-client.md). You can also retrieve each object's UUID by following the instructions here: [Frequently Asked Questions (FAQs)](/frequently-asked-questions/frequently-asked-questions-faqs.md)

```python
# CHANGE_ME: YOUR_FCP_PROJECT_NAME
project = session.project.get_project_by_name('YOUR_FCP_PROJECT_NAME')

# CHANGE_ME: INPUT_SCHEMA_NAME & Possibly Version Number too
input_schema = session.project.get_data_schema_by_name('INPUT_SCHEMA_NAME', project_uid=project.uid, version=1)

# CHANGE_ME: OUTPUT_SCHEMA_NAME & Possibly Version Number too.
output_schema = session.project.get_data_schema_by_name('OUTPUT_SCHEMA_NAME', project_uid=project.uid, version=1)

# CHANGE_ME: ECR_WORKGROUP
base_ecr_uri = rh.lib.constants.ECRService.PROD_URL + "/ECR_WORKGROUP"
```

#### Create your NVFlare Code Object using the Container You Just Pushed

During the creation of your `CodeObject`, you will provide it with various pieces of data similar to how Code is created within the UI. You will give the `CodeObject` a name, description, `input_data_schema_uids`, `output_data_schema_uids`, `project_uid`, `code_object_type`, and the `config` where you will provide the name of the container you just pushed.

```python
code_object_params = CodeObjectCreateInput(

    # CHANGE_ME: CODE_OBJECT_NAME
    name = "CODE_OBJECT_NAME",

    # CHANGE_ME: CODE_OBJECT_DESCRIPTION
    description = "CODE_OBJECT_DESCRIPTION",

    input_data_schema_uids = [input_schema.uid],
    # output_schema.uid or None to Infer Output Data Schema
    output_data_schema_uids = [output_schema.uid],
    project_uid = project.uid,

    # CHANGE_ME: NVIDIA_FLARE_V2_0, depending on what version of NVFlare you want to use
    code_type = CodeTypes.NVIDIA_FLARE_V2_0,
    # OR code_type = CodeTypes.NVIDIA_FLARE_V2_2,
    # OR code_type = CodeTypes.NVIDIA_FLARE_V2_3,
    # OR code_type = CodeTypes.NVIDIA_FLARE_V2_4,

    # CHANGE_ME: CONTAINER_IMAGE_NAME
    config = {"container_image_uri": f"{base_ecr_uri}:CONTAINER_IMAGE_NAME"}
)
code_object = session.code.create_code_object(code_object_params)
print(f"Got Code Object '{code_object.name}' with UID {code_object.uid}")
```

**Getting Help**

If you have received an error or run into any issues throughout the process, please reach out to <support@rhinohealth.com> for more assistance.
