uipath 2.1.37__tar.gz → 2.1.39__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.
- {uipath-2.1.37 → uipath-2.1.39}/PKG-INFO +1 -1
- {uipath-2.1.37 → uipath-2.1.39}/pyproject.toml +1 -1
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/__init__.py +1 -1
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +20 -12
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_details.py +6 -3
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +4 -3
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +36 -34
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_hitl.py +2 -1
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/jobs_service.py +48 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/processes_service.py +90 -14
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_uipath.py +7 -2
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/job.py +2 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_jobs_service.py +447 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_processes_service.py +205 -1
- {uipath-2.1.37 → uipath-2.1.39}/uv.lock +1 -1
- {uipath-2.1.37 → uipath-2.1.39}/.cursorrules +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.editorconfig +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.gitattributes +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/test.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.gitignore +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.python-version +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.vscode/extensions.json +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.vscode/launch.json +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/.vscode/settings.json +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/CONTRIBUTING.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/LICENSE +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/README.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/FAQ.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/assets/favicon.png +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/cli/index.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/actions.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/attachments.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/buckets.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/connections.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/getting_started.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/jobs.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/processes.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/queues.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/core/traced.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/hooks.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/index.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/overrides/main.html +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/release_policy.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/justfile +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/mkdocs.yml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/py.typed +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/scripts/debug_test.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_deterministic_evaluator_base.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_evaluator_base.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_evaluator_factory.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_exact_match_evaluator.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_json_similarity_evaluator.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_trajectory_evaluator.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_models/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_models/_evaluators.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/evaluation_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/progress_reporter.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_config.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/py.typed +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/__init__.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/conftest.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_init.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_new.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_push.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_run.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/conftest.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.37 → uipath-2.1.39}/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.39
|
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.39"
|
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"
|
@@ -295,7 +295,7 @@ class UiPathDevTerminal(App[Any]):
|
|
295
295
|
if not updated_chat_message:
|
296
296
|
return
|
297
297
|
details_panel = self.app.query_one("#details-panel", RunDetailsPanel)
|
298
|
-
details_panel.add_chat_message(updated_chat_message, execution_id)
|
298
|
+
details_panel.add_chat_message(event, updated_chat_message, execution_id)
|
299
299
|
|
300
300
|
def _add_info_log(self, run: ExecutionRun, message: str):
|
301
301
|
"""Add info log to run."""
|
@@ -6,6 +6,7 @@ from textual.containers import Container, Vertical, VerticalScroll
|
|
6
6
|
from textual.widgets import Input, Markdown
|
7
7
|
|
8
8
|
from uipath.agent.conversation import (
|
9
|
+
UiPathConversationEvent,
|
9
10
|
UiPathConversationMessage,
|
10
11
|
UiPathExternalValue,
|
11
12
|
UiPathInlineValue,
|
@@ -17,11 +18,11 @@ class Prompt(Markdown):
|
|
17
18
|
|
18
19
|
|
19
20
|
class Response(Markdown):
|
20
|
-
BORDER_TITLE = "ai"
|
21
|
+
BORDER_TITLE = "🤖 ai"
|
21
22
|
|
22
23
|
|
23
24
|
class Tool(Markdown):
|
24
|
-
BORDER_TITLE = "tool"
|
25
|
+
BORDER_TITLE = "🛠️ tool"
|
25
26
|
|
26
27
|
|
27
28
|
class ChatPanel(Container):
|
@@ -43,38 +44,40 @@ class ChatPanel(Container):
|
|
43
44
|
id="chat-input",
|
44
45
|
)
|
45
46
|
|
46
|
-
def add_chat_message(
|
47
|
+
def add_chat_message(
|
48
|
+
self, event: UiPathConversationEvent, chat_msg: UiPathConversationMessage
|
49
|
+
) -> None:
|
47
50
|
"""Add or update a chat message bubble."""
|
48
51
|
chat_view = self.query_one("#chat-view")
|
49
52
|
|
50
53
|
widget_cls: Union[type[Prompt], type[Response], type[Tool]]
|
51
54
|
if chat_msg.role == "user":
|
52
55
|
widget_cls = Prompt
|
53
|
-
prefix = "👤"
|
54
56
|
elif chat_msg.role == "assistant":
|
55
57
|
widget_cls = Response
|
56
|
-
prefix = "🤖"
|
57
58
|
else:
|
58
59
|
widget_cls = Response
|
59
|
-
prefix = "⚒️"
|
60
60
|
|
61
61
|
parts: List[str] = []
|
62
62
|
if chat_msg.content_parts:
|
63
63
|
for part in chat_msg.content_parts:
|
64
|
-
if
|
64
|
+
if (
|
65
|
+
part.mime_type.startswith("text/")
|
66
|
+
or part.mime_type == "application/json"
|
67
|
+
):
|
65
68
|
if isinstance(part.data, UiPathInlineValue):
|
66
69
|
parts.append(part.data.inline or "")
|
67
70
|
elif isinstance(part.data, UiPathExternalValue):
|
68
|
-
# maybe fetch from URL or just show a placeholder
|
69
71
|
parts.append(f"[external: {part.data.url}]")
|
70
72
|
|
71
73
|
text_block = "\n".join(parts).strip()
|
72
|
-
content_lines = [f"{
|
74
|
+
content_lines = [f"{text_block}"] if text_block else []
|
73
75
|
|
74
76
|
if chat_msg.tool_calls:
|
77
|
+
widget_cls = Tool
|
75
78
|
for call in chat_msg.tool_calls:
|
76
|
-
|
77
|
-
content_lines.append(f"
|
79
|
+
status_icon = "✓" if call.result else "⚙"
|
80
|
+
content_lines.append(f" {status_icon} **{call.name}**")
|
78
81
|
|
79
82
|
if not content_lines:
|
80
83
|
return
|
@@ -86,7 +89,12 @@ class ChatPanel(Container):
|
|
86
89
|
last_update = self._last_update_time.get(chat_msg.message_id, 0.0)
|
87
90
|
|
88
91
|
if existing:
|
89
|
-
|
92
|
+
should_update = (
|
93
|
+
event.exchange
|
94
|
+
and event.exchange.message
|
95
|
+
and event.exchange.message.end is not None
|
96
|
+
)
|
97
|
+
if should_update or now - last_update > 0.15:
|
90
98
|
existing.update(content)
|
91
99
|
self._last_update_time[chat_msg.message_id] = now
|
92
100
|
chat_view.scroll_end(animate=False)
|
@@ -6,7 +6,7 @@ from textual.reactive import reactive
|
|
6
6
|
from textual.widgets import Input, RichLog, TabbedContent, TabPane, Tree
|
7
7
|
from textual.widgets.tree import TreeNode
|
8
8
|
|
9
|
-
from uipath.agent.conversation import UiPathConversationMessage
|
9
|
+
from uipath.agent.conversation import UiPathConversationEvent, UiPathConversationMessage
|
10
10
|
|
11
11
|
from .._models._execution import ExecutionRun
|
12
12
|
from .._models._messages import LogMessage, TraceMessage
|
@@ -430,13 +430,16 @@ class RunDetailsPanel(Container):
|
|
430
430
|
logs_log.write(log_msg.message)
|
431
431
|
|
432
432
|
def add_chat_message(
|
433
|
-
self,
|
433
|
+
self,
|
434
|
+
event: UiPathConversationEvent,
|
435
|
+
chat_msg: UiPathConversationMessage,
|
436
|
+
run_id: str,
|
434
437
|
) -> None:
|
435
438
|
"""Add a chat message to the display."""
|
436
439
|
if not self.current_run or run_id != self.current_run.id:
|
437
440
|
return
|
438
441
|
chat_panel = self.query_one("#chat-panel", ChatPanel)
|
439
|
-
chat_panel.add_chat_message(chat_msg)
|
442
|
+
chat_panel.add_chat_message(event, chat_msg)
|
440
443
|
|
441
444
|
def clear_display(self):
|
442
445
|
"""Clear both traces and logs display."""
|
@@ -226,15 +226,16 @@ TextArea.invalid {
|
|
226
226
|
|
227
227
|
|
228
228
|
Prompt {
|
229
|
-
|
229
|
+
border: wide $primary-background;
|
230
|
+
background: $surface;
|
230
231
|
color: $text;
|
231
232
|
margin-right: 8;
|
232
233
|
margin-left: 1;
|
233
234
|
padding: 1 1 0 1;
|
234
235
|
}
|
235
236
|
Response, Tool {
|
236
|
-
border: wide $
|
237
|
-
background: $
|
237
|
+
border: wide $primary-background;
|
238
|
+
background: $surface;
|
238
239
|
color: $text;
|
239
240
|
margin: 1;
|
240
241
|
margin-left: 8;
|
@@ -74,9 +74,10 @@ class ConversationAggregator:
|
|
74
74
|
)
|
75
75
|
self.messages[ev.message_id] = msg
|
76
76
|
|
77
|
-
# --- Handle content parts ---
|
77
|
+
# --- Handle content parts (text, JSON, etc.) ---
|
78
78
|
if ev.content_part:
|
79
79
|
cp_event = ev.content_part
|
80
|
+
|
80
81
|
existing = next(
|
81
82
|
(
|
82
83
|
cp
|
@@ -86,27 +87,41 @@ class ConversationAggregator:
|
|
86
87
|
None,
|
87
88
|
)
|
88
89
|
|
89
|
-
|
90
|
+
# Start of a new content part
|
91
|
+
if cp_event.start and not existing:
|
92
|
+
new_cp = UiPathConversationContentPart(
|
93
|
+
content_part_id=cp_event.content_part_id,
|
94
|
+
mime_type=cp_event.start.mime_type,
|
95
|
+
data=UiPathInlineValue(inline=""),
|
96
|
+
citations=[],
|
97
|
+
is_transcript=None,
|
98
|
+
is_incomplete=True,
|
99
|
+
)
|
100
|
+
if msg.content_parts is None:
|
101
|
+
msg.content_parts = []
|
102
|
+
msg.content_parts.append(new_cp)
|
103
|
+
existing = new_cp
|
104
|
+
|
105
|
+
# Chunk for an existing part (or backfill if start missing)
|
106
|
+
if cp_event.chunk:
|
90
107
|
if not existing:
|
108
|
+
new_cp = UiPathConversationContentPart(
|
109
|
+
content_part_id=cp_event.content_part_id,
|
110
|
+
mime_type="text/plain", # fallback if start missing
|
111
|
+
data=UiPathInlineValue(inline=""),
|
112
|
+
citations=[],
|
113
|
+
is_transcript=None,
|
114
|
+
is_incomplete=True,
|
115
|
+
)
|
91
116
|
if msg.content_parts is None:
|
92
117
|
msg.content_parts = []
|
93
|
-
msg.content_parts.append(
|
94
|
-
|
95
|
-
|
96
|
-
mime_type=cp_event.start.mime_type,
|
97
|
-
data=UiPathInlineValue(
|
98
|
-
inline=cp_event.chunk.data
|
99
|
-
if cp_event.chunk and cp_event.chunk.data
|
100
|
-
else ""
|
101
|
-
),
|
102
|
-
citations=[],
|
103
|
-
is_transcript=None,
|
104
|
-
is_incomplete=None,
|
105
|
-
)
|
106
|
-
)
|
107
|
-
if cp_event.chunk and existing:
|
118
|
+
msg.content_parts.append(new_cp)
|
119
|
+
existing = new_cp
|
120
|
+
|
108
121
|
if isinstance(existing.data, UiPathInlineValue):
|
109
122
|
existing.data.inline += cp_event.chunk.data or ""
|
123
|
+
|
124
|
+
# End of a part
|
110
125
|
if cp_event.end and existing:
|
111
126
|
existing.is_incomplete = bool(cp_event.end.interrupted)
|
112
127
|
|
@@ -122,43 +137,31 @@ class ConversationAggregator:
|
|
122
137
|
None,
|
123
138
|
)
|
124
139
|
|
140
|
+
# Start of a tool call
|
125
141
|
if tc_event.start:
|
126
142
|
if not existing_tool_call:
|
127
|
-
# create new tool call
|
128
143
|
new_tc = UiPathConversationToolCall(
|
129
144
|
tool_call_id=tc_event.tool_call_id,
|
130
145
|
name=tc_event.start.tool_name,
|
131
|
-
arguments=
|
146
|
+
arguments=None, # args will arrive as JSON content part
|
132
147
|
timestamp=tc_event.start.timestamp,
|
133
148
|
result=None,
|
134
149
|
)
|
135
150
|
if msg.tool_calls is None:
|
136
151
|
msg.tool_calls = []
|
137
152
|
msg.tool_calls.append(new_tc)
|
153
|
+
existing_tool_call = new_tc
|
138
154
|
else:
|
139
|
-
# merge/update existing
|
140
155
|
existing_tool_call.name = (
|
141
156
|
tc_event.start.tool_name or existing_tool_call.name
|
142
157
|
)
|
143
|
-
if tc_event.start.arguments:
|
144
|
-
# If Inline, append more data
|
145
|
-
if isinstance(
|
146
|
-
tc_event.start.arguments, UiPathInlineValue
|
147
|
-
) and isinstance(
|
148
|
-
existing_tool_call.arguments, UiPathInlineValue
|
149
|
-
):
|
150
|
-
existing_tool_call.arguments.inline += (
|
151
|
-
tc_event.start.arguments.inline or ""
|
152
|
-
)
|
153
|
-
else:
|
154
|
-
existing_tool_call.arguments = tc_event.start.arguments
|
155
158
|
existing_tool_call.timestamp = (
|
156
159
|
tc_event.start.timestamp or existing_tool_call.timestamp
|
157
160
|
)
|
158
161
|
|
162
|
+
# End of a tool call
|
159
163
|
if tc_event.end:
|
160
164
|
if not existing_tool_call:
|
161
|
-
# Shouldn't happen, but initialize if end comes first
|
162
165
|
existing_tool_call = UiPathConversationToolCall(
|
163
166
|
tool_call_id=tc_event.tool_call_id,
|
164
167
|
name="", # unknown until start seen
|
@@ -177,7 +180,6 @@ class ConversationAggregator:
|
|
177
180
|
|
178
181
|
# --- Update timestamps ---
|
179
182
|
msg.updated_at = self._timestamp(ev)
|
180
|
-
|
181
183
|
return msg
|
182
184
|
|
183
185
|
def _timestamp(self, ev: UiPathConversationMessageEvent) -> str:
|
@@ -92,7 +92,8 @@ class HitlReader:
|
|
92
92
|
_try_convert_to_json_format(str(job.job_error or job.info))
|
93
93
|
or "Job error unavailable.",
|
94
94
|
)
|
95
|
-
|
95
|
+
output_data = await uipath.jobs.extract_output_async(job)
|
96
|
+
return _try_convert_to_json_format(output_data)
|
96
97
|
|
97
98
|
case UiPathResumeTriggerType.API:
|
98
99
|
if resume_trigger.api_resume and resume_trigger.api_resume.inbox_id:
|
@@ -351,6 +351,54 @@ class JobsService(FolderContext, BaseService):
|
|
351
351
|
},
|
352
352
|
)
|
353
353
|
|
354
|
+
def extract_output(self, job: Job) -> Optional[str]:
|
355
|
+
"""Get the actual output data, downloading from attachment if necessary.
|
356
|
+
|
357
|
+
Args:
|
358
|
+
job: The job instance to fetch output data from.
|
359
|
+
|
360
|
+
Returns:
|
361
|
+
Parsed output arguments as dictionary, or None if no output
|
362
|
+
"""
|
363
|
+
if job.output_file:
|
364
|
+
# Large output stored as attachment
|
365
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
366
|
+
temp_path = Path(temp_dir) / f"output_{job.output_file}"
|
367
|
+
self._attachments_service.download(
|
368
|
+
key=uuid.UUID(job.output_file), destination_path=temp_path
|
369
|
+
)
|
370
|
+
with open(temp_path, "r", encoding="utf-8") as f:
|
371
|
+
return f.read()
|
372
|
+
elif job.output_arguments:
|
373
|
+
# Small output stored inline
|
374
|
+
return job.output_arguments
|
375
|
+
else:
|
376
|
+
return None
|
377
|
+
|
378
|
+
async def extract_output_async(self, job: Job) -> Optional[str]:
|
379
|
+
"""Asynchronously fetch the actual output data, downloading from attachment if necessary.
|
380
|
+
|
381
|
+
Args:
|
382
|
+
job: The job instance to fetch output data from.
|
383
|
+
|
384
|
+
Returns:
|
385
|
+
Parsed output arguments as dictionary, or None if no output
|
386
|
+
"""
|
387
|
+
if job.output_file:
|
388
|
+
# Large output stored as attachment
|
389
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
390
|
+
temp_path = Path(temp_dir) / f"output_{job.output_file}"
|
391
|
+
await self._attachments_service.download_async(
|
392
|
+
key=uuid.UUID(job.output_file), destination_path=temp_path
|
393
|
+
)
|
394
|
+
with open(temp_path, "r", encoding="utf-8") as f:
|
395
|
+
return f.read()
|
396
|
+
elif job.output_arguments:
|
397
|
+
# Small output stored inline
|
398
|
+
return job.output_arguments
|
399
|
+
else:
|
400
|
+
return None
|
401
|
+
|
354
402
|
def _resume_spec(
|
355
403
|
self,
|
356
404
|
*,
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import json
|
2
2
|
import os
|
3
|
+
import uuid
|
3
4
|
from typing import Any, Dict, Optional
|
4
5
|
|
5
6
|
from .._config import Config
|
@@ -9,6 +10,7 @@ from .._utils import Endpoint, RequestSpec, header_folder, infer_bindings
|
|
9
10
|
from .._utils.constants import ENV_JOB_ID, HEADER_JOB_KEY
|
10
11
|
from ..models.job import Job
|
11
12
|
from ..tracing._traced import traced
|
13
|
+
from . import AttachmentsService
|
12
14
|
from ._base_service import BaseService
|
13
15
|
|
14
16
|
|
@@ -20,7 +22,13 @@ class ProcessesService(FolderContext, BaseService):
|
|
20
22
|
specific business tasks.
|
21
23
|
"""
|
22
24
|
|
23
|
-
def __init__(
|
25
|
+
def __init__(
|
26
|
+
self,
|
27
|
+
config: Config,
|
28
|
+
execution_context: ExecutionContext,
|
29
|
+
attachment_service: AttachmentsService,
|
30
|
+
) -> None:
|
31
|
+
self._attachments_service = attachment_service
|
24
32
|
super().__init__(config=config, execution_context=execution_context)
|
25
33
|
|
26
34
|
@traced(name="processes_invoke", run_type="uipath")
|
@@ -65,9 +73,14 @@ class ProcessesService(FolderContext, BaseService):
|
|
65
73
|
client.processes.invoke(name="MyProcess", folder_path="my-folder-key")
|
66
74
|
```
|
67
75
|
"""
|
76
|
+
input_data = self._handle_input_arguments(
|
77
|
+
input_arguments=input_arguments,
|
78
|
+
folder_key=folder_key,
|
79
|
+
folder_path=folder_path,
|
80
|
+
)
|
68
81
|
spec = self._invoke_spec(
|
69
82
|
name,
|
70
|
-
|
83
|
+
input_data=input_data,
|
71
84
|
folder_key=folder_key,
|
72
85
|
folder_path=folder_path,
|
73
86
|
)
|
@@ -118,9 +131,14 @@ class ProcessesService(FolderContext, BaseService):
|
|
118
131
|
asyncio.run(main())
|
119
132
|
```
|
120
133
|
"""
|
134
|
+
input_data = await self._handle_input_arguments_async(
|
135
|
+
input_arguments=input_arguments,
|
136
|
+
folder_key=folder_key,
|
137
|
+
folder_path=folder_path,
|
138
|
+
)
|
121
139
|
spec = self._invoke_spec(
|
122
140
|
name,
|
123
|
-
|
141
|
+
input_data=input_data,
|
124
142
|
folder_key=folder_key,
|
125
143
|
folder_path=folder_path,
|
126
144
|
)
|
@@ -138,29 +156,87 @@ class ProcessesService(FolderContext, BaseService):
|
|
138
156
|
def custom_headers(self) -> Dict[str, str]:
|
139
157
|
return self.folder_headers
|
140
158
|
|
159
|
+
def _handle_input_arguments(
|
160
|
+
self,
|
161
|
+
input_arguments: Optional[Dict[str, Any]] = None,
|
162
|
+
*,
|
163
|
+
folder_key: Optional[str] = None,
|
164
|
+
folder_path: Optional[str] = None,
|
165
|
+
) -> Dict[str, str]:
|
166
|
+
"""Handle input arguments, storing as attachment if they exceed size limit.
|
167
|
+
|
168
|
+
Args:
|
169
|
+
input_arguments: The input arguments to process
|
170
|
+
folder_key: The folder key for attachment storage
|
171
|
+
folder_path: The folder path for attachment storage
|
172
|
+
|
173
|
+
Returns:
|
174
|
+
Dict containing either "InputArguments" or "InputFile" key
|
175
|
+
"""
|
176
|
+
if not input_arguments:
|
177
|
+
return {"InputArguments": json.dumps({})}
|
178
|
+
|
179
|
+
# If payload exceeds limit, store as attachment
|
180
|
+
payload_json = json.dumps(input_arguments)
|
181
|
+
if len(payload_json) > 10000: # 10k char limit
|
182
|
+
attachment_id = self._attachments_service.upload(
|
183
|
+
name=f"{uuid.uuid4()}.json",
|
184
|
+
content=payload_json,
|
185
|
+
folder_key=folder_key,
|
186
|
+
folder_path=folder_path,
|
187
|
+
)
|
188
|
+
return {"InputFile": str(attachment_id)}
|
189
|
+
else:
|
190
|
+
return {"InputArguments": payload_json}
|
191
|
+
|
192
|
+
async def _handle_input_arguments_async(
|
193
|
+
self,
|
194
|
+
input_arguments: Optional[Dict[str, Any]] = None,
|
195
|
+
*,
|
196
|
+
folder_key: Optional[str] = None,
|
197
|
+
folder_path: Optional[str] = None,
|
198
|
+
) -> Dict[str, str]:
|
199
|
+
"""Handle input arguments, storing as attachment if they exceed size limit.
|
200
|
+
|
201
|
+
Args:
|
202
|
+
input_arguments: The input arguments to process
|
203
|
+
folder_key: The folder key for attachment storage
|
204
|
+
folder_path: The folder path for attachment storage
|
205
|
+
|
206
|
+
Returns:
|
207
|
+
Dict containing either "InputArguments" or "InputFile" key
|
208
|
+
"""
|
209
|
+
if not input_arguments:
|
210
|
+
return {"InputArguments": json.dumps({})}
|
211
|
+
|
212
|
+
# If payload exceeds limit, store as attachment
|
213
|
+
payload_json = json.dumps(input_arguments)
|
214
|
+
if len(payload_json) > 10000: # 10k char limit
|
215
|
+
attachment_id = await self._attachments_service.upload_async(
|
216
|
+
name=f"{uuid.uuid4()}.json",
|
217
|
+
content=payload_json,
|
218
|
+
folder_key=folder_key,
|
219
|
+
folder_path=folder_path,
|
220
|
+
)
|
221
|
+
return {"InputFile": str(attachment_id)}
|
222
|
+
else:
|
223
|
+
return {"InputArguments": payload_json}
|
224
|
+
|
141
225
|
def _invoke_spec(
|
142
226
|
self,
|
143
227
|
name: str,
|
144
|
-
|
228
|
+
input_data: Optional[Dict[str, Any]] = None,
|
145
229
|
*,
|
146
230
|
folder_key: Optional[str] = None,
|
147
231
|
folder_path: Optional[str] = None,
|
148
232
|
) -> RequestSpec:
|
233
|
+
input_dict = {"startInfo": {"ReleaseName": name, **(input_data or {})}}
|
149
234
|
request_scope = RequestSpec(
|
150
235
|
method="POST",
|
151
236
|
endpoint=Endpoint(
|
152
237
|
"/orchestrator_/odata/Jobs/UiPath.Server.Configuration.OData.StartJobs"
|
153
238
|
),
|
154
|
-
content=str(
|
155
|
-
{
|
156
|
-
"startInfo": {
|
157
|
-
"ReleaseName": name,
|
158
|
-
"InputArguments": json.dumps(input_arguments)
|
159
|
-
if input_arguments
|
160
|
-
else "{}",
|
161
|
-
}
|
162
|
-
}
|
163
|
-
),
|
239
|
+
content=str(input_dict),
|
164
240
|
headers={
|
165
241
|
**header_folder(folder_key, folder_path),
|
166
242
|
},
|
@@ -57,6 +57,7 @@ class UiPath:
|
|
57
57
|
raise SecretMissingError() from e
|
58
58
|
self._folders_service: Optional[FolderService] = None
|
59
59
|
self._buckets_service: Optional[BucketsService] = None
|
60
|
+
self._attachments_service: Optional[AttachmentsService] = None
|
60
61
|
|
61
62
|
setup_logging(debug)
|
62
63
|
self._execution_context = ExecutionContext()
|
@@ -71,11 +72,15 @@ class UiPath:
|
|
71
72
|
|
72
73
|
@property
|
73
74
|
def attachments(self) -> AttachmentsService:
|
74
|
-
|
75
|
+
if not self._attachments_service:
|
76
|
+
self._attachments_service = AttachmentsService(
|
77
|
+
self._config, self._execution_context
|
78
|
+
)
|
79
|
+
return self._attachments_service
|
75
80
|
|
76
81
|
@property
|
77
82
|
def processes(self) -> ProcessesService:
|
78
|
-
return ProcessesService(self._config, self._execution_context)
|
83
|
+
return ProcessesService(self._config, self._execution_context, self.attachments)
|
79
84
|
|
80
85
|
@property
|
81
86
|
def actions(self) -> ActionsService:
|
@@ -58,7 +58,9 @@ class Job(BaseModel):
|
|
58
58
|
deleter_user_id: Optional[int] = Field(default=None, alias="DeleterUserId")
|
59
59
|
is_deleted: Optional[bool] = Field(default=None, alias="IsDeleted")
|
60
60
|
input_arguments: Optional[str] = Field(default=None, alias="InputArguments")
|
61
|
+
input_file: Optional[str] = Field(default=None, alias="InputFile")
|
61
62
|
output_arguments: Optional[str] = Field(default=None, alias="OutputArguments")
|
63
|
+
output_file: Optional[str] = Field(default=None, alias="OutputFile")
|
62
64
|
host_machine_name: Optional[str] = Field(default=None, alias="HostMachineName")
|
63
65
|
has_errors: Optional[bool] = Field(default=None, alias="HasErrors")
|
64
66
|
has_warnings: Optional[bool] = Field(default=None, alias="HasWarnings")
|