Skip to content

Commit a2e8fe4

Browse files
refactor: reference platform constants instead of hardcoded strings (#1747)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent a22cdb1 commit a2e8fe4

38 files changed

Lines changed: 233 additions & 116 deletions

packages/uipath-platform/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "uipath-platform"
3-
version = "0.1.82"
3+
version = "0.1.83"
44
description = "HTTP client library for programmatic access to UiPath Platform"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"

packages/uipath-platform/src/uipath/platform/chat/_llm_gateway_service.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from ..common._endpoints_manager import EndpointManager
2828
from ..common._execution_context import UiPathExecutionContext
2929
from ..common._models import Endpoint
30+
from ..common.constants import HEADER_AGENTHUB_CONFIG
3031
from .llm_gateway import (
3132
ChatCompletion,
3233
SpecificToolChoice,
@@ -59,7 +60,7 @@ def _build_llm_headers(
5960
"X-UiPath-LlmGateway-RequestingFeature": requesting_feature,
6061
}
6162
if agenthub_config:
62-
headers["X-UiPath-AgentHub-Config"] = agenthub_config
63+
headers[HEADER_AGENTHUB_CONFIG] = agenthub_config
6364
if action_id:
6465
headers["X-UiPath-LlmGateway-ActionId"] = action_id
6566
return headers

packages/uipath-platform/src/uipath/platform/common/_service_url_overrides.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import os
1616

1717
from ._config import UiPathConfig
18+
from .constants import HEADER_INTERNAL_ACCOUNT_ID, HEADER_INTERNAL_TENANT_ID
1819

1920

2021
def resolve_service_url(endpoint_path: str) -> str | None:
@@ -57,8 +58,8 @@ def inject_routing_headers(headers: dict[str, str]) -> None:
5758
"""
5859
tenant_id = UiPathConfig.tenant_id
5960
if tenant_id:
60-
headers["X-UiPath-Internal-TenantId"] = tenant_id
61+
headers[HEADER_INTERNAL_TENANT_ID] = tenant_id
6162

6263
organization_id = UiPathConfig.organization_id
6364
if organization_id:
64-
headers["X-UiPath-Internal-AccountId"] = organization_id
65+
headers[HEADER_INTERNAL_ACCOUNT_ID] = organization_id

packages/uipath-platform/src/uipath/platform/common/_span_utils.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@
1515
from pydantic import BaseModel, ConfigDict, Field
1616
from uipath.core.serialization import serialize_json
1717

18+
from .constants import (
19+
ENV_FOLDER_KEY,
20+
ENV_JOB_KEY,
21+
ENV_ORGANIZATION_ID,
22+
ENV_PROCESS_KEY,
23+
ENV_TENANT_ID,
24+
ENV_UIPATH_PROCESS_UUID,
25+
ENV_UIPATH_PROCESS_VERSION,
26+
ENV_UIPATH_TRACE_ID,
27+
)
28+
1829
logger = logging.getLogger(__name__)
1930

2031

@@ -201,25 +212,25 @@ class UiPathSpan:
201212
# serializer, and even null fails for the required OrganizationId/FolderKey.
202213
# In the platform runtime these are always set to real GUIDs.
203214
organization_id: Optional[str] = field(
204-
default_factory=lambda: env.get("UIPATH_ORGANIZATION_ID") or None
215+
default_factory=lambda: env.get(ENV_ORGANIZATION_ID) or None
205216
)
206217
tenant_id: Optional[str] = field(
207-
default_factory=lambda: env.get("UIPATH_TENANT_ID") or None
218+
default_factory=lambda: env.get(ENV_TENANT_ID) or None
208219
)
209220
expiry_time_utc: Optional[str] = None
210221
folder_key: Optional[str] = field(
211-
default_factory=lambda: env.get("UIPATH_FOLDER_KEY") or None
222+
default_factory=lambda: env.get(ENV_FOLDER_KEY) or None
212223
)
213224
source: SpanSource = SpanSource.CODED_AGENTS
214225
span_type: str = "Coded Agents"
215226
process_key: Optional[str] = field(
216-
default_factory=lambda: env.get("UIPATH_PROCESS_UUID")
227+
default_factory=lambda: env.get(ENV_UIPATH_PROCESS_UUID)
217228
)
218229
reference_id: Optional[str] = field(
219230
default_factory=lambda: env.get("TRACE_REFERENCE_ID")
220231
)
221232

222-
job_key: Optional[str] = field(default_factory=lambda: env.get("UIPATH_JOB_KEY"))
233+
job_key: Optional[str] = field(default_factory=lambda: env.get(ENV_JOB_KEY))
223234

224235
# Top-level fields for internal tracing schema
225236
execution_type: Optional[ExecutionType] = None
@@ -341,7 +352,7 @@ def otel_span_to_uipath_span(
341352
span_id = format(span_context.span_id, "016x")
342353

343354
# Override trace_id if custom or env var provided (supports both UUID and hex format)
344-
trace_id_override = custom_trace_id or os.environ.get("UIPATH_TRACE_ID")
355+
trace_id_override = custom_trace_id or os.environ.get(ENV_UIPATH_TRACE_ID)
345356
if trace_id_override:
346357
trace_id = _SpanUtils.normalize_trace_id(trace_id_override)
347358

@@ -420,8 +431,8 @@ def otel_span_to_uipath_span(
420431

421432
# Add process context attributes from environment variables
422433
for env_key, attr_key in (
423-
("UIPATH_PROCESS_KEY", "agentName"),
424-
("UIPATH_PROCESS_VERSION", "agentVersion"),
434+
(ENV_PROCESS_KEY, "agentName"),
435+
(ENV_UIPATH_PROCESS_VERSION, "agentVersion"),
425436
):
426437
value = env.get(env_key)
427438
if value:

packages/uipath-platform/tests/services/test_service_url_overrides.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
inject_routing_headers,
55
resolve_service_url,
66
)
7+
from uipath.platform.common.constants import (
8+
HEADER_INTERNAL_ACCOUNT_ID,
9+
HEADER_INTERNAL_TENANT_ID,
10+
)
711

812

913
class TestResolveServiceUrl:
@@ -68,16 +72,16 @@ def test_injects_tenant_and_org(self, monkeypatch: pytest.MonkeyPatch) -> None:
6872
monkeypatch.setenv("UIPATH_ORGANIZATION_ID", "org-456")
6973
headers: dict[str, str] = {}
7074
inject_routing_headers(headers)
71-
assert headers["X-UiPath-Internal-TenantId"] == "tenant-123"
72-
assert headers["X-UiPath-Internal-AccountId"] == "org-456"
75+
assert headers[HEADER_INTERNAL_TENANT_ID] == "tenant-123"
76+
assert headers[HEADER_INTERNAL_ACCOUNT_ID] == "org-456"
7377

7478
def test_skips_missing_env_vars(self, monkeypatch: pytest.MonkeyPatch) -> None:
7579
monkeypatch.delenv("UIPATH_TENANT_ID", raising=False)
7680
monkeypatch.delenv("UIPATH_ORGANIZATION_ID", raising=False)
7781
headers: dict[str, str] = {}
7882
inject_routing_headers(headers)
79-
assert "X-UiPath-Internal-TenantId" not in headers
80-
assert "X-UiPath-Internal-AccountId" not in headers
83+
assert HEADER_INTERNAL_TENANT_ID not in headers
84+
assert HEADER_INTERNAL_ACCOUNT_ID not in headers
8185

8286
def test_does_not_overwrite_existing_headers(
8387
self, monkeypatch: pytest.MonkeyPatch
@@ -87,4 +91,4 @@ def test_does_not_overwrite_existing_headers(
8791
headers: dict[str, str] = {"X-Custom": "keep-me"}
8892
inject_routing_headers(headers)
8993
assert headers["X-Custom"] == "keep-me"
90-
assert headers["X-UiPath-Internal-TenantId"] == "tenant-123"
94+
assert headers[HEADER_INTERNAL_TENANT_ID] == "tenant-123"

packages/uipath-platform/uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/uipath/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[project]
22
name = "uipath"
3-
version = "2.11.16"
3+
version = "2.11.17"
44
description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools."
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"
77
dependencies = [
88
"uipath-core>=0.5.26, <0.6.0",
99
"uipath-runtime>=0.11.5, <0.12.0",
10-
"uipath-platform>=0.1.82, <0.2.0",
10+
"uipath-platform>=0.1.83, <0.2.0",
1111
"click>=8.3.1",
1212
"httpx>=0.28.1",
1313
"pyjwt>=2.10.1",

packages/uipath/src/uipath/_cli/_auth/_auth_service.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
from uipath._cli._utils._console import ConsoleLogger
1010
from uipath._utils._auth import update_env_file
1111
from uipath.platform.common import ExternalApplicationService, TokenData
12+
from uipath.platform.common.constants import (
13+
ENV_BASE_URL,
14+
ENV_ORGANIZATION_ID,
15+
ENV_TENANT_ID,
16+
ENV_UIPATH_ACCESS_TOKEN,
17+
)
1218

1319
from ._utils import update_auth_file
1420

@@ -61,17 +67,17 @@ async def _authenticate_client_credentials(self):
6167
)
6268

6369
env_vars = {
64-
"UIPATH_ACCESS_TOKEN": token_data.access_token,
65-
"UIPATH_URL": external_app_service._base_url,
66-
"UIPATH_ORGANIZATION_ID": get_parsed_token_data(token_data).get("prt_id"),
70+
ENV_UIPATH_ACCESS_TOKEN: token_data.access_token,
71+
ENV_BASE_URL: external_app_service._base_url,
72+
ENV_ORGANIZATION_ID: get_parsed_token_data(token_data).get("prt_id"),
6773
}
6874

6975
if tenant_name:
7076
self._tenant = tenant_name
7177
auth_session = AuthSession(self._domain)
7278
auth_session.update_token_data(token_data)
7379
tenant_info = await auth_session.resolve_tenant_info(self._tenant)
74-
env_vars["UIPATH_TENANT_ID"] = tenant_info["tenant_id"]
80+
env_vars[ENV_TENANT_ID] = tenant_info["tenant_id"]
7581
else:
7682
self._console.warning("Could not extract tenant from --base-url.")
7783
update_env_file(env_vars)
@@ -90,10 +96,10 @@ async def _authenticate_authorization_code(self) -> None:
9096

9197
update_env_file(
9298
{
93-
"UIPATH_ACCESS_TOKEN": token_data.access_token,
94-
"UIPATH_URL": uipath_url,
95-
"UIPATH_TENANT_ID": tenant_info["tenant_id"],
96-
"UIPATH_ORGANIZATION_ID": tenant_info["organization_id"],
99+
ENV_UIPATH_ACCESS_TOKEN: token_data.access_token,
100+
ENV_BASE_URL: uipath_url,
101+
ENV_TENANT_ID: tenant_info["tenant_id"],
102+
ENV_ORGANIZATION_ID: tenant_info["organization_id"],
97103
}
98104
)
99105

@@ -110,9 +116,9 @@ async def _authenticate_authorization_code(self) -> None:
110116

111117
async def _can_reuse_existing_token(self, auth_session: AuthSession) -> bool:
112118
if (
113-
os.getenv("UIPATH_URL")
114-
and os.getenv("UIPATH_TENANT_ID")
115-
and os.getenv("UIPATH_ORGANIZATION_ID")
119+
os.getenv(ENV_BASE_URL)
120+
and os.getenv(ENV_TENANT_ID)
121+
and os.getenv(ENV_ORGANIZATION_ID)
116122
):
117123
try:
118124
await auth_session.ensure_valid_token()

packages/uipath/src/uipath/_cli/_auth/_auth_session.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import click
44

55
from uipath.platform.common import TokenData
6+
from uipath.platform.common.constants import ENV_UIPATH_ACCESS_TOKEN
67
from uipath.platform.identity import IdentityService
78
from uipath.platform.portal import (
89
PortalService as PlatformPortalService,
@@ -95,7 +96,7 @@ async def ensure_valid_token(self):
9596
def finalize(token_data: TokenData):
9697
self.update_token_data(token_data)
9798
update_auth_file(token_data)
98-
update_env_file({"UIPATH_ACCESS_TOKEN": token_data.access_token})
99+
update_env_file({ENV_UIPATH_ACCESS_TOKEN: token_data.access_token})
99100

100101
if exp is not None and float(exp) > time.time():
101102
finalize(auth_data)

packages/uipath/src/uipath/_cli/_auth/_url_utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Tuple
33
from urllib.parse import urlparse
44

5+
from ...platform.common.constants import ENV_BASE_URL
56
from .._utils._console import ConsoleLogger
67

78
console = ConsoleLogger()
@@ -26,7 +27,7 @@ def resolve_domain(base_url: str | None, environment: str | None) -> str:
2627
return domain
2728

2829
if environment is None:
29-
uipath_url = os.getenv("UIPATH_URL")
30+
uipath_url = os.getenv(ENV_BASE_URL)
3031
if uipath_url:
3132
parsed = urlparse(uipath_url)
3233
if parsed.scheme and parsed.netloc:

0 commit comments

Comments
 (0)