Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
[project]
name = "uipath"
version = "2.8.46"
version = "2.9.0"
description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools."
readme = { file = "README.md", content-type = "text/markdown" }
requires-python = ">=3.11"
dependencies = [
"uipath-core>=0.5.0, <0.6.0",
"uipath-runtime>=0.9.0, <0.10.0",
"uipath-runtime==0.9.0.dev1000950339",
"click>=8.3.1",
"httpx>=0.28.1",
"pyjwt>=2.10.1",
Expand All @@ -23,6 +23,7 @@ dependencies = [
"mermaid-builder==0.0.3",
"graphtty==0.1.8",
"applicationinsights>=0.11.10",
"uipath-platform==0.0.1.dev1000020019",
]
classifiers = [
"Intended Audience :: Developers",
Expand Down Expand Up @@ -131,9 +132,9 @@ init_typed = true
warn_required_dynamic_aliases = true

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = "test_*.py"
addopts = "-ra -q --cov"
#testpaths = ["tests"]
#python_files = "test_*.py"
#addopts = "-ra -q --cov"
asyncio_default_fixture_loop_scope = "function"
asyncio_mode = "auto"

Expand All @@ -148,3 +149,8 @@ name = "testpypi"
url = "https://test.pypi.org/simple/"
publish-url = "https://test.pypi.org/legacy/"
explicit = true

[tool.uv.sources]
uipath-platform = { index = "testpypi" }
uipath-core = { index = "testpypi" }
uipath-runtime = { index = "testpypi" }
2 changes: 1 addition & 1 deletion src/uipath/_cli/_auth/_portal_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import click
import httpx
from uipath.platform.common import TokenData
from uipath.runtime.errors import (
UiPathErrorCategory,
UiPathErrorCode,
Expand All @@ -10,7 +11,6 @@

from ..._utils._auth import update_env_file
from ..._utils._ssl_context import get_httpx_client_kwargs
from ...platform.common import TokenData
from .._utils._console import ConsoleLogger
from ._models import OrganizationInfo, TenantInfo, TenantsAndOrganizationInfoResponse
from ._oidc_utils import OidcUtils
Expand Down
3 changes: 2 additions & 1 deletion src/uipath/_cli/_auth/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
import os
from pathlib import Path

from uipath.platform.common import TokenData

from ..._utils._auth import parse_access_token
from ...platform.common import TokenData
from ._models import AccessTokenData


Expand Down
2 changes: 1 addition & 1 deletion src/uipath/_cli/_chat/_bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
UiPathConversationToolCallConfirmationInterruptStartEvent,
UiPathConversationToolCallConfirmationValue,
)
from uipath.runtime import UiPathResumeTrigger
from uipath.core.triggers import UiPathResumeTrigger
from uipath.runtime.chat import UiPathChatProtocol
from uipath.runtime.context import UiPathRuntimeContext

Expand Down
5 changes: 2 additions & 3 deletions src/uipath/_cli/_debug/_bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from pydantic import BaseModel
from rich.console import Console
from rich.tree import Tree
from uipath.core.serialization import serialize_object
from uipath.core.triggers import UiPathResumeTriggerType
from uipath.runtime import (
UiPathBreakpointResult,
UiPathRuntimeContext,
Expand All @@ -18,9 +20,6 @@
)
from uipath.runtime.debug import UiPathDebugProtocol, UiPathDebugQuitError
from uipath.runtime.events import UiPathRuntimeStateEvent, UiPathRuntimeStatePhase
from uipath.runtime.resumable import UiPathResumeTriggerType

from uipath._cli._utils._common import serialize_object

logger = logging.getLogger(__name__)

Expand Down
12 changes: 9 additions & 3 deletions src/uipath/_cli/_evals/mocks/input_mocker.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
from datetime import datetime
from typing import Any

from uipath.platform import UiPath

from uipath._cli._evals.mocks.types import (
InputMockingStrategy,
)
from uipath.platform import UiPath
from uipath.tracing import traced

from .mocker import UiPathInputMockingError
Expand Down Expand Up @@ -65,11 +66,16 @@ async def generate_llm_input(
from .mocks import cache_manager_context

try:
llm = UiPath(
from uipath.platform.chat import UiPathLlmChatService

uipath = UiPath()
llm = UiPathLlmChatService(
uipath._config,
uipath._execution_context,
requesting_product="agentsplayground",
requesting_feature="agents-evaluations",
agenthub_config="agentsevals",
).llm
)
cache_manager = cache_manager_context.get()

# Ensure additionalProperties is set for strict mode compatibility
Expand Down
12 changes: 8 additions & 4 deletions src/uipath/_cli/_evals/mocks/llm_mocker.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
from typing import Any, Callable

from pydantic import BaseModel, TypeAdapter
from uipath.core.tracing import traced
from uipath.platform.common import _SpanUtils

from uipath._cli._evals.mocks.types import (
LLMMockingStrategy,
MockingContext,
)
from uipath.tracing import traced
from uipath.tracing._utils import _SpanUtils

from .._models._mocks import ExampleCall
from .mocker import (
Expand Down Expand Up @@ -92,6 +92,7 @@ async def response(
function_name = params.get("name") or func.__name__
if function_name in [x.name for x in self.context.strategy.tools_to_simulate]:
from uipath.platform import UiPath
from uipath.platform.chat import UiPathLlmChatService
from uipath.platform.chat._llm_gateway_service import _cleanup_schema

from .mocks import (
Expand All @@ -101,11 +102,14 @@ async def response(
span_collector_context,
)

llm = UiPath(
uipath = UiPath()
llm = UiPathLlmChatService(
uipath._config,
uipath._execution_context,
requesting_product="agentsplayground",
requesting_feature="agents-evaluations",
agenthub_config="agentsevals",
).llm
)
return_type: Any = func.__annotations__.get("return", None)
if return_type is None:
return_type = Any
Expand Down
49 changes: 6 additions & 43 deletions src/uipath/_cli/_utils/_common.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import json
import logging
import os
import uuid
from datetime import date, datetime, time
from datetime import datetime
from pathlib import Path
from typing import Literal
from urllib.parse import urlparse

import click
from uipath.platform.common import (
ResourceOverwrite,
ResourceOverwriteParser,
UiPathConfig,
)

from uipath.platform.common import UiPathConfig

from ..._utils._bindings import ResourceOverwrite, ResourceOverwriteParser
from ..._utils.constants import ENV_UIPATH_ACCESS_TOKEN
from ..spinner import Spinner
from ._console import ConsoleLogger
Expand Down Expand Up @@ -73,43 +74,6 @@ def get_env_vars(spinner: Spinner | None = None) -> list[str]:
return [base_url, token]


def serialize_object(obj):
"""Recursively serializes an object and all its nested components."""
# Handle Pydantic models
if hasattr(obj, "model_dump"):
return serialize_object(obj.model_dump(by_alias=True))
elif hasattr(obj, "dict"):
return serialize_object(obj.dict())
elif hasattr(obj, "to_dict"):
return serialize_object(obj.to_dict())
# Special handling for UiPathBaseRuntimeErrors
elif hasattr(obj, "as_dict"):
return serialize_object(obj.as_dict)
elif isinstance(obj, (datetime, date, time)):
return obj.isoformat()
# Handle dictionaries
elif isinstance(obj, dict):
return {k: serialize_object(v) for k, v in obj.items()}
# Handle lists
elif isinstance(obj, list):
return [serialize_object(item) for item in obj]
# Handle exceptions
elif isinstance(obj, Exception):
return str(obj)
# Handle other iterable objects (convert to dict first)
elif hasattr(obj, "__iter__") and not isinstance(obj, (str, bytes)):
try:
return serialize_object(dict(obj))
except (TypeError, ValueError):
return obj
# UUIDs must be serialized explicitly
elif isinstance(obj, uuid.UUID):
return str(obj)
# Return primitive types as is
else:
return obj


def get_org_scoped_url(base_url: str) -> str:
"""Get organization scoped URL from base URL.

Expand Down Expand Up @@ -154,7 +118,6 @@ async def ensure_coded_agent_project(studio_client: StudioClient):
async def may_override_files(
studio_client: StudioClient, scope: Literal["remote", "local"]
) -> bool:
from datetime import datetime

from packaging import version

Expand Down
11 changes: 7 additions & 4 deletions src/uipath/_cli/_utils/_studio_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,21 @@

import click
from pydantic import BaseModel, ConfigDict, Field, field_validator
from uipath.platform import UiPath
from uipath.platform.common import (
ResourceOverwrite,
ResourceOverwriteParser,
UiPathConfig,
)
from uipath.platform.errors import EnrichedException

from uipath._utils._bindings import ResourceOverwrite, ResourceOverwriteParser
from uipath._utils.constants import (
ENV_TENANT_ID,
HEADER_SW_LOCK_KEY,
HEADER_TENANT_ID,
PYTHON_CONFIGURATION_FILE,
STUDIO_METADATA_FILE,
)
from uipath.platform import UiPath
from uipath.platform.common import UiPathConfig
from uipath.platform.errors import EnrichedException
from uipath.tracing import traced

logger = logging.getLogger(__name__)
Expand Down
3 changes: 1 addition & 2 deletions src/uipath/_cli/cli_debug.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import click
from uipath.core.tracing import UiPathTraceManager
from uipath.platform.common import ResourceOverwritesContext, UiPathConfig
from uipath.runtime import (
UiPathExecuteOptions,
UiPathRuntimeContext,
Expand All @@ -31,8 +32,6 @@
)
from uipath._cli._utils._debug import setup_debugging
from uipath._cli._utils._studio_project import StudioClient
from uipath._utils._bindings import ResourceOverwritesContext
from uipath.platform.common import UiPathConfig
from uipath.tracing import LiveTrackingSpanProcessor, LlmOpsHttpExporter

from ._utils._console import ConsoleLogger
Expand Down
5 changes: 2 additions & 3 deletions src/uipath/_cli/cli_eval.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

import click
from uipath.core.tracing import UiPathTraceManager
from uipath.platform.chat import set_llm_concurrency
from uipath.platform.common import ResourceOverwritesContext, UiPathConfig
from uipath.runtime import (
UiPathRuntimeContext,
UiPathRuntimeFactoryRegistry,
Expand All @@ -27,10 +29,7 @@
from uipath._cli._utils._studio_project import StudioClient
from uipath._cli.middlewares import Middlewares
from uipath._events._event_bus import EventBus
from uipath._utils._bindings import ResourceOverwritesContext
from uipath.eval._helpers import auto_discover_entrypoint
from uipath.platform.chat import set_llm_concurrency
from uipath.platform.common import UiPathConfig
from uipath.telemetry._track import flush_events
from uipath.tracing import (
JsonLinesFileExporter,
Expand Down
3 changes: 1 addition & 2 deletions src/uipath/_cli/cli_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import click
from uipath.core.tracing import UiPathTraceManager
from uipath.platform.common import ResourceOverwritesContext, UiPathConfig
from uipath.runtime import (
UiPathExecuteOptions,
UiPathRuntimeFactoryProtocol,
Expand All @@ -20,8 +21,6 @@
from uipath._cli._debug._bridge import ConsoleDebugBridge
from uipath._cli._utils._common import read_resource_overwrites_from_file
from uipath._cli._utils._debug import setup_debugging
from uipath._utils._bindings import ResourceOverwritesContext
from uipath.platform.common import UiPathConfig
from uipath.tracing import (
JsonLinesFileExporter,
LiveTrackingSpanProcessor,
Expand Down
3 changes: 2 additions & 1 deletion src/uipath/_utils/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from ._bindings import resource_override
from uipath.platform.common import resource_override

from ._endpoint import Endpoint
from ._logs import setup_logging
from ._request_override import header_folder
Expand Down
Loading
Loading