

# Introducción
<a name="nova-sagemaker-inference-getting-started"></a>

Esta guía le muestra cómo implementar modelos personalizados de Amazon Nova en puntos de conexión en tiempo real de SageMaker, configurar los parámetros de inferencia e invocar sus modelos para realizar pruebas.

## Requisitos previos
<a name="nova-sagemaker-inference-prerequisites"></a>

Los siguientes son requisitos previos para implementar modelos de Amazon Nova en Inferencias de SageMaker:
+ Cree una Cuenta de AWS: si aún no tiene una, consulte [Creating an AWS account](https://docs.aws.amazon.com//sagemaker/latest/dg/gs-set-up.html#sign-up-for-aws).
+ Permisos de IAM necesarios: asegúrese de que su usuario o rol de IAM tenga adjuntas las políticas de administración siguientes:
  + `AmazonSageMakerFullAccess`
  + `AmazonS3FullAccess`
+ Versiones del SDK y de la CLI requeridas: las siguientes versiones de SDK se han probado y validado con modelos de Amazon Nova en Inferencias de SageMaker.
  + Versión 3.0.0 o superior del SDK de SageMaker para Python (`sagemaker>=3.0.0`) para un enfoque de API basado en recursos.
  + Versión 1.35.0 o superior de Boto3 (`boto3>=1.35.0`) para llamadas directas a la API. Los ejemplos de esta guía utilizan este enfoque.
+ Aumento de la cuota de servicio: solicite un aumento de la cuota de servicio de Amazon SageMaker para el tipo de instancia de ML que tiene previsto utilizar para el punto de conexión de Inferencia de SageMaker (por ejemplo, `ml.p5.48xlarge for endpoint usage`). Para ver una lista de los tipos de instancia admitidos, consulte [Modelos e instancias compatibles](nova-model-sagemaker-inference.md#nova-sagemaker-inference-supported). Para solicitar un aumento, consulte [Solicitud de aumento de cuota](https://docs.aws.amazon.com//servicequotas/latest/userguide/request-quota-increase.html). Para obtener más información sobre las cuotas de instancias de SageMaker, consulte [Puntos de conexión y cuotas de Amazon SageMaker](https://docs.aws.amazon.com//general/latest/gr/sagemaker.html).

## Paso 1: configure las credenciales de AWS
<a name="nova-sagemaker-inference-step1"></a>

Configure las credenciales de AWS con uno de los siguientes métodos:

**Opción 1: AWS CLI (recomendado)**

```
aws configure
```

Ingrese la clave de acceso de AWS, la clave secreta y el nombre de la región predeterminada cuando se le solicite.

**Opción 2: archivo de credenciales AWS**

Cree o edite `~/.aws/credentials`:

```
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
```

**Opción 3: variables de entorno**

```
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
```

**nota**  
Para obtener más información sobre las credenciales de AWS, consulte [Opciones de los archivos de configuración y credenciales en la AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-files.html).

**Initialización de clientes de AWS**

Cree un script o cuaderno de Python con el siguiente código para inicializar el SDK de AWS y verificar sus credenciales:

```
import boto3

# AWS Configuration - Update these for your environment
REGION = "us-east-1"  # Supported regions: us-east-1, us-west-2
AWS_ACCOUNT_ID = "YOUR_ACCOUNT_ID"  # Replace with your AWS account ID

# Initialize AWS clients using default credential chain
sagemaker = boto3.client('sagemaker', region_name=REGION)
sts = boto3.client('sts')

# Verify credentials
try:
    identity = sts.get_caller_identity()
    print(f"Successfully authenticated to AWS Account: {identity['Account']}")
    
    if identity['Account'] != AWS_ACCOUNT_ID:
        print(f"Warning: Connected to account {identity['Account']}, expected {AWS_ACCOUNT_ID}")

except Exception as e:
    print(f"Failed to authenticate: {e}")
    print("Please verify your credentials are configured correctly.")
```

Si la autenticación se realiza correctamente, debería ver una salida que confirma el ID de su cuenta de AWS.

## Paso 2: cree un rol de puesta en marcha de SageMaker AI
<a name="nova-sagemaker-inference-step2"></a>

Un rol de puesta en marcha de SageMaker es un rol de IAM que concede permisos a SageMaker para acceder a los recursos de AWS en su nombre, como los buckets de Amazon S3 para artefactos de modelos y CloudWatch para el registro.

**Creación del rol de puesta en marcha**

**nota**  
La creación de roles de IAM requiere los permisos `iam:CreateRole` y `iam:AttachRolePolicy`. Asegúrese de que el usuario o el rol de IAM tenga estos permisos antes de continuar.

El código siguiente crea un rol de IAM con los permisos necesarios para implementar modelos personalizados de Amazon Nova:

```
import json

# Create SageMaker Execution Role
role_name = f"SageMakerInference-ExecutionRole-{AWS_ACCOUNT_ID}"

trust_policy = {
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"Service": "sagemaker.amazonaws.com"},
            "Action": "sts:AssumeRole"
        }
    ]
}

iam = boto3.client('iam', region_name=REGION)

# Create the role
role_response = iam.create_role(
    RoleName=role_name,
    AssumeRolePolicyDocument=json.dumps(trust_policy),
    Description='SageMaker execution role with S3 and SageMaker access'
)

# Attach required policies
iam.attach_role_policy(
    RoleName=role_name,
    PolicyArn='arn:aws:iam::aws:policy/AmazonSageMakerFullAccess'
)

iam.attach_role_policy(
    RoleName=role_name,
    PolicyArn='arn:aws:iam::aws:policy/AmazonS3FullAccess'
)

SAGEMAKER_EXECUTION_ROLE_ARN = role_response['Role']['Arn']
print(f"Created SageMaker execution role: {SAGEMAKER_EXECUTION_ROLE_ARN}")
```

**Uso de un rol de puesta en marcha existente (opcional)**

Si ya tiene un rol de puesta en marcha de SageMaker, puede usarlo en su lugar:

```
# Replace with your existing role ARN
SAGEMAKER_EXECUTION_ROLE_ARN = "arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_EXISTING_ROLE_NAME"
```

Para buscar los roles de SageMaker existentes en su cuenta:

```
iam = boto3.client('iam', region_name=REGION)
response = iam.list_roles()
sagemaker_roles = [role for role in response['Roles'] if 'SageMaker' in role['RoleName']]
for role in sagemaker_roles:
    print(f"{role['RoleName']}: {role['Arn']}")
```

**importante**  
El rol de puesta en marcha debe tener una relación de confianza con `sagemaker.amazonaws.com` y permisos para acceder a los recursos de Amazon S3 y SageMaker.

Para obtener más información sobre los roles de puesta en marcha de SageMaker, consulte [SageMaker Roles](https://docs.aws.amazon.com//sagemaker/latest/dg/sagemaker-roles.html).

## Paso 3: configure los parámetros del modelo
<a name="nova-sagemaker-inference-step3"></a>

Configure los parámetros de implementación de su modelo de Amazon Nova. Estos ajustes controlan el comportamiento del modelo, la asignación de recursos y las características de inferencia. Para obtener una lista de los tipos de instancias compatibles y los valores de CONTEXT\$1LENGTH y MAX\$1CONCURRENCY admitidos para cada uno, consulte [Modelos e instancias compatibles](nova-model-sagemaker-inference.md#nova-sagemaker-inference-supported).

**Parámetros requeridos**
+ `IMAGE`: el URI de imagen del contenedor de Docker para el contenedor de inferencias de Amazon Nova. Lo proporcionará AWS.
+ `CONTEXT_LENGTH`: longitud del contexto del modelo.
+ `MAX_CONCURRENCY`: número máximo de secuencias por iteración; establece el límite de cuántas solicitudes de usuarios individuales (peticiones) se pueden procesar simultáneamente en un solo lote en la GPU. Rango: valor entero mayor que 0.

**Parámetros de generación opcionales**
+ `DEFAULT_TEMPERATURE`: controla la asignación al azar en la generación. Rango: de 0,0 a 2,0 (0.0 = determinista, más alto = asignación al azar mayor).
+ `DEFAULT_TOP_P`: umbral de muestreo del núcleo para la selección de tokens. Rango: del 1e-10 al 1,0.
+ `DEFAULT_TOP_K`: limita la selección de tokens a los K más probables. Rango: número entero -1 o mayor (-1 = sin límite).
+ `DEFAULT_MAX_NEW_TOKENS`: número máximo de tokens que se generarán en respuesta (es decir, número máximo de tokens de salida). Rango: número entero 1 o mayor.
+ `DEFAULT_LOGPROBS`: número de probabilidades logarítmicas que se devolverán por token. Rango: número entero del 1 al 20.

**Configurar su implementación**

```
# AWS Configuration
REGION = "us-east-1"  # Must match region from Step 1

# ECR Account mapping by region
ECR_ACCOUNT_MAP = {
    "us-east-1": "708977205387",
    "us-west-2": "176779409107"
}

# Container Image
IMAGE = f"{ECR_ACCOUNT_MAP[REGION]}.dkr.ecr.{REGION}.amazonaws.com/nova-inference-repo:SM-Inference-latest"
print(f"IMAGE = {IMAGE}")

# Model Parameters
CONTEXT_LENGTH = "16000"       # Maximum total context length
MAX_CONCURRENCY = "2"          # Maximum concurrent sequences

# Optional: Default generation parameters (uncomment to use)
DEFAULT_TEMPERATURE = "0.0"   # Deterministic output
DEFAULT_TOP_P = "1.0"         # Consider all tokens
# DEFAULT_TOP_K = "50"        # Uncomment to limit to top 50 tokens
# DEFAULT_MAX_NEW_TOKENS = "2048"  # Uncomment to set max output tokens
# DEFAULT_LOGPROBS = "1"      # Uncomment to enable log probabilities

# Build environment variables for the container
environment = {
    'CONTEXT_LENGTH': CONTEXT_LENGTH,
    'MAX_CONCURRENCY': MAX_CONCURRENCY,
}

# Add optional parameters if defined
if 'DEFAULT_TEMPERATURE' in globals():
    environment['DEFAULT_TEMPERATURE'] = DEFAULT_TEMPERATURE
if 'DEFAULT_TOP_P' in globals():
    environment['DEFAULT_TOP_P'] = DEFAULT_TOP_P
if 'DEFAULT_TOP_K' in globals():
    environment['DEFAULT_TOP_K'] = DEFAULT_TOP_K
if 'DEFAULT_MAX_NEW_TOKENS' in globals():
    environment['DEFAULT_MAX_NEW_TOKENS'] = DEFAULT_MAX_NEW_TOKENS
if 'DEFAULT_LOGPROBS' in globals():
    environment['DEFAULT_LOGPROBS'] = DEFAULT_LOGPROBS

print("Environment configuration:")
for key, value in environment.items():
    print(f"  {key}: {value}")
```

**Configuración de los parámetros específicos de la implementación**

Ahora configure los parámetros específicos de la implementación de su modelo de Amazon Nova, como la ubicación de los artefactos del modelo y la selección del tipo de instancia.

**Definición del identificador de la implementación**

```
# Deployment identifier - use a descriptive name for your use case
JOB_NAME = "my-nova-deployment"
```

**Definición de la ubicación de los artefactos del modelo**

Proporcione el URI de Amazon S3 en el que se almacenan los artefactos de los modelos entrenados de Amazon Nova. Esta debe ser la ubicación de salida de su trabajo de entrenamiento o refinamiento del modelo.

```
# S3 location of your trained Nova model artifacts
# Replace with your model's S3 URI - must end with /
MODEL_S3_LOCATION = "s3://your-bucket-name/path/to/model/artifacts/"
```

**Selección de la variante del modelo y del tipo de instancia**

```
# Configure model variant and instance type
TESTCASE = {
    "model": "lite2",              # Options: micro, lite, lite2
    "instance": "ml.p5.48xlarge"   # Refer to "Supported models and instances" section
}

# Generate resource names
INSTANCE_TYPE = TESTCASE["instance"]
MODEL_NAME = JOB_NAME + "-" + TESTCASE["model"] + "-" + INSTANCE_TYPE.replace(".", "-")
ENDPOINT_CONFIG_NAME = MODEL_NAME + "-Config"
ENDPOINT_NAME = MODEL_NAME + "-Endpoint"

print(f"Model Name: {MODEL_NAME}")
print(f"Endpoint Config: {ENDPOINT_CONFIG_NAME}")
print(f"Endpoint Name: {ENDPOINT_NAME}")
```

**Convenciones de nomenclatura**

El código genera automáticamente nombres consistentes para los recursos de AWS:
+ Nombre del modelo: `{JOB_NAME}-{model}-{instance-type}`
+ Configuración del punto de conexión: `{MODEL_NAME}-Config`
+ Nombre del punto de conexión: `{MODEL_NAME}-Endpoint`

## Paso 4: cree la configuración del modelo y del punto de conexión de SageMaker
<a name="nova-sagemaker-inference-step4"></a>

En este paso, creará dos recursos esenciales: un objeto de modelo de SageMaker que haga referencia a los artefactos del modelo de Amazon Nova y una configuración de punto de conexión que defina cómo se implementará el modelo.

**Modelo de SageMaker**: objeto de modelo que empaqueta la imagen del contenedor de inferencia, la ubicación de los artefactos del modelo y la configuración del entorno. Se trata de un recurso reutilizable que se puede implementar en varios puntos de conexión.

**Configuración de punto de conexión**: define la configuración de la infraestructura de la implementación, como el tipo de instancia, el número de instancias y las variantes del modelo. Esto le permite administrar la configuración de implementación de forma independiente del propio modelo.

**Cree el modelo de SageMaker**

El siguiente código crea un modelo de SageMaker que hace referencia a los artefactos del modelo de Amazon Nova:

```
try:
    model_response = sagemaker.create_model(
        ModelName=MODEL_NAME,
        PrimaryContainer={
            'Image': IMAGE,
            'ModelDataSource': {
                'S3DataSource': {
                    'S3Uri': MODEL_S3_LOCATION,
                    'S3DataType': 'S3Prefix',
                    'CompressionType': 'None'
                }
            },
            'Environment': environment
        },
        ExecutionRoleArn=SAGEMAKER_EXECUTION_ROLE_ARN,
        EnableNetworkIsolation=True
    )
    print("Model created successfully!")
    print(f"Model ARN: {model_response['ModelArn']}")
    
except sagemaker.exceptions.ClientError as e:
    print(f"Error creating model: {e}")
```

Parámetros clave:
+ `ModelName`: identificador único para su modelo
+ `Image`: URI de imagen del contenedor de Docker para las inferencias de Amazon Nova
+ `ModelDataSource`: ubicación en Amazon S3 de los artefactos de su modelo
+ `Environment`: variables de entorno configuradas en el paso 3
+ `ExecutionRoleArn`: rol de IAM del paso 2
+ `EnableNetworkIsolation`: establezca el valor en True para mejorar la seguridad (evita que el contenedor haga llamadas salientes a la red)

**Creación de la configuración de punto de conexión**

A continuación, cree una configuración de punto de conexión que defina la infraestructura de la implementación:

```
# Create Endpoint Configuration
try:
    production_variant = {
        'VariantName': 'primary',
        'ModelName': MODEL_NAME,
        'InitialInstanceCount': 1,
        'InstanceType': INSTANCE_TYPE,
    }
    
    config_response = sagemaker.create_endpoint_config(
        EndpointConfigName=ENDPOINT_CONFIG_NAME,
        ProductionVariants=[production_variant]
    )
    print("Endpoint configuration created successfully!")
    print(f"Config ARN: {config_response['EndpointConfigArn']}")
    
except sagemaker.exceptions.ClientError as e:
    print(f"Error creating endpoint configuration: {e}")
```

Parámetros clave:
+ `VariantName`: identificador de esta variante del modelo (utilice “principal” para las implementaciones de un solo modelo)
+ `ModelName`: hace referencia al modelo creado anteriormente
+ `InitialInstanceCount`: número de instancias que se van a implementar (comience con 1 y escale más adelante si es necesario)
+ `InstanceType`: tipo de instancia de ML seleccionado en el paso 3

**Verificación de la creación de recursos**

Puede verificar que los recursos se crearon correctamente:

```
# Describe the model
model_info = sagemaker.describe_model(ModelName=MODEL_NAME)
print(f"Model Status: {model_info['ModelName']} created")

# Describe the endpoint configuration
config_info = sagemaker.describe_endpoint_config(EndpointConfigName=ENDPOINT_CONFIG_NAME)
print(f"Endpoint Config Status: {config_info['EndpointConfigName']} created")
```

## Paso 5: implemente el punto de conexión
<a name="nova-sagemaker-inference-step5"></a>

El siguiente paso consiste en implementar su modelo de Amazon Nova mediante la creación de un punto de conexión en tiempo real de SageMaker. Este punto de conexión alojará su modelo y proporcionará un punto de conexión HTTPS seguro para realizar solicitudes de inferencia.

La creación del punto de conexión suele tardar entre 15 y 30 minutos, ya que AWS aprovisiona la infraestructura, descarga los artefactos del modelo e inicializa el contenedor de inferencias.

**Cree el punto de conexión**

```
import time

try:
    endpoint_response = sagemaker.create_endpoint(
        EndpointName=ENDPOINT_NAME,
        EndpointConfigName=ENDPOINT_CONFIG_NAME
    )
    print("Endpoint creation initiated successfully!")
    print(f"Endpoint ARN: {endpoint_response['EndpointArn']}")
except Exception as e:
    print(f"Error creating endpoint: {e}")
```

**Supervisión de la creación de puntos de conexión**

El siguiente código sondea el estado del punto de conexión hasta que se complete la implementación:

```
# Monitor endpoint creation progress
print("Waiting for endpoint creation to complete...")
print("This typically takes 15-30 minutes...\n")

while True:
    try:
        response = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME)
        status = response['EndpointStatus']
        
        if status == 'Creating':
            print(f"⏳ Status: {status} - Provisioning infrastructure and loading model...")
        elif status == 'InService':
            print(f"✅ Status: {status}")
            print("\nEndpoint creation completed successfully!")
            print(f"Endpoint Name: {ENDPOINT_NAME}")
            print(f"Endpoint ARN: {response['EndpointArn']}")
            break
        elif status == 'Failed':
            print(f"❌ Status: {status}")
            print(f"Failure Reason: {response.get('FailureReason', 'Unknown')}")
            print("\nFull response:")
            print(response)
            break
        else:
            print(f"Status: {status}")
        
    except Exception as e:
        print(f"Error checking endpoint status: {e}")
        break
    
    time.sleep(30)  # Check every 30 seconds
```

**Comprobación de que el punto de conexión esté listo**

Cuando el punto de conexión esté en funcionamiento, puede verificar su configuración:

```
# Get detailed endpoint information
endpoint_info = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME)

print("\n=== Endpoint Details ===")
print(f"Endpoint Name: {endpoint_info['EndpointName']}")
print(f"Endpoint ARN: {endpoint_info['EndpointArn']}")
print(f"Status: {endpoint_info['EndpointStatus']}")
print(f"Creation Time: {endpoint_info['CreationTime']}")
print(f"Last Modified: {endpoint_info['LastModifiedTime']}")

# Get endpoint config for instance type details
endpoint_config_name = endpoint_info['EndpointConfigName']
endpoint_config = sagemaker.describe_endpoint_config(EndpointConfigName=endpoint_config_name)

# Display production variant details
for variant in endpoint_info['ProductionVariants']:
    print(f"\nProduction Variant: {variant['VariantName']}")
    print(f"  Current Instance Count: {variant['CurrentInstanceCount']}")
    print(f"  Desired Instance Count: {variant['DesiredInstanceCount']}")
    # Get instance type from endpoint config
    for config_variant in endpoint_config['ProductionVariants']:
        if config_variant['VariantName'] == variant['VariantName']:
            print(f"  Instance Type: {config_variant['InstanceType']}")
            break
```

**Solución de problemas de creación de puntos de conexión**

Motivos de error comunes:
+ **Capacidad insuficiente**: el tipo de instancia solicitado no está disponible en su región.
  + Solución: pruebe un tipo de instancia diferente o solicite un aumento de cuota
+ **Permisos de IAM**: el rol de puesta en marcha carece de los permisos necesarios.
  + Solución: compruebe que el rol tenga acceso a los artefactos del modelo de Amazon S3 y a los permisos de SageMaker necesarios
+ **No se encontraron los artefactos del modelo**: el URI de Amazon S3 es incorrecto o no se puede acceder a él.
  + Solución: compruebe el URI de Amazon S3 y los permisos del bucket, y asegúrese de que se encuentra en la región correcta.
+ **Límites de recursos**: se han superado los límites de las cuentas para los puntos de conexión o las instancias.
  + Solución: solicite un aumento de la cuota de servicio a través de Service Quotas o AWS Support.

**nota**  
Si tiene que eliminar un punto de conexión defectuoso y empezar de nuevo, haga lo siguiente:  

```
sagemaker.delete_endpoint(EndpointName=ENDPOINT_NAME)
```

## Paso 6: invoque el punto de conexión
<a name="nova-sagemaker-inference-step6"></a>

Cuando el punto de conexión esté en funcionamiento, puede enviar solicitudes de inferencia para generar predicciones a partir de su modelo de Amazon Nova. SageMaker admite puntos de conexión síncronos (en tiempo real con modos de transmisión o sin transmisión) y puntos de conexión asíncronos (basados en Amazon S3 para el procesamiento por lotes).

**Configuración del cliente de tiempo de ejecución**

Cree un cliente de tiempo de ejecución de SageMaker con la configuración de tiempo de espera adecuada:

```
import json
import boto3
import botocore
from botocore.exceptions import ClientError

# Configure client with appropriate timeouts
config = botocore.config.Config(
    read_timeout=120,      # Maximum time to wait for response
    connect_timeout=10,    # Maximum time to establish connection
    retries={'max_attempts': 3}  # Number of retry attempts
)

# Create SageMaker Runtime client
runtime_client = boto3.client('sagemaker-runtime', config=config, region_name=REGION)
```

**Creación de una función de inferencia universal**

La siguiente función gestiona las solicitudes de transmisión y de no transmisión:

```
def invoke_nova_endpoint(request_body):
    """
    Invoke Nova endpoint with automatic streaming detection.
    
    Args:
        request_body (dict): Request payload containing prompt and parameters
    
    Returns:
        dict: Response from the model (for non-streaming requests)
        None: For streaming requests (prints output directly)
    """
    body = json.dumps(request_body)
    is_streaming = request_body.get("stream", False)
    
    try:
        print(f"Invoking endpoint ({'streaming' if is_streaming else 'non-streaming'})...")
        
        if is_streaming:
            response = runtime_client.invoke_endpoint_with_response_stream(
                EndpointName=ENDPOINT_NAME,
                ContentType='application/json',
                Body=body
            )
            
            event_stream = response['Body']
            for event in event_stream:
                if 'PayloadPart' in event:
                    chunk = event['PayloadPart']
                    if 'Bytes' in chunk:
                        data = chunk['Bytes'].decode()
                        print("Chunk:", data)
        else:
            # Non-streaming inference
            response = runtime_client.invoke_endpoint(
                EndpointName=ENDPOINT_NAME,
                ContentType='application/json',
                Accept='application/json',
                Body=body
            )
            
            response_body = response['Body'].read().decode('utf-8')
            result = json.loads(response_body)
            print("✅ Response received successfully")
            return result
    
    except ClientError as e:
        error_code = e.response['Error']['Code']
        error_message = e.response['Error']['Message']
        print(f"❌ AWS Error: {error_code} - {error_message}")
    except Exception as e:
        print(f"❌ Unexpected error: {str(e)}")
```

**Ejemplo 1: finalización de un chat sin transmisión**

Use el formato de chat para las interacciones conversacionales:

```
# Non-streaming chat request
chat_request = {
    "messages": [
        {"role": "user", "content": "Hello! How are you?"}
    ],
    "max_tokens": 100,
    "max_completion_tokens": 100,  # Alternative to max_tokens
    "stream": False,
    "temperature": 0.7,
    "top_p": 0.9,
    "top_k": 50,
    "logprobs": True,
    "top_logprobs": 3,
    "reasoning_effort": "low",  # Options: "low", "high"
    "allowed_token_ids": None,  # List of allowed token IDs
    "truncate_prompt_tokens": None,  # Truncate prompt to this many tokens
    "stream_options": None
}

response = invoke_nova_endpoint(chat_request)
```

**Respuesta de ejemplo:**

```
{
    "id": "chatcmpl-123456",
    "object": "chat.completion",
    "created": 1234567890,
    "model": "default",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "Hello! I'm doing well, thank you for asking. I'm here and ready to help you with any questions or tasks you might have. How can I assist you today?"
            },
            "logprobs": {
                "content": [
                    {
                        "token": "Hello",
                        "logprob": -0.123,
                        "top_logprobs": [
                            {"token": "Hello", "logprob": -0.123},
                            {"token": "Hi", "logprob": -2.456},
                            {"token": "Hey", "logprob": -3.789}
                        ]
                    }
                    # Additional tokens...
                ]
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 12,
        "completion_tokens": 28,
        "total_tokens": 40
    }
}
```

**Ejemplo 2: finalización de texto simple**

Use el formato de finalización para generar texto simple:

```
# Simple completion request
completion_request = {
    "prompt": "The capital of France is",
    "max_tokens": 50,
    "stream": False,
    "temperature": 0.0,
    "top_p": 1.0,
    "top_k": -1,  # -1 means no limit
    "logprobs": 3,  # Number of log probabilities to return
    "allowed_token_ids": None,  # List of allowed token IDs
    "truncate_prompt_tokens": None,  # Truncate prompt to this many tokens
    "stream_options": None
}

response = invoke_nova_endpoint(completion_request)
```

**Respuesta de ejemplo:**

```
{
    "id": "cmpl-789012",
    "object": "text_completion",
    "created": 1234567890,
    "model": "default",
    "choices": [
        {
            "text": " Paris.",
            "index": 0,
            "logprobs": {
                "tokens": [" Paris", "."],
                "token_logprobs": [-0.001, -0.002],
                "top_logprobs": [
                    {" Paris": -0.001, " London": -5.234, " Rome": -6.789},
                    {".": -0.002, ",": -4.567, "!": -7.890}
                ]
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 6,
        "completion_tokens": 2,
        "total_tokens": 8
    }
}
```

**Ejemplo 3: finalización de un chat con transmisión**

```
# Streaming chat request
streaming_request = {
    "messages": [
        {"role": "user", "content": "Tell me a short story about a robot"}
    ],
    "max_tokens": 200,
    "stream": True,
    "temperature": 0.7,
    "top_p": 0.95,
    "top_k": 40,
    "logprobs": True,
    "top_logprobs": 2,
    "reasoning_effort": "high",  # For more detailed reasoning
    "stream_options": {"include_usage": True}
}

invoke_nova_endpoint(streaming_request)
```

**Ejemplo de salida de transmisión:**

```
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":null},"logprobs":null,"finish_reason":null}],"prompt_token_ids":null}
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" Once","reasoning_content":null},"logprobs":{"content":[{"token":"\u2581Once","logprob":-0.6078429222106934,"bytes":[226,150,129,79,110,99,101],"top_logprobs":[{"token":"\u2581Once","logprob":-0.6078429222106934,"bytes":[226,150,129,79,110,99,101]},{"token":"\u2581In","logprob":-0.7864127159118652,"bytes":[226,150,129,73,110]}]}]},"finish_reason":null,"token_ids":null}]}
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" upon","reasoning_content":null},"logprobs":{"content":[{"token":"\u2581upon","logprob":-0.0012345,"bytes":[226,150,129,117,112,111,110],"top_logprobs":[{"token":"\u2581upon","logprob":-0.0012345,"bytes":[226,150,129,117,112,111,110]},{"token":"\u2581a","logprob":-6.789,"bytes":[226,150,129,97]}]}]},"finish_reason":null,"token_ids":null}]}
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" a","reasoning_content":null},"logprobs":{"content":[{"token":"\u2581a","logprob":-0.0001234,"bytes":[226,150,129,97],"top_logprobs":[{"token":"\u2581a","logprob":-0.0001234,"bytes":[226,150,129,97]},{"token":"\u2581time","logprob":-9.123,"bytes":[226,150,129,116,105,109,101]}]}]},"finish_reason":null,"token_ids":null}]}
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" time","reasoning_content":null},"logprobs":{"content":[{"token":"\u2581time","logprob":-0.0023456,"bytes":[226,150,129,116,105,109,101],"top_logprobs":[{"token":"\u2581time","logprob":-0.0023456,"bytes":[226,150,129,116,105,109,101]},{"token":",","logprob":-6.012,"bytes":[44]}]}]},"finish_reason":null,"token_ids":null}]}

# Additional chunks...

Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":15,"completion_tokens":87,"total_tokens":102}}
Chunk: data: [DONE]
```

**Ejemplo 4: finalización de un chat multimodal**

Use el formato multimodal para la entrada de imágenes y texto:

```
# Multimodal chat request (if supported by your model)
multimodal_request = {
    "messages": [
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "What's in this image?"},
                {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}
            ]
        }
    ],
    "max_tokens": 150,
    "temperature": 0.3,
    "top_p": 0.8,
    "stream": False
}

response = invoke_nova_endpoint(multimodal_request)
```

**Respuesta de ejemplo:**

```
{
    "id": "chatcmpl-345678",
    "object": "chat.completion",
    "created": 1234567890,
    "model": "default",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "The image shows..."
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 1250,
        "completion_tokens": 45,
        "total_tokens": 1295
    }
}
```

## Paso 7 (opcional): elimine recursos
<a name="nova-sagemaker-inference-step7"></a>

Para evitar incurrir en gastos innecesarios, elimine los recursos de AWS que creó durante este tutorial. Los puntos de conexión de SageMaker incurren en cargos mientras están en funcionamiento, incluso si no realiza activamente solicitudes de inferencia.

**importante**  
La eliminación de los recursos es permanente y no se puede deshacer. Asegúrese de que ya no necesite estos recursos antes de continuar.

**Eliminación del punto de conexión**

```
import boto3

# Initialize SageMaker client
sagemaker = boto3.client('sagemaker', region_name=REGION)

try:
    print("Deleting endpoint...")
    sagemaker.delete_endpoint(EndpointName=ENDPOINT_NAME)
    print(f"✅ Endpoint '{ENDPOINT_NAME}' deletion initiated")
    print("Charges will stop once deletion completes (typically 2-5 minutes)")
except Exception as e:
    print(f"❌ Error deleting endpoint: {e}")
```

**nota**  
La eliminación de puntos de conexión es asíncrona. Puede supervisar el estado de la eliminación:  

```
import time

print("Monitoring endpoint deletion...")
while True:
    try:
        response = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME)
        status = response['EndpointStatus']
        print(f"Status: {status}")
        time.sleep(10)
    except sagemaker.exceptions.ClientError as e:
        if e.response['Error']['Code'] == 'ValidationException':
            print("✅ Endpoint successfully deleted")
            break
        else:
            print(f"Error: {e}")
            break
```

**Eliminación de la configuración de punto de conexión**

Una vez eliminado el punto de conexión, elimine su configuración.

```
try:
    print("Deleting endpoint configuration...")
    sagemaker.delete_endpoint_config(EndpointConfigName=ENDPOINT_CONFIG_NAME)
    print(f"✅ Endpoint configuration '{ENDPOINT_CONFIG_NAME}' deleted")
except Exception as e:
    print(f"❌ Error deleting endpoint configuration: {e}")
```

**Eliminación del modelo**

Elimine el objeto de modelo de SageMaker:

```
try:
    print("Deleting model...")
    sagemaker.delete_model(ModelName=MODEL_NAME)
    print(f"✅ Model '{MODEL_NAME}' deleted")
except Exception as e:
    print(f"❌ Error deleting model: {e}")
```