uipath 2.1.84__tar.gz → 2.1.86__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.86/.github/workflows/test-uipath-langchain.yml +144 -0
- {uipath-2.1.84 → uipath-2.1.86}/PKG-INFO +1 -1
- {uipath-2.1.84 → uipath-2.1.86}/pyproject.toml +1 -1
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_runtime.py +4 -5
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_project_files.py +122 -0
- uipath-2.1.86/src/uipath/_cli/cli_pull.py +59 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/connections_service.py +67 -1
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/__init__.py +2 -1
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/connections.py +8 -0
- uipath-2.1.86/src/uipath/utils/dynamic_schema.py +111 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/apicalls-testcase/run.sh +1 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/basic-testcase/run.sh +2 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/common/validate_output.sh +2 -2
- {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/run.sh +2 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/run.sh +2 -0
- uipath-2.1.86/tests/cli/utils/test_dynamic_schema.py +95 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_connections_service.py +246 -1
- {uipath-2.1.84 → uipath-2.1.86}/uv.lock +1 -1
- uipath-2.1.84/.github/workflows/test-uipath-langchain.yml +0 -184
- uipath-2.1.84/src/uipath/_cli/cli_pull.py +0 -199
- {uipath-2.1.84 → uipath-2.1.86}/.cursorrules +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.editorconfig +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.gitattributes +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/labeler.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/auto-label.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/integration_tests.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/test-uipath-llamaindex.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/test.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.gitignore +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.python-version +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.vscode/extensions.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.vscode/launch.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/.vscode/settings.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/CONTRIBUTING.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/LICENSE +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/README.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/FAQ.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/assets/favicon.png +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/assets/llms.txt +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/cli/index.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/actions.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/attachments.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/buckets.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/connections.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/documents.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/documents_models.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/getting_started.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/jobs.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/processes.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/queues.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/core/traced.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/hooks.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/index.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/overrides/main.html +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/release_policy.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/justfile +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/mkdocs.yml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/py.typed +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/.env.example +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/README.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/input.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/main.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/uv.lock +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/README.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/evals/eval-sets/default.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/evals/evaluators/equality.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/main.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/scripts/debug_test.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_auth_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_span_collection.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/llm_mocker.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/mocks.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_config.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_events/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_events/_event_bus.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_events/_events.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/documents_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/external_application_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_auth.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/_utils.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/models/agent.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/mocks/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/mocks/mockable.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/auth.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/documents.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/job.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/py.typed +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/apicalls-testcase/main.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/apicalls-testcase/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/apicalls-testcase/src/assert.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/basic-testcase/main.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/basic-testcase/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/basic-testcase/src/assert.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/agent.mermaid +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/langgraph.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/src/assert.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/src/main.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/agent.mermaid +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/llama_index.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/src/assert.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/src/main.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/__init__.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/agent/models/test_agent.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/conftest.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/eval/mocks/test_mocks.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_init.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_new.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_oidc_utils.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_push.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_run.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/conftest.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_documents_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_external_application_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.84 → uipath-2.1.86}/tests/tracing/test_tracing_manager.py +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
name: Test UiPath Langchain
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [ opened, synchronize, reopened, labeled ]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
test-uipath-langchain:
|
|
9
|
+
runs-on: ${{ matrix.os }}
|
|
10
|
+
strategy:
|
|
11
|
+
matrix:
|
|
12
|
+
python-version: [ "3.10", "3.11", "3.12", "3.13" ]
|
|
13
|
+
os: [ ubuntu-latest, windows-latest ]
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
# Only run if PR has the test:uipath-langchain label
|
|
19
|
+
if: contains(github.event.pull_request.labels.*.name, 'test:uipath-langchain')
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- name: Checkout uipath-python
|
|
23
|
+
uses: actions/checkout@v4
|
|
24
|
+
with:
|
|
25
|
+
path: 'uipath-python'
|
|
26
|
+
|
|
27
|
+
- name: Setup uv
|
|
28
|
+
uses: astral-sh/setup-uv@v5
|
|
29
|
+
|
|
30
|
+
- name: Setup Python
|
|
31
|
+
uses: actions/setup-python@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version: ${{ matrix.python-version }}
|
|
34
|
+
|
|
35
|
+
- name: Build uipath-python package
|
|
36
|
+
working-directory: uipath-python
|
|
37
|
+
run: uv build
|
|
38
|
+
|
|
39
|
+
- name: Checkout uipath-langchain-python
|
|
40
|
+
uses: actions/checkout@v4
|
|
41
|
+
with:
|
|
42
|
+
repository: 'UiPath/uipath-langchain-python'
|
|
43
|
+
path: 'uipath-langchain-python'
|
|
44
|
+
|
|
45
|
+
- name: Update uipath-python version
|
|
46
|
+
shell: bash
|
|
47
|
+
working-directory: uipath-langchain-python
|
|
48
|
+
run: uv add ../uipath-python/dist/*.whl --dev
|
|
49
|
+
|
|
50
|
+
- name: Run uipath-langchain tests
|
|
51
|
+
working-directory: uipath-langchain-python
|
|
52
|
+
run: |
|
|
53
|
+
uv sync
|
|
54
|
+
uv run pytest
|
|
55
|
+
|
|
56
|
+
discover-testcases:
|
|
57
|
+
runs-on: ubuntu-latest
|
|
58
|
+
permissions:
|
|
59
|
+
contents: read
|
|
60
|
+
needs: [test-uipath-langchain]
|
|
61
|
+
outputs:
|
|
62
|
+
testcases: ${{ steps.discover.outputs.testcases }}
|
|
63
|
+
steps:
|
|
64
|
+
- name: Checkout uipath-langchain-python
|
|
65
|
+
uses: actions/checkout@v4
|
|
66
|
+
with:
|
|
67
|
+
repository: 'UiPath/uipath-langchain-python'
|
|
68
|
+
path: 'uipath-langchain-python'
|
|
69
|
+
|
|
70
|
+
- name: Discover testcases
|
|
71
|
+
id: discover
|
|
72
|
+
working-directory: uipath-langchain-python
|
|
73
|
+
run: |
|
|
74
|
+
# Find all testcase folders (excluding common folders like README, etc.)
|
|
75
|
+
testcase_dirs=$(find testcases -maxdepth 1 -type d -name "*-*" | sed 's|testcases/||' | sort)
|
|
76
|
+
|
|
77
|
+
echo "Found testcase directories:"
|
|
78
|
+
echo "$testcase_dirs"
|
|
79
|
+
|
|
80
|
+
# Convert to JSON array for matrix
|
|
81
|
+
testcases_json=$(echo "$testcase_dirs" | jq -R -s -c 'split("\n")[:-1]')
|
|
82
|
+
echo "testcases=$testcases_json" >> $GITHUB_OUTPUT
|
|
83
|
+
|
|
84
|
+
run-uipath-langchain-integration-tests:
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
needs: [discover-testcases]
|
|
87
|
+
container:
|
|
88
|
+
image: ghcr.io/astral-sh/uv:python3.12-bookworm
|
|
89
|
+
env:
|
|
90
|
+
UIPATH_JOB_KEY: "3a03d5cb-fa21-4021-894d-a8e2eda0afe0"
|
|
91
|
+
permissions:
|
|
92
|
+
contents: read
|
|
93
|
+
strategy:
|
|
94
|
+
fail-fast: false
|
|
95
|
+
matrix:
|
|
96
|
+
testcase: ${{ fromJson(needs.discover-testcases.outputs.testcases) }}
|
|
97
|
+
environment: [alpha, staging] # temporary disable [cloud]
|
|
98
|
+
use_azure_chat: [true, false]
|
|
99
|
+
|
|
100
|
+
name: "${{ matrix.testcase }} / ${{ matrix.environment }} / ${{ matrix.use_azure_chat && 'UiPathAzureChatOpenAI' || 'UiPathChat' }}"
|
|
101
|
+
|
|
102
|
+
steps:
|
|
103
|
+
- name: Checkout uipath-python
|
|
104
|
+
uses: actions/checkout@v4
|
|
105
|
+
with:
|
|
106
|
+
path: 'uipath-python'
|
|
107
|
+
|
|
108
|
+
- name: Build uipath-python package
|
|
109
|
+
working-directory: uipath-python
|
|
110
|
+
run: uv build
|
|
111
|
+
|
|
112
|
+
- name: Checkout uipath-langchain-python
|
|
113
|
+
uses: actions/checkout@v4
|
|
114
|
+
with:
|
|
115
|
+
repository: 'UiPath/uipath-langchain-python'
|
|
116
|
+
path: 'uipath-langchain-python'
|
|
117
|
+
|
|
118
|
+
- name: Update uipath-python version
|
|
119
|
+
shell: bash
|
|
120
|
+
working-directory: uipath-langchain-python
|
|
121
|
+
run: uv add ../uipath-python/dist/*.whl
|
|
122
|
+
|
|
123
|
+
- name: Install dependencies
|
|
124
|
+
working-directory: uipath-langchain-python
|
|
125
|
+
run: uv sync
|
|
126
|
+
|
|
127
|
+
- name: Run testcase
|
|
128
|
+
env:
|
|
129
|
+
CLIENT_ID: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_ID || matrix.environment == 'staging' && secrets.STAGING_TEST_CLIENT_ID || matrix.environment == 'cloud' && secrets.CLOUD_TEST_CLIENT_ID }}
|
|
130
|
+
CLIENT_SECRET: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_SECRET || matrix.environment == 'staging' && secrets.STAGING_TEST_CLIENT_SECRET || matrix.environment == 'cloud' && secrets.CLOUD_TEST_CLIENT_SECRET }}
|
|
131
|
+
BASE_URL: ${{ matrix.environment == 'alpha' && secrets.ALPHA_BASE_URL || matrix.environment == 'staging' && secrets.STAGING_BASE_URL || matrix.environment == 'cloud' && secrets.CLOUD_BASE_URL }}
|
|
132
|
+
USE_AZURE_CHAT: ${{ matrix.use_azure_chat }}
|
|
133
|
+
UV_PYTHON: "3.12"
|
|
134
|
+
working-directory: uipath-langchain-python/testcases/${{ matrix.testcase }}
|
|
135
|
+
run: |
|
|
136
|
+
echo "Running testcase: ${{ matrix.testcase }}"
|
|
137
|
+
echo "Environment: ${{ matrix.environment }}"
|
|
138
|
+
echo "LLM: ${{ matrix.use_azure_chat && 'UiPathAzureChatOpenAI' || 'UiPathChat' }}"
|
|
139
|
+
echo "USE_AZURE_CHAT: ${{ matrix.use_azure_chat }}"
|
|
140
|
+
|
|
141
|
+
# Execute the testcase run script directly
|
|
142
|
+
bash run.sh
|
|
143
|
+
bash ../common/validate_output.sh
|
|
144
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: uipath
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.86
|
|
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.86"
|
|
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"
|
|
@@ -432,12 +432,12 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
432
432
|
async def execute_runtime(
|
|
433
433
|
self, eval_item: EvaluationItem
|
|
434
434
|
) -> UiPathEvalRunExecutionOutput:
|
|
435
|
-
|
|
435
|
+
execution_id = str(uuid.uuid4())
|
|
436
436
|
runtime_context: C = self.factory.new_context(
|
|
437
|
-
execution_id=
|
|
437
|
+
execution_id=execution_id,
|
|
438
438
|
input_json=eval_item.inputs,
|
|
439
439
|
is_eval_run=True,
|
|
440
|
-
log_handler=self._setup_execution_logging(
|
|
440
|
+
log_handler=self._setup_execution_logging(execution_id),
|
|
441
441
|
)
|
|
442
442
|
if runtime_context.execution_id is None:
|
|
443
443
|
raise ValueError("execution_id must be set for eval runs")
|
|
@@ -445,9 +445,8 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
445
445
|
attributes = {
|
|
446
446
|
"evalId": eval_item.id,
|
|
447
447
|
"span_type": "eval",
|
|
448
|
+
"execution.id": runtime_context.execution_id,
|
|
448
449
|
}
|
|
449
|
-
if runtime_context.execution_id:
|
|
450
|
-
attributes["execution.id"] = runtime_context.execution_id
|
|
451
450
|
|
|
452
451
|
start_time = time()
|
|
453
452
|
try:
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
# type: ignore
|
|
2
|
+
import hashlib
|
|
2
3
|
import json
|
|
3
4
|
import os
|
|
4
5
|
import re
|
|
6
|
+
from pathlib import Path
|
|
5
7
|
from typing import Any, Dict, Optional, Tuple
|
|
6
8
|
|
|
9
|
+
import click
|
|
7
10
|
from pydantic import BaseModel
|
|
8
11
|
|
|
9
12
|
from .._utils._console import ConsoleLogger
|
|
10
13
|
from ._constants import is_binary_file
|
|
14
|
+
from ._studio_project import (
|
|
15
|
+
ProjectFile,
|
|
16
|
+
ProjectFolder,
|
|
17
|
+
StudioClient,
|
|
18
|
+
get_folder_by_name,
|
|
19
|
+
)
|
|
11
20
|
|
|
12
21
|
try:
|
|
13
22
|
import tomllib
|
|
@@ -431,3 +440,116 @@ def files_to_include(
|
|
|
431
440
|
)
|
|
432
441
|
)
|
|
433
442
|
return extra_files
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def compute_normalized_hash(content: str) -> str:
|
|
446
|
+
"""Compute hash of normalized content.
|
|
447
|
+
|
|
448
|
+
Args:
|
|
449
|
+
content: Content to hash
|
|
450
|
+
|
|
451
|
+
Returns:
|
|
452
|
+
str: SHA256 hash of the normalized content
|
|
453
|
+
"""
|
|
454
|
+
try:
|
|
455
|
+
# Try to parse as JSON to handle formatting
|
|
456
|
+
json_content = json.loads(content)
|
|
457
|
+
normalized = json.dumps(json_content, indent=2)
|
|
458
|
+
except json.JSONDecodeError:
|
|
459
|
+
# Not JSON, normalize line endings
|
|
460
|
+
normalized = content.replace("\r\n", "\n").replace("\r", "\n")
|
|
461
|
+
|
|
462
|
+
return hashlib.sha256(normalized.encode("utf-8")).hexdigest()
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
def collect_files_from_folder(
|
|
466
|
+
folder: ProjectFolder, base_path: str, files_dict: Dict[str, ProjectFile]
|
|
467
|
+
) -> None:
|
|
468
|
+
"""Recursively collect all files from a folder and its subfolders.
|
|
469
|
+
|
|
470
|
+
Args:
|
|
471
|
+
folder: The folder to collect files from
|
|
472
|
+
base_path: Base path for file paths
|
|
473
|
+
files_dict: Dictionary to store collected files
|
|
474
|
+
"""
|
|
475
|
+
# Add files from current folder
|
|
476
|
+
for file in folder.files:
|
|
477
|
+
file_path = os.path.join(base_path, file.name)
|
|
478
|
+
files_dict[file_path] = file
|
|
479
|
+
|
|
480
|
+
# Recursively process subfolders
|
|
481
|
+
for subfolder in folder.folders:
|
|
482
|
+
subfolder_path = os.path.join(base_path, subfolder.name)
|
|
483
|
+
collect_files_from_folder(subfolder, subfolder_path, files_dict)
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
async def download_folder_files(
|
|
487
|
+
studio_client: StudioClient,
|
|
488
|
+
folder: ProjectFolder,
|
|
489
|
+
base_path: Path,
|
|
490
|
+
) -> None:
|
|
491
|
+
"""Download files from a folder recursively.
|
|
492
|
+
|
|
493
|
+
Args:
|
|
494
|
+
studio_client: Studio client
|
|
495
|
+
folder: The folder to download files from
|
|
496
|
+
base_path: Base path for local file storage
|
|
497
|
+
"""
|
|
498
|
+
files_dict: Dict[str, ProjectFile] = {}
|
|
499
|
+
collect_files_from_folder(folder, "", files_dict)
|
|
500
|
+
for file_path, remote_file in files_dict.items():
|
|
501
|
+
local_path = base_path / file_path
|
|
502
|
+
local_path.parent.mkdir(parents=True, exist_ok=True)
|
|
503
|
+
|
|
504
|
+
# Download remote file
|
|
505
|
+
response = await studio_client.download_file_async(remote_file.id)
|
|
506
|
+
remote_content = response.read().decode("utf-8")
|
|
507
|
+
remote_hash = compute_normalized_hash(remote_content)
|
|
508
|
+
|
|
509
|
+
if os.path.exists(local_path):
|
|
510
|
+
# Read and hash local file
|
|
511
|
+
with open(local_path, "r", encoding="utf-8") as f:
|
|
512
|
+
local_content = f.read()
|
|
513
|
+
local_hash = compute_normalized_hash(local_content)
|
|
514
|
+
|
|
515
|
+
# Compare hashes
|
|
516
|
+
if local_hash != remote_hash:
|
|
517
|
+
styled_path = click.style(str(file_path), fg="cyan")
|
|
518
|
+
console.warning(f"File {styled_path}" + " differs from remote version.")
|
|
519
|
+
response = click.prompt("Do you want to overwrite it? (y/n)", type=str)
|
|
520
|
+
if response.lower() == "y":
|
|
521
|
+
with open(local_path, "w", encoding="utf-8", newline="\n") as f:
|
|
522
|
+
f.write(remote_content)
|
|
523
|
+
console.success(f"Updated {click.style(str(file_path), fg='cyan')}")
|
|
524
|
+
else:
|
|
525
|
+
console.info(f"Skipped {click.style(str(file_path), fg='cyan')}")
|
|
526
|
+
else:
|
|
527
|
+
console.info(
|
|
528
|
+
f"File {click.style(str(file_path), fg='cyan')} is up to date"
|
|
529
|
+
)
|
|
530
|
+
else:
|
|
531
|
+
# File doesn't exist locally, create it
|
|
532
|
+
with open(local_path, "w", encoding="utf-8", newline="\n") as f:
|
|
533
|
+
f.write(remote_content)
|
|
534
|
+
console.success(f"Downloaded {click.style(str(file_path), fg='cyan')}")
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
async def pull_project(project_id: str, download_configuration: dict[str, Path]):
|
|
538
|
+
studio_client = StudioClient(project_id)
|
|
539
|
+
|
|
540
|
+
with console.spinner("Pulling UiPath project files..."):
|
|
541
|
+
try:
|
|
542
|
+
structure = await studio_client.get_project_structure_async()
|
|
543
|
+
for source_key, destination in download_configuration.items():
|
|
544
|
+
source_folder = get_folder_by_name(structure, source_key)
|
|
545
|
+
if source_folder:
|
|
546
|
+
await download_folder_files(
|
|
547
|
+
studio_client,
|
|
548
|
+
source_folder,
|
|
549
|
+
destination,
|
|
550
|
+
)
|
|
551
|
+
else:
|
|
552
|
+
console.warning(f"No {source_key} folder found in remote project")
|
|
553
|
+
|
|
554
|
+
except Exception as e:
|
|
555
|
+
console.error(f"Failed to pull UiPath project: {str(e)}")
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
"""CLI command for pulling remote project files from UiPath StudioWeb solution.
|
|
3
|
+
|
|
4
|
+
This module provides functionality to pull remote project files from a UiPath StudioWeb solution.
|
|
5
|
+
It handles:
|
|
6
|
+
- File downloads from source_code and evals folders
|
|
7
|
+
- Maintaining folder structure locally
|
|
8
|
+
- File comparison using hashes
|
|
9
|
+
- Interactive confirmation for overwriting files
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# type: ignore
|
|
13
|
+
import asyncio
|
|
14
|
+
import os
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
import click
|
|
18
|
+
|
|
19
|
+
from ..telemetry import track
|
|
20
|
+
from ._utils._console import ConsoleLogger
|
|
21
|
+
from ._utils._constants import UIPATH_PROJECT_ID
|
|
22
|
+
from ._utils._project_files import pull_project
|
|
23
|
+
|
|
24
|
+
console = ConsoleLogger()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@click.command()
|
|
28
|
+
@click.argument(
|
|
29
|
+
"root",
|
|
30
|
+
type=click.Path(exists=False, file_okay=False, dir_okay=True, path_type=Path),
|
|
31
|
+
default=Path("."),
|
|
32
|
+
)
|
|
33
|
+
@track
|
|
34
|
+
def pull(root: Path) -> None:
|
|
35
|
+
"""Pull remote project files from Studio Web Project.
|
|
36
|
+
|
|
37
|
+
This command pulls the remote project files from a UiPath Studio Web project.
|
|
38
|
+
It downloads files from the source_code and evals folders, maintaining the
|
|
39
|
+
folder structure locally. Files are compared using hashes before overwriting,
|
|
40
|
+
and user confirmation is required for differing files.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
root: The root directory to pull files into
|
|
44
|
+
|
|
45
|
+
Environment Variables:
|
|
46
|
+
UIPATH_PROJECT_ID: Required. The ID of the UiPath Studio Web project
|
|
47
|
+
|
|
48
|
+
Example:
|
|
49
|
+
$ uipath pull
|
|
50
|
+
$ uipath pull /path/to/project
|
|
51
|
+
"""
|
|
52
|
+
if not (project_id := os.getenv(UIPATH_PROJECT_ID, False)):
|
|
53
|
+
console.error("UIPATH_PROJECT_ID environment variable not found.")
|
|
54
|
+
|
|
55
|
+
default_download_configuration = {
|
|
56
|
+
"source_code": root,
|
|
57
|
+
"evals": root / "evals",
|
|
58
|
+
}
|
|
59
|
+
asyncio.run(pull_project(project_id, default_download_configuration))
|
|
@@ -7,7 +7,7 @@ from httpx import Response
|
|
|
7
7
|
from .._config import Config
|
|
8
8
|
from .._execution_context import ExecutionContext
|
|
9
9
|
from .._utils import Endpoint, RequestSpec, header_folder, infer_bindings
|
|
10
|
-
from ..models import Connection, ConnectionToken, EventArguments
|
|
10
|
+
from ..models import Connection, ConnectionMetadata, ConnectionToken, EventArguments
|
|
11
11
|
from ..models.connections import ConnectionTokenType
|
|
12
12
|
from ..tracing._traced import traced
|
|
13
13
|
from ._base_service import BaseService
|
|
@@ -54,6 +54,31 @@ class ConnectionsService(BaseService):
|
|
|
54
54
|
response = self.request(spec.method, url=spec.endpoint)
|
|
55
55
|
return Connection.model_validate(response.json())
|
|
56
56
|
|
|
57
|
+
@traced(
|
|
58
|
+
name="connections_metadata",
|
|
59
|
+
run_type="uipath",
|
|
60
|
+
hide_output=True,
|
|
61
|
+
)
|
|
62
|
+
def metadata(
|
|
63
|
+
self, element_instance_id: int, tool_path: str, schema_mode: bool = True
|
|
64
|
+
) -> ConnectionMetadata:
|
|
65
|
+
"""Synchronously retrieve connection API metadata.
|
|
66
|
+
|
|
67
|
+
This method fetches the metadata for a connection,
|
|
68
|
+
which can be used to establish communication with an external service.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
element_instance_id (int): The element instance ID of the connection.
|
|
72
|
+
tool_path (str): The tool path to retrieve metadata for.
|
|
73
|
+
schema_mode (bool): Whether or not to represent the output schema in the response fields.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
ConnectionMetadata: The connection metadata.
|
|
77
|
+
"""
|
|
78
|
+
spec = self._metadata_spec(element_instance_id, tool_path, schema_mode)
|
|
79
|
+
response = self.request(spec.method, url=spec.endpoint, headers=spec.headers)
|
|
80
|
+
return ConnectionMetadata.model_validate(response.json())
|
|
81
|
+
|
|
57
82
|
@traced(name="connections_list", run_type="uipath")
|
|
58
83
|
def list(
|
|
59
84
|
self,
|
|
@@ -186,6 +211,33 @@ class ConnectionsService(BaseService):
|
|
|
186
211
|
response = await self.request_async(spec.method, url=spec.endpoint)
|
|
187
212
|
return Connection.model_validate(response.json())
|
|
188
213
|
|
|
214
|
+
@traced(
|
|
215
|
+
name="connections_metadata",
|
|
216
|
+
run_type="uipath",
|
|
217
|
+
hide_output=True,
|
|
218
|
+
)
|
|
219
|
+
async def metadata_async(
|
|
220
|
+
self, element_instance_id: int, tool_path: str, schema_mode: bool = True
|
|
221
|
+
) -> ConnectionMetadata:
|
|
222
|
+
"""Asynchronously retrieve connection API metadata.
|
|
223
|
+
|
|
224
|
+
This method fetches the metadata for a connection,
|
|
225
|
+
which can be used to establish communication with an external service.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
element_instance_id (int): The element instance ID of the connection.
|
|
229
|
+
tool_path (str): The tool path to retrieve metadata for.
|
|
230
|
+
schema_mode (bool): Whether or not to represent the output schema in the response fields.
|
|
231
|
+
|
|
232
|
+
Returns:
|
|
233
|
+
ConnectionMetadata: The connection metadata.
|
|
234
|
+
"""
|
|
235
|
+
spec = self._metadata_spec(element_instance_id, tool_path, schema_mode)
|
|
236
|
+
response = await self.request_async(
|
|
237
|
+
spec.method, url=spec.endpoint, headers=spec.headers
|
|
238
|
+
)
|
|
239
|
+
return ConnectionMetadata.model_validate(response.json())
|
|
240
|
+
|
|
189
241
|
@traced(
|
|
190
242
|
name="connections_retrieve_token",
|
|
191
243
|
run_type="uipath",
|
|
@@ -324,6 +376,20 @@ class ConnectionsService(BaseService):
|
|
|
324
376
|
endpoint=Endpoint(f"/connections_/api/v1/Connections/{key}"),
|
|
325
377
|
)
|
|
326
378
|
|
|
379
|
+
def _metadata_spec(
|
|
380
|
+
self, element_instance_id: int, tool_path: str, schema_mode: bool
|
|
381
|
+
) -> RequestSpec:
|
|
382
|
+
metadata_endpoint_url = f"/elements_/v3/element/instances/{element_instance_id}/elements/{tool_path}/metadata"
|
|
383
|
+
return RequestSpec(
|
|
384
|
+
method="GET",
|
|
385
|
+
endpoint=Endpoint(metadata_endpoint_url),
|
|
386
|
+
headers={
|
|
387
|
+
"accept": "application/schema+json"
|
|
388
|
+
if schema_mode
|
|
389
|
+
else "application/json"
|
|
390
|
+
},
|
|
391
|
+
)
|
|
392
|
+
|
|
327
393
|
def _retrieve_token_spec(
|
|
328
394
|
self, key: str, token_type: ConnectionTokenType = ConnectionTokenType.DIRECT
|
|
329
395
|
) -> RequestSpec:
|
|
@@ -3,7 +3,7 @@ from .actions import Action
|
|
|
3
3
|
from .assets import Asset, UserAsset
|
|
4
4
|
from .attachment import Attachment
|
|
5
5
|
from .buckets import Bucket
|
|
6
|
-
from .connections import Connection, ConnectionToken, EventArguments
|
|
6
|
+
from .connections import Connection, ConnectionMetadata, ConnectionToken, EventArguments
|
|
7
7
|
from .context_grounding import ContextGroundingQueryResponse
|
|
8
8
|
from .context_grounding_index import ContextGroundingIndex
|
|
9
9
|
from .errors import BaseUrlMissingError, SecretMissingError
|
|
@@ -38,6 +38,7 @@ __all__ = [
|
|
|
38
38
|
"QueueItemPriority",
|
|
39
39
|
"TransactionItemResult",
|
|
40
40
|
"Connection",
|
|
41
|
+
"ConnectionMetadata",
|
|
41
42
|
"ConnectionToken",
|
|
42
43
|
"EventArguments",
|
|
43
44
|
"Job",
|
|
@@ -4,6 +4,14 @@ from typing import Any, Optional
|
|
|
4
4
|
from pydantic import BaseModel, ConfigDict, Field
|
|
5
5
|
|
|
6
6
|
|
|
7
|
+
class ConnectionMetadata(BaseModel):
|
|
8
|
+
"""Metadata about a connection."""
|
|
9
|
+
|
|
10
|
+
fields: dict[str, Any] = Field(default_factory=dict, alias="fields")
|
|
11
|
+
|
|
12
|
+
model_config = ConfigDict(populate_by_name=True, extra="allow")
|
|
13
|
+
|
|
14
|
+
|
|
7
15
|
class Connection(BaseModel):
|
|
8
16
|
model_config = ConfigDict(
|
|
9
17
|
validate_by_name=True,
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"""Json schema to dynamic pydantic model."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, List, Optional, Type, Union
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, Field, create_model
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def jsonschema_to_pydantic(
|
|
9
|
+
schema: dict[str, Any],
|
|
10
|
+
definitions: Optional[dict[str, Any]] = None,
|
|
11
|
+
) -> Type[BaseModel]:
|
|
12
|
+
"""Convert a schema dict to a pydantic model.
|
|
13
|
+
|
|
14
|
+
Modified version of https://github.com/kreneskyp/jsonschema-pydantic to account for two unresolved issues.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
schema: JSON schema.
|
|
18
|
+
definitions: Definitions dict. Defaults to `$def`.
|
|
19
|
+
|
|
20
|
+
Returns: Pydantic model.
|
|
21
|
+
"""
|
|
22
|
+
title = schema.get("title", "DynamicModel")
|
|
23
|
+
assert isinstance(title, str), "Title of a model must be a string."
|
|
24
|
+
|
|
25
|
+
description = schema.get("description", None)
|
|
26
|
+
|
|
27
|
+
# top level schema provides definitions
|
|
28
|
+
if definitions is None:
|
|
29
|
+
if "$defs" in schema:
|
|
30
|
+
definitions = schema["$defs"]
|
|
31
|
+
elif "definitions" in schema:
|
|
32
|
+
definitions = schema["definitions"]
|
|
33
|
+
else:
|
|
34
|
+
definitions = {}
|
|
35
|
+
|
|
36
|
+
def convert_type(prop: dict[str, Any]) -> Any:
|
|
37
|
+
if "$ref" in prop:
|
|
38
|
+
ref_path = prop["$ref"].split("/")
|
|
39
|
+
ref = definitions[ref_path[-1]]
|
|
40
|
+
return jsonschema_to_pydantic(ref, definitions)
|
|
41
|
+
|
|
42
|
+
if "type" in prop:
|
|
43
|
+
type_mapping = {
|
|
44
|
+
"string": str,
|
|
45
|
+
"number": float,
|
|
46
|
+
"integer": int,
|
|
47
|
+
"boolean": bool,
|
|
48
|
+
"array": List,
|
|
49
|
+
"object": Dict[str, Any],
|
|
50
|
+
"null": None,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
type_ = prop["type"]
|
|
54
|
+
|
|
55
|
+
if type_ == "array":
|
|
56
|
+
item_type: Any = convert_type(prop.get("items", {}))
|
|
57
|
+
assert isinstance(item_type, type)
|
|
58
|
+
return List[item_type] # noqa F821
|
|
59
|
+
elif type_ == "object":
|
|
60
|
+
if "properties" in prop:
|
|
61
|
+
return jsonschema_to_pydantic(prop, definitions)
|
|
62
|
+
else:
|
|
63
|
+
return Dict[str, Any]
|
|
64
|
+
else:
|
|
65
|
+
return type_mapping.get(type_, Any)
|
|
66
|
+
|
|
67
|
+
elif "allOf" in prop:
|
|
68
|
+
combined_fields = {}
|
|
69
|
+
for sub_schema in prop["allOf"]:
|
|
70
|
+
model = jsonschema_to_pydantic(sub_schema, definitions)
|
|
71
|
+
combined_fields.update(model.__annotations__)
|
|
72
|
+
return create_model("CombinedModel", **combined_fields)
|
|
73
|
+
|
|
74
|
+
elif "anyOf" in prop:
|
|
75
|
+
unioned_types = tuple(
|
|
76
|
+
convert_type(sub_schema) for sub_schema in prop["anyOf"]
|
|
77
|
+
)
|
|
78
|
+
return Union[unioned_types]
|
|
79
|
+
elif prop == {} or "type" not in prop:
|
|
80
|
+
return Any
|
|
81
|
+
else:
|
|
82
|
+
raise ValueError(f"Unsupported schema: {prop}")
|
|
83
|
+
|
|
84
|
+
fields: dict[str, Any] = {}
|
|
85
|
+
required_fields = schema.get("required", [])
|
|
86
|
+
|
|
87
|
+
for name, prop in schema.get("properties", {}).items():
|
|
88
|
+
pydantic_type = convert_type(prop)
|
|
89
|
+
field_kwargs = {}
|
|
90
|
+
if "default" in prop:
|
|
91
|
+
field_kwargs["default"] = prop["default"]
|
|
92
|
+
if name not in required_fields:
|
|
93
|
+
# Note that we do not make this optional. This is due to a limitation in Pydantic/Python.
|
|
94
|
+
# If we convert the Optional type back to json schema, it is represented as type | None.
|
|
95
|
+
# pydantic_type = Optional[pydantic_type]
|
|
96
|
+
|
|
97
|
+
if "default" not in field_kwargs:
|
|
98
|
+
field_kwargs["default"] = None
|
|
99
|
+
if "description" in prop:
|
|
100
|
+
field_kwargs["description"] = prop["description"]
|
|
101
|
+
if "title" in prop:
|
|
102
|
+
field_kwargs["title"] = prop["title"]
|
|
103
|
+
|
|
104
|
+
fields[name] = (pydantic_type, Field(**field_kwargs))
|
|
105
|
+
|
|
106
|
+
convert_type(schema.get("properties", {}).get("choices", {}))
|
|
107
|
+
|
|
108
|
+
model = create_model(title, **fields)
|
|
109
|
+
if description:
|
|
110
|
+
model.__doc__ = description
|
|
111
|
+
return model
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
3
|
# Common utility to print UiPath output file
|
|
4
|
-
# Usage: source /app/testcases/common/
|
|
4
|
+
# Usage: source /app/testcases/common/validate_output.sh
|
|
5
5
|
|
|
6
6
|
debug_print_uipath_output() {
|
|
7
7
|
echo "Printing output file..."
|
|
@@ -32,4 +32,4 @@ validate_output() {
|
|
|
32
32
|
echo "Testcase completed successfully."
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
validate_output
|
|
35
|
+
validate_output
|