Skip to main content

Introduction

Nexus SDK Py is a Python development kit for Nexus client applications. It builds upon Golang Client via cgo. Python SDK does not use any Python-level HTTP middleware for Nexus interactions, but authentication might require it.

SDK is tested against a Nexus stack in a docker-compose deployment, backed by kind Kubernetes clusters.

Quickstart

Install CGO library from Go SDK by running:

chmod +x ./sdk-installer.sh
./sdk-installer.sh

Setting up the development environment

To set up the development environment, follow these steps:

To start a local Nexus stack for testing, run:

just up

The command will start the Kind cluster and deploy Nexus stack on it. You can then run tests against this local deployment.

The Nexus Scheduler API will be available at http://localhost:5555/scheduler and the Nexus Receiver API will be available at http://localhost:8080/receiver. Note that the cluster's ingress configured to rewrite URL paths to reduce number of ports you need to interact with and reduce probability of errors related to ports collision. For example, when you send a request to http://localhost:5555/scheduler/api/something/something, it will be automatically rewritten to http://scheduler-pod:8080/api/something/something and forwarded to the Scheduler API.

The Scylla DB will be available at localhost:9042 and you can connect to it using any CQL client. The default credentials are cassandra/cassandra.

The MinIO s3 API will be available at localhost:9000 and you can connect to it using any S3 client. The default credentials are minioadmin/minioadmin. The minio console is not exposed, but you can use the mc client to interact with it.

In case you are testing changes for Go SDK, clone branch you are testing and compile the .so file from source:

go build -v -buildmode=c-shared -o nexus_sdk.so main.go

Afterwards, copy the nexus_sdk.so under nexus_client_sdk/.extensions/nexus_sdk.so.

Initialize a client and retrieve results for a tagged submission:

from nexus_client_sdk.models.access_token import AccessToken
from nexus_client_sdk.models.scheduler import SdkCustomRunConfiguration
from nexus_client_sdk.clients.nexus_scheduler_client import NexusSchedulerClient

token = "..."
client = NexusSchedulerClient.create("https://localhost:8080", lambda: AccessToken.empty())

alg_params = {"field1": {"field2": 1, "field3": "abc"}, "field4": "cde"}

# create a run
new_run = client.create_run(
    algorithm_parameters=alg_params,
    algorithm_name="test-algorithm",
    custom_configuration=SdkCustomRunConfiguration.create(version="v1.2.3"),
    tag="test-py-sdk",
)

print(f"Run id: {new_run}")

for result in client.get_run_results("abc"):
    print(result)

Nexus Development Framework

Apart from API clients for Nexus, SDK ships a development framework under nexus subpackage. It allows to create production-grade, asyncio-native ML/AI solutions that use a unified structure and are compose of objects and object relations, rather than methods. Nexus turns ML/AI apps into standard Python applications and removes the common noise found in notebook- type code, such as variable reassignment, frequent data copying due to lack of reusable code, copy-paste of code etc.

Nexus's design makes life even easier when using AI code generation, as it is essentially a framework an AI agent can follow to generate a working data science pipeline. Nexus takes care of result accounting, error handling, logging, metric reporting and, most importantly, execution flow. A key feature in Nexus is automatic resolution of execution graph via dependency injection. In essence, a developer just needs to specify which inputs are required for an algorithm to run, and provide class implementations for this, and Nexus will take care of the rest. This also implies that whether an IO operation happens, such as a database read or a file load, Nexus will utilize asyncio coroutines to run multiple IO ops in parallel, significantly increasing the execution speed, without any need for a developer to understand async programming.

For a example of how to use Nexus, take a look at a Sample Algorithm and a corresponding test configuration and a test itself.

Execution tree

Nexus provides a set of utilities that allow viewing and inspecting the execution tree:

from nexus_client_sdk.nexus.execution.trees import get_tree
from tests.algorithms.minimalistic.minimalistic_algorithm_sample import TestMinimalisticAlgorithm

print(get_tree(TestMinimalisticAlgorithm).serialize())

# graph TB
# TESTMINIMALISTICALGORITHM["TestMinimalisticAlgorithm"] --> XYPROCESSOR["XYProcessor"] --> XYREADER["XYReader"]
# TESTMINIMALISTICALGORITHM["TestMinimalisticAlgorithm"] --> ZPROCESSOR["ZProcessor"] --> ZREADER["ZReader"]

Handling Compressed Payloads

Nexus supports reading compressed payloads for efficient data transfer. When a payload is compressed, it must include both the compressed content and a reference to the decompression function.

Payload Structure

A compressed payload should be a json with the following keys:

  • content: The compressed data (as a base64-encoded string).
  • decompressor_import_path: The Python import path to the decompression function.

Example:

{
    "content": "SGVsbG8gd29ybGQ=",  # base64-encoded string of compressed bytes
    "decompressor_import_path": "my_module.my_decompress"
}

When Nexus receives such a payload, it will:

  1. Base64-decode the content field to obtain the compressed bytes.
  2. Dynamically import and call the function specified by decompressor_import_path to decompress the payload.
  3. Use the decompressed data as the actual payload for the algorithm.

This mechanism allows for flexible, pluggable decompression logic, as long as the function path is importable and callable in the runtime environment.

Automatic Payload Compression

Nexus can automatically compress and decompress payloads when using RemoteAlgorithm. To use this feature, you must first configure it with environment variables and then explicitly enable it in your RemoteAlgorithm implementation.

Step 1: Configuration (Environment Variables)

First, you need to provide the Python import paths for your compression and decompression logic. Setting these environment variables allows Nexus to create an injectable Compressor service.

  • NEXUS__REMOTE_ALGORITHM__COMPRESSION_IMPORT_PATH: The import path to your compression function (e.g., my_module.my_compress).
  • NEXUS__REMOTE_ALGORITHM__DECOMPRESSION_IMPORT_PATH: The import path to your decompression function (e.g., my_module.my_decompress).

Step 2: Enabling Compression in Your Algorithm

Once the environment variables are set, you can activate compression on a RemoteAlgorithm instance by providing two arguments during its initialization:

  1. compress_payload=True: This boolean flag signals your intent to use compression for this remote algorithm.
  2. compressor=<injected_compressor_instance>: You must inject the Compressor service that Nexus creates from your environment variables.

Important Requirement

For compression to work, both conditions must be met. The application will raise an error if compress_payload is set to True but a valid Compressor instance is not injected. Ensure that the required environment variables are set so the Compressor service can be created and injected successfully.

Metadata

Release files for nexus-client-sdk 1.8.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for nexus-client-sdk 1.8.2
File Interpreter ABI Platform
nexus_client_sdk-1.8.2-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details
nexus_client_sdk-1.8.2-cp311-cp311-manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64 Details
nexus_client_sdk-1.8.2-cp311-cp311-macosx_13_0_arm64.whl CPython 3.11 CPython 3.11 macOS 13.0+ ARM64 Details

Total release size: 44.0 MB

Release files / nexus_client_sdk-1.8.2-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL nexus_client_sdk-1.8.2-cp311-cp311-manylinux_2_28_x86_64.whl
Size 18.9 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
5526ab8db25239bfec5d012a36c1ed5fd02fbe45f22539da5bbd3583f29cac91
BLAKE2b-256 checksum
How to use checksums
6f40e42ffa6a09d461f2565489664b346f6d222acfc4d860f0a20f0b8713f240
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.5.1 CPython/3.11.16 Linux/6.17.0-1022-azure

Release files / nexus_client_sdk-1.8.2-cp311-cp311-manylinux_2_28_aarch64.whl

Download URL nexus_client_sdk-1.8.2-cp311-cp311-manylinux_2_28_aarch64.whl
Size 16.9 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
56cddbabee55e63ef8d5cc603e43d09138c1135a0d063c54042c9e6ec55096c6
BLAKE2b-256 checksum
How to use checksums
d698c0b23bf5a4c0a6a6d19593e9e505b7b5ffcabd308d5643fe7cdd8c26f645
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.5.1 CPython/3.11.16 Linux/6.17.0-1022-azure

Release files / nexus_client_sdk-1.8.2-cp311-cp311-macosx_13_0_arm64.whl

Download URL nexus_client_sdk-1.8.2-cp311-cp311-macosx_13_0_arm64.whl
Size 8.2 MB
Tags CPython 3.11 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
bb1e85d78654deb8f5dab6576672fd8166ead6755f358d0b2e7cf38c9bb7b28a
BLAKE2b-256 checksum
How to use checksums
dc1b74a5e80b167431063df9188f9ba7e6f821ab1932435ec3f7c227ec8d5b8b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.5.1 CPython/3.11.16 Linux/6.17.0-1022-azure

Release history Release notifications | RSS feed

1.8.5

3 release files

1.8.4

3 release files

1.8.3

3 release files

This release

1.8.2 This release

3 release files

1.8.1

3 release files

1.8.0

3 release files

1.7.3

3 release files

1.7.2

3 release files

1.7.1

3 release files

1.7.0

3 release files

1.6.9

3 release files

1.6.8

3 release files

1.6.7

3 release files

1.6.6

3 release files

1.6.5

3 release files

1.6.4

3 release files

1.6.3

3 release files

1.6.2

3 release files

1.6.1

3 release files

1.6.0

3 release files

1.5.8

3 release files

1.5.7

3 release files

1.5.6

3 release files

1.5.5

3 release files

1.5.4

3 release files

1.5.3

3 release files

1.5.2

3 release files

1.5.1

3 release files

1.5.0

3 release files

1.4.8

3 release files

1.4.6

3 release files

1.4.5

3 release files

1.4.4

3 release files

1.4.3

3 release files

1.4.2

3 release files

1.4.1

3 release files

1.4.0

3 release files

1.3.8

3 release files

1.3.7

3 release files

1.3.6

3 release files

1.3.5

3 release files

1.3.4

3 release files

1.3.3

3 release files

1.3.2

3 release files

1.3.1

3 release files

1.3.0

3 release files

1.2.16

3 release files

1.2.15

3 release files

1.2.14

3 release files

1.2.13

3 release files

1.2.12

3 release files

1.2.11

3 release files

1.2.9

3 release files

1.2.8

3 release files

1.2.7

3 release files

1.2.6

3 release files

1.2.5

3 release files

1.2.4

3 release files

1.2.3

3 release files

1.2.2

3 release files

1.2.1

3 release files

1.2.0

3 release files

1.1.2

3 release files

1.1.1

3 release files

1.1.0

3 release files

1.0.0

3 release files

0.3.7

3 release files

0.3.6

3 release files

0.3.5

3 release files

0.3.4

3 release files

0.3.3

3 release files

0.3.2

3 release files

0.3.1

3 release files

0.3.0

3 release files

0.2.1

3 release files

0.2.0

3 release files

0.1.1

3 release files

0.1.0

3 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page