uipath 2.1.81__tar.gz → 2.1.83__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of uipath might be problematic. Click here for more details.
- {uipath-2.1.81 → uipath-2.1.83}/PKG-INFO +1 -1
- {uipath-2.1.81 → uipath-2.1.83}/pyproject.toml +1 -1
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_auth_server.py +15 -12
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_auth_service.py +9 -3
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_oidc_utils.py +4 -8
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_runtime.py +38 -6
- uipath-2.1.83/src/uipath/_cli/_evals/_span_collection.py +24 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/llm_mocker.py +16 -2
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocks.py +25 -6
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/telemetry/_track.py +1 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/tracing/_utils.py +52 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/eval/mocks/test_mocks.py +12 -9
- uipath-2.1.83/tests/cli/test_oidc_utils.py +96 -0
- {uipath-2.1.81 → uipath-2.1.83}/uv.lock +1 -1
- {uipath-2.1.81 → uipath-2.1.83}/.cursorrules +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.editorconfig +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.gitattributes +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/labeler.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/auto-label.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/integration_tests.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/test-uipath-langchain.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/test-uipath-llamaindex.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/test.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.gitignore +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.python-version +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.vscode/extensions.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.vscode/launch.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/.vscode/settings.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/CONTRIBUTING.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/LICENSE +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/README.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/FAQ.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/assets/favicon.png +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/assets/llms.txt +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/cli/index.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/actions.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/attachments.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/buckets.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/connections.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/documents.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/documents_models.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/getting_started.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/jobs.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/processes.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/queues.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/core/traced.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/hooks.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/index.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/overrides/main.html +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/release_policy.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/justfile +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/mkdocs.yml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/py.typed +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/.env.example +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/README.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/input.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/main.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/uv.lock +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/README.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/evals/eval-sets/default.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/evals/evaluators/equality.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/main.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/scripts/debug_test.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_config.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_events/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_events/_event_bus.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_events/_events.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/documents_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/external_application_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_auth.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/_utils.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/models/agent.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/mocks/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/mocks/mockable.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/auth.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/documents.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/job.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/py.typed +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/apicalls-testcase/main.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/apicalls-testcase/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/apicalls-testcase/run.sh +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/apicalls-testcase/src/assert.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/basic-testcase/main.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/basic-testcase/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/basic-testcase/run.sh +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/basic-testcase/src/assert.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/common/validate_output.sh +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/agent.mermaid +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/langgraph.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/run.sh +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/src/assert.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/src/main.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/agent.mermaid +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/llama_index.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/run.sh +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/src/assert.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/src/main.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/__init__.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/agent/models/test_agent.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/conftest.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_init.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_new.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_push.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_run.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/conftest.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_documents_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_external_application_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.81 → uipath-2.1.83}/tests/tracing/test_tracing_manager.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: uipath
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.83
|
|
4
4
|
Summary: Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools.
|
|
5
5
|
Project-URL: Homepage, https://uipath.com
|
|
6
6
|
Project-URL: Repository, https://github.com/UiPath/uipath-python
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "uipath"
|
|
3
|
-
version = "2.1.
|
|
3
|
+
version = "2.1.83"
|
|
4
4
|
description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools."
|
|
5
5
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -7,8 +7,6 @@ import threading
|
|
|
7
7
|
import time
|
|
8
8
|
from typing import Optional
|
|
9
9
|
|
|
10
|
-
from ._oidc_utils import OidcUtils
|
|
11
|
-
|
|
12
10
|
# Server port
|
|
13
11
|
PORT = 6234
|
|
14
12
|
|
|
@@ -22,7 +20,9 @@ class TokenReceivedSignal(Exception):
|
|
|
22
20
|
super().__init__("Token received successfully")
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
def make_request_handler_class(
|
|
23
|
+
def make_request_handler_class(
|
|
24
|
+
state, code_verifier, token_callback, domain, redirect_uri, client_id
|
|
25
|
+
):
|
|
26
26
|
class SimpleHTTPSRequestHandler(http.server.SimpleHTTPRequestHandler):
|
|
27
27
|
"""Simple HTTPS request handler that serves static files."""
|
|
28
28
|
|
|
@@ -73,16 +73,10 @@ def make_request_handler_class(state, code_verifier, token_callback, domain):
|
|
|
73
73
|
with open(index_path, "r") as f:
|
|
74
74
|
content = f.read()
|
|
75
75
|
|
|
76
|
-
# Get the redirect URI from auth config
|
|
77
|
-
auth_config = OidcUtils.get_auth_config()
|
|
78
|
-
redirect_uri = auth_config["redirect_uri"]
|
|
79
|
-
|
|
80
76
|
content = content.replace("__PY_REPLACE_EXPECTED_STATE__", state)
|
|
81
77
|
content = content.replace("__PY_REPLACE_CODE_VERIFIER__", code_verifier)
|
|
82
78
|
content = content.replace("__PY_REPLACE_REDIRECT_URI__", redirect_uri)
|
|
83
|
-
content = content.replace(
|
|
84
|
-
"__PY_REPLACE_CLIENT_ID__", auth_config["client_id"]
|
|
85
|
-
)
|
|
79
|
+
content = content.replace("__PY_REPLACE_CLIENT_ID__", client_id)
|
|
86
80
|
content = content.replace("__PY_REPLACE_DOMAIN__", domain)
|
|
87
81
|
|
|
88
82
|
self.send_response(200)
|
|
@@ -107,14 +101,18 @@ def make_request_handler_class(state, code_verifier, token_callback, domain):
|
|
|
107
101
|
|
|
108
102
|
|
|
109
103
|
class HTTPServer:
|
|
110
|
-
def __init__(self, port=6234):
|
|
104
|
+
def __init__(self, port=6234, redirect_uri=None, client_id=None):
|
|
111
105
|
"""Initialize HTTP server with configurable parameters.
|
|
112
106
|
|
|
113
107
|
Args:
|
|
114
108
|
port (int, optional): Port number to run the server on. Defaults to 6234.
|
|
109
|
+
redirect_uri (str, optional): OAuth redirect URI. Defaults to None.
|
|
110
|
+
client_id (str, optional): OAuth client ID. Defaults to None.
|
|
115
111
|
"""
|
|
116
112
|
self.current_path = os.path.dirname(os.path.abspath(__file__))
|
|
117
113
|
self.port = port
|
|
114
|
+
self.redirect_uri = redirect_uri
|
|
115
|
+
self.client_id = client_id
|
|
118
116
|
self.httpd: Optional[socketserver.TCPServer] = None
|
|
119
117
|
self.token_data = None
|
|
120
118
|
self.should_shutdown = False
|
|
@@ -145,7 +143,12 @@ class HTTPServer:
|
|
|
145
143
|
# Create server with address reuse
|
|
146
144
|
socketserver.TCPServer.allow_reuse_address = True
|
|
147
145
|
handler = make_request_handler_class(
|
|
148
|
-
state,
|
|
146
|
+
state,
|
|
147
|
+
code_verifier,
|
|
148
|
+
self.token_received_callback,
|
|
149
|
+
domain,
|
|
150
|
+
self.redirect_uri,
|
|
151
|
+
self.client_id,
|
|
149
152
|
)
|
|
150
153
|
self.httpd = socketserver.TCPServer(("", self.port), handler)
|
|
151
154
|
return self.httpd
|
|
@@ -121,11 +121,17 @@ class AuthService:
|
|
|
121
121
|
return False
|
|
122
122
|
|
|
123
123
|
def _perform_oauth_flow(self) -> TokenData:
|
|
124
|
-
|
|
124
|
+
auth_config = OidcUtils.get_auth_config()
|
|
125
|
+
auth_url, code_verifier, state = OidcUtils.get_auth_url(
|
|
126
|
+
self._domain, auth_config
|
|
127
|
+
)
|
|
125
128
|
self._open_browser(auth_url)
|
|
126
129
|
|
|
127
|
-
|
|
128
|
-
|
|
130
|
+
server = HTTPServer(
|
|
131
|
+
port=auth_config["port"],
|
|
132
|
+
redirect_uri=auth_config["redirect_uri"],
|
|
133
|
+
client_id=auth_config["client_id"],
|
|
134
|
+
)
|
|
129
135
|
token_data = asyncio.run(server.start(state, code_verifier, self._domain))
|
|
130
136
|
|
|
131
137
|
if not token_data:
|
|
@@ -49,12 +49,8 @@ class OidcUtils:
|
|
|
49
49
|
) as f:
|
|
50
50
|
auth_config = json.load(f)
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
int(auth_config.get("portOptionOne", 8104)),
|
|
55
|
-
int(auth_config.get("portOptionTwo", 8055)),
|
|
56
|
-
int(auth_config.get("portOptionThree", 42042)),
|
|
57
|
-
]
|
|
52
|
+
custom_port = os.getenv("UIPATH_AUTH_PORT")
|
|
53
|
+
candidates = [int(custom_port)] if custom_port else [8104, 8055, 42042]
|
|
58
54
|
|
|
59
55
|
port = cls._find_free_port(candidates)
|
|
60
56
|
if port is None:
|
|
@@ -75,11 +71,12 @@ class OidcUtils:
|
|
|
75
71
|
)
|
|
76
72
|
|
|
77
73
|
@classmethod
|
|
78
|
-
def get_auth_url(cls, domain: str) -> tuple[str, str, str]:
|
|
74
|
+
def get_auth_url(cls, domain: str, auth_config: AuthConfig) -> tuple[str, str, str]:
|
|
79
75
|
"""Get the authorization URL for OAuth2 PKCE flow.
|
|
80
76
|
|
|
81
77
|
Args:
|
|
82
78
|
domain (str): The UiPath domain to authenticate against (e.g. 'alpha', 'cloud')
|
|
79
|
+
auth_config (AuthConfig): The authentication configuration to use
|
|
83
80
|
|
|
84
81
|
Returns:
|
|
85
82
|
tuple[str, str]: A tuple containing:
|
|
@@ -87,7 +84,6 @@ class OidcUtils:
|
|
|
87
84
|
- The code verifier for PKCE flow
|
|
88
85
|
"""
|
|
89
86
|
code_verifier, code_challenge = generate_code_verifier_and_challenge()
|
|
90
|
-
auth_config = cls.get_auth_config()
|
|
91
87
|
state = get_state_param()
|
|
92
88
|
query_params = {
|
|
93
89
|
"client_id": auth_config["client_id"],
|
|
@@ -7,7 +7,8 @@ from pathlib import Path
|
|
|
7
7
|
from time import time
|
|
8
8
|
from typing import Any, Dict, Generic, List, Optional, Sequence, TypeVar
|
|
9
9
|
|
|
10
|
-
from opentelemetry
|
|
10
|
+
from opentelemetry import context as context_api
|
|
11
|
+
from opentelemetry.sdk.trace import ReadableSpan, Span
|
|
11
12
|
from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
|
|
12
13
|
|
|
13
14
|
from ..._events._event_bus import EventBus
|
|
@@ -24,6 +25,7 @@ from ...eval.models import EvaluationResult
|
|
|
24
25
|
from ...eval.models.models import AgentExecution, EvalItemResult
|
|
25
26
|
from .._runtime._contracts import (
|
|
26
27
|
UiPathBaseRuntime,
|
|
28
|
+
UiPathExecutionBatchTraceProcessor,
|
|
27
29
|
UiPathRuntimeContext,
|
|
28
30
|
UiPathRuntimeFactory,
|
|
29
31
|
UiPathRuntimeResult,
|
|
@@ -41,7 +43,11 @@ from ._models._output import (
|
|
|
41
43
|
UiPathEvalOutput,
|
|
42
44
|
UiPathEvalRunExecutionOutput,
|
|
43
45
|
)
|
|
44
|
-
from .
|
|
46
|
+
from ._span_collection import ExecutionSpanCollector
|
|
47
|
+
from .mocks.mocks import (
|
|
48
|
+
clear_execution_context,
|
|
49
|
+
set_execution_context,
|
|
50
|
+
)
|
|
45
51
|
|
|
46
52
|
T = TypeVar("T", bound=UiPathBaseRuntime)
|
|
47
53
|
C = TypeVar("C", bound=UiPathRuntimeContext)
|
|
@@ -78,6 +84,24 @@ class ExecutionSpanExporter(SpanExporter):
|
|
|
78
84
|
self.clear()
|
|
79
85
|
|
|
80
86
|
|
|
87
|
+
class ExecutionSpanProcessor(UiPathExecutionBatchTraceProcessor):
|
|
88
|
+
"""Span processor that adds spans to ExecutionSpanCollector when they start."""
|
|
89
|
+
|
|
90
|
+
def __init__(self, span_exporter: SpanExporter, collector: ExecutionSpanCollector):
|
|
91
|
+
super().__init__(span_exporter)
|
|
92
|
+
self.collector = collector
|
|
93
|
+
|
|
94
|
+
def on_start(
|
|
95
|
+
self, span: Span, parent_context: Optional[context_api.Context] = None
|
|
96
|
+
) -> None:
|
|
97
|
+
super().on_start(span, parent_context)
|
|
98
|
+
|
|
99
|
+
if span.attributes and "execution.id" in span.attributes:
|
|
100
|
+
exec_id = span.attributes["execution.id"]
|
|
101
|
+
if isinstance(exec_id, str):
|
|
102
|
+
self.collector.add_span(span, exec_id)
|
|
103
|
+
|
|
104
|
+
|
|
81
105
|
class ExecutionLogsExporter:
|
|
82
106
|
"""Custom exporter that stores multiple execution log handlers."""
|
|
83
107
|
|
|
@@ -127,8 +151,15 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
127
151
|
self.context: UiPathEvalContext = context
|
|
128
152
|
self.factory: UiPathRuntimeFactory[T, C] = factory
|
|
129
153
|
self.event_bus: EventBus = event_bus
|
|
154
|
+
|
|
130
155
|
self.span_exporter: ExecutionSpanExporter = ExecutionSpanExporter()
|
|
131
|
-
self.
|
|
156
|
+
self.span_collector: ExecutionSpanCollector = ExecutionSpanCollector()
|
|
157
|
+
|
|
158
|
+
# Span processor feeds both exporter and collector
|
|
159
|
+
span_processor = ExecutionSpanProcessor(self.span_exporter, self.span_collector)
|
|
160
|
+
self.factory.tracer_span_processors.append(span_processor)
|
|
161
|
+
self.factory.tracer_provider.add_span_processor(span_processor)
|
|
162
|
+
|
|
132
163
|
self.logs_exporter: ExecutionLogsExporter = ExecutionLogsExporter()
|
|
133
164
|
self.execution_id = str(uuid.uuid4())
|
|
134
165
|
|
|
@@ -180,7 +211,6 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
180
211
|
evaluation_set_name=evaluation_set.name,
|
|
181
212
|
evaluation_set_results=eval_run_result_list,
|
|
182
213
|
)
|
|
183
|
-
|
|
184
214
|
# Computing evaluator averages
|
|
185
215
|
evaluator_averages: Dict[str, float] = defaultdict(float)
|
|
186
216
|
evaluator_count: Dict[str, int] = defaultdict(int)
|
|
@@ -194,7 +224,6 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
194
224
|
evaluator_averages[eval_id] = (
|
|
195
225
|
evaluator_averages[eval_id] / evaluator_count[eval_id]
|
|
196
226
|
)
|
|
197
|
-
|
|
198
227
|
await event_bus.publish(
|
|
199
228
|
EvaluationEvents.UPDATE_EVAL_SET_RUN,
|
|
200
229
|
EvalSetRunUpdatedEvent(
|
|
@@ -289,7 +318,7 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
289
318
|
evaluators: List[BaseEvaluator[Any]],
|
|
290
319
|
event_bus: EventBus,
|
|
291
320
|
) -> EvaluationRunResult:
|
|
292
|
-
|
|
321
|
+
set_execution_context(eval_item, self.span_collector)
|
|
293
322
|
|
|
294
323
|
await event_bus.publish(
|
|
295
324
|
EvaluationEvents.CREATE_EVAL_RUN,
|
|
@@ -383,6 +412,8 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
383
412
|
eval_run_updated_event,
|
|
384
413
|
wait_for_completion=False,
|
|
385
414
|
)
|
|
415
|
+
finally:
|
|
416
|
+
clear_execution_context()
|
|
386
417
|
|
|
387
418
|
return evaluation_run_results
|
|
388
419
|
|
|
@@ -391,6 +422,7 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
391
422
|
) -> tuple[List[ReadableSpan], list[logging.LogRecord]]:
|
|
392
423
|
spans = self.span_exporter.get_spans(execution_id)
|
|
393
424
|
self.span_exporter.clear(execution_id)
|
|
425
|
+
self.span_collector.clear(execution_id)
|
|
394
426
|
|
|
395
427
|
logs = self.logs_exporter.get_logs(execution_id)
|
|
396
428
|
self.logs_exporter.clear(execution_id)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from collections import defaultdict
|
|
2
|
+
from typing import Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
from opentelemetry.sdk.trace import ReadableSpan, Span
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ExecutionSpanCollector:
|
|
8
|
+
"""Collects spans as they are created during execution."""
|
|
9
|
+
|
|
10
|
+
def __init__(self):
|
|
11
|
+
# { execution_id -> list of spans }
|
|
12
|
+
self._spans: Dict[str, List[ReadableSpan]] = defaultdict(list)
|
|
13
|
+
|
|
14
|
+
def add_span(self, span: Span, execution_id: str) -> None:
|
|
15
|
+
self._spans[execution_id].append(span)
|
|
16
|
+
|
|
17
|
+
def get_spans(self, execution_id: str) -> List[ReadableSpan]:
|
|
18
|
+
return self._spans.get(execution_id, [])
|
|
19
|
+
|
|
20
|
+
def clear(self, execution_id: Optional[str] = None) -> None:
|
|
21
|
+
if execution_id:
|
|
22
|
+
self._spans.pop(execution_id, None)
|
|
23
|
+
else:
|
|
24
|
+
self._spans.clear()
|
|
@@ -6,6 +6,9 @@ from typing import Any, Callable
|
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel
|
|
8
8
|
|
|
9
|
+
from uipath.tracing._traced import traced
|
|
10
|
+
from uipath.tracing._utils import _SpanUtils
|
|
11
|
+
|
|
9
12
|
from .._models._evaluation_set import (
|
|
10
13
|
EvaluationItem,
|
|
11
14
|
LLMMockingStrategy,
|
|
@@ -51,7 +54,7 @@ Based on the above information, provide a realistic response for this tool call.
|
|
|
51
54
|
3. Always include the entire output regardless of token length.
|
|
52
55
|
3. Consider the context of the current test run and the agent being tested. If the agent is acting on a property, make sure the output includes that property.
|
|
53
56
|
|
|
54
|
-
Respond ONLY with valid JSON that would be a realistic and
|
|
57
|
+
Respond ONLY with valid JSON that would be a realistic and complete tool response. Do not include any explanations or markdown.
|
|
55
58
|
"""
|
|
56
59
|
|
|
57
60
|
logger = logging.getLogger(__name__)
|
|
@@ -79,6 +82,7 @@ class LLMMocker(Mocker):
|
|
|
79
82
|
self.evaluation_item = evaluation_item
|
|
80
83
|
assert isinstance(self.evaluation_item.mocking_strategy, LLMMockingStrategy)
|
|
81
84
|
|
|
85
|
+
@traced(name="__mocker__")
|
|
82
86
|
async def response(
|
|
83
87
|
self, func: Callable[[T], R], params: dict[str, Any], *args: T, **kwargs
|
|
84
88
|
) -> R:
|
|
@@ -92,6 +96,8 @@ class LLMMocker(Mocker):
|
|
|
92
96
|
from uipath import UiPath
|
|
93
97
|
from uipath._services.llm_gateway_service import _cleanup_schema
|
|
94
98
|
|
|
99
|
+
from .mocks import evaluation_context, span_collector_context
|
|
100
|
+
|
|
95
101
|
llm = UiPath().llm
|
|
96
102
|
return_type: Any = func.__annotations__.get("return", None)
|
|
97
103
|
if return_type is None:
|
|
@@ -116,9 +122,17 @@ class LLMMocker(Mocker):
|
|
|
116
122
|
example_calls = [
|
|
117
123
|
call for call in example_calls if isinstance(call, ExampleCall)
|
|
118
124
|
]
|
|
125
|
+
|
|
126
|
+
test_run_history = "(empty)"
|
|
127
|
+
eval_item = evaluation_context.get()
|
|
128
|
+
span_collector = span_collector_context.get()
|
|
129
|
+
if eval_item and span_collector:
|
|
130
|
+
spans = span_collector.get_spans(eval_item.id)
|
|
131
|
+
test_run_history = _SpanUtils.spans_to_llm_context(spans)
|
|
132
|
+
|
|
119
133
|
prompt_input: dict[str, Any] = {
|
|
120
134
|
"toolRunExamples": example_calls,
|
|
121
|
-
"testRunHistory":
|
|
135
|
+
"testRunHistory": test_run_history,
|
|
122
136
|
"toolInfo": {
|
|
123
137
|
"name": function_name,
|
|
124
138
|
"description": params.get("description"),
|
|
@@ -5,30 +5,49 @@ from contextvars import ContextVar
|
|
|
5
5
|
from typing import Any, Callable, Optional
|
|
6
6
|
|
|
7
7
|
from uipath._cli._evals._models._evaluation_set import EvaluationItem
|
|
8
|
+
from uipath._cli._evals._span_collection import ExecutionSpanCollector
|
|
8
9
|
from uipath._cli._evals.mocks.mocker import Mocker, UiPathNoMockFoundError
|
|
9
10
|
from uipath._cli._evals.mocks.mocker_factory import MockerFactory
|
|
10
11
|
|
|
12
|
+
# Context variables for evaluation items and mockers
|
|
11
13
|
evaluation_context: ContextVar[Optional[EvaluationItem]] = ContextVar(
|
|
12
14
|
"evaluation", default=None
|
|
13
15
|
)
|
|
14
16
|
|
|
15
17
|
mocker_context: ContextVar[Optional[Mocker]] = ContextVar("mocker", default=None)
|
|
16
18
|
|
|
19
|
+
# Span collector for trace access during mocking
|
|
20
|
+
span_collector_context: ContextVar[Optional[ExecutionSpanCollector]] = ContextVar(
|
|
21
|
+
"span_collector", default=None
|
|
22
|
+
)
|
|
23
|
+
|
|
17
24
|
logger = logging.getLogger(__name__)
|
|
18
25
|
|
|
19
26
|
|
|
20
|
-
def
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
def set_execution_context(
|
|
28
|
+
eval_item: EvaluationItem, span_collector: ExecutionSpanCollector
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Set the execution context for an evaluation run for mocking and trace access."""
|
|
31
|
+
evaluation_context.set(eval_item)
|
|
32
|
+
|
|
23
33
|
try:
|
|
24
|
-
if
|
|
25
|
-
mocker_context.set(MockerFactory.create(
|
|
34
|
+
if eval_item.mocking_strategy:
|
|
35
|
+
mocker_context.set(MockerFactory.create(eval_item))
|
|
26
36
|
else:
|
|
27
37
|
mocker_context.set(None)
|
|
28
38
|
except Exception:
|
|
29
|
-
logger.warning(f"Failed to create mocker for evaluation {
|
|
39
|
+
logger.warning(f"Failed to create mocker for evaluation {eval_item.name}")
|
|
30
40
|
mocker_context.set(None)
|
|
31
41
|
|
|
42
|
+
span_collector_context.set(span_collector)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def clear_execution_context() -> None:
|
|
46
|
+
"""Clear the execution context after evaluation completes."""
|
|
47
|
+
evaluation_context.set(None)
|
|
48
|
+
mocker_context.set(None)
|
|
49
|
+
span_collector_context.set(None)
|
|
50
|
+
|
|
32
51
|
|
|
33
52
|
async def get_mocked_response(
|
|
34
53
|
func: Callable[[Any], Any], params: dict[str, Any], *args, **kwargs
|
|
@@ -319,3 +319,55 @@ class _SpanUtils:
|
|
|
319
319
|
f"Error formatting arguments for trace: {e}. Using args and kwargs directly."
|
|
320
320
|
)
|
|
321
321
|
return {"args": args, "kwargs": kwargs}
|
|
322
|
+
|
|
323
|
+
@staticmethod
|
|
324
|
+
def _has_ancestor_with_name(
|
|
325
|
+
span: ReadableSpan, ancestor_name: str, span_map: Dict[int, ReadableSpan]
|
|
326
|
+
) -> bool:
|
|
327
|
+
"""Check if this span or any of its ancestors has a given name."""
|
|
328
|
+
if span.name == ancestor_name:
|
|
329
|
+
return True
|
|
330
|
+
|
|
331
|
+
current = span
|
|
332
|
+
while current.parent is not None:
|
|
333
|
+
parent_span = span_map.get(current.parent.span_id)
|
|
334
|
+
if parent_span is None:
|
|
335
|
+
break
|
|
336
|
+
if parent_span.name == ancestor_name:
|
|
337
|
+
return True
|
|
338
|
+
current = parent_span
|
|
339
|
+
|
|
340
|
+
return False
|
|
341
|
+
|
|
342
|
+
@staticmethod
|
|
343
|
+
def spans_to_llm_context(spans: list[ReadableSpan]) -> str:
|
|
344
|
+
"""Convert spans to a formatted conversation history string suitable for LLM context.
|
|
345
|
+
|
|
346
|
+
Includes function calls (including LLM calls) with their inputs and outputs.
|
|
347
|
+
"""
|
|
348
|
+
# Build span_id -> span map for parent chain traversal
|
|
349
|
+
span_map = {span.get_span_context().span_id: span for span in spans}
|
|
350
|
+
|
|
351
|
+
history = []
|
|
352
|
+
for span in spans:
|
|
353
|
+
attributes = dict(span.attributes) if span.attributes else {}
|
|
354
|
+
|
|
355
|
+
input_value = attributes.get("input.value")
|
|
356
|
+
output_value = attributes.get("output.value")
|
|
357
|
+
|
|
358
|
+
if not input_value or not output_value:
|
|
359
|
+
continue
|
|
360
|
+
|
|
361
|
+
# Skip spans that are internal LLM calls (eg. for tool mocking in evals)
|
|
362
|
+
if _SpanUtils._has_ancestor_with_name(span, "__mocker__", span_map):
|
|
363
|
+
continue
|
|
364
|
+
|
|
365
|
+
history.append(f"Function: {span.name}")
|
|
366
|
+
history.append(f"Input: {input_value}")
|
|
367
|
+
history.append(f"Output: {output_value}")
|
|
368
|
+
history.append("")
|
|
369
|
+
|
|
370
|
+
if not history:
|
|
371
|
+
return "(empty)"
|
|
372
|
+
|
|
373
|
+
return "\n".join(history)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from typing import Any
|
|
2
|
+
from unittest.mock import MagicMock
|
|
2
3
|
|
|
3
4
|
import pytest
|
|
4
5
|
from _pytest.monkeypatch import MonkeyPatch
|
|
@@ -10,9 +11,11 @@ from uipath._cli._evals._models._evaluation_set import (
|
|
|
10
11
|
MockitoMockingStrategy,
|
|
11
12
|
)
|
|
12
13
|
from uipath._cli._evals.mocks.mocker import UiPathMockResponseGenerationError
|
|
13
|
-
from uipath._cli._evals.mocks.mocks import
|
|
14
|
+
from uipath._cli._evals.mocks.mocks import set_execution_context
|
|
14
15
|
from uipath.eval.mocks import mockable
|
|
15
16
|
|
|
17
|
+
_mock_span_collector = MagicMock()
|
|
18
|
+
|
|
16
19
|
|
|
17
20
|
def test_mockito_mockable_sync():
|
|
18
21
|
# Arrange
|
|
@@ -51,7 +54,7 @@ def test_mockito_mockable_sync():
|
|
|
51
54
|
assert isinstance(evaluation.mocking_strategy, MockitoMockingStrategy)
|
|
52
55
|
|
|
53
56
|
# Act & Assert
|
|
54
|
-
|
|
57
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
55
58
|
assert foo() == "bar1"
|
|
56
59
|
assert foo() == "bar2"
|
|
57
60
|
assert foo() == "bar2"
|
|
@@ -63,13 +66,13 @@ def test_mockito_mockable_sync():
|
|
|
63
66
|
assert foofoo()
|
|
64
67
|
|
|
65
68
|
evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {"x": 1}
|
|
66
|
-
|
|
69
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
67
70
|
assert foo(x=1) == "bar1"
|
|
68
71
|
|
|
69
72
|
evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {
|
|
70
73
|
"x": {"_target_": "mockito.any"}
|
|
71
74
|
}
|
|
72
|
-
|
|
75
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
73
76
|
assert foo(x=2) == "bar1"
|
|
74
77
|
|
|
75
78
|
|
|
@@ -111,7 +114,7 @@ async def test_mockito_mockable_async():
|
|
|
111
114
|
assert isinstance(evaluation.mocking_strategy, MockitoMockingStrategy)
|
|
112
115
|
|
|
113
116
|
# Act & Assert
|
|
114
|
-
|
|
117
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
115
118
|
assert await foo() == "bar1"
|
|
116
119
|
assert await foo() == "bar2"
|
|
117
120
|
assert await foo() == "bar2"
|
|
@@ -123,13 +126,13 @@ async def test_mockito_mockable_async():
|
|
|
123
126
|
assert await foofoo()
|
|
124
127
|
|
|
125
128
|
evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {"x": 1}
|
|
126
|
-
|
|
129
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
127
130
|
assert await foo(x=1) == "bar1"
|
|
128
131
|
|
|
129
132
|
evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {
|
|
130
133
|
"x": {"_target_": "mockito.any"}
|
|
131
134
|
}
|
|
132
|
-
|
|
135
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
133
136
|
assert await foo(x=2) == "bar1"
|
|
134
137
|
|
|
135
138
|
|
|
@@ -201,7 +204,7 @@ def test_llm_mockable_sync(httpx_mock: HTTPXMock, monkeypatch: MonkeyPatch):
|
|
|
201
204
|
},
|
|
202
205
|
)
|
|
203
206
|
# Act & Assert
|
|
204
|
-
|
|
207
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
205
208
|
|
|
206
209
|
assert foo() == "bar1"
|
|
207
210
|
with pytest.raises(NotImplementedError):
|
|
@@ -274,7 +277,7 @@ async def test_llm_mockable_async(httpx_mock: HTTPXMock, monkeypatch: MonkeyPatc
|
|
|
274
277
|
},
|
|
275
278
|
)
|
|
276
279
|
# Act & Assert
|
|
277
|
-
|
|
280
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
278
281
|
|
|
279
282
|
assert await foo() == "bar1"
|
|
280
283
|
with pytest.raises(NotImplementedError):
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Unit tests for OidcUtils.get_auth_config() method.
|
|
3
|
+
|
|
4
|
+
IMPORTANT: Backwards Compatibility Notice
|
|
5
|
+
=========================================
|
|
6
|
+
If any values in auth_config.json are changed, we MUST maintain backwards
|
|
7
|
+
compatibility with release/2025.10 branches or later.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestOidcUtils:
|
|
15
|
+
"""Test suite for OidcUtils class."""
|
|
16
|
+
|
|
17
|
+
def test_auth_config_backwards_compatibility_v2025_10(self):
|
|
18
|
+
"""
|
|
19
|
+
Test that auth_config.json maintains backwards compatibility with release/v2025.10.
|
|
20
|
+
|
|
21
|
+
This test validates that the authentication configuration values remain
|
|
22
|
+
unchanged to ensure compatibility with release/v2025.10 and later branches.
|
|
23
|
+
|
|
24
|
+
CRITICAL: Any failure indicates a breaking change that requires coordination
|
|
25
|
+
across all supported release branches.
|
|
26
|
+
"""
|
|
27
|
+
# Read the actual auth_config.json file
|
|
28
|
+
config_path = os.path.join(
|
|
29
|
+
os.path.dirname(__file__),
|
|
30
|
+
"..",
|
|
31
|
+
"..",
|
|
32
|
+
"src",
|
|
33
|
+
"uipath",
|
|
34
|
+
"_cli",
|
|
35
|
+
"_auth",
|
|
36
|
+
"auth_config.json",
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
with open(config_path, "r") as f:
|
|
40
|
+
actual_config = json.load(f)
|
|
41
|
+
|
|
42
|
+
# Assert exact values for non-scope fields
|
|
43
|
+
assert actual_config["client_id"] == "36dea5b8-e8bb-423d-8e7b-c808df8f1c00", (
|
|
44
|
+
f"BACKWARDS COMPATIBILITY VIOLATION: client_id has changed! "
|
|
45
|
+
f"Expected: 36dea5b8-e8bb-423d-8e7b-c808df8f1c00, Got: {actual_config['client_id']}"
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
assert (
|
|
49
|
+
actual_config["redirect_uri"]
|
|
50
|
+
== "http://localhost:__PY_REPLACE_PORT__/oidc/login"
|
|
51
|
+
), (
|
|
52
|
+
f"BACKWARDS COMPATIBILITY VIOLATION: redirect_uri has changed! "
|
|
53
|
+
f"Expected: http://localhost:__PY_REPLACE_PORT__/oidc/login, Got: {actual_config['redirect_uri']}"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
assert actual_config["port"] == 8104, (
|
|
57
|
+
f"BACKWARDS COMPATIBILITY VIOLATION: port has changed! "
|
|
58
|
+
f"Expected: 8104, Got: {actual_config['port']}"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# For scopes, ensure actual scopes are a subset of the allowed scopes (no new scopes allowed)
|
|
62
|
+
allowed_scopes = set(
|
|
63
|
+
[
|
|
64
|
+
"offline_access",
|
|
65
|
+
"ProcessMining",
|
|
66
|
+
"OrchestratorApiUserAccess",
|
|
67
|
+
"StudioWebBackend",
|
|
68
|
+
"IdentityServerApi",
|
|
69
|
+
"ConnectionService",
|
|
70
|
+
"DataService",
|
|
71
|
+
"DocumentUnderstanding",
|
|
72
|
+
"Du.Digitization.Api",
|
|
73
|
+
"Du.Classification.Api",
|
|
74
|
+
"Du.Extraction.Api",
|
|
75
|
+
"Du.Validation.Api",
|
|
76
|
+
"EnterpriseContextService",
|
|
77
|
+
"Directory",
|
|
78
|
+
"JamJamApi",
|
|
79
|
+
"LLMGateway",
|
|
80
|
+
"LLMOps",
|
|
81
|
+
"OMS",
|
|
82
|
+
"RCS.FolderAuthorization",
|
|
83
|
+
"TM.Projects",
|
|
84
|
+
"TM.TestCases",
|
|
85
|
+
"TM.Requirements",
|
|
86
|
+
"TM.TestSets",
|
|
87
|
+
]
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
actual_scopes = set(actual_config["scope"].split())
|
|
91
|
+
|
|
92
|
+
assert actual_scopes.issubset(allowed_scopes), (
|
|
93
|
+
f"BACKWARDS COMPATIBILITY VIOLATION: New scopes detected that are not allowed on v2025.10! "
|
|
94
|
+
f"New scopes: {actual_scopes - allowed_scopes}. "
|
|
95
|
+
f"Only subsets of the following scopes are permitted: {sorted(allowed_scopes)}"
|
|
96
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|