uipath 2.1.60__tar.gz → 2.1.61__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 (311) hide show
  1. {uipath-2.1.60 → uipath-2.1.61}/PKG-INFO +1 -1
  2. {uipath-2.1.60 → uipath-2.1.61}/pyproject.toml +1 -1
  3. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_evals/_models/_output.py +22 -9
  4. uipath-2.1.61/src/uipath/_cli/_evals/_models/_sw_reporting.py +21 -0
  5. uipath-2.1.61/src/uipath/_cli/_evals/_progress_reporter.py +436 -0
  6. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_evals/_runtime.py +103 -10
  7. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_runtime/_contracts.py +11 -4
  8. uipath-2.1.61/src/uipath/_cli/_utils/_folders.py +41 -0
  9. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_eval.py +28 -6
  10. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_invoke.py +5 -2
  11. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_publish.py +4 -3
  12. uipath-2.1.61/src/uipath/_events/_event_bus.py +157 -0
  13. uipath-2.1.61/src/uipath/_events/_events.py +53 -0
  14. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/models/models.py +1 -1
  15. uipath-2.1.61/src/uipath/py.typed +0 -0
  16. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/tracing/_otel_exporters.py +95 -91
  17. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/tracing/_traced.py +16 -0
  18. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/tracing/_utils.py +9 -2
  19. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_invoke.py +1 -1
  20. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_publish.py +3 -5
  21. {uipath-2.1.60 → uipath-2.1.61}/uv.lock +1 -1
  22. uipath-2.1.60/src/uipath/_cli/_utils/_folders.py +0 -35
  23. {uipath-2.1.60 → uipath-2.1.61}/.cursorrules +0 -0
  24. {uipath-2.1.60 → uipath-2.1.61}/.editorconfig +0 -0
  25. {uipath-2.1.60 → uipath-2.1.61}/.gitattributes +0 -0
  26. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/cd.yml +0 -0
  27. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/ci.yml +0 -0
  28. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/commitlint.yml +0 -0
  29. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/integration_tests.yml +0 -0
  30. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/lint.yml +0 -0
  31. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/publish-dev.yml +0 -0
  32. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/publish-docs.yml +0 -0
  33. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/slack.yml +0 -0
  34. {uipath-2.1.60 → uipath-2.1.61}/.github/workflows/test.yml +0 -0
  35. {uipath-2.1.60 → uipath-2.1.61}/.gitignore +0 -0
  36. {uipath-2.1.60 → uipath-2.1.61}/.pre-commit-config.yaml +0 -0
  37. {uipath-2.1.60 → uipath-2.1.61}/.python-version +0 -0
  38. {uipath-2.1.60 → uipath-2.1.61}/.vscode/extensions.json +0 -0
  39. {uipath-2.1.60 → uipath-2.1.61}/.vscode/launch.json +0 -0
  40. {uipath-2.1.60 → uipath-2.1.61}/.vscode/settings.json +0 -0
  41. {uipath-2.1.60 → uipath-2.1.61}/CONTRIBUTING.md +0 -0
  42. {uipath-2.1.60 → uipath-2.1.61}/LICENSE +0 -0
  43. {uipath-2.1.60 → uipath-2.1.61}/README.md +0 -0
  44. {uipath-2.1.60 → uipath-2.1.61}/docs/CONTRIBUTING.md +0 -0
  45. {uipath-2.1.60 → uipath-2.1.61}/docs/FAQ.md +0 -0
  46. {uipath-2.1.60 → uipath-2.1.61}/docs/assets/env-preparation-failed-dark.png +0 -0
  47. {uipath-2.1.60 → uipath-2.1.61}/docs/assets/env-preparation-failed-light.png +0 -0
  48. {uipath-2.1.60 → uipath-2.1.61}/docs/assets/favicon.png +0 -0
  49. {uipath-2.1.60 → uipath-2.1.61}/docs/assets/logo-dark.svg +0 -0
  50. {uipath-2.1.60 → uipath-2.1.61}/docs/assets/logo-light.svg +0 -0
  51. {uipath-2.1.60 → uipath-2.1.61}/docs/cli/index.md +0 -0
  52. {uipath-2.1.60 → uipath-2.1.61}/docs/core/actions.md +0 -0
  53. {uipath-2.1.60 → uipath-2.1.61}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  54. {uipath-2.1.60 → uipath-2.1.61}/docs/core/assets/cloud_env_var_light.gif +0 -0
  55. {uipath-2.1.60 → uipath-2.1.61}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  56. {uipath-2.1.60 → uipath-2.1.61}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  57. {uipath-2.1.60 → uipath-2.1.61}/docs/core/assets/copy_path_dark.png +0 -0
  58. {uipath-2.1.60 → uipath-2.1.61}/docs/core/assets/copy_path_light.png +0 -0
  59. {uipath-2.1.60 → uipath-2.1.61}/docs/core/assets.md +0 -0
  60. {uipath-2.1.60 → uipath-2.1.61}/docs/core/attachments.md +0 -0
  61. {uipath-2.1.60 → uipath-2.1.61}/docs/core/buckets.md +0 -0
  62. {uipath-2.1.60 → uipath-2.1.61}/docs/core/connections.md +0 -0
  63. {uipath-2.1.60 → uipath-2.1.61}/docs/core/context_grounding.md +0 -0
  64. {uipath-2.1.60 → uipath-2.1.61}/docs/core/environment_variables.md +0 -0
  65. {uipath-2.1.60 → uipath-2.1.61}/docs/core/getting_started.md +0 -0
  66. {uipath-2.1.60 → uipath-2.1.61}/docs/core/jobs.md +0 -0
  67. {uipath-2.1.60 → uipath-2.1.61}/docs/core/llm_gateway.md +0 -0
  68. {uipath-2.1.60 → uipath-2.1.61}/docs/core/processes.md +0 -0
  69. {uipath-2.1.60 → uipath-2.1.61}/docs/core/queues.md +0 -0
  70. {uipath-2.1.60 → uipath-2.1.61}/docs/core/traced.md +0 -0
  71. {uipath-2.1.60 → uipath-2.1.61}/docs/hooks.py +0 -0
  72. {uipath-2.1.60 → uipath-2.1.61}/docs/index.md +0 -0
  73. {uipath-2.1.60 → uipath-2.1.61}/docs/javascripts/extra.js +0 -0
  74. {uipath-2.1.60 → uipath-2.1.61}/docs/overrides/main.html +0 -0
  75. {uipath-2.1.60 → uipath-2.1.61}/docs/overrides/partials/actions.html +0 -0
  76. {uipath-2.1.60 → uipath-2.1.61}/docs/overrides/partials/logo.html +0 -0
  77. {uipath-2.1.60 → uipath-2.1.61}/docs/release_policy.md +0 -0
  78. {uipath-2.1.60 → uipath-2.1.61}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  79. {uipath-2.1.60 → uipath-2.1.61}/docs/stylesheets/extra.css +0 -0
  80. {uipath-2.1.60 → uipath-2.1.61}/justfile +0 -0
  81. {uipath-2.1.60 → uipath-2.1.61}/mkdocs.yml +0 -0
  82. {uipath-2.1.60 → uipath-2.1.61}/py.typed +0 -0
  83. {uipath-2.1.60 → uipath-2.1.61}/samples/calculator/README.md +0 -0
  84. {uipath-2.1.60 → uipath-2.1.61}/samples/calculator/main.py +0 -0
  85. {uipath-2.1.60 → uipath-2.1.61}/samples/calculator/pyproject.toml +0 -0
  86. {uipath-2.1.60 → uipath-2.1.61}/samples/event-trigger/.python-version +0 -0
  87. {uipath-2.1.60 → uipath-2.1.61}/samples/event-trigger/README.md +0 -0
  88. {uipath-2.1.60 → uipath-2.1.61}/samples/event-trigger/main.py +0 -0
  89. {uipath-2.1.60 → uipath-2.1.61}/samples/event-trigger/pyproject.toml +0 -0
  90. {uipath-2.1.60 → uipath-2.1.61}/samples/google-ADK-agent/.env.example +0 -0
  91. {uipath-2.1.60 → uipath-2.1.61}/samples/google-ADK-agent/README.md +0 -0
  92. {uipath-2.1.60 → uipath-2.1.61}/samples/google-ADK-agent/input.json +0 -0
  93. {uipath-2.1.60 → uipath-2.1.61}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  94. {uipath-2.1.60 → uipath-2.1.61}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  95. {uipath-2.1.60 → uipath-2.1.61}/samples/google-ADK-agent/pyproject.toml +0 -0
  96. {uipath-2.1.60 → uipath-2.1.61}/samples/google-ADK-agent/uv.lock +0 -0
  97. {uipath-2.1.60 → uipath-2.1.61}/scripts/debug_test.py +0 -0
  98. {uipath-2.1.60 → uipath-2.1.61}/scripts/lint_httpx_client.py +0 -0
  99. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/__init__.py +0 -0
  100. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/README.md +0 -0
  101. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/__init__.py +0 -0
  102. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  103. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/_auth_service.py +0 -0
  104. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
  105. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/_models.py +0 -0
  106. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  107. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  108. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  109. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/_utils.py +0 -0
  110. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/auth_config.json +0 -0
  111. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/index.html +0 -0
  112. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/localhost.crt +0 -0
  113. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_auth/localhost.key +0 -0
  114. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  115. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  116. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  117. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  118. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  119. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  120. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  121. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  122. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  123. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  124. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  125. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  126. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
  127. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  128. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
  129. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  130. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  131. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  132. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_runtime/_logging.py +0 -0
  133. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  134. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
  135. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  136. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_templates/.rels.template +0 -0
  137. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  138. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_templates/main.py.template +0 -0
  139. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  140. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_common.py +0 -0
  141. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_console.py +0 -0
  142. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_constants.py +0 -0
  143. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_debug.py +0 -0
  144. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  145. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_input_args.py +0 -0
  146. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  147. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_processes.py +0 -0
  148. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_project_files.py +0 -0
  149. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  150. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_tracing.py +0 -0
  151. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  152. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_auth.py +0 -0
  153. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_deploy.py +0 -0
  154. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_dev.py +0 -0
  155. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_init.py +0 -0
  156. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_new.py +0 -0
  157. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_pack.py +0 -0
  158. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_pull.py +0 -0
  159. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_push.py +0 -0
  160. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/cli_run.py +0 -0
  161. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/middlewares.py +0 -0
  162. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_cli/spinner.py +0 -0
  163. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_config.py +0 -0
  164. /uipath-2.1.60/src/uipath/py.typed → /uipath-2.1.61/src/uipath/_events/__init__.py +0 -0
  165. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_execution_context.py +0 -0
  166. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_folder_context.py +0 -0
  167. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_resources/AGENTS.md +0 -0
  168. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/__init__.py +0 -0
  169. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/_base_service.py +0 -0
  170. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/actions_service.py +0 -0
  171. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/api_client.py +0 -0
  172. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/assets_service.py +0 -0
  173. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/attachments_service.py +0 -0
  174. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/buckets_service.py +0 -0
  175. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/connections_service.py +0 -0
  176. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/context_grounding_service.py +0 -0
  177. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/entities_service.py +0 -0
  178. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/folder_service.py +0 -0
  179. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/jobs_service.py +0 -0
  180. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/llm_gateway_service.py +0 -0
  181. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/processes_service.py +0 -0
  182. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_services/queues_service.py +0 -0
  183. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_uipath.py +0 -0
  184. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/__init__.py +0 -0
  185. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_endpoint.py +0 -0
  186. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_infer_bindings.py +0 -0
  187. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_logs.py +0 -0
  188. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_read_overwrites.py +0 -0
  189. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_request_override.py +0 -0
  190. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_request_spec.py +0 -0
  191. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_ssl_context.py +0 -0
  192. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_url.py +0 -0
  193. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/_user_agent.py +0 -0
  194. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/_utils/constants.py +0 -0
  195. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/_utils.py +0 -0
  196. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/__init__.py +0 -0
  197. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/async_stream.py +0 -0
  198. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/citation.py +0 -0
  199. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/content.py +0 -0
  200. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/conversation.py +0 -0
  201. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/event.py +0 -0
  202. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/exchange.py +0 -0
  203. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/message.py +0 -0
  204. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/meta.py +0 -0
  205. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/conversation/tool.py +0 -0
  206. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/agent/models/agent.py +0 -0
  207. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/_helpers/__init__.py +0 -0
  208. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/_helpers/helpers.py +0 -0
  209. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/evaluators/__init__.py +0 -0
  210. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
  211. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
  212. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
  213. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
  214. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
  215. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
  216. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/eval/models/__init__.py +0 -0
  217. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/__init__.py +0 -0
  218. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/action_schema.py +0 -0
  219. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/actions.py +0 -0
  220. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/assets.py +0 -0
  221. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/attachment.py +0 -0
  222. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/buckets.py +0 -0
  223. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/connections.py +0 -0
  224. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/context_grounding.py +0 -0
  225. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/context_grounding_index.py +0 -0
  226. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/entities.py +0 -0
  227. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/errors.py +0 -0
  228. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/exceptions.py +0 -0
  229. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/interrupt_models.py +0 -0
  230. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/job.py +0 -0
  231. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/llm_gateway.py +0 -0
  232. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/processes.py +0 -0
  233. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/models/queues.py +0 -0
  234. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/telemetry/__init__.py +0 -0
  235. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/telemetry/_constants.py +0 -0
  236. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/telemetry/_track.py +0 -0
  237. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/tracing/__init__.py +0 -0
  238. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/utils/__init__.py +0 -0
  239. {uipath-2.1.60 → uipath-2.1.61}/src/uipath/utils/_endpoints_manager.py +0 -0
  240. {uipath-2.1.60 → uipath-2.1.61}/testcases/apicalls-testcase/main.py +0 -0
  241. {uipath-2.1.60 → uipath-2.1.61}/testcases/apicalls-testcase/pyproject.toml +0 -0
  242. {uipath-2.1.60 → uipath-2.1.61}/testcases/apicalls-testcase/run.sh +0 -0
  243. {uipath-2.1.60 → uipath-2.1.61}/testcases/apicalls-testcase/src/assert.py +0 -0
  244. {uipath-2.1.60 → uipath-2.1.61}/testcases/basic-testcase/main.py +0 -0
  245. {uipath-2.1.60 → uipath-2.1.61}/testcases/basic-testcase/pyproject.toml +0 -0
  246. {uipath-2.1.60 → uipath-2.1.61}/testcases/basic-testcase/run.sh +0 -0
  247. {uipath-2.1.60 → uipath-2.1.61}/testcases/basic-testcase/src/assert.py +0 -0
  248. {uipath-2.1.60 → uipath-2.1.61}/testcases/common/validate_output.sh +0 -0
  249. {uipath-2.1.60 → uipath-2.1.61}/testcases/langchain-cross/agent.mermaid +0 -0
  250. {uipath-2.1.60 → uipath-2.1.61}/testcases/langchain-cross/langgraph.json +0 -0
  251. {uipath-2.1.60 → uipath-2.1.61}/testcases/langchain-cross/pyproject.toml +0 -0
  252. {uipath-2.1.60 → uipath-2.1.61}/testcases/langchain-cross/run.sh +0 -0
  253. {uipath-2.1.60 → uipath-2.1.61}/testcases/langchain-cross/src/assert.py +0 -0
  254. {uipath-2.1.60 → uipath-2.1.61}/testcases/langchain-cross/src/main.py +0 -0
  255. {uipath-2.1.60 → uipath-2.1.61}/testcases/llamaindex-cross/agent.mermaid +0 -0
  256. {uipath-2.1.60 → uipath-2.1.61}/testcases/llamaindex-cross/llama_index.json +0 -0
  257. {uipath-2.1.60 → uipath-2.1.61}/testcases/llamaindex-cross/pyproject.toml +0 -0
  258. {uipath-2.1.60 → uipath-2.1.61}/testcases/llamaindex-cross/run.sh +0 -0
  259. {uipath-2.1.60 → uipath-2.1.61}/testcases/llamaindex-cross/src/assert.py +0 -0
  260. {uipath-2.1.60 → uipath-2.1.61}/testcases/llamaindex-cross/src/main.py +0 -0
  261. {uipath-2.1.60 → uipath-2.1.61}/tests/__init__.py +0 -0
  262. {uipath-2.1.60 → uipath-2.1.61}/tests/agent/models/test_agent.py +0 -0
  263. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/conftest.py +0 -0
  264. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  265. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/mocks/bindings_script.py +0 -0
  266. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/mocks/pyproject.toml +0 -0
  267. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/mocks/simple_script.py +0 -0
  268. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/mocks/uipath-mock.json +0 -0
  269. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  270. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_auth.py +0 -0
  271. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_hitl.py +0 -0
  272. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_init.py +0 -0
  273. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_init_agents_md.py +0 -0
  274. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_input_args.py +0 -0
  275. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_new.py +0 -0
  276. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_pack.py +0 -0
  277. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  278. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_portal_service_refresh_token.py +0 -0
  279. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_pull.py +0 -0
  280. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_push.py +0 -0
  281. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_run.py +0 -0
  282. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/test_utils.py +0 -0
  283. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/utils/common.py +0 -0
  284. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/utils/project_details.py +0 -0
  285. {uipath-2.1.60 → uipath-2.1.61}/tests/cli/utils/uipath_json.py +0 -0
  286. {uipath-2.1.60 → uipath-2.1.61}/tests/conftest.py +0 -0
  287. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/conftest.py +0 -0
  288. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_actions_service.py +0 -0
  289. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_api_client.py +0 -0
  290. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_assets_service.py +0 -0
  291. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_attachments_service.py +0 -0
  292. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_base_service.py +0 -0
  293. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_buckets_service.py +0 -0
  294. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_connections_service.py +0 -0
  295. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_context_grounding_service.py +0 -0
  296. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_entities_service.py +0 -0
  297. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_folder_service.py +0 -0
  298. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_jobs_service.py +0 -0
  299. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_llm_integration.py +0 -0
  300. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  301. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_llm_service.py +0 -0
  302. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_processes_service.py +0 -0
  303. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_queues_service.py +0 -0
  304. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  305. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/test_bindings_inference.py +0 -0
  306. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/test_config.py +0 -0
  307. {uipath-2.1.60 → uipath-2.1.61}/tests/sdk/test_overwrites.py +0 -0
  308. {uipath-2.1.60 → uipath-2.1.61}/tests/tracing/test_otel_exporters.py +0 -0
  309. {uipath-2.1.60 → uipath-2.1.61}/tests/tracing/test_span_utils.py +0 -0
  310. {uipath-2.1.60 → uipath-2.1.61}/tests/tracing/test_traced.py +0 -0
  311. {uipath-2.1.60 → uipath-2.1.61}/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.60
3
+ Version: 2.1.61
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.60"
3
+ version = "2.1.61"
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"
@@ -62,9 +62,19 @@ class EvaluationRunResultDto(BaseModel):
62
62
  class EvaluationRunResult(BaseModel):
63
63
  model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
64
64
 
65
+ score: float = 0.0
65
66
  evaluation_name: str
66
67
  evaluation_run_results: List[EvaluationRunResultDto]
67
68
 
69
+ def compute_average_score(self) -> None:
70
+ """Compute average score for this single eval_item."""
71
+ if not self.evaluation_run_results:
72
+ self.score = 0.0
73
+ return
74
+
75
+ total_score = sum(dto.result.score for dto in self.evaluation_run_results)
76
+ self.score = total_score / len(self.evaluation_run_results)
77
+
68
78
 
69
79
  class UiPathEvalOutput(BaseModel):
70
80
  model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
@@ -74,12 +84,15 @@ class UiPathEvalOutput(BaseModel):
74
84
  evaluation_set_results: List[EvaluationRunResult]
75
85
 
76
86
  def compute_average_score(self) -> None:
77
- total_score = 0.0
78
- total_count = 0
79
-
80
- for evaluation_set_result in self.evaluation_set_results:
81
- for evaluation_run_result in evaluation_set_result.evaluation_run_results:
82
- total_score += evaluation_run_result.result.score
83
- total_count += 1
84
-
85
- self.score = total_score / total_count if total_count > 0 else 0.0
87
+ """Compute overall average by calling eval_item.compute_average_score()."""
88
+ if not self.evaluation_set_results:
89
+ self.score = 0.0
90
+ return
91
+
92
+ for eval_result in self.evaluation_set_results:
93
+ eval_result.compute_average_score()
94
+
95
+ eval_item_scores = [
96
+ eval_result.score for eval_result in self.evaluation_set_results
97
+ ]
98
+ self.score = sum(eval_item_scores) / len(eval_item_scores)
@@ -0,0 +1,21 @@
1
+ from typing import Any
2
+
3
+ from pydantic import BaseModel, ConfigDict
4
+ from pydantic.alias_generators import to_camel
5
+
6
+ from uipath.eval.models import EvalItemResult
7
+
8
+
9
+ class StudioWebProgressItem(BaseModel):
10
+ eval_run_id: str
11
+ eval_results: list[EvalItemResult]
12
+ success: bool
13
+ agent_output: dict[str, Any]
14
+ agent_execution_time: float
15
+
16
+
17
+ class StudioWebAgentSnapshot(BaseModel):
18
+ model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
19
+
20
+ input_schema: dict[str, Any]
21
+ output_schema: dict[str, Any]
@@ -0,0 +1,436 @@
1
+ """Progress reporter for sending evaluation updates to StudioWeb."""
2
+
3
+ import functools
4
+ import json
5
+ import logging
6
+ import os
7
+ from typing import Any, Dict, List
8
+
9
+ from opentelemetry import trace
10
+
11
+ from uipath import UiPath
12
+ from uipath._cli._evals._models._evaluation_set import EvaluationItem, EvaluationStatus
13
+ from uipath._cli._evals._models._sw_reporting import (
14
+ StudioWebAgentSnapshot,
15
+ StudioWebProgressItem,
16
+ )
17
+ from uipath._cli._utils._console import ConsoleLogger
18
+ from uipath._cli._utils._project_files import ( # type: ignore
19
+ get_project_config,
20
+ )
21
+ from uipath._events._event_bus import EventBus
22
+ from uipath._events._events import (
23
+ EvalRunCreatedEvent,
24
+ EvalRunUpdatedEvent,
25
+ EvalSetRunCreatedEvent,
26
+ EvalSetRunUpdatedEvent,
27
+ EvaluationEvents,
28
+ )
29
+ from uipath._utils import Endpoint, RequestSpec
30
+ from uipath._utils.constants import ENV_TENANT_ID, HEADER_INTERNAL_TENANT_ID
31
+ from uipath.eval.evaluators import BaseEvaluator
32
+ from uipath.eval.models import EvalItemResult, ScoreType
33
+ from uipath.tracing import LlmOpsHttpExporter
34
+
35
+ logger = logging.getLogger(__name__)
36
+
37
+
38
+ def gracefully_handle_errors(func):
39
+ """Decorator to catch and log errors without stopping execution."""
40
+
41
+ @functools.wraps(func)
42
+ async def wrapper(self, *args, **kwargs):
43
+ try:
44
+ return await func(self, *args, **kwargs)
45
+ except Exception as e:
46
+ if hasattr(self, "_console"):
47
+ error_type = type(e).__name__
48
+ logger.warning(
49
+ f"Cannot report progress to SW. "
50
+ f"Function: {func.__name__}, "
51
+ f"Error type: {error_type}, "
52
+ f"Details: {e}"
53
+ )
54
+ return None
55
+
56
+ return wrapper
57
+
58
+
59
+ class StudioWebProgressReporter:
60
+ """Handles reporting evaluation progress to StudioWeb."""
61
+
62
+ def __init__(self):
63
+ logging.getLogger("uipath._cli.middlewares").setLevel(logging.CRITICAL)
64
+ console_logger = ConsoleLogger.get_instance()
65
+ uipath = UiPath()
66
+
67
+ self._client = uipath.api_client
68
+ self._console = console_logger
69
+ self._project_id = os.getenv("UIPATH_PROJECT_ID", None)
70
+ if not self._project_id:
71
+ logger.warning(
72
+ "Cannot report data to StudioWeb. Please set UIPATH_PROJECT_ID."
73
+ )
74
+
75
+ self.eval_set_run_ids: Dict[str, str] = {}
76
+ self.evaluators: Dict[str, Any] = {}
77
+ self.evaluator_scores: Dict[str, List[float]] = {}
78
+ self.eval_run_ids: Dict[str, str] = {}
79
+
80
+ @gracefully_handle_errors
81
+ async def create_eval_set_run(
82
+ self,
83
+ eval_set_id: str,
84
+ agent_snapshot: StudioWebAgentSnapshot,
85
+ no_of_evals: int,
86
+ evaluators: List[BaseEvaluator[Any]],
87
+ ) -> str:
88
+ """Create a new evaluation set run in StudioWeb."""
89
+ spec = self._create_eval_set_run_spec(eval_set_id, agent_snapshot, no_of_evals)
90
+ response = await self._client.request_async(
91
+ method=spec.method,
92
+ url=spec.endpoint,
93
+ params=spec.params,
94
+ json=spec.json,
95
+ headers=spec.headers,
96
+ )
97
+ eval_set_run_id = json.loads(response.content)["id"]
98
+ return eval_set_run_id
99
+
100
+ @gracefully_handle_errors
101
+ async def create_eval_run(
102
+ self, eval_item: EvaluationItem, eval_set_run_id: str
103
+ ) -> str:
104
+ """Create a new evaluation run in StudioWeb.
105
+
106
+ Args:
107
+ eval_item: Dictionary containing evaluation data
108
+ eval_set_run_id: The ID of the evaluation set run
109
+
110
+ Returns:
111
+ The ID of the created evaluation run
112
+ """
113
+ spec = self._create_eval_run_spec(eval_item, eval_set_run_id)
114
+ response = await self._client.request_async(
115
+ method=spec.method,
116
+ url=spec.endpoint,
117
+ params=spec.params,
118
+ json=spec.json,
119
+ headers=spec.headers,
120
+ )
121
+ return json.loads(response.content)["id"]
122
+
123
+ @gracefully_handle_errors
124
+ async def update_eval_run(
125
+ self,
126
+ sw_progress_item: StudioWebProgressItem,
127
+ evaluators: dict[str, BaseEvaluator[Any]],
128
+ ):
129
+ """Update an evaluation run with results."""
130
+ assertion_runs, evaluator_scores = self._collect_results(
131
+ sw_progress_item.eval_results, evaluators
132
+ )
133
+ spec = self._update_eval_run_spec(
134
+ assertion_runs=assertion_runs,
135
+ evaluator_scores=evaluator_scores,
136
+ eval_run_id=sw_progress_item.eval_run_id,
137
+ execution_time=sw_progress_item.agent_execution_time,
138
+ actual_output=sw_progress_item.agent_output,
139
+ )
140
+ await self._client.request_async(
141
+ method=spec.method,
142
+ url=spec.endpoint,
143
+ params=spec.params,
144
+ json=spec.json,
145
+ headers=spec.headers,
146
+ )
147
+
148
+ @gracefully_handle_errors
149
+ async def update_eval_set_run(
150
+ self,
151
+ eval_set_run_id: str,
152
+ evaluator_scores: dict[str, float],
153
+ ):
154
+ """Update the evaluation set run status to complete."""
155
+ spec = self._update_eval_set_run_spec(eval_set_run_id, evaluator_scores)
156
+ await self._client.request_async(
157
+ method=spec.method,
158
+ url=spec.endpoint,
159
+ params=spec.params,
160
+ json=spec.json,
161
+ headers=spec.headers,
162
+ )
163
+
164
+ async def handle_create_eval_set_run(self, payload: EvalSetRunCreatedEvent) -> None:
165
+ try:
166
+ self.evaluators = {eval.id: eval for eval in payload.evaluators}
167
+ self.evaluator_scores = {eval.id: [] for eval in payload.evaluators}
168
+
169
+ eval_set_run_id = await self.create_eval_set_run(
170
+ eval_set_id=payload.eval_set_id,
171
+ agent_snapshot=self._extract_agent_snapshot(payload.entrypoint),
172
+ no_of_evals=payload.no_of_evals,
173
+ evaluators=payload.evaluators,
174
+ )
175
+ self.eval_set_run_ids[payload.execution_id] = eval_set_run_id
176
+ current_span = trace.get_current_span()
177
+ if current_span.is_recording():
178
+ current_span.set_attribute("eval_set_run_id", eval_set_run_id)
179
+
180
+ logger.debug(f"Created eval set run with ID: {eval_set_run_id}")
181
+
182
+ except Exception as e:
183
+ logger.error(f"Failed to handle create eval set run event: {e}")
184
+
185
+ async def handle_create_eval_run(self, payload: EvalRunCreatedEvent) -> None:
186
+ try:
187
+ if eval_set_run_id := self.eval_set_run_ids.get(payload.execution_id):
188
+ eval_run_id = await self.create_eval_run(
189
+ payload.eval_item, eval_set_run_id
190
+ )
191
+ if eval_run_id:
192
+ self.eval_run_ids[payload.execution_id] = eval_run_id
193
+ logger.debug(f"Created eval run with ID: {eval_run_id}")
194
+ else:
195
+ logger.warning("Cannot create eval run: eval_set_run_id not available")
196
+
197
+ except Exception as e:
198
+ logger.error(f"Failed to handle create eval run event: {e}")
199
+
200
+ async def handle_update_eval_run(self, payload: EvalRunUpdatedEvent) -> None:
201
+ try:
202
+ spans_exporter = LlmOpsHttpExporter(
203
+ trace_id=self.eval_set_run_ids.get(payload.execution_id),
204
+ )
205
+
206
+ spans_exporter.export(payload.spans)
207
+
208
+ for eval_result in payload.eval_results:
209
+ evaluator_id = eval_result.evaluator_id
210
+ if evaluator_id in self.evaluator_scores:
211
+ match eval_result.result.score_type:
212
+ case ScoreType.NUMERICAL:
213
+ self.evaluator_scores[evaluator_id].append(
214
+ eval_result.result.score
215
+ )
216
+ case ScoreType.BOOLEAN:
217
+ self.evaluator_scores[evaluator_id].append(
218
+ 100 if eval_result.result.score else 0
219
+ )
220
+ case ScoreType.ERROR:
221
+ self.evaluator_scores[evaluator_id].append(0)
222
+
223
+ eval_run_id = self.eval_run_ids[payload.execution_id]
224
+ if eval_run_id:
225
+ await self.update_eval_run(
226
+ StudioWebProgressItem(
227
+ eval_run_id=eval_run_id,
228
+ eval_results=payload.eval_results,
229
+ success=payload.success,
230
+ agent_output=payload.agent_output,
231
+ agent_execution_time=payload.agent_execution_time,
232
+ ),
233
+ self.evaluators,
234
+ )
235
+
236
+ logger.debug(f"Updated eval run with ID: {eval_run_id}")
237
+
238
+ except Exception as e:
239
+ logger.error(f"Failed to handle update eval run event: {e}")
240
+
241
+ async def handle_update_eval_set_run(self, payload: EvalSetRunUpdatedEvent) -> None:
242
+ try:
243
+ if eval_set_run_id := self.eval_set_run_ids.get(payload.execution_id):
244
+ await self.update_eval_set_run(
245
+ eval_set_run_id,
246
+ payload.evaluator_scores,
247
+ )
248
+ logger.debug(f"Updated eval set run with ID: {eval_set_run_id}")
249
+ else:
250
+ logger.warning(
251
+ "Cannot update eval set run: eval_set_run_id not available"
252
+ )
253
+
254
+ except Exception as e:
255
+ logger.error(f"Failed to handle update eval set run event: {e}")
256
+
257
+ async def subscribe_to_eval_runtime_events(self, event_bus: EventBus) -> None:
258
+ event_bus.subscribe(
259
+ EvaluationEvents.CREATE_EVAL_SET_RUN, self.handle_create_eval_set_run
260
+ )
261
+ event_bus.subscribe(
262
+ EvaluationEvents.CREATE_EVAL_RUN, self.handle_create_eval_run
263
+ )
264
+ event_bus.subscribe(
265
+ EvaluationEvents.UPDATE_EVAL_RUN, self.handle_update_eval_run
266
+ )
267
+ event_bus.subscribe(
268
+ EvaluationEvents.UPDATE_EVAL_SET_RUN, self.handle_update_eval_set_run
269
+ )
270
+
271
+ logger.info("StudioWeb progress reporter subscribed to evaluation events")
272
+
273
+ def _extract_agent_snapshot(self, entrypoint: str) -> StudioWebAgentSnapshot:
274
+ try:
275
+ project_config = get_project_config(os.getcwd())
276
+ ep = None
277
+ for entry_point in project_config.get("entryPoints", []):
278
+ if entry_point.get("filePath") == entrypoint:
279
+ ep = entry_point
280
+ break
281
+
282
+ if not ep:
283
+ logger.warning(
284
+ f"Entrypoint {entrypoint} not found in configuration file"
285
+ )
286
+ return StudioWebAgentSnapshot(input_schema={}, output_schema={})
287
+
288
+ input_schema = ep.get("input", {})
289
+ output_schema = ep.get("output", {})
290
+
291
+ return StudioWebAgentSnapshot(
292
+ input_schema=input_schema, output_schema=output_schema
293
+ )
294
+ except Exception as e:
295
+ logger.warning(f"Failed to extract agent snapshot: {e}")
296
+ return StudioWebAgentSnapshot(input_schema={}, output_schema={})
297
+
298
+ def _collect_results(
299
+ self,
300
+ eval_results: list[EvalItemResult],
301
+ evaluators: dict[str, BaseEvaluator[Any]],
302
+ ) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]:
303
+ assertion_runs: list[dict[str, Any]] = []
304
+ evaluator_scores_list: list[dict[str, Any]] = []
305
+ for eval_result in eval_results:
306
+ evaluator_scores_list.append(
307
+ {
308
+ "type": eval_result.result.score_type.value,
309
+ "value": eval_result.result.score,
310
+ "justification": eval_result.result.details,
311
+ "evaluatorId": eval_result.evaluator_id,
312
+ }
313
+ )
314
+ assertion_runs.append(
315
+ {
316
+ "status": EvaluationStatus.COMPLETED.value,
317
+ "evaluatorId": eval_result.evaluator_id,
318
+ "completionMetrics": {
319
+ "duration": int(eval_result.result.evaluation_time)
320
+ if eval_result.result.evaluation_time
321
+ else 0,
322
+ "cost": None,
323
+ "tokens": 0,
324
+ "completionTokens": 0,
325
+ "promptTokens": 0,
326
+ },
327
+ "assertionSnapshot": {
328
+ "assertionType": evaluators[
329
+ eval_result.evaluator_id
330
+ ].evaluator_type.name,
331
+ "outputKey": evaluators[
332
+ eval_result.evaluator_id
333
+ ].target_output_key,
334
+ },
335
+ }
336
+ )
337
+ return assertion_runs, evaluator_scores_list
338
+
339
+ def _update_eval_run_spec(
340
+ self,
341
+ assertion_runs: list[dict[str, Any]],
342
+ evaluator_scores: list[dict[str, Any]],
343
+ eval_run_id: str,
344
+ actual_output: dict[str, Any],
345
+ execution_time: float,
346
+ ) -> RequestSpec:
347
+ return RequestSpec(
348
+ method="PUT",
349
+ endpoint=Endpoint(
350
+ f"agentsruntime_/api/execution/agents/{self._project_id}/evalRun"
351
+ ),
352
+ json={
353
+ "evalRunId": eval_run_id,
354
+ "status": EvaluationStatus.COMPLETED.value,
355
+ "result": {
356
+ "output": {"content": {**actual_output}},
357
+ "evaluatorScores": evaluator_scores,
358
+ },
359
+ "completionMetrics": {"duration": int(execution_time)},
360
+ "assertionRuns": assertion_runs,
361
+ },
362
+ headers=self._tenant_header(),
363
+ )
364
+
365
+ def _create_eval_run_spec(
366
+ self, eval_item: EvaluationItem, eval_set_run_id: str
367
+ ) -> RequestSpec:
368
+ return RequestSpec(
369
+ method="POST",
370
+ endpoint=Endpoint(
371
+ f"agentsruntime_/api/execution/agents/{self._project_id}/evalRun"
372
+ ),
373
+ json={
374
+ "evalSetRunId": eval_set_run_id,
375
+ "evalSnapshot": {
376
+ "id": eval_item.id,
377
+ "name": eval_item.name,
378
+ "inputs": eval_item.inputs,
379
+ "expectedOutput": eval_item.expected_output,
380
+ },
381
+ "status": EvaluationStatus.IN_PROGRESS.value,
382
+ },
383
+ headers=self._tenant_header(),
384
+ )
385
+
386
+ def _create_eval_set_run_spec(
387
+ self,
388
+ eval_set_id: str,
389
+ agent_snapshot: StudioWebAgentSnapshot,
390
+ no_of_evals: int,
391
+ ) -> RequestSpec:
392
+ return RequestSpec(
393
+ method="POST",
394
+ endpoint=Endpoint(
395
+ f"agentsruntime_/api/execution/agents/{self._project_id}/evalSetRun"
396
+ ),
397
+ json={
398
+ "agentId": self._project_id,
399
+ "evalSetId": eval_set_id,
400
+ "agentSnapshot": agent_snapshot.model_dump(by_alias=True),
401
+ "status": EvaluationStatus.IN_PROGRESS.value,
402
+ "numberOfEvalsExecuted": no_of_evals,
403
+ },
404
+ headers=self._tenant_header(),
405
+ )
406
+
407
+ def _update_eval_set_run_spec(
408
+ self,
409
+ eval_set_run_id: str,
410
+ evaluator_scores: dict[str, float],
411
+ ) -> RequestSpec:
412
+ evaluator_scores_list = [
413
+ {"value": avg_score, "evaluatorId": evaluator_id}
414
+ for evaluator_id, avg_score in evaluator_scores.items()
415
+ ]
416
+
417
+ return RequestSpec(
418
+ method="PUT",
419
+ endpoint=Endpoint(
420
+ f"agentsruntime_/api/execution/agents/{self._project_id}/evalSetRun"
421
+ ),
422
+ json={
423
+ "evalSetRunId": eval_set_run_id,
424
+ "status": EvaluationStatus.COMPLETED.value,
425
+ "evaluatorScores": evaluator_scores_list,
426
+ },
427
+ headers=self._tenant_header(),
428
+ )
429
+
430
+ def _tenant_header(self) -> dict[str, str]:
431
+ tenant_id = os.getenv(ENV_TENANT_ID, None)
432
+ if not tenant_id:
433
+ self._console.error(
434
+ f"{ENV_TENANT_ID} env var is not set. Please run 'uipath auth'."
435
+ )
436
+ return {HEADER_INTERNAL_TENANT_ID: tenant_id} # type: ignore