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.
Files changed (266) hide show
  1. {uipath-2.1.37 → uipath-2.1.39}/PKG-INFO +1 -1
  2. {uipath-2.1.37 → uipath-2.1.39}/pyproject.toml +1 -1
  3. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/__init__.py +1 -1
  4. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +20 -12
  5. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_details.py +6 -3
  6. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +4 -3
  7. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +36 -34
  8. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_hitl.py +2 -1
  9. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/jobs_service.py +48 -0
  10. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/processes_service.py +90 -14
  11. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_uipath.py +7 -2
  12. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/job.py +2 -0
  13. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_jobs_service.py +447 -0
  14. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_processes_service.py +205 -1
  15. {uipath-2.1.37 → uipath-2.1.39}/uv.lock +1 -1
  16. {uipath-2.1.37 → uipath-2.1.39}/.cursorrules +0 -0
  17. {uipath-2.1.37 → uipath-2.1.39}/.editorconfig +0 -0
  18. {uipath-2.1.37 → uipath-2.1.39}/.gitattributes +0 -0
  19. {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/cd.yml +0 -0
  20. {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/ci.yml +0 -0
  21. {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/commitlint.yml +0 -0
  22. {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/lint.yml +0 -0
  23. {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/publish-dev.yml +0 -0
  24. {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/publish-docs.yml +0 -0
  25. {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/slack.yml +0 -0
  26. {uipath-2.1.37 → uipath-2.1.39}/.github/workflows/test.yml +0 -0
  27. {uipath-2.1.37 → uipath-2.1.39}/.gitignore +0 -0
  28. {uipath-2.1.37 → uipath-2.1.39}/.pre-commit-config.yaml +0 -0
  29. {uipath-2.1.37 → uipath-2.1.39}/.python-version +0 -0
  30. {uipath-2.1.37 → uipath-2.1.39}/.vscode/extensions.json +0 -0
  31. {uipath-2.1.37 → uipath-2.1.39}/.vscode/launch.json +0 -0
  32. {uipath-2.1.37 → uipath-2.1.39}/.vscode/settings.json +0 -0
  33. {uipath-2.1.37 → uipath-2.1.39}/CONTRIBUTING.md +0 -0
  34. {uipath-2.1.37 → uipath-2.1.39}/LICENSE +0 -0
  35. {uipath-2.1.37 → uipath-2.1.39}/README.md +0 -0
  36. {uipath-2.1.37 → uipath-2.1.39}/docs/CONTRIBUTING.md +0 -0
  37. {uipath-2.1.37 → uipath-2.1.39}/docs/FAQ.md +0 -0
  38. {uipath-2.1.37 → uipath-2.1.39}/docs/assets/env-preparation-failed-dark.png +0 -0
  39. {uipath-2.1.37 → uipath-2.1.39}/docs/assets/env-preparation-failed-light.png +0 -0
  40. {uipath-2.1.37 → uipath-2.1.39}/docs/assets/favicon.png +0 -0
  41. {uipath-2.1.37 → uipath-2.1.39}/docs/assets/logo-dark.svg +0 -0
  42. {uipath-2.1.37 → uipath-2.1.39}/docs/assets/logo-light.svg +0 -0
  43. {uipath-2.1.37 → uipath-2.1.39}/docs/cli/index.md +0 -0
  44. {uipath-2.1.37 → uipath-2.1.39}/docs/core/actions.md +0 -0
  45. {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  46. {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/cloud_env_var_light.gif +0 -0
  47. {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  48. {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  49. {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/copy_path_dark.png +0 -0
  50. {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets/copy_path_light.png +0 -0
  51. {uipath-2.1.37 → uipath-2.1.39}/docs/core/assets.md +0 -0
  52. {uipath-2.1.37 → uipath-2.1.39}/docs/core/attachments.md +0 -0
  53. {uipath-2.1.37 → uipath-2.1.39}/docs/core/buckets.md +0 -0
  54. {uipath-2.1.37 → uipath-2.1.39}/docs/core/connections.md +0 -0
  55. {uipath-2.1.37 → uipath-2.1.39}/docs/core/context_grounding.md +0 -0
  56. {uipath-2.1.37 → uipath-2.1.39}/docs/core/environment_variables.md +0 -0
  57. {uipath-2.1.37 → uipath-2.1.39}/docs/core/getting_started.md +0 -0
  58. {uipath-2.1.37 → uipath-2.1.39}/docs/core/jobs.md +0 -0
  59. {uipath-2.1.37 → uipath-2.1.39}/docs/core/llm_gateway.md +0 -0
  60. {uipath-2.1.37 → uipath-2.1.39}/docs/core/processes.md +0 -0
  61. {uipath-2.1.37 → uipath-2.1.39}/docs/core/queues.md +0 -0
  62. {uipath-2.1.37 → uipath-2.1.39}/docs/core/traced.md +0 -0
  63. {uipath-2.1.37 → uipath-2.1.39}/docs/hooks.py +0 -0
  64. {uipath-2.1.37 → uipath-2.1.39}/docs/index.md +0 -0
  65. {uipath-2.1.37 → uipath-2.1.39}/docs/javascripts/extra.js +0 -0
  66. {uipath-2.1.37 → uipath-2.1.39}/docs/overrides/main.html +0 -0
  67. {uipath-2.1.37 → uipath-2.1.39}/docs/overrides/partials/actions.html +0 -0
  68. {uipath-2.1.37 → uipath-2.1.39}/docs/overrides/partials/logo.html +0 -0
  69. {uipath-2.1.37 → uipath-2.1.39}/docs/release_policy.md +0 -0
  70. {uipath-2.1.37 → uipath-2.1.39}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  71. {uipath-2.1.37 → uipath-2.1.39}/docs/stylesheets/extra.css +0 -0
  72. {uipath-2.1.37 → uipath-2.1.39}/justfile +0 -0
  73. {uipath-2.1.37 → uipath-2.1.39}/mkdocs.yml +0 -0
  74. {uipath-2.1.37 → uipath-2.1.39}/py.typed +0 -0
  75. {uipath-2.1.37 → uipath-2.1.39}/samples/event-trigger/.python-version +0 -0
  76. {uipath-2.1.37 → uipath-2.1.39}/samples/event-trigger/README.md +0 -0
  77. {uipath-2.1.37 → uipath-2.1.39}/samples/event-trigger/main.py +0 -0
  78. {uipath-2.1.37 → uipath-2.1.39}/samples/event-trigger/pyproject.toml +0 -0
  79. {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/.env.example +0 -0
  80. {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/README.md +0 -0
  81. {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/input.json +0 -0
  82. {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  83. {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  84. {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/pyproject.toml +0 -0
  85. {uipath-2.1.37 → uipath-2.1.39}/samples/google-ADK-agent/uv.lock +0 -0
  86. {uipath-2.1.37 → uipath-2.1.39}/scripts/debug_test.py +0 -0
  87. {uipath-2.1.37 → uipath-2.1.39}/scripts/lint_httpx_client.py +0 -0
  88. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/__init__.py +0 -0
  89. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/README.md +0 -0
  90. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/__init__.py +0 -0
  91. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  92. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
  93. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_models.py +0 -0
  94. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  95. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  96. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  97. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/_utils.py +0 -0
  98. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/auth_config.json +0 -0
  99. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/index.html +0 -0
  100. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/localhost.crt +0 -0
  101. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_auth/localhost.key +0 -0
  102. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  103. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  104. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  105. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  106. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  107. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  108. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  109. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/__init__.py +0 -0
  110. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_deterministic_evaluator_base.py +0 -0
  111. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_evaluator_base.py +0 -0
  112. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_evaluator_factory.py +0 -0
  113. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_exact_match_evaluator.py +0 -0
  114. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_json_similarity_evaluator.py +0 -0
  115. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_llm_as_judge_evaluator.py +0 -0
  116. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_evaluators/_trajectory_evaluator.py +0 -0
  117. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_models/__init__.py +0 -0
  118. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  119. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/_models/_evaluators.py +0 -0
  120. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/evaluation_service.py +0 -0
  121. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_evals/progress_reporter.py +0 -0
  122. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  123. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_contracts.py +0 -0
  124. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  125. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_logging.py +0 -0
  126. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  127. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  128. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/.rels.template +0 -0
  129. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  130. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/main.py.template +0 -0
  131. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  132. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_common.py +0 -0
  133. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_console.py +0 -0
  134. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_constants.py +0 -0
  135. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_debug.py +0 -0
  136. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_folders.py +0 -0
  137. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_input_args.py +0 -0
  138. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  139. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_processes.py +0 -0
  140. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_project_files.py +0 -0
  141. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  142. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_tracing.py +0 -0
  143. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  144. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_auth.py +0 -0
  145. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_deploy.py +0 -0
  146. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_dev.py +0 -0
  147. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_eval.py +0 -0
  148. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_init.py +0 -0
  149. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_invoke.py +0 -0
  150. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_new.py +0 -0
  151. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_pack.py +0 -0
  152. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_publish.py +0 -0
  153. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_pull.py +0 -0
  154. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_push.py +0 -0
  155. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/cli_run.py +0 -0
  156. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/middlewares.py +0 -0
  157. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_cli/spinner.py +0 -0
  158. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_config.py +0 -0
  159. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_execution_context.py +0 -0
  160. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_folder_context.py +0 -0
  161. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/__init__.py +0 -0
  162. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/_base_service.py +0 -0
  163. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/actions_service.py +0 -0
  164. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/api_client.py +0 -0
  165. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/assets_service.py +0 -0
  166. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/attachments_service.py +0 -0
  167. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/buckets_service.py +0 -0
  168. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/connections_service.py +0 -0
  169. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/context_grounding_service.py +0 -0
  170. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/folder_service.py +0 -0
  171. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/llm_gateway_service.py +0 -0
  172. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_services/queues_service.py +0 -0
  173. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/__init__.py +0 -0
  174. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_endpoint.py +0 -0
  175. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_infer_bindings.py +0 -0
  176. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_logs.py +0 -0
  177. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_read_overwrites.py +0 -0
  178. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_request_override.py +0 -0
  179. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_request_spec.py +0 -0
  180. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_ssl_context.py +0 -0
  181. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_url.py +0 -0
  182. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/_user_agent.py +0 -0
  183. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/_utils/constants.py +0 -0
  184. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/__init__.py +0 -0
  185. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/async_stream.py +0 -0
  186. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/citation.py +0 -0
  187. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/content.py +0 -0
  188. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/conversation.py +0 -0
  189. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/event.py +0 -0
  190. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/exchange.py +0 -0
  191. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/message.py +0 -0
  192. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/meta.py +0 -0
  193. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/agent/conversation/tool.py +0 -0
  194. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/__init__.py +0 -0
  195. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/action_schema.py +0 -0
  196. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/actions.py +0 -0
  197. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/assets.py +0 -0
  198. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/attachment.py +0 -0
  199. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/buckets.py +0 -0
  200. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/connections.py +0 -0
  201. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/context_grounding.py +0 -0
  202. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/context_grounding_index.py +0 -0
  203. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/errors.py +0 -0
  204. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/exceptions.py +0 -0
  205. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/interrupt_models.py +0 -0
  206. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/llm_gateway.py +0 -0
  207. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/processes.py +0 -0
  208. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/models/queues.py +0 -0
  209. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/py.typed +0 -0
  210. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/telemetry/__init__.py +0 -0
  211. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/telemetry/_constants.py +0 -0
  212. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/telemetry/_track.py +0 -0
  213. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/tracing/__init__.py +0 -0
  214. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/tracing/_otel_exporters.py +0 -0
  215. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/tracing/_traced.py +0 -0
  216. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/tracing/_utils.py +0 -0
  217. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/utils/__init__.py +0 -0
  218. {uipath-2.1.37 → uipath-2.1.39}/src/uipath/utils/_endpoints_manager.py +0 -0
  219. {uipath-2.1.37 → uipath-2.1.39}/tests/__init__.py +0 -0
  220. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/conftest.py +0 -0
  221. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  222. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/bindings_script.py +0 -0
  223. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/pyproject.toml +0 -0
  224. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/simple_script.py +0 -0
  225. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/uipath-mock.json +0 -0
  226. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  227. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_auth.py +0 -0
  228. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_hitl.py +0 -0
  229. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_init.py +0 -0
  230. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_input_args.py +0 -0
  231. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_invoke.py +0 -0
  232. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_new.py +0 -0
  233. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_pack.py +0 -0
  234. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  235. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_portal_service_refresh_token.py +0 -0
  236. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_publish.py +0 -0
  237. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_pull.py +0 -0
  238. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_push.py +0 -0
  239. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_run.py +0 -0
  240. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/test_utils.py +0 -0
  241. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/utils/common.py +0 -0
  242. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/utils/project_details.py +0 -0
  243. {uipath-2.1.37 → uipath-2.1.39}/tests/cli/utils/uipath_json.py +0 -0
  244. {uipath-2.1.37 → uipath-2.1.39}/tests/conftest.py +0 -0
  245. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/conftest.py +0 -0
  246. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_actions_service.py +0 -0
  247. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_api_client.py +0 -0
  248. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_assets_service.py +0 -0
  249. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_attachments_service.py +0 -0
  250. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_base_service.py +0 -0
  251. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_buckets_service.py +0 -0
  252. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_connections_service.py +0 -0
  253. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_context_grounding_service.py +0 -0
  254. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_folder_service.py +0 -0
  255. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_llm_integration.py +0 -0
  256. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  257. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_llm_service.py +0 -0
  258. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_queues_service.py +0 -0
  259. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  260. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/test_bindings_inference.py +0 -0
  261. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/test_config.py +0 -0
  262. {uipath-2.1.37 → uipath-2.1.39}/tests/sdk/test_overwrites.py +0 -0
  263. {uipath-2.1.37 → uipath-2.1.39}/tests/tracing/test_otel_exporters.py +0 -0
  264. {uipath-2.1.37 → uipath-2.1.39}/tests/tracing/test_span_utils.py +0 -0
  265. {uipath-2.1.37 → uipath-2.1.39}/tests/tracing/test_traced.py +0 -0
  266. {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.37
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.37"
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(self, chat_msg: UiPathConversationMessage) -> None:
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 part.mime_type.startswith("text/"):
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"{prefix} {text_block}"] if text_block else []
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
- args = call.arguments
77
- content_lines.append(f"🛠 **{call.name}**\n{args}")
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
- if now - last_update > 0.15:
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, chat_msg: UiPathConversationMessage, run_id: str
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
- background: $primary 5%;
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 $success;
237
- background: $success 5%;
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
- if cp_event.start:
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
- UiPathConversationContentPart(
95
- content_part_id=cp_event.content_part_id,
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=tc_event.start.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
- return _try_convert_to_json_format(job.output_arguments)
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__(self, config: Config, execution_context: ExecutionContext) -> None:
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
- input_arguments=input_arguments,
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
- input_arguments=input_arguments,
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
- input_arguments: Optional[Dict[str, Any]] = None,
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
- return AttachmentsService(self._config, self._execution_context)
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")