Source code for air_sdk.const
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: MIT
"""
Constants shared throughout the SDK.
"""
import os
from datetime import timedelta
from enum import Enum
from urllib.parse import ParseResult, urlparse
SDK_ROOT = os.path.dirname(os.path.abspath(__file__))
MAX_STACKLEVEL = 20
DEFAULT_CONNECT_TIMEOUT = timedelta(seconds=16)
DEFAULT_READ_TIMEOUT = timedelta(seconds=61)
DEFAULT_PAGINATION_PAGE_SIZE = 200 # Objects per paginated response
# Request retry configuration
DEFAULT_RETRY_ATTEMPTS: int = 5
DEFAULT_RETRY_BACKOFF_FACTOR: float = 1.0
DEFAULT_RETRY_BACKOFF_JITTER: float = 1.0
# Image upload configuration
# Multipart upload chunk size (~100MB for balance of speed/reliability)
MULTIPART_CHUNK_SIZE = 100 * 1000 * 1000 # 100 MB in bytes
# Minimum part size for S3 multipart (5 MiB, except for last part)
MULTIPART_MIN_PART_SIZE = 5 * 1024 * 1024 # 5 MiB in bytes
# Maximum recommended concurrent workers for multipart uploads
MAX_RECOMMENDED_UPLOAD_WORKERS = 10
# Default timeout per part upload
DEFAULT_UPLOAD_TIMEOUT = timedelta(minutes=5)
SCOPED_KEY_PREFIX = 'nvapi-'
AIR_API_URL = 'https://api.air-ngc.nvidia.com/'
NGC_API_PROD_URL = 'https://api.ngc.nvidia.com'
NGC_API_STG_URL = 'https://api.stg.ngc.nvidia.com'
[docs]
def get_ngc_api_base_url(api_url: str) -> ParseResult:
"""Return the NGC API base URL based on the Air API URL.
If the api_url contains 'stg', the staging NGC URL is used.
Otherwise, the production NGC URL is used.
"""
base = NGC_API_STG_URL if 'stg' in api_url else NGC_API_PROD_URL
return urlparse(base)
[docs]
def get_ngc_device_login_url(api_url: str) -> ParseResult:
"""Return the NGC device login URL."""
return get_ngc_api_base_url(api_url)._replace(
path='/device/login',
)
[docs]
def get_ngc_token_url(api_url: str) -> ParseResult:
"""Return the NGC token URL."""
return get_ngc_api_base_url(api_url)._replace(
path='/token',
)
[docs]
def get_ngc_sak_details_url(api_url: str) -> ParseResult:
"""Return the NGC SAK details URL."""
return get_ngc_api_base_url(api_url)._replace(
path='/v3/keys/get-caller-info',
)
[docs]
def get_ngc_me_url(api_url: str) -> ParseResult:
"""Return the NGC user info URL."""
return get_ngc_api_base_url(api_url)._replace(
path='/v2/users/me',
)