This file documents how to provision a clean development environment for uipath-runtime, run the build, execute the tests, and validate a sample code change end-to-end. It is intended both as a quick reference for human contributors and as a structured guide for automated environment-setup tooling.
- Python 3.11+
- uv 0.5+
uv is shell- and OS-agnostic, so the commands below run unchanged on every supported platform:
- Linux
- Windows
- macOS
None required for environment setup, build, or unit tests. The suite under the Test section runs fully offline and requires no external authentication.
All commands below must be run from the repository root. The
uvinvocations resolvepyproject.toml,src/, andtests/relative to the current working directory. The first line of## Setupenforces this bycd-ing to the git root.
cd "$(git rev-parse --show-toplevel)"
python3 -m pip install --upgrade uv
uv sync --all-extrasuv --version
uv run python --version
uv run python -c "import uipath.runtime; print('uipath_runtime ok')"N/A
uv run pytestAdd a new count classmethod to UiPathRuntimeFactoryRegistry in src/uipath/runtime/registry.py, immediately after the existing get_all method:
@classmethod
def count(cls) -> int:
"""Return the number of currently registered factories."""
return len(cls._factories)Then create tests/test_registry_count.py with two pytest tests:
"""Tests for UiPathRuntimeFactoryRegistry.count."""
from unittest.mock import MagicMock
from uipath.runtime.registry import UiPathRuntimeFactoryRegistry
def _make_factory():
"""Return a callable that yields a protocol-shaped mock.
The registry stores the callable in `_factories` without invoking it, so
`count()` only needs the entry to exist. Returning a `MagicMock()` keeps
the callable's return type structurally compatible with
`UiPathRuntimeFactoryProtocol` without dragging the real type in.
"""
return lambda _context: MagicMock()
def test_count_empty(monkeypatch) -> None:
monkeypatch.setattr(UiPathRuntimeFactoryRegistry, "_factories", {})
monkeypatch.setattr(UiPathRuntimeFactoryRegistry, "_registration_order", [])
assert UiPathRuntimeFactoryRegistry.count() == 0
def test_count_after_registrations(monkeypatch) -> None:
monkeypatch.setattr(UiPathRuntimeFactoryRegistry, "_factories", {})
monkeypatch.setattr(UiPathRuntimeFactoryRegistry, "_registration_order", [])
UiPathRuntimeFactoryRegistry.register("alpha", _make_factory(), "a.json")
UiPathRuntimeFactoryRegistry.register("beta", _make_factory(), "b.json")
assert UiPathRuntimeFactoryRegistry.count() == 2uv run pytest tests/test_registry_count.py -vThis section is for human contributors who want to validate changes end-to-end against the real cloud platform. It is not executed by the Agentic Inner Loop validation pipeline — that pipeline only runs the sections above (Setup → Verify → Build → Test → Sample Code Change).
The unit tests above are necessary but not sufficient — they don't exercise the package end-to-end through a real agent. The flow below validates changes against a live runtime:
-
Apply the code changes locally.
-
Run the unit tests (see the
Sample Code Changesection above). -
Scaffold a coded UiPath agent that exercises the changed code path.
-
In the downstream project's
pyproject.toml, add this local library as an editable dependency:[tool.uv.sources] uipath-runtime = { path = "../path/to/uipath-runtime-python", editable = true }
-
Exercise the new behavior end-to-end:
uv run uipath run <agent-name> --input '{...}'
-
(Optional) Open a PR and apply the
build:devlabel — this publishes the development version to Test PyPI. -
The PR description is updated automatically with instructions for pointing the downstream agent at the Test PyPI dev version.
-
Validate the new behavior against the real platform — use either or both of the deploy targets below (Studio Web and Orchestrator are not mutually exclusive):
- Studio Web: export the
UIPATH_PROJECT_IDenvironment variable pointing to an existing Coded Agent project in your solution, then runuipath pushto push the dev version to that project. Open it in Studio Web and exercise the changed code path. - Orchestrator: run
uipath deployto deploy the dev version as a package, then start a job in Orchestrator and exercise the changed code path.
- Studio Web: export the
-
Once validation is done, close the dev PR — these PRs are not meant to be merged; their only purpose was to publish a Test PyPI build for end-to-end validation.