The Uli SDK infrastructure organizes all computing resources into a clear hierarchical structure of subsystems, nodes, and components. A subsystem serves as a logical grouping of one or more nodes, where each node represents a physical or virtual computing device. In turn, each node hosts the components (applications) that provide services. All communication between these services is conducted through a robust, message-based interaction model.
To facilitate seamless communication, every entity within this hierarchy—subsystems, nodes, and components—is assigned a unique identifier. Messages are then addressed using a tuple in the format (Subsystem ID, Node ID, Comp ID), which precisely specifies both the source and destination. This ID assignment is performed dynamically, analogous to a DHCP server assigning IP addresses. The SDK’s Id Allocator service issues unique IDs to subsystems, and once a subsystem is registered, its internal Subsystem Manager service allocates unique IDs to the nodes within its domain.
For efficiency and performance, all messages are serialized using the Cap’n Proto framework before being transmitted between clients and servers via local sockets, UDP unicast, or UDP multicast. To enable logical network segmentation, messages can be assigned to specific partitions, ensuring that only services within the same partition can communicate. This entire communication system is managed by a Node Manager service running on each node. The Node Manager dynamically builds a routing table by learning from the messages it processes, allowing it to forward traffic based solely on Uli identifiers. This sophisticated mechanism abstracts away the underlying network topology and removes any dependency on IP addresses for inter-service communication.
Within the Uli SDK, a service is the fundamental building block of functionality. Each service's behavior and interface are formally defined by its input/output messages, its internal events, a governing state machine, and a set of configurable parameters. To promote modularity and organization, related services are logically grouped together into a higher-level structure known as a component.
To ensure system-wide discoverability and observability, every component is required to implement two foundational services:
. Service Register: Provides a dynamic discovery mechanism, allowing other services to locate and interact with it at runtime.
. Status Reporter: Offers a standardized interface for querying the component's operational status, health, and other vital metrics.
Agents are the primary components for executing mission-critical tasks and exercising direct control over system capabilities. The Uli SDK provides a unified interface for the entire agent lifecycle, encompassing discovery, configuration, execution, and real-time status monitoring. Utilizing the subsystem's Agent Discovery service, clients can dynamically query an agent's capabilities, current configuration, and operational status, as well as request exclusive control to perform specific tasks.
This agent-based architecture is particularly vital for integrating advanced AI and Large Language Model (LLM) frameworks. In this context, agents function as the critical bridge between the AI's cognitive processes and real-world execution. They provide the essential tools for task execution, deliver the capability and mission-readiness data that support AI-driven workflow reasoning, and supply the control parameters and feedback required for AI models to learn and optimize their processes.
The unified workflow for accessing and controlling agents is outlined below.
1. The client requests control (exclusive) of the subsyste.
2. The client discovers the authorized agents.
3. The client requests exclusive control of the agent of interest.
4. The client configures the agent.
5. The client controls the agent to run, pause, and cancel.
6. The client queries the status of the agent.
Data Topics are the primary mechanism for categorizing and disseminating real-time data throughout the Uli SDK, operating on a robust publish-subscribe model. Services act as publishers, broadcasting information to these named channels, while clients subscribe to specific topics to receive data streams relevant to their function.
To facilitate this dynamic interaction, the Uli SDK provides a Data Topic Discovery service. This allows publishing applications to formally register their available data topics within the subsystem. Through a single, unified interface, clients can then perform both the discovery of and subscription to these topics, enabling seamless, on-the-fly integration with new data sources.
The unified workflow for discovering and accessing Data Topics is detailed below.
1. The client requests data access (none-exclusive) to the subsystem.
2. The client discovers the authorized data topics.
3. The client subscribes to data topics of interest.
4. The client receives the data topic streams.
To ensure the security of the operation, the Uli SDK implements a robust server-client authentication and authorization framework that distinctly governs data and control access. The framework enforces the security by requiring clients to initiate distinct requests for data access and control access. For each request, the client must present a valid certification. Upon successful validation, the server grants a tailored set of permissions and issues a corresponding session token: either a data access uuid for data requests or a control access uuid for control requests. The client must then use the data access uuid to subscribe to data topics and the control access uuid to request exclusive control of agents.
The safety framework implemented within the Uli SDK is engineered to ensure the proactive detection and decisive handling of emergency conditions, thereby safeguarding operational integrity. This system is designed to trigger an emergency state automatically upon the detection of critical faults-such as a safety critical application entering an error state or a complete loss of contact-as well as through direct command by an operator, e-stop pressed.
The Uli SDK automatically generates Python Bindings for applications, facilitating seamless integration within the PySide6, Flask-Next.js, and MCP frameworks, as well as NVIDIA Isaac Sim, ROS, SECS/GEM, DDS, and a diverse array of hardward and sensors.
The Uli SDK offers a comprehensive suite of tools for code generation, building, and application deployment.
The SDK's code generation tools produce concise C++ code for record structures, messages, services, and Comp Apps. For example, the Uli-generated service code typically contains around 400 source lines of code (SLOC).
Uli SDK utilizes Google's highly efficient build tool, Bazel, which supports cross-building for both x86 and ARM 64-bit architectures, with or without CUDA support. It has been tested on Ubuntu 18.04, 20.04, 22.04, and 24.04, and supports x86_64, NVIDIA Jetson, Xavier, and AGX boards. Here are the Uli SDK supported OS and devices:
In addition, the SDK includes shell scripts to streamline the staging and deployment of applications across a network of devices
OS | Device | Development Host (x86_64) |
Jetpack 46 | Jetson Nano, Jetson Xavier NX | Ubuntu 18.04 |
Jetpack 5 | Jetson Xavier NX, Jetson Orin | Ubuntu 20.04 |
Jetpack 6 | Jetson Orin Nano, AGX Orin | Ubuntu 22.04 |
Ubuntu 18.04 | x86_64 | Ubuntu 18.04 |
Ubuntu 20.04 | x86_64 | Ubuntu 20.04 |
Ubuntu 22.04 | x86_64 | Ubuntu 22.04 |
Ubuntu 24.04 | x86_64 | Ubuntu 24.04 |