uipath 2.1.44__tar.gz → 2.1.45__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 (276) hide show
  1. {uipath-2.1.44 → uipath-2.1.45}/PKG-INFO +1 -1
  2. {uipath-2.1.44 → uipath-2.1.45}/pyproject.toml +1 -1
  3. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_runtime.py +17 -52
  4. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_runtime/_contracts.py +89 -36
  5. uipath-2.1.45/src/uipath/_cli/_runtime/_runtime.py +79 -0
  6. uipath-2.1.44/src/uipath/_cli/_runtime/_runtime.py → uipath-2.1.45/src/uipath/_cli/_runtime/_script_executor.py +15 -73
  7. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_dev.py +4 -2
  8. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_eval.py +26 -32
  9. uipath-2.1.45/src/uipath/_cli/cli_run.py +128 -0
  10. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/processes_service.py +2 -2
  11. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_run.py +1 -5
  12. {uipath-2.1.44 → uipath-2.1.45}/uv.lock +1 -1
  13. uipath-2.1.44/src/uipath/_cli/cli_run.py +0 -225
  14. {uipath-2.1.44 → uipath-2.1.45}/.cursorrules +0 -0
  15. {uipath-2.1.44 → uipath-2.1.45}/.editorconfig +0 -0
  16. {uipath-2.1.44 → uipath-2.1.45}/.gitattributes +0 -0
  17. {uipath-2.1.44 → uipath-2.1.45}/.github/workflows/cd.yml +0 -0
  18. {uipath-2.1.44 → uipath-2.1.45}/.github/workflows/ci.yml +0 -0
  19. {uipath-2.1.44 → uipath-2.1.45}/.github/workflows/commitlint.yml +0 -0
  20. {uipath-2.1.44 → uipath-2.1.45}/.github/workflows/lint.yml +0 -0
  21. {uipath-2.1.44 → uipath-2.1.45}/.github/workflows/publish-dev.yml +0 -0
  22. {uipath-2.1.44 → uipath-2.1.45}/.github/workflows/publish-docs.yml +0 -0
  23. {uipath-2.1.44 → uipath-2.1.45}/.github/workflows/slack.yml +0 -0
  24. {uipath-2.1.44 → uipath-2.1.45}/.github/workflows/test.yml +0 -0
  25. {uipath-2.1.44 → uipath-2.1.45}/.gitignore +0 -0
  26. {uipath-2.1.44 → uipath-2.1.45}/.pre-commit-config.yaml +0 -0
  27. {uipath-2.1.44 → uipath-2.1.45}/.python-version +0 -0
  28. {uipath-2.1.44 → uipath-2.1.45}/.vscode/extensions.json +0 -0
  29. {uipath-2.1.44 → uipath-2.1.45}/.vscode/launch.json +0 -0
  30. {uipath-2.1.44 → uipath-2.1.45}/.vscode/settings.json +0 -0
  31. {uipath-2.1.44 → uipath-2.1.45}/CONTRIBUTING.md +0 -0
  32. {uipath-2.1.44 → uipath-2.1.45}/LICENSE +0 -0
  33. {uipath-2.1.44 → uipath-2.1.45}/README.md +0 -0
  34. {uipath-2.1.44 → uipath-2.1.45}/docs/CONTRIBUTING.md +0 -0
  35. {uipath-2.1.44 → uipath-2.1.45}/docs/FAQ.md +0 -0
  36. {uipath-2.1.44 → uipath-2.1.45}/docs/assets/env-preparation-failed-dark.png +0 -0
  37. {uipath-2.1.44 → uipath-2.1.45}/docs/assets/env-preparation-failed-light.png +0 -0
  38. {uipath-2.1.44 → uipath-2.1.45}/docs/assets/favicon.png +0 -0
  39. {uipath-2.1.44 → uipath-2.1.45}/docs/assets/logo-dark.svg +0 -0
  40. {uipath-2.1.44 → uipath-2.1.45}/docs/assets/logo-light.svg +0 -0
  41. {uipath-2.1.44 → uipath-2.1.45}/docs/cli/index.md +0 -0
  42. {uipath-2.1.44 → uipath-2.1.45}/docs/core/actions.md +0 -0
  43. {uipath-2.1.44 → uipath-2.1.45}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  44. {uipath-2.1.44 → uipath-2.1.45}/docs/core/assets/cloud_env_var_light.gif +0 -0
  45. {uipath-2.1.44 → uipath-2.1.45}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  46. {uipath-2.1.44 → uipath-2.1.45}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  47. {uipath-2.1.44 → uipath-2.1.45}/docs/core/assets/copy_path_dark.png +0 -0
  48. {uipath-2.1.44 → uipath-2.1.45}/docs/core/assets/copy_path_light.png +0 -0
  49. {uipath-2.1.44 → uipath-2.1.45}/docs/core/assets.md +0 -0
  50. {uipath-2.1.44 → uipath-2.1.45}/docs/core/attachments.md +0 -0
  51. {uipath-2.1.44 → uipath-2.1.45}/docs/core/buckets.md +0 -0
  52. {uipath-2.1.44 → uipath-2.1.45}/docs/core/connections.md +0 -0
  53. {uipath-2.1.44 → uipath-2.1.45}/docs/core/context_grounding.md +0 -0
  54. {uipath-2.1.44 → uipath-2.1.45}/docs/core/environment_variables.md +0 -0
  55. {uipath-2.1.44 → uipath-2.1.45}/docs/core/getting_started.md +0 -0
  56. {uipath-2.1.44 → uipath-2.1.45}/docs/core/jobs.md +0 -0
  57. {uipath-2.1.44 → uipath-2.1.45}/docs/core/llm_gateway.md +0 -0
  58. {uipath-2.1.44 → uipath-2.1.45}/docs/core/processes.md +0 -0
  59. {uipath-2.1.44 → uipath-2.1.45}/docs/core/queues.md +0 -0
  60. {uipath-2.1.44 → uipath-2.1.45}/docs/core/traced.md +0 -0
  61. {uipath-2.1.44 → uipath-2.1.45}/docs/hooks.py +0 -0
  62. {uipath-2.1.44 → uipath-2.1.45}/docs/index.md +0 -0
  63. {uipath-2.1.44 → uipath-2.1.45}/docs/javascripts/extra.js +0 -0
  64. {uipath-2.1.44 → uipath-2.1.45}/docs/overrides/main.html +0 -0
  65. {uipath-2.1.44 → uipath-2.1.45}/docs/overrides/partials/actions.html +0 -0
  66. {uipath-2.1.44 → uipath-2.1.45}/docs/overrides/partials/logo.html +0 -0
  67. {uipath-2.1.44 → uipath-2.1.45}/docs/release_policy.md +0 -0
  68. {uipath-2.1.44 → uipath-2.1.45}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  69. {uipath-2.1.44 → uipath-2.1.45}/docs/stylesheets/extra.css +0 -0
  70. {uipath-2.1.44 → uipath-2.1.45}/justfile +0 -0
  71. {uipath-2.1.44 → uipath-2.1.45}/mkdocs.yml +0 -0
  72. {uipath-2.1.44 → uipath-2.1.45}/py.typed +0 -0
  73. {uipath-2.1.44 → uipath-2.1.45}/samples/calculator/README.md +0 -0
  74. {uipath-2.1.44 → uipath-2.1.45}/samples/calculator/main.py +0 -0
  75. {uipath-2.1.44 → uipath-2.1.45}/samples/calculator/pyproject.toml +0 -0
  76. {uipath-2.1.44 → uipath-2.1.45}/samples/event-trigger/.python-version +0 -0
  77. {uipath-2.1.44 → uipath-2.1.45}/samples/event-trigger/README.md +0 -0
  78. {uipath-2.1.44 → uipath-2.1.45}/samples/event-trigger/main.py +0 -0
  79. {uipath-2.1.44 → uipath-2.1.45}/samples/event-trigger/pyproject.toml +0 -0
  80. {uipath-2.1.44 → uipath-2.1.45}/samples/google-ADK-agent/.env.example +0 -0
  81. {uipath-2.1.44 → uipath-2.1.45}/samples/google-ADK-agent/README.md +0 -0
  82. {uipath-2.1.44 → uipath-2.1.45}/samples/google-ADK-agent/input.json +0 -0
  83. {uipath-2.1.44 → uipath-2.1.45}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  84. {uipath-2.1.44 → uipath-2.1.45}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  85. {uipath-2.1.44 → uipath-2.1.45}/samples/google-ADK-agent/pyproject.toml +0 -0
  86. {uipath-2.1.44 → uipath-2.1.45}/samples/google-ADK-agent/uv.lock +0 -0
  87. {uipath-2.1.44 → uipath-2.1.45}/scripts/debug_test.py +0 -0
  88. {uipath-2.1.44 → uipath-2.1.45}/scripts/lint_httpx_client.py +0 -0
  89. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/__init__.py +0 -0
  90. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/README.md +0 -0
  91. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/__init__.py +0 -0
  92. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  93. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/_auth_service.py +0 -0
  94. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
  95. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/_models.py +0 -0
  96. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  97. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  98. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  99. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/_utils.py +0 -0
  100. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/auth_config.json +0 -0
  101. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/index.html +0 -0
  102. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/localhost.crt +0 -0
  103. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_auth/localhost.key +0 -0
  104. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  105. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  106. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  107. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  108. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  109. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  110. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  111. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  112. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  113. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  114. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  115. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  116. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_evaluators/__init__.py +0 -0
  117. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_evaluators/_deterministic_evaluator_base.py +0 -0
  118. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_evaluators/_evaluator_base.py +0 -0
  119. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_evaluators/_evaluator_factory.py +0 -0
  120. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_evaluators/_exact_match_evaluator.py +0 -0
  121. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_evaluators/_json_similarity_evaluator.py +0 -0
  122. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_evaluators/_llm_as_judge_evaluator.py +0 -0
  123. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_evaluators/_trajectory_evaluator.py +0 -0
  124. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_models/__init__.py +0 -0
  125. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_models/_agent_execution_output.py +0 -0
  126. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  127. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/_models/_evaluators.py +0 -0
  128. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_evals/progress_reporter.py +0 -0
  129. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  130. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  131. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  132. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_runtime/_logging.py +0 -0
  133. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  134. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_templates/.rels.template +0 -0
  135. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  136. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_templates/main.py.template +0 -0
  137. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  138. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_common.py +0 -0
  139. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_console.py +0 -0
  140. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_constants.py +0 -0
  141. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_debug.py +0 -0
  142. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  143. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_folders.py +0 -0
  144. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_input_args.py +0 -0
  145. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  146. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_processes.py +0 -0
  147. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_project_files.py +0 -0
  148. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  149. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_tracing.py +0 -0
  150. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  151. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_auth.py +0 -0
  152. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_deploy.py +0 -0
  153. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_init.py +0 -0
  154. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_invoke.py +0 -0
  155. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_new.py +0 -0
  156. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_pack.py +0 -0
  157. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_publish.py +0 -0
  158. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_pull.py +0 -0
  159. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/cli_push.py +0 -0
  160. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/middlewares.py +0 -0
  161. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_cli/spinner.py +0 -0
  162. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_config.py +0 -0
  163. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_execution_context.py +0 -0
  164. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_folder_context.py +0 -0
  165. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/__init__.py +0 -0
  166. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/_base_service.py +0 -0
  167. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/actions_service.py +0 -0
  168. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/api_client.py +0 -0
  169. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/assets_service.py +0 -0
  170. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/attachments_service.py +0 -0
  171. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/buckets_service.py +0 -0
  172. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/connections_service.py +0 -0
  173. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/context_grounding_service.py +0 -0
  174. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/folder_service.py +0 -0
  175. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/jobs_service.py +0 -0
  176. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/llm_gateway_service.py +0 -0
  177. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_services/queues_service.py +0 -0
  178. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_uipath.py +0 -0
  179. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/__init__.py +0 -0
  180. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_endpoint.py +0 -0
  181. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_infer_bindings.py +0 -0
  182. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_logs.py +0 -0
  183. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_read_overwrites.py +0 -0
  184. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_request_override.py +0 -0
  185. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_request_spec.py +0 -0
  186. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_ssl_context.py +0 -0
  187. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_url.py +0 -0
  188. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/_user_agent.py +0 -0
  189. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/_utils/constants.py +0 -0
  190. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/__init__.py +0 -0
  191. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/async_stream.py +0 -0
  192. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/citation.py +0 -0
  193. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/content.py +0 -0
  194. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/conversation.py +0 -0
  195. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/event.py +0 -0
  196. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/exchange.py +0 -0
  197. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/message.py +0 -0
  198. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/meta.py +0 -0
  199. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/agent/conversation/tool.py +0 -0
  200. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/eval/_helpers/__init__.py +0 -0
  201. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/eval/_helpers/helpers.py +0 -0
  202. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/__init__.py +0 -0
  203. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/action_schema.py +0 -0
  204. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/actions.py +0 -0
  205. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/assets.py +0 -0
  206. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/attachment.py +0 -0
  207. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/buckets.py +0 -0
  208. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/connections.py +0 -0
  209. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/context_grounding.py +0 -0
  210. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/context_grounding_index.py +0 -0
  211. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/errors.py +0 -0
  212. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/exceptions.py +0 -0
  213. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/interrupt_models.py +0 -0
  214. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/job.py +0 -0
  215. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/llm_gateway.py +0 -0
  216. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/processes.py +0 -0
  217. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/models/queues.py +0 -0
  218. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/py.typed +0 -0
  219. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/telemetry/__init__.py +0 -0
  220. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/telemetry/_constants.py +0 -0
  221. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/telemetry/_track.py +0 -0
  222. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/tracing/__init__.py +0 -0
  223. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/tracing/_otel_exporters.py +0 -0
  224. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/tracing/_traced.py +0 -0
  225. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/tracing/_utils.py +0 -0
  226. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/utils/__init__.py +0 -0
  227. {uipath-2.1.44 → uipath-2.1.45}/src/uipath/utils/_endpoints_manager.py +0 -0
  228. {uipath-2.1.44 → uipath-2.1.45}/tests/__init__.py +0 -0
  229. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/conftest.py +0 -0
  230. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  231. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/mocks/bindings_script.py +0 -0
  232. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/mocks/pyproject.toml +0 -0
  233. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/mocks/simple_script.py +0 -0
  234. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/mocks/uipath-mock.json +0 -0
  235. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  236. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_auth.py +0 -0
  237. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_hitl.py +0 -0
  238. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_init.py +0 -0
  239. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_input_args.py +0 -0
  240. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_invoke.py +0 -0
  241. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_new.py +0 -0
  242. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_pack.py +0 -0
  243. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  244. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_portal_service_refresh_token.py +0 -0
  245. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_publish.py +0 -0
  246. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_pull.py +0 -0
  247. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_push.py +0 -0
  248. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/test_utils.py +0 -0
  249. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/utils/common.py +0 -0
  250. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/utils/project_details.py +0 -0
  251. {uipath-2.1.44 → uipath-2.1.45}/tests/cli/utils/uipath_json.py +0 -0
  252. {uipath-2.1.44 → uipath-2.1.45}/tests/conftest.py +0 -0
  253. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/conftest.py +0 -0
  254. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_actions_service.py +0 -0
  255. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_api_client.py +0 -0
  256. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_assets_service.py +0 -0
  257. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_attachments_service.py +0 -0
  258. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_base_service.py +0 -0
  259. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_buckets_service.py +0 -0
  260. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_connections_service.py +0 -0
  261. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_context_grounding_service.py +0 -0
  262. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_folder_service.py +0 -0
  263. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_jobs_service.py +0 -0
  264. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_llm_integration.py +0 -0
  265. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  266. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_llm_service.py +0 -0
  267. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_processes_service.py +0 -0
  268. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_queues_service.py +0 -0
  269. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  270. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/test_bindings_inference.py +0 -0
  271. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/test_config.py +0 -0
  272. {uipath-2.1.44 → uipath-2.1.45}/tests/sdk/test_overwrites.py +0 -0
  273. {uipath-2.1.44 → uipath-2.1.45}/tests/tracing/test_otel_exporters.py +0 -0
  274. {uipath-2.1.44 → uipath-2.1.45}/tests/tracing/test_span_utils.py +0 -0
  275. {uipath-2.1.44 → uipath-2.1.45}/tests/tracing/test_traced.py +0 -0
  276. {uipath-2.1.44 → uipath-2.1.45}/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.44
3
+ Version: 2.1.45
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.44"
3
+ version = "2.1.45"
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"
@@ -1,4 +1,3 @@
1
- import copy
2
1
  from collections import defaultdict
3
2
  from time import time
4
3
  from typing import Dict, Generic, List, Optional, Sequence, TypeVar
@@ -6,8 +5,6 @@ from typing import Dict, Generic, List, Optional, Sequence, TypeVar
6
5
  from opentelemetry.sdk.trace import ReadableSpan
7
6
  from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
8
7
 
9
- from uipath.eval._helpers import auto_discover_entrypoint
10
-
11
8
  from .._runtime._contracts import (
12
9
  UiPathBaseRuntime,
13
10
  UiPathRuntimeContext,
@@ -54,49 +51,21 @@ class ExecutionSpanExporter(SpanExporter):
54
51
  self.clear()
55
52
 
56
53
 
57
- class UiPathEvalContext(UiPathRuntimeContext, Generic[C]):
54
+ class UiPathEvalContext(UiPathRuntimeContext):
58
55
  """Context used for evaluation runs."""
59
56
 
60
- runtime_context: C
61
- no_report: bool
62
- workers: int
57
+ no_report: Optional[bool] = False
58
+ workers: Optional[int] = 1
63
59
  eval_set: Optional[str] = None
64
60
  eval_ids: Optional[List[str]] = None
65
61
 
66
- def __init__(
67
- self,
68
- runtime_context: C,
69
- no_report: bool,
70
- workers: int,
71
- eval_set: Optional[str] = None,
72
- eval_ids: Optional[List[str]] = None,
73
- **kwargs,
74
- ):
75
- super().__init__(
76
- runtime_context=runtime_context, # type: ignore
77
- no_report=no_report,
78
- workers=workers,
79
- eval_set=eval_set,
80
- eval_ids=eval_ids,
81
- **kwargs,
82
- )
83
- self._auto_discover()
84
-
85
- def _auto_discover(self):
86
- self.runtime_context.entrypoint = (
87
- self.runtime_context.entrypoint or auto_discover_entrypoint()
88
- )
89
- self.eval_set = self.eval_set or EvalHelpers.auto_discover_eval_set()
90
-
91
62
 
92
63
  class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
93
64
  """Specialized runtime for evaluation runs, with access to the factory."""
94
65
 
95
- def __init__(
96
- self, context: "UiPathEvalContext[C]", factory: "UiPathRuntimeFactory[T, C]"
97
- ):
66
+ def __init__(self, context: UiPathEvalContext, factory: UiPathRuntimeFactory[T, C]):
98
67
  super().__init__(context)
99
- self.context: "UiPathEvalContext[C]" = context
68
+ self.context: UiPathEvalContext = context
100
69
  self.factory: UiPathRuntimeFactory[T, C] = factory
101
70
  self.span_exporter: ExecutionSpanExporter = ExecutionSpanExporter()
102
71
  self.factory.add_span_exporter(self.span_exporter)
@@ -104,8 +73,8 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
104
73
  @classmethod
105
74
  def from_eval_context(
106
75
  cls,
107
- context: "UiPathEvalContext[C]",
108
- factory: "UiPathRuntimeFactory[T, C]",
76
+ context: UiPathEvalContext,
77
+ factory: UiPathRuntimeFactory[T, C],
109
78
  ) -> "UiPathEvalRuntime[T, C]":
110
79
  return cls(context, factory)
111
80
 
@@ -119,30 +88,26 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
119
88
  )
120
89
  execution_output_list: list[UiPathEvalRunExecutionOutput] = []
121
90
  for eval_item in evaluation_set.evaluations:
122
- execution_output_list.append(await self.execute_agent(eval_item))
91
+ execution_output = await self.execute_runtime(eval_item)
92
+ execution_output_list.append(execution_output)
123
93
 
124
94
  self.context.result = UiPathRuntimeResult(
125
95
  output={
126
96
  "results": execution_output_list,
127
97
  },
128
98
  status=UiPathRuntimeStatus.SUCCESSFUL,
129
- resume=None,
130
99
  )
131
100
 
132
- return self.context.runtime_context.result
133
-
134
- def _prepare_new_runtime_context(self, eval_item: EvaluationItem) -> C:
135
- runtime_context = copy.deepcopy(self.context.runtime_context)
136
- runtime_context.execution_id = eval_item.id
137
- runtime_context.input_json = eval_item.inputs
138
- # here we can pass other values from eval_item: expectedAgentBehavior, simulationInstructions etc.
139
- return runtime_context
101
+ return self.context.result
140
102
 
141
- # TODO: this would most likely need to be ported to a public AgentEvaluator class
142
- async def execute_agent(
103
+ async def execute_runtime(
143
104
  self, eval_item: EvaluationItem
144
- ) -> "UiPathEvalRunExecutionOutput":
145
- runtime_context = self._prepare_new_runtime_context(eval_item)
105
+ ) -> UiPathEvalRunExecutionOutput:
106
+ runtime_context: C = self.factory.new_context(
107
+ execution_id=eval_item.id,
108
+ input_json=eval_item.inputs,
109
+ is_eval_run=True,
110
+ )
146
111
  start_time = time()
147
112
  result = await self.factory.execute_in_root_span(
148
113
  runtime_context, root_span=eval_item.name
@@ -30,6 +30,9 @@ from ._logging import LogsInterceptor
30
30
 
31
31
  logger = logging.getLogger(__name__)
32
32
 
33
+ T = TypeVar("T", bound="UiPathBaseRuntime")
34
+ C = TypeVar("C", bound="UiPathRuntimeContext")
35
+
33
36
 
34
37
  class UiPathResumeTriggerType(str, Enum):
35
38
  """Constants representing different types of resume job triggers in the system."""
@@ -315,21 +318,43 @@ class UiPathRuntimeContext(BaseModel):
315
318
  model_config = {"arbitrary_types_allowed": True}
316
319
 
317
320
  @classmethod
318
- def from_config(cls, config_path=None, **kwargs):
319
- """Load configuration from uipath.json file.
321
+ def with_defaults(cls: type[C], config_path: Optional[str] = None, **kwargs) -> C:
322
+ """Construct a context with defaults, reading env vars and config file."""
323
+ resolved_config_path = config_path or os.environ.get(
324
+ "UIPATH_CONFIG_PATH", "uipath.json"
325
+ )
320
326
 
321
- Args:
322
- config_path: Path to the configuration file. If None, uses the default "uipath.json"
323
- **kwargs: Additional keyword arguments to use as fallback for configuration values
327
+ base = cls.from_config(resolved_config_path)
328
+
329
+ # Apply defaults from env
330
+ base.job_id = os.environ.get("UIPATH_JOB_KEY")
331
+ base.trace_id = os.environ.get("UIPATH_TRACE_ID")
332
+ base.tracing_enabled = os.environ.get("UIPATH_TRACING_ENABLED", True)
333
+ base.logs_min_level = os.environ.get("LOG_LEVEL", "INFO")
334
+
335
+ base.trace_context = UiPathTraceContext(
336
+ trace_id=os.environ.get("UIPATH_TRACE_ID"),
337
+ parent_span_id=os.environ.get("UIPATH_PARENT_SPAN_ID"),
338
+ root_span_id=os.environ.get("UIPATH_ROOT_SPAN_ID"),
339
+ enabled=os.environ.get("UIPATH_TRACING_ENABLED", True),
340
+ job_id=os.environ.get("UIPATH_JOB_KEY"),
341
+ org_id=os.environ.get("UIPATH_ORGANIZATION_ID"),
342
+ tenant_id=os.environ.get("UIPATH_TENANT_ID"),
343
+ process_key=os.environ.get("UIPATH_PROCESS_UUID"),
344
+ folder_key=os.environ.get("UIPATH_FOLDER_KEY"),
345
+ reference_id=os.environ.get("UIPATH_JOB_KEY") or str(uuid4()),
346
+ )
324
347
 
325
- Returns:
326
- An instance of the class with fields populated from the config file
327
- """
328
- import json
329
- import os
348
+ # Override with kwargs
349
+ for k, v in kwargs.items():
350
+ setattr(base, k, v)
330
351
 
331
- path = config_path or "uipath.json"
352
+ return base
332
353
 
354
+ @classmethod
355
+ def from_config(cls: type[C], config_path: Optional[str] = None, **kwargs) -> C:
356
+ """Load configuration from uipath.json file."""
357
+ path = config_path or "uipath.json"
333
358
  config = {}
334
359
 
335
360
  if os.path.exists(path):
@@ -346,7 +371,6 @@ class UiPathRuntimeContext(BaseModel):
346
371
  }
347
372
 
348
373
  attributes_set = set()
349
- # set values from config file if available
350
374
  if "runtime" in config:
351
375
  runtime_config = config["runtime"]
352
376
  for config_key, attr_name in mapping.items():
@@ -354,10 +378,8 @@ class UiPathRuntimeContext(BaseModel):
354
378
  attributes_set.add(attr_name)
355
379
  setattr(instance, attr_name, runtime_config[config_key])
356
380
 
357
- # fallback to kwargs for any values not set from config file
358
381
  for _, attr_name in mapping.items():
359
382
  if attr_name in kwargs and hasattr(instance, attr_name):
360
- # Only set from kwargs if not already set from config file
361
383
  if attr_name not in attributes_set:
362
384
  setattr(instance, attr_name, kwargs[attr_name])
363
385
 
@@ -383,7 +405,7 @@ class UiPathRuntimeError(Exception):
383
405
  if (
384
406
  tb and tb.strip() != "NoneType: None"
385
407
  ): # Ensure there's an actual traceback
386
- detail = f"{detail}\n\nTraceback:\n{tb}"
408
+ detail = f"{detail}\n\n{tb}"
387
409
 
388
410
  if status is None:
389
411
  status = self._extract_http_status()
@@ -473,6 +495,21 @@ class UiPathBaseRuntime(ABC):
473
495
  with open(self.context.input_file) as f:
474
496
  self.context.input = f.read()
475
497
 
498
+ try:
499
+ if self.context.input:
500
+ self.context.input_json = json.loads(self.context.input)
501
+ if self.context.input_json is None:
502
+ self.context.input_json = {}
503
+ except json.JSONDecodeError as e:
504
+ raise UiPathRuntimeError(
505
+ "INPUT_INVALID_JSON",
506
+ "Invalid JSON input",
507
+ f"The input data is not valid JSON: {str(e)}",
508
+ UiPathErrorCategory.USER,
509
+ ) from e
510
+
511
+ await self.validate()
512
+
476
513
  # Intercept all stdout/stderr/logs and write them to a file (runtime/evals), stdout (debug)
477
514
  self.logs_interceptor = LogsInterceptor(
478
515
  min_level=self.context.logs_min_level,
@@ -620,14 +657,16 @@ class UiPathBaseRuntime(ABC):
620
657
  return os.path.join("__uipath", "state.db")
621
658
 
622
659
 
623
- T = TypeVar("T", bound=UiPathBaseRuntime)
624
- C = TypeVar("C", bound=UiPathRuntimeContext)
625
-
626
-
627
660
  class UiPathRuntimeFactory(Generic[T, C]):
628
661
  """Generic factory for UiPath runtime classes."""
629
662
 
630
- def __init__(self, runtime_class: Type[T], context_class: Type[C]):
663
+ def __init__(
664
+ self,
665
+ runtime_class: Type[T],
666
+ context_class: Type[C],
667
+ runtime_generator: Optional[Callable[[C], T]] = None,
668
+ context_generator: Optional[Callable[..., C]] = None,
669
+ ):
631
670
  if not issubclass(runtime_class, UiPathBaseRuntime):
632
671
  raise TypeError(
633
672
  f"runtime_class {runtime_class.__name__} must inherit from UiPathBaseRuntime"
@@ -640,10 +679,11 @@ class UiPathRuntimeFactory(Generic[T, C]):
640
679
 
641
680
  self.runtime_class = runtime_class
642
681
  self.context_class = context_class
682
+ self.runtime_generator = runtime_generator
683
+ self.context_generator = context_generator
643
684
  self.tracer_provider: TracerProvider = TracerProvider()
644
685
  self.tracer_span_processors: List[SpanProcessor] = []
645
686
  trace.set_tracer_provider(self.tracer_provider)
646
-
647
687
  if os.getenv("UIPATH_JOB_KEY"):
648
688
  self.add_span_exporter(LlmOpsHttpExporter())
649
689
 
@@ -674,36 +714,49 @@ class UiPathRuntimeFactory(Generic[T, C]):
674
714
 
675
715
  def new_context(self, **kwargs) -> C:
676
716
  """Create a new context instance."""
717
+ if self.context_generator:
718
+ return self.context_generator(**kwargs)
677
719
  return self.context_class(**kwargs)
678
720
 
721
+ def new_runtime(self) -> T:
722
+ """Create a new runtime instance."""
723
+ context = self.new_context()
724
+ if self.runtime_generator:
725
+ return self.runtime_generator(context)
726
+ return self.runtime_class.from_context(context)
727
+
679
728
  def from_context(self, context: C) -> T:
680
729
  """Create runtime instance from context."""
730
+ if self.runtime_generator:
731
+ return self.runtime_generator(context)
681
732
  return self.runtime_class.from_context(context)
682
733
 
683
734
  async def execute(self, context: C) -> Optional[UiPathRuntimeResult]:
684
735
  """Execute runtime with context."""
685
736
  async with self.from_context(context) as runtime:
686
- result = await runtime.execute()
687
- for span_processor in self.tracer_span_processors:
688
- span_processor.force_flush()
689
- return result
737
+ try:
738
+ return await runtime.execute()
739
+ finally:
740
+ for span_processor in self.tracer_span_processors:
741
+ span_processor.force_flush()
690
742
 
691
743
  async def execute_in_root_span(
692
744
  self, context: C, root_span: str = "root"
693
745
  ) -> Optional[UiPathRuntimeResult]:
694
746
  """Execute runtime with context."""
695
747
  async with self.from_context(context) as runtime:
696
- tracer: Tracer = trace.get_tracer("uipath-runtime")
697
- with tracer.start_as_current_span(
698
- root_span,
699
- attributes={"execution.id": context.execution_id}
700
- if context.execution_id
701
- else {},
702
- ):
703
- result = await runtime.execute()
704
- for span_processor in self.tracer_span_processors:
705
- span_processor.force_flush()
706
- return result
748
+ try:
749
+ tracer: Tracer = trace.get_tracer("uipath-runtime")
750
+ with tracer.start_as_current_span(
751
+ root_span,
752
+ attributes={"execution.id": context.execution_id}
753
+ if context.execution_id
754
+ else {},
755
+ ):
756
+ return await runtime.execute()
757
+ finally:
758
+ for span_processor in self.tracer_span_processors:
759
+ span_processor.force_flush()
707
760
 
708
761
 
709
762
  class UiPathExecutionTraceProcessorMixin:
@@ -0,0 +1,79 @@
1
+ """Python script runtime implementation for executing and managing python scripts."""
2
+
3
+ import logging
4
+ from typing import Any, Awaitable, Callable, Optional, TypeVar
5
+
6
+ from ._contracts import (
7
+ UiPathBaseRuntime,
8
+ UiPathErrorCategory,
9
+ UiPathRuntimeContext,
10
+ UiPathRuntimeError,
11
+ UiPathRuntimeResult,
12
+ UiPathRuntimeStatus,
13
+ )
14
+ from ._script_executor import ScriptExecutor
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ T = TypeVar("T")
19
+ R = TypeVar("R")
20
+ AsyncFunc = Callable[[T], Awaitable[R]]
21
+
22
+
23
+ class UiPathRuntime(UiPathBaseRuntime):
24
+ def __init__(self, context: UiPathRuntimeContext, executor: AsyncFunc[Any, Any]):
25
+ self.context = context
26
+ self.executor = executor
27
+
28
+ async def cleanup(self) -> None:
29
+ """Cleanup runtime resources."""
30
+ pass
31
+
32
+ async def validate(self):
33
+ """Validate runtime context."""
34
+ pass
35
+
36
+ async def execute(self) -> Optional[UiPathRuntimeResult]:
37
+ """Execute the Python script with the provided input and configuration.
38
+
39
+ Returns:
40
+ Dictionary with execution results
41
+
42
+ Raises:
43
+ UiPathRuntimeError: If execution fails
44
+ """
45
+ try:
46
+ script_result = await self.executor(self.context.input_json)
47
+
48
+ if self.context.job_id is None:
49
+ logger.info(script_result)
50
+
51
+ self.context.result = UiPathRuntimeResult(
52
+ output=script_result, status=UiPathRuntimeStatus.SUCCESSFUL
53
+ )
54
+
55
+ return self.context.result
56
+
57
+ except Exception as e:
58
+ if isinstance(e, UiPathRuntimeError):
59
+ raise
60
+
61
+ raise UiPathRuntimeError(
62
+ "EXECUTION_ERROR",
63
+ "Python script execution failed",
64
+ f"Error: {str(e)}",
65
+ UiPathErrorCategory.SYSTEM,
66
+ ) from e
67
+
68
+
69
+ class UiPathScriptRuntime(UiPathRuntime):
70
+ """Runtime for executing Python scripts."""
71
+
72
+ def __init__(self, context: UiPathRuntimeContext, entrypoint: str):
73
+ executor = ScriptExecutor(entrypoint)
74
+ super().__init__(context, executor)
75
+
76
+ @classmethod
77
+ def from_context(cls, context: UiPathRuntimeContext):
78
+ """Create runtime instance from context."""
79
+ return UiPathScriptRuntime(context, context.entrypoint or "")
@@ -2,72 +2,31 @@
2
2
 
3
3
  import importlib.util
4
4
  import inspect
5
- import json
6
- import logging
7
5
  import os
8
6
  from dataclasses import asdict, is_dataclass
9
- from typing import Any, Dict, Optional, Type, TypeVar, cast, get_type_hints
7
+ from typing import Any, Dict, Type, TypeVar, cast, get_type_hints
10
8
 
11
9
  from pydantic import BaseModel
12
10
 
13
11
  from ._contracts import (
14
- UiPathBaseRuntime,
15
12
  UiPathErrorCategory,
16
13
  UiPathRuntimeError,
17
- UiPathRuntimeResult,
18
- UiPathRuntimeStatus,
19
14
  )
20
15
 
21
- logger = logging.getLogger(__name__)
22
-
23
16
  T = TypeVar("T")
24
17
 
25
18
 
26
- class UiPathRuntime(UiPathBaseRuntime):
27
- """Runtime for executing Python scripts."""
28
-
29
- async def execute(self) -> Optional[UiPathRuntimeResult]:
30
- """Execute the Python script with the provided input and configuration.
31
-
32
- Returns:
33
- Dictionary with execution results
34
-
35
- Raises:
36
- UiPathRuntimeError: If execution fails
37
- """
38
- await self.validate()
39
-
40
- try:
41
- if self.context.entrypoint is None:
42
- return None
43
-
44
- script_result = await self._execute_python_script(
45
- self.context.entrypoint, self.context.input_json
46
- )
47
-
48
- if self.context.job_id is None:
49
- logger.info(script_result)
50
-
51
- self.context.result = UiPathRuntimeResult(
52
- output=script_result, status=UiPathRuntimeStatus.SUCCESSFUL
53
- )
54
-
55
- return self.context.result
56
-
57
- except Exception as e:
58
- if isinstance(e, UiPathRuntimeError):
59
- raise
19
+ class ScriptExecutor:
20
+ def __init__(self, entrypoint: str):
21
+ self.entrypoint = entrypoint
22
+ self.validate_entrypoint()
60
23
 
61
- raise UiPathRuntimeError(
62
- "EXECUTION_ERROR",
63
- "Python script execution failed",
64
- f"Error: {str(e)}",
65
- UiPathErrorCategory.SYSTEM,
66
- ) from e
24
+ async def __call__(self, input: Any) -> Any:
25
+ return await self._execute_python_script(input)
67
26
 
68
- async def validate(self) -> None:
27
+ def validate_entrypoint(self) -> None:
69
28
  """Validate runtime inputs."""
70
- if not self.context.entrypoint:
29
+ if not self.entrypoint:
71
30
  raise UiPathRuntimeError(
72
31
  "ENTRYPOINT_MISSING",
73
32
  "No entrypoint specified",
@@ -75,39 +34,22 @@ class UiPathRuntime(UiPathBaseRuntime):
75
34
  UiPathErrorCategory.USER,
76
35
  )
77
36
 
78
- if not os.path.exists(self.context.entrypoint):
37
+ if not os.path.exists(self.entrypoint):
79
38
  raise UiPathRuntimeError(
80
39
  "ENTRYPOINT_NOT_FOUND",
81
40
  "Script not found",
82
- f"Script not found at path {self.context.entrypoint}.",
41
+ f"Script not found at path {self.entrypoint}.",
83
42
  UiPathErrorCategory.USER,
84
43
  )
85
44
 
86
- try:
87
- if self.context.input:
88
- self.context.input_json = json.loads(self.context.input)
89
- if self.context.input_json is None:
90
- self.context.input_json = {}
91
- except json.JSONDecodeError as e:
92
- raise UiPathRuntimeError(
93
- "INPUT_INVALID_JSON",
94
- "Invalid JSON input",
95
- f"The input data is not valid JSON: {str(e)}",
96
- UiPathErrorCategory.USER,
97
- ) from e
98
-
99
- async def cleanup(self) -> None:
100
- """Cleanup runtime resources."""
101
- pass
102
-
103
- async def _execute_python_script(self, script_path: str, input_data: Any) -> Any:
45
+ async def _execute_python_script(self, input_data: Any) -> Any:
104
46
  """Execute the Python script with the given input."""
105
- spec = importlib.util.spec_from_file_location("dynamic_module", script_path)
47
+ spec = importlib.util.spec_from_file_location("dynamic_module", self.entrypoint)
106
48
  if not spec or not spec.loader:
107
49
  raise UiPathRuntimeError(
108
50
  "IMPORT_ERROR",
109
51
  "Module import failed",
110
- f"Could not load spec for {script_path}",
52
+ f"Could not load spec for {self.entrypoint}",
111
53
  UiPathErrorCategory.USER,
112
54
  )
113
55
 
@@ -202,7 +144,7 @@ class UiPathRuntime(UiPathBaseRuntime):
202
144
  raise UiPathRuntimeError(
203
145
  "ENTRYPOINT_FUNCTION_MISSING",
204
146
  "No entry function found",
205
- f"No main function (main, run, or execute) found in {script_path}",
147
+ f"No main function (main, run, or execute) found in {self.entrypoint}",
206
148
  UiPathErrorCategory.USER,
207
149
  )
208
150
 
@@ -6,7 +6,7 @@ import click
6
6
 
7
7
  from uipath._cli._dev._terminal import UiPathDevTerminal
8
8
  from uipath._cli._runtime._contracts import UiPathRuntimeContext, UiPathRuntimeFactory
9
- from uipath._cli._runtime._runtime import UiPathRuntime
9
+ from uipath._cli._runtime._runtime import UiPathScriptRuntime
10
10
  from uipath._cli._utils._console import ConsoleLogger
11
11
  from uipath._cli._utils._debug import setup_debugging
12
12
  from uipath._cli.cli_init import init # type: ignore[attr-defined]
@@ -53,7 +53,9 @@ def dev(interface: Optional[str], debug: bool, debug_port: int) -> None:
53
53
 
54
54
  try:
55
55
  if interface == "terminal":
56
- runtime_factory = UiPathRuntimeFactory(UiPathRuntime, UiPathRuntimeContext)
56
+ runtime_factory = UiPathRuntimeFactory(
57
+ UiPathScriptRuntime, UiPathRuntimeContext
58
+ )
57
59
  app = UiPathDevTerminal(runtime_factory)
58
60
  asyncio.run(app.run_async())
59
61
  else:
@@ -10,15 +10,16 @@ import click
10
10
  from uipath._cli._evals._runtime import UiPathEvalContext, UiPathEvalRuntime
11
11
  from uipath._cli._runtime._contracts import (
12
12
  UiPathRuntimeContext,
13
- UiPathRuntimeContextBuilder,
14
13
  UiPathRuntimeFactory,
15
14
  )
16
- from uipath._cli._runtime._runtime import UiPathRuntime
15
+ from uipath._cli._runtime._runtime import UiPathScriptRuntime
17
16
  from uipath._cli.middlewares import MiddlewareResult, Middlewares
17
+ from uipath.eval._helpers import auto_discover_entrypoint
18
18
 
19
19
  from .._utils.constants import ENV_JOB_ID
20
20
  from ..telemetry import track
21
21
  from ._utils._console import ConsoleLogger
22
+ from ._utils._eval_set import EvalHelpers
22
23
 
23
24
  console = ConsoleLogger()
24
25
 
@@ -39,42 +40,35 @@ def eval_agent_middleware(
39
40
  no_report: bool = False,
40
41
  **kwargs,
41
42
  ) -> MiddlewareResult:
42
- def generate_eval_context(
43
- runtime_context: UiPathRuntimeContext,
44
- ) -> UiPathEvalContext:
45
- os.makedirs("evals/results", exist_ok=True)
46
- timestamp = datetime.now(timezone.utc).strftime("%M-%H-%d-%m-%Y")
47
- base_context = UiPathRuntimeContextBuilder().with_defaults().build()
48
- # TODO: the name should include the eval_set name. those files should not be commited to SW
49
- base_context.execution_output_file = (
50
- f"evals/results/{timestamp}.json"
51
- if not os.getenv("UIPATH_JOB_KEY")
52
- else None
53
- )
54
- return UiPathEvalContext(
55
- runtime_context=runtime_context,
56
- no_report=no_report,
57
- workers=workers,
58
- eval_set=eval_set,
59
- eval_ids=eval_ids,
60
- **kwargs,
61
- **base_context.model_dump(),
62
- )
43
+ """Middleware to run an evaluation set against the agent."""
44
+ timestamp = datetime.now(timezone.utc).strftime("%M-%H-%d-%m-%Y")
45
+
46
+ eval_context = UiPathEvalContext.with_defaults()
47
+ eval_context.no_report = no_report
48
+ eval_context.workers = workers
49
+ eval_context.eval_set = eval_set or EvalHelpers.auto_discover_eval_set()
50
+ eval_context.eval_ids = eval_ids
51
+ eval_context.execution_output_file = (
52
+ f"evals/results/{timestamp}.json" if not os.getenv("UIPATH_JOB_KEY") else None
53
+ )
54
+
55
+ runtime_entrypoint = entrypoint or auto_discover_entrypoint()
56
+
57
+ def generate_runtime_context(**context_kwargs) -> UiPathRuntimeContext:
58
+ runtime_context = UiPathRuntimeContext.with_defaults(**context_kwargs)
59
+ runtime_context.entrypoint = runtime_entrypoint
60
+ return runtime_context
63
61
 
64
62
  try:
65
- runtime_factory = UiPathRuntimeFactory(UiPathRuntime, UiPathRuntimeContext)
66
- context = (
67
- UiPathRuntimeContextBuilder()
68
- .with_defaults(**kwargs)
69
- .with_entrypoint(entrypoint)
70
- .with_entrypoint(entrypoint)
71
- .mark_eval_run()
72
- .build()
63
+ runtime_factory = UiPathRuntimeFactory(
64
+ UiPathScriptRuntime,
65
+ UiPathRuntimeContext,
66
+ context_generator=generate_runtime_context,
73
67
  )
74
68
 
75
69
  async def execute():
76
70
  async with UiPathEvalRuntime.from_eval_context(
77
- factory=runtime_factory, context=generate_eval_context(context)
71
+ factory=runtime_factory, context=eval_context
78
72
  ) as eval_runtime:
79
73
  await eval_runtime.execute()
80
74