***

layout: overview
slug: nemo-curator/nemo\_curator/backends/xenna/adapter
title: nemo\_curator.backends.xenna.adapter
-------------------------------------------

## Module Contents

### Classes

| Name                                                                          | Description                      |
| ----------------------------------------------------------------------------- | -------------------------------- |
| [`XennaStageAdapter`](#nemo_curator-backends-xenna-adapter-XennaStageAdapter) | Adapts ProcessingStage to Xenna. |

### Functions

| Name                                                                                                        | Description                                                             |
| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| [`create_named_xenna_stage_adapter`](#nemo_curator-backends-xenna-adapter-create_named_xenna_stage_adapter) | When we run a pipeline in Xenna, since we wrap using XennaStageAdapter, |

### API

<Anchor id="nemo_curator-backends-xenna-adapter-XennaStageAdapter">
  <CodeBlock links={{"nemo_curator.stages.base.ProcessingStage":"/nemo-curator/nemo_curator/stages/base#nemo_curator-stages-base-ProcessingStage"}} showLineNumbers={false} wordWrap={true}>
    ```python
    class nemo_curator.backends.xenna.adapter.XennaStageAdapter(
        processing_stage: nemo_curator.stages.base.ProcessingStage
    )
    ```
  </CodeBlock>
</Anchor>

<Indent>
  **Bases:** [BaseStageAdapter](/nemo-curator/nemo_curator/backends/base#nemo_curator-backends-base-BaseStageAdapter), `Stage`

  Adapts ProcessingStage to Xenna.
  Args:
  stage: ProcessingStage to adapt

  <ParamField path="env_info" type="RuntimeEnv | None">
    Runtime environment for this stage.
  </ParamField>

  <ParamField path="required_resources" type="XennaResources">
    Get the resources required for this stage.
  </ParamField>

  <ParamField path="stage_batch_size" type="int">
    Get the batch size for this stage.
  </ParamField>

  <Anchor id="nemo_curator-backends-xenna-adapter-XennaStageAdapter-process_data">
    <CodeBlock links={{"nemo_curator.tasks.Task":"/nemo-curator/nemo_curator/tasks/tasks#nemo_curator-tasks-tasks-Task"}} showLineNumbers={false} wordWrap={true}>
      ```python
      nemo_curator.backends.xenna.adapter.XennaStageAdapter.process_data(
          tasks: list[nemo_curator.tasks.Task]
      ) -> list[nemo_curator.tasks.Task] | None
      ```
    </CodeBlock>
  </Anchor>

  <Indent>
    Process batch of tasks with automatic performance tracking.
    Args:
    tasks: List of tasks to process
    Returns:
    List of processed tasks or None
  </Indent>

  <Anchor id="nemo_curator-backends-xenna-adapter-XennaStageAdapter-setup">
    <CodeBlock showLineNumbers={false} wordWrap={true}>
      ```python
      nemo_curator.backends.xenna.adapter.XennaStageAdapter.setup(
          worker_metadata: cosmos_xenna.pipelines.private.resources.WorkerMetadata
      ) -> None
      ```
    </CodeBlock>
  </Anchor>

  <Indent>
    Setup the stage per worker - Xenna-specific signature.
    This method is called by Xenna with its specific types. We convert them
    to our generic types and delegate to the base adapter.
    Args:
    worker\_metadata: Xenna's WorkerMetadata object
  </Indent>

  <Anchor id="nemo_curator-backends-xenna-adapter-XennaStageAdapter-setup_on_node">
    <CodeBlock showLineNumbers={false} wordWrap={true}>
      ```python
      nemo_curator.backends.xenna.adapter.XennaStageAdapter.setup_on_node(
          node_info: cosmos_xenna.pipelines.private.resources.NodeInfo,
          worker_metadata: cosmos_xenna.pipelines.private.resources.WorkerMetadata
      ) -> None
      ```
    </CodeBlock>
  </Anchor>

  <Indent>
    Setup the stage on a node - Xenna-specific signature.
    This method is called by Xenna with its specific types. We convert them
    to our generic types and delegate to the base adapter.
    Args:
    node\_info: Xenna's NodeInfo object
    worker\_metadata: Xenna's WorkerMetadata object
  </Indent>
</Indent>

<Anchor id="nemo_curator-backends-xenna-adapter-create_named_xenna_stage_adapter">
  <CodeBlock links={{"nemo_curator.stages.base.ProcessingStage":"/nemo-curator/nemo_curator/stages/base#nemo_curator-stages-base-ProcessingStage","nemo_curator.backends.xenna.adapter.XennaStageAdapter":"#nemo_curator-backends-xenna-adapter-XennaStageAdapter"}} showLineNumbers={false} wordWrap={true}>
    ```python
    nemo_curator.backends.xenna.adapter.create_named_xenna_stage_adapter(
        stage: nemo_curator.stages.base.ProcessingStage
    ) -> nemo_curator.backends.xenna.adapter.XennaStageAdapter
    ```
  </CodeBlock>
</Anchor>

<Indent>
  When we run a pipeline in Xenna, since we wrap using XennaStageAdapter,
  the stage name is shown as XennaStageAdapter. This is not what we want.
  So we create a dynamic subclass with the original stage's name.
  This ensures that when Xenna calls type(adapter).**name**, it returns the
  original stage's class name rather than 'XennaStageAdapter'.
  Args:
  stage (ProcessingStage): ProcessingStage to adapt

  **Returns:** `XennaStageAdapter`

  XennaStageAdapter instance with the wrapped stage's class name
</Indent>
