uipath 2.1.81__tar.gz → 2.1.83__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of uipath might be problematic. Click here for more details.

Files changed (350) hide show
  1. {uipath-2.1.81 → uipath-2.1.83}/PKG-INFO +1 -1
  2. {uipath-2.1.81 → uipath-2.1.83}/pyproject.toml +1 -1
  3. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_auth_server.py +15 -12
  4. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_auth_service.py +9 -3
  5. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_oidc_utils.py +4 -8
  6. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_runtime.py +38 -6
  7. uipath-2.1.83/src/uipath/_cli/_evals/_span_collection.py +24 -0
  8. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/llm_mocker.py +16 -2
  9. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocks.py +25 -6
  10. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/telemetry/_track.py +1 -0
  11. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/tracing/_utils.py +52 -0
  12. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/eval/mocks/test_mocks.py +12 -9
  13. uipath-2.1.83/tests/cli/test_oidc_utils.py +96 -0
  14. {uipath-2.1.81 → uipath-2.1.83}/uv.lock +1 -1
  15. {uipath-2.1.81 → uipath-2.1.83}/.cursorrules +0 -0
  16. {uipath-2.1.81 → uipath-2.1.83}/.editorconfig +0 -0
  17. {uipath-2.1.81 → uipath-2.1.83}/.gitattributes +0 -0
  18. {uipath-2.1.81 → uipath-2.1.83}/.github/labeler.yml +0 -0
  19. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/auto-label.yml +0 -0
  20. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/cd.yml +0 -0
  21. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/ci.yml +0 -0
  22. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/commitlint.yml +0 -0
  23. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/integration_tests.yml +0 -0
  24. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/lint.yml +0 -0
  25. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/publish-dev.yml +0 -0
  26. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/publish-docs.yml +0 -0
  27. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/slack.yml +0 -0
  28. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/test-uipath-langchain.yml +0 -0
  29. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/test-uipath-llamaindex.yml +0 -0
  30. {uipath-2.1.81 → uipath-2.1.83}/.github/workflows/test.yml +0 -0
  31. {uipath-2.1.81 → uipath-2.1.83}/.gitignore +0 -0
  32. {uipath-2.1.81 → uipath-2.1.83}/.pre-commit-config.yaml +0 -0
  33. {uipath-2.1.81 → uipath-2.1.83}/.python-version +0 -0
  34. {uipath-2.1.81 → uipath-2.1.83}/.vscode/extensions.json +0 -0
  35. {uipath-2.1.81 → uipath-2.1.83}/.vscode/launch.json +0 -0
  36. {uipath-2.1.81 → uipath-2.1.83}/.vscode/settings.json +0 -0
  37. {uipath-2.1.81 → uipath-2.1.83}/CONTRIBUTING.md +0 -0
  38. {uipath-2.1.81 → uipath-2.1.83}/LICENSE +0 -0
  39. {uipath-2.1.81 → uipath-2.1.83}/README.md +0 -0
  40. {uipath-2.1.81 → uipath-2.1.83}/docs/CONTRIBUTING.md +0 -0
  41. {uipath-2.1.81 → uipath-2.1.83}/docs/FAQ.md +0 -0
  42. {uipath-2.1.81 → uipath-2.1.83}/docs/assets/env-preparation-failed-dark.png +0 -0
  43. {uipath-2.1.81 → uipath-2.1.83}/docs/assets/env-preparation-failed-light.png +0 -0
  44. {uipath-2.1.81 → uipath-2.1.83}/docs/assets/favicon.png +0 -0
  45. {uipath-2.1.81 → uipath-2.1.83}/docs/assets/llms.txt +0 -0
  46. {uipath-2.1.81 → uipath-2.1.83}/docs/assets/logo-dark.svg +0 -0
  47. {uipath-2.1.81 → uipath-2.1.83}/docs/assets/logo-light.svg +0 -0
  48. {uipath-2.1.81 → uipath-2.1.83}/docs/cli/index.md +0 -0
  49. {uipath-2.1.81 → uipath-2.1.83}/docs/core/actions.md +0 -0
  50. {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  51. {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/cloud_env_var_light.gif +0 -0
  52. {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  53. {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  54. {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/copy_path_dark.png +0 -0
  55. {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets/copy_path_light.png +0 -0
  56. {uipath-2.1.81 → uipath-2.1.83}/docs/core/assets.md +0 -0
  57. {uipath-2.1.81 → uipath-2.1.83}/docs/core/attachments.md +0 -0
  58. {uipath-2.1.81 → uipath-2.1.83}/docs/core/buckets.md +0 -0
  59. {uipath-2.1.81 → uipath-2.1.83}/docs/core/connections.md +0 -0
  60. {uipath-2.1.81 → uipath-2.1.83}/docs/core/context_grounding.md +0 -0
  61. {uipath-2.1.81 → uipath-2.1.83}/docs/core/documents.md +0 -0
  62. {uipath-2.1.81 → uipath-2.1.83}/docs/core/documents_models.md +0 -0
  63. {uipath-2.1.81 → uipath-2.1.83}/docs/core/environment_variables.md +0 -0
  64. {uipath-2.1.81 → uipath-2.1.83}/docs/core/getting_started.md +0 -0
  65. {uipath-2.1.81 → uipath-2.1.83}/docs/core/jobs.md +0 -0
  66. {uipath-2.1.81 → uipath-2.1.83}/docs/core/llm_gateway.md +0 -0
  67. {uipath-2.1.81 → uipath-2.1.83}/docs/core/processes.md +0 -0
  68. {uipath-2.1.81 → uipath-2.1.83}/docs/core/queues.md +0 -0
  69. {uipath-2.1.81 → uipath-2.1.83}/docs/core/traced.md +0 -0
  70. {uipath-2.1.81 → uipath-2.1.83}/docs/hooks.py +0 -0
  71. {uipath-2.1.81 → uipath-2.1.83}/docs/index.md +0 -0
  72. {uipath-2.1.81 → uipath-2.1.83}/docs/javascripts/extra.js +0 -0
  73. {uipath-2.1.81 → uipath-2.1.83}/docs/overrides/main.html +0 -0
  74. {uipath-2.1.81 → uipath-2.1.83}/docs/overrides/partials/actions.html +0 -0
  75. {uipath-2.1.81 → uipath-2.1.83}/docs/overrides/partials/logo.html +0 -0
  76. {uipath-2.1.81 → uipath-2.1.83}/docs/release_policy.md +0 -0
  77. {uipath-2.1.81 → uipath-2.1.83}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  78. {uipath-2.1.81 → uipath-2.1.83}/docs/stylesheets/extra.css +0 -0
  79. {uipath-2.1.81 → uipath-2.1.83}/justfile +0 -0
  80. {uipath-2.1.81 → uipath-2.1.83}/mkdocs.yml +0 -0
  81. {uipath-2.1.81 → uipath-2.1.83}/py.typed +0 -0
  82. {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/.env.example +0 -0
  83. {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/README.md +0 -0
  84. {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/input.json +0 -0
  85. {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/main.py +0 -0
  86. {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/pyproject.toml +0 -0
  87. {uipath-2.1.81 → uipath-2.1.83}/samples/asset-modifier-agent/uv.lock +0 -0
  88. {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/README.md +0 -0
  89. {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/evals/eval-sets/default.json +0 -0
  90. {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/evals/evaluators/equality.json +0 -0
  91. {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
  92. {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/main.py +0 -0
  93. {uipath-2.1.81 → uipath-2.1.83}/samples/calculator/pyproject.toml +0 -0
  94. {uipath-2.1.81 → uipath-2.1.83}/samples/event-trigger/.python-version +0 -0
  95. {uipath-2.1.81 → uipath-2.1.83}/samples/event-trigger/README.md +0 -0
  96. {uipath-2.1.81 → uipath-2.1.83}/samples/event-trigger/main.py +0 -0
  97. {uipath-2.1.81 → uipath-2.1.83}/samples/event-trigger/pyproject.toml +0 -0
  98. {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/.env.example +0 -0
  99. {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/README.md +0 -0
  100. {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/input.json +0 -0
  101. {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  102. {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  103. {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/pyproject.toml +0 -0
  104. {uipath-2.1.81 → uipath-2.1.83}/samples/google-ADK-agent/uv.lock +0 -0
  105. {uipath-2.1.81 → uipath-2.1.83}/scripts/debug_test.py +0 -0
  106. {uipath-2.1.81 → uipath-2.1.83}/scripts/lint_httpx_client.py +0 -0
  107. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/__init__.py +0 -0
  108. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/README.md +0 -0
  109. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/__init__.py +0 -0
  110. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_models.py +0 -0
  111. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  112. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  113. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/_utils.py +0 -0
  114. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/auth_config.json +0 -0
  115. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/index.html +0 -0
  116. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/localhost.crt +0 -0
  117. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_auth/localhost.key +0 -0
  118. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  119. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  120. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  121. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  122. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  123. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  124. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  125. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  126. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  127. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  128. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  129. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  130. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
  131. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
  132. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  133. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
  134. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
  135. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
  136. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
  137. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_output.py +0 -0
  138. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
  139. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
  140. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
  141. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
  142. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
  143. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
  144. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  145. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_contracts.py +0 -0
  146. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  147. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  148. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_logging.py +0 -0
  149. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  150. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
  151. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  152. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/.rels.template +0 -0
  153. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  154. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/main.py.template +0 -0
  155. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  156. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_common.py +0 -0
  157. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_console.py +0 -0
  158. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_constants.py +0 -0
  159. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_debug.py +0 -0
  160. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  161. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_folders.py +0 -0
  162. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_input_args.py +0 -0
  163. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  164. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_processes.py +0 -0
  165. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_project_files.py +0 -0
  166. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  167. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_tracing.py +0 -0
  168. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  169. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_auth.py +0 -0
  170. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_deploy.py +0 -0
  171. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_dev.py +0 -0
  172. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_eval.py +0 -0
  173. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_init.py +0 -0
  174. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_invoke.py +0 -0
  175. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_new.py +0 -0
  176. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_pack.py +0 -0
  177. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_publish.py +0 -0
  178. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_pull.py +0 -0
  179. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_push.py +0 -0
  180. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/cli_run.py +0 -0
  181. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/middlewares.py +0 -0
  182. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_cli/spinner.py +0 -0
  183. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_config.py +0 -0
  184. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_events/__init__.py +0 -0
  185. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_events/_event_bus.py +0 -0
  186. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_events/_events.py +0 -0
  187. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_execution_context.py +0 -0
  188. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_folder_context.py +0 -0
  189. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_resources/AGENTS.md +0 -0
  190. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/__init__.py +0 -0
  191. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/_base_service.py +0 -0
  192. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/actions_service.py +0 -0
  193. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/api_client.py +0 -0
  194. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/assets_service.py +0 -0
  195. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/attachments_service.py +0 -0
  196. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/buckets_service.py +0 -0
  197. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/connections_service.py +0 -0
  198. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/context_grounding_service.py +0 -0
  199. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/documents_service.py +0 -0
  200. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/entities_service.py +0 -0
  201. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/external_application_service.py +0 -0
  202. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/folder_service.py +0 -0
  203. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/jobs_service.py +0 -0
  204. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/llm_gateway_service.py +0 -0
  205. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/processes_service.py +0 -0
  206. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_services/queues_service.py +0 -0
  207. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_uipath.py +0 -0
  208. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/__init__.py +0 -0
  209. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_auth.py +0 -0
  210. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_endpoint.py +0 -0
  211. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_infer_bindings.py +0 -0
  212. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_logs.py +0 -0
  213. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_read_overwrites.py +0 -0
  214. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_request_override.py +0 -0
  215. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_request_spec.py +0 -0
  216. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_ssl_context.py +0 -0
  217. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_url.py +0 -0
  218. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/_user_agent.py +0 -0
  219. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/_utils/constants.py +0 -0
  220. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/_utils.py +0 -0
  221. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/__init__.py +0 -0
  222. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/async_stream.py +0 -0
  223. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/citation.py +0 -0
  224. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/content.py +0 -0
  225. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/conversation.py +0 -0
  226. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/event.py +0 -0
  227. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/exchange.py +0 -0
  228. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/message.py +0 -0
  229. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/meta.py +0 -0
  230. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/conversation/tool.py +0 -0
  231. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/agent/models/agent.py +0 -0
  232. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/_helpers/__init__.py +0 -0
  233. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/_helpers/helpers.py +0 -0
  234. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/__init__.py +0 -0
  235. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
  236. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
  237. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
  238. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
  239. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
  240. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
  241. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/mocks/__init__.py +0 -0
  242. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/mocks/mockable.py +0 -0
  243. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/models/__init__.py +0 -0
  244. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/eval/models/models.py +0 -0
  245. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/__init__.py +0 -0
  246. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/action_schema.py +0 -0
  247. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/actions.py +0 -0
  248. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/assets.py +0 -0
  249. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/attachment.py +0 -0
  250. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/auth.py +0 -0
  251. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/buckets.py +0 -0
  252. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/connections.py +0 -0
  253. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/context_grounding.py +0 -0
  254. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/context_grounding_index.py +0 -0
  255. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/documents.py +0 -0
  256. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/entities.py +0 -0
  257. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/errors.py +0 -0
  258. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/exceptions.py +0 -0
  259. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/interrupt_models.py +0 -0
  260. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/job.py +0 -0
  261. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/llm_gateway.py +0 -0
  262. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/processes.py +0 -0
  263. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/models/queues.py +0 -0
  264. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/py.typed +0 -0
  265. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/telemetry/__init__.py +0 -0
  266. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/telemetry/_constants.py +0 -0
  267. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/tracing/__init__.py +0 -0
  268. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/tracing/_otel_exporters.py +0 -0
  269. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/tracing/_traced.py +0 -0
  270. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/utils/__init__.py +0 -0
  271. {uipath-2.1.81 → uipath-2.1.83}/src/uipath/utils/_endpoints_manager.py +0 -0
  272. {uipath-2.1.81 → uipath-2.1.83}/testcases/apicalls-testcase/main.py +0 -0
  273. {uipath-2.1.81 → uipath-2.1.83}/testcases/apicalls-testcase/pyproject.toml +0 -0
  274. {uipath-2.1.81 → uipath-2.1.83}/testcases/apicalls-testcase/run.sh +0 -0
  275. {uipath-2.1.81 → uipath-2.1.83}/testcases/apicalls-testcase/src/assert.py +0 -0
  276. {uipath-2.1.81 → uipath-2.1.83}/testcases/basic-testcase/main.py +0 -0
  277. {uipath-2.1.81 → uipath-2.1.83}/testcases/basic-testcase/pyproject.toml +0 -0
  278. {uipath-2.1.81 → uipath-2.1.83}/testcases/basic-testcase/run.sh +0 -0
  279. {uipath-2.1.81 → uipath-2.1.83}/testcases/basic-testcase/src/assert.py +0 -0
  280. {uipath-2.1.81 → uipath-2.1.83}/testcases/common/validate_output.sh +0 -0
  281. {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/agent.mermaid +0 -0
  282. {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/langgraph.json +0 -0
  283. {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/pyproject.toml +0 -0
  284. {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/run.sh +0 -0
  285. {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/src/assert.py +0 -0
  286. {uipath-2.1.81 → uipath-2.1.83}/testcases/langchain-cross/src/main.py +0 -0
  287. {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/agent.mermaid +0 -0
  288. {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/llama_index.json +0 -0
  289. {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/pyproject.toml +0 -0
  290. {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/run.sh +0 -0
  291. {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/src/assert.py +0 -0
  292. {uipath-2.1.81 → uipath-2.1.83}/testcases/llamaindex-cross/src/main.py +0 -0
  293. {uipath-2.1.81 → uipath-2.1.83}/tests/__init__.py +0 -0
  294. {uipath-2.1.81 → uipath-2.1.83}/tests/agent/models/test_agent.py +0 -0
  295. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/conftest.py +0 -0
  296. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  297. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/bindings_script.py +0 -0
  298. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/pyproject.toml +0 -0
  299. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/simple_script.py +0 -0
  300. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/uipath-mock.json +0 -0
  301. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  302. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_auth.py +0 -0
  303. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_hitl.py +0 -0
  304. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_init.py +0 -0
  305. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_init_agents_md.py +0 -0
  306. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_input_args.py +0 -0
  307. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_invoke.py +0 -0
  308. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_new.py +0 -0
  309. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_pack.py +0 -0
  310. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  311. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_portal_service_refresh_token.py +0 -0
  312. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_publish.py +0 -0
  313. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_pull.py +0 -0
  314. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_push.py +0 -0
  315. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_run.py +0 -0
  316. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/test_utils.py +0 -0
  317. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/utils/common.py +0 -0
  318. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/utils/project_details.py +0 -0
  319. {uipath-2.1.81 → uipath-2.1.83}/tests/cli/utils/uipath_json.py +0 -0
  320. {uipath-2.1.81 → uipath-2.1.83}/tests/conftest.py +0 -0
  321. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/conftest.py +0 -0
  322. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_actions_service.py +0 -0
  323. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_api_client.py +0 -0
  324. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_assets_service.py +0 -0
  325. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_attachments_service.py +0 -0
  326. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_base_service.py +0 -0
  327. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_buckets_service.py +0 -0
  328. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_connections_service.py +0 -0
  329. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_context_grounding_service.py +0 -0
  330. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_documents_service.py +0 -0
  331. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_entities_service.py +0 -0
  332. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_external_application_service.py +0 -0
  333. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_folder_service.py +0 -0
  334. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_jobs_service.py +0 -0
  335. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_llm_integration.py +0 -0
  336. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  337. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_llm_service.py +0 -0
  338. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_processes_service.py +0 -0
  339. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_queues_service.py +0 -0
  340. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  341. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
  342. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
  343. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
  344. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/test_bindings_inference.py +0 -0
  345. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/test_config.py +0 -0
  346. {uipath-2.1.81 → uipath-2.1.83}/tests/sdk/test_overwrites.py +0 -0
  347. {uipath-2.1.81 → uipath-2.1.83}/tests/tracing/test_otel_exporters.py +0 -0
  348. {uipath-2.1.81 → uipath-2.1.83}/tests/tracing/test_span_utils.py +0 -0
  349. {uipath-2.1.81 → uipath-2.1.83}/tests/tracing/test_traced.py +0 -0
  350. {uipath-2.1.81 → uipath-2.1.83}/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.81
3
+ Version: 2.1.83
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.81"
3
+ version = "2.1.83"
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"
@@ -7,8 +7,6 @@ import threading
7
7
  import time
8
8
  from typing import Optional
9
9
 
10
- from ._oidc_utils import OidcUtils
11
-
12
10
  # Server port
13
11
  PORT = 6234
14
12
 
@@ -22,7 +20,9 @@ class TokenReceivedSignal(Exception):
22
20
  super().__init__("Token received successfully")
23
21
 
24
22
 
25
- def make_request_handler_class(state, code_verifier, token_callback, domain):
23
+ def make_request_handler_class(
24
+ state, code_verifier, token_callback, domain, redirect_uri, client_id
25
+ ):
26
26
  class SimpleHTTPSRequestHandler(http.server.SimpleHTTPRequestHandler):
27
27
  """Simple HTTPS request handler that serves static files."""
28
28
 
@@ -73,16 +73,10 @@ def make_request_handler_class(state, code_verifier, token_callback, domain):
73
73
  with open(index_path, "r") as f:
74
74
  content = f.read()
75
75
 
76
- # Get the redirect URI from auth config
77
- auth_config = OidcUtils.get_auth_config()
78
- redirect_uri = auth_config["redirect_uri"]
79
-
80
76
  content = content.replace("__PY_REPLACE_EXPECTED_STATE__", state)
81
77
  content = content.replace("__PY_REPLACE_CODE_VERIFIER__", code_verifier)
82
78
  content = content.replace("__PY_REPLACE_REDIRECT_URI__", redirect_uri)
83
- content = content.replace(
84
- "__PY_REPLACE_CLIENT_ID__", auth_config["client_id"]
85
- )
79
+ content = content.replace("__PY_REPLACE_CLIENT_ID__", client_id)
86
80
  content = content.replace("__PY_REPLACE_DOMAIN__", domain)
87
81
 
88
82
  self.send_response(200)
@@ -107,14 +101,18 @@ def make_request_handler_class(state, code_verifier, token_callback, domain):
107
101
 
108
102
 
109
103
  class HTTPServer:
110
- def __init__(self, port=6234):
104
+ def __init__(self, port=6234, redirect_uri=None, client_id=None):
111
105
  """Initialize HTTP server with configurable parameters.
112
106
 
113
107
  Args:
114
108
  port (int, optional): Port number to run the server on. Defaults to 6234.
109
+ redirect_uri (str, optional): OAuth redirect URI. Defaults to None.
110
+ client_id (str, optional): OAuth client ID. Defaults to None.
115
111
  """
116
112
  self.current_path = os.path.dirname(os.path.abspath(__file__))
117
113
  self.port = port
114
+ self.redirect_uri = redirect_uri
115
+ self.client_id = client_id
118
116
  self.httpd: Optional[socketserver.TCPServer] = None
119
117
  self.token_data = None
120
118
  self.should_shutdown = False
@@ -145,7 +143,12 @@ class HTTPServer:
145
143
  # Create server with address reuse
146
144
  socketserver.TCPServer.allow_reuse_address = True
147
145
  handler = make_request_handler_class(
148
- state, code_verifier, self.token_received_callback, domain
146
+ state,
147
+ code_verifier,
148
+ self.token_received_callback,
149
+ domain,
150
+ self.redirect_uri,
151
+ self.client_id,
149
152
  )
150
153
  self.httpd = socketserver.TCPServer(("", self.port), handler)
151
154
  return self.httpd
@@ -121,11 +121,17 @@ class AuthService:
121
121
  return False
122
122
 
123
123
  def _perform_oauth_flow(self) -> TokenData:
124
- auth_url, code_verifier, state = OidcUtils.get_auth_url(self._domain)
124
+ auth_config = OidcUtils.get_auth_config()
125
+ auth_url, code_verifier, state = OidcUtils.get_auth_url(
126
+ self._domain, auth_config
127
+ )
125
128
  self._open_browser(auth_url)
126
129
 
127
- auth_config = OidcUtils.get_auth_config()
128
- server = HTTPServer(port=auth_config["port"])
130
+ server = HTTPServer(
131
+ port=auth_config["port"],
132
+ redirect_uri=auth_config["redirect_uri"],
133
+ client_id=auth_config["client_id"],
134
+ )
129
135
  token_data = asyncio.run(server.start(state, code_verifier, self._domain))
130
136
 
131
137
  if not token_data:
@@ -49,12 +49,8 @@ class OidcUtils:
49
49
  ) as f:
50
50
  auth_config = json.load(f)
51
51
 
52
- candidates = [
53
- int(auth_config.get("port", 8104)),
54
- int(auth_config.get("portOptionOne", 8104)),
55
- int(auth_config.get("portOptionTwo", 8055)),
56
- int(auth_config.get("portOptionThree", 42042)),
57
- ]
52
+ custom_port = os.getenv("UIPATH_AUTH_PORT")
53
+ candidates = [int(custom_port)] if custom_port else [8104, 8055, 42042]
58
54
 
59
55
  port = cls._find_free_port(candidates)
60
56
  if port is None:
@@ -75,11 +71,12 @@ class OidcUtils:
75
71
  )
76
72
 
77
73
  @classmethod
78
- def get_auth_url(cls, domain: str) -> tuple[str, str, str]:
74
+ def get_auth_url(cls, domain: str, auth_config: AuthConfig) -> tuple[str, str, str]:
79
75
  """Get the authorization URL for OAuth2 PKCE flow.
80
76
 
81
77
  Args:
82
78
  domain (str): The UiPath domain to authenticate against (e.g. 'alpha', 'cloud')
79
+ auth_config (AuthConfig): The authentication configuration to use
83
80
 
84
81
  Returns:
85
82
  tuple[str, str]: A tuple containing:
@@ -87,7 +84,6 @@ class OidcUtils:
87
84
  - The code verifier for PKCE flow
88
85
  """
89
86
  code_verifier, code_challenge = generate_code_verifier_and_challenge()
90
- auth_config = cls.get_auth_config()
91
87
  state = get_state_param()
92
88
  query_params = {
93
89
  "client_id": auth_config["client_id"],
@@ -7,7 +7,8 @@ from pathlib import Path
7
7
  from time import time
8
8
  from typing import Any, Dict, Generic, List, Optional, Sequence, TypeVar
9
9
 
10
- from opentelemetry.sdk.trace import ReadableSpan
10
+ from opentelemetry import context as context_api
11
+ from opentelemetry.sdk.trace import ReadableSpan, Span
11
12
  from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
12
13
 
13
14
  from ..._events._event_bus import EventBus
@@ -24,6 +25,7 @@ from ...eval.models import EvaluationResult
24
25
  from ...eval.models.models import AgentExecution, EvalItemResult
25
26
  from .._runtime._contracts import (
26
27
  UiPathBaseRuntime,
28
+ UiPathExecutionBatchTraceProcessor,
27
29
  UiPathRuntimeContext,
28
30
  UiPathRuntimeFactory,
29
31
  UiPathRuntimeResult,
@@ -41,7 +43,11 @@ from ._models._output import (
41
43
  UiPathEvalOutput,
42
44
  UiPathEvalRunExecutionOutput,
43
45
  )
44
- from .mocks.mocks import set_evaluation_item
46
+ from ._span_collection import ExecutionSpanCollector
47
+ from .mocks.mocks import (
48
+ clear_execution_context,
49
+ set_execution_context,
50
+ )
45
51
 
46
52
  T = TypeVar("T", bound=UiPathBaseRuntime)
47
53
  C = TypeVar("C", bound=UiPathRuntimeContext)
@@ -78,6 +84,24 @@ class ExecutionSpanExporter(SpanExporter):
78
84
  self.clear()
79
85
 
80
86
 
87
+ class ExecutionSpanProcessor(UiPathExecutionBatchTraceProcessor):
88
+ """Span processor that adds spans to ExecutionSpanCollector when they start."""
89
+
90
+ def __init__(self, span_exporter: SpanExporter, collector: ExecutionSpanCollector):
91
+ super().__init__(span_exporter)
92
+ self.collector = collector
93
+
94
+ def on_start(
95
+ self, span: Span, parent_context: Optional[context_api.Context] = None
96
+ ) -> None:
97
+ super().on_start(span, parent_context)
98
+
99
+ if span.attributes and "execution.id" in span.attributes:
100
+ exec_id = span.attributes["execution.id"]
101
+ if isinstance(exec_id, str):
102
+ self.collector.add_span(span, exec_id)
103
+
104
+
81
105
  class ExecutionLogsExporter:
82
106
  """Custom exporter that stores multiple execution log handlers."""
83
107
 
@@ -127,8 +151,15 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
127
151
  self.context: UiPathEvalContext = context
128
152
  self.factory: UiPathRuntimeFactory[T, C] = factory
129
153
  self.event_bus: EventBus = event_bus
154
+
130
155
  self.span_exporter: ExecutionSpanExporter = ExecutionSpanExporter()
131
- self.factory.add_span_exporter(self.span_exporter)
156
+ self.span_collector: ExecutionSpanCollector = ExecutionSpanCollector()
157
+
158
+ # Span processor feeds both exporter and collector
159
+ span_processor = ExecutionSpanProcessor(self.span_exporter, self.span_collector)
160
+ self.factory.tracer_span_processors.append(span_processor)
161
+ self.factory.tracer_provider.add_span_processor(span_processor)
162
+
132
163
  self.logs_exporter: ExecutionLogsExporter = ExecutionLogsExporter()
133
164
  self.execution_id = str(uuid.uuid4())
134
165
 
@@ -180,7 +211,6 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
180
211
  evaluation_set_name=evaluation_set.name,
181
212
  evaluation_set_results=eval_run_result_list,
182
213
  )
183
-
184
214
  # Computing evaluator averages
185
215
  evaluator_averages: Dict[str, float] = defaultdict(float)
186
216
  evaluator_count: Dict[str, int] = defaultdict(int)
@@ -194,7 +224,6 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
194
224
  evaluator_averages[eval_id] = (
195
225
  evaluator_averages[eval_id] / evaluator_count[eval_id]
196
226
  )
197
-
198
227
  await event_bus.publish(
199
228
  EvaluationEvents.UPDATE_EVAL_SET_RUN,
200
229
  EvalSetRunUpdatedEvent(
@@ -289,7 +318,7 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
289
318
  evaluators: List[BaseEvaluator[Any]],
290
319
  event_bus: EventBus,
291
320
  ) -> EvaluationRunResult:
292
- set_evaluation_item(eval_item)
321
+ set_execution_context(eval_item, self.span_collector)
293
322
 
294
323
  await event_bus.publish(
295
324
  EvaluationEvents.CREATE_EVAL_RUN,
@@ -383,6 +412,8 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
383
412
  eval_run_updated_event,
384
413
  wait_for_completion=False,
385
414
  )
415
+ finally:
416
+ clear_execution_context()
386
417
 
387
418
  return evaluation_run_results
388
419
 
@@ -391,6 +422,7 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
391
422
  ) -> tuple[List[ReadableSpan], list[logging.LogRecord]]:
392
423
  spans = self.span_exporter.get_spans(execution_id)
393
424
  self.span_exporter.clear(execution_id)
425
+ self.span_collector.clear(execution_id)
394
426
 
395
427
  logs = self.logs_exporter.get_logs(execution_id)
396
428
  self.logs_exporter.clear(execution_id)
@@ -0,0 +1,24 @@
1
+ from collections import defaultdict
2
+ from typing import Dict, List, Optional
3
+
4
+ from opentelemetry.sdk.trace import ReadableSpan, Span
5
+
6
+
7
+ class ExecutionSpanCollector:
8
+ """Collects spans as they are created during execution."""
9
+
10
+ def __init__(self):
11
+ # { execution_id -> list of spans }
12
+ self._spans: Dict[str, List[ReadableSpan]] = defaultdict(list)
13
+
14
+ def add_span(self, span: Span, execution_id: str) -> None:
15
+ self._spans[execution_id].append(span)
16
+
17
+ def get_spans(self, execution_id: str) -> List[ReadableSpan]:
18
+ return self._spans.get(execution_id, [])
19
+
20
+ def clear(self, execution_id: Optional[str] = None) -> None:
21
+ if execution_id:
22
+ self._spans.pop(execution_id, None)
23
+ else:
24
+ self._spans.clear()
@@ -6,6 +6,9 @@ from typing import Any, Callable
6
6
 
7
7
  from pydantic import BaseModel
8
8
 
9
+ from uipath.tracing._traced import traced
10
+ from uipath.tracing._utils import _SpanUtils
11
+
9
12
  from .._models._evaluation_set import (
10
13
  EvaluationItem,
11
14
  LLMMockingStrategy,
@@ -51,7 +54,7 @@ Based on the above information, provide a realistic response for this tool call.
51
54
  3. Always include the entire output regardless of token length.
52
55
  3. Consider the context of the current test run and the agent being tested. If the agent is acting on a property, make sure the output includes that property.
53
56
 
54
- Respond ONLY with valid JSON that would be a realistic and completetool response. Do not include any explanations or markdown.
57
+ Respond ONLY with valid JSON that would be a realistic and complete tool response. Do not include any explanations or markdown.
55
58
  """
56
59
 
57
60
  logger = logging.getLogger(__name__)
@@ -79,6 +82,7 @@ class LLMMocker(Mocker):
79
82
  self.evaluation_item = evaluation_item
80
83
  assert isinstance(self.evaluation_item.mocking_strategy, LLMMockingStrategy)
81
84
 
85
+ @traced(name="__mocker__")
82
86
  async def response(
83
87
  self, func: Callable[[T], R], params: dict[str, Any], *args: T, **kwargs
84
88
  ) -> R:
@@ -92,6 +96,8 @@ class LLMMocker(Mocker):
92
96
  from uipath import UiPath
93
97
  from uipath._services.llm_gateway_service import _cleanup_schema
94
98
 
99
+ from .mocks import evaluation_context, span_collector_context
100
+
95
101
  llm = UiPath().llm
96
102
  return_type: Any = func.__annotations__.get("return", None)
97
103
  if return_type is None:
@@ -116,9 +122,17 @@ class LLMMocker(Mocker):
116
122
  example_calls = [
117
123
  call for call in example_calls if isinstance(call, ExampleCall)
118
124
  ]
125
+
126
+ test_run_history = "(empty)"
127
+ eval_item = evaluation_context.get()
128
+ span_collector = span_collector_context.get()
129
+ if eval_item and span_collector:
130
+ spans = span_collector.get_spans(eval_item.id)
131
+ test_run_history = _SpanUtils.spans_to_llm_context(spans)
132
+
119
133
  prompt_input: dict[str, Any] = {
120
134
  "toolRunExamples": example_calls,
121
- "testRunHistory": [], # This should contain ordered spans.
135
+ "testRunHistory": test_run_history,
122
136
  "toolInfo": {
123
137
  "name": function_name,
124
138
  "description": params.get("description"),
@@ -5,30 +5,49 @@ from contextvars import ContextVar
5
5
  from typing import Any, Callable, Optional
6
6
 
7
7
  from uipath._cli._evals._models._evaluation_set import EvaluationItem
8
+ from uipath._cli._evals._span_collection import ExecutionSpanCollector
8
9
  from uipath._cli._evals.mocks.mocker import Mocker, UiPathNoMockFoundError
9
10
  from uipath._cli._evals.mocks.mocker_factory import MockerFactory
10
11
 
12
+ # Context variables for evaluation items and mockers
11
13
  evaluation_context: ContextVar[Optional[EvaluationItem]] = ContextVar(
12
14
  "evaluation", default=None
13
15
  )
14
16
 
15
17
  mocker_context: ContextVar[Optional[Mocker]] = ContextVar("mocker", default=None)
16
18
 
19
+ # Span collector for trace access during mocking
20
+ span_collector_context: ContextVar[Optional[ExecutionSpanCollector]] = ContextVar(
21
+ "span_collector", default=None
22
+ )
23
+
17
24
  logger = logging.getLogger(__name__)
18
25
 
19
26
 
20
- def set_evaluation_item(item: EvaluationItem) -> None:
21
- """Set an evaluation item within an evaluation set."""
22
- evaluation_context.set(item)
27
+ def set_execution_context(
28
+ eval_item: EvaluationItem, span_collector: ExecutionSpanCollector
29
+ ) -> None:
30
+ """Set the execution context for an evaluation run for mocking and trace access."""
31
+ evaluation_context.set(eval_item)
32
+
23
33
  try:
24
- if item.mocking_strategy:
25
- mocker_context.set(MockerFactory.create(item))
34
+ if eval_item.mocking_strategy:
35
+ mocker_context.set(MockerFactory.create(eval_item))
26
36
  else:
27
37
  mocker_context.set(None)
28
38
  except Exception:
29
- logger.warning(f"Failed to create mocker for evaluation {item.name}")
39
+ logger.warning(f"Failed to create mocker for evaluation {eval_item.name}")
30
40
  mocker_context.set(None)
31
41
 
42
+ span_collector_context.set(span_collector)
43
+
44
+
45
+ def clear_execution_context() -> None:
46
+ """Clear the execution context after evaluation completes."""
47
+ evaluation_context.set(None)
48
+ mocker_context.set(None)
49
+ span_collector_context.set(None)
50
+
32
51
 
33
52
  async def get_mocked_response(
34
53
  func: Callable[[Any], Any], params: dict[str, Any], *args, **kwargs
@@ -101,6 +101,7 @@ class _TelemetryClient:
101
101
  disable_offline_storage=True,
102
102
  )
103
103
 
104
+ getLogger("azure").setLevel(WARNING)
104
105
  _logger.addHandler(_AzureMonitorOpenTelemetryEventHandler())
105
106
  _logger.setLevel(WARNING)
106
107
 
@@ -319,3 +319,55 @@ class _SpanUtils:
319
319
  f"Error formatting arguments for trace: {e}. Using args and kwargs directly."
320
320
  )
321
321
  return {"args": args, "kwargs": kwargs}
322
+
323
+ @staticmethod
324
+ def _has_ancestor_with_name(
325
+ span: ReadableSpan, ancestor_name: str, span_map: Dict[int, ReadableSpan]
326
+ ) -> bool:
327
+ """Check if this span or any of its ancestors has a given name."""
328
+ if span.name == ancestor_name:
329
+ return True
330
+
331
+ current = span
332
+ while current.parent is not None:
333
+ parent_span = span_map.get(current.parent.span_id)
334
+ if parent_span is None:
335
+ break
336
+ if parent_span.name == ancestor_name:
337
+ return True
338
+ current = parent_span
339
+
340
+ return False
341
+
342
+ @staticmethod
343
+ def spans_to_llm_context(spans: list[ReadableSpan]) -> str:
344
+ """Convert spans to a formatted conversation history string suitable for LLM context.
345
+
346
+ Includes function calls (including LLM calls) with their inputs and outputs.
347
+ """
348
+ # Build span_id -> span map for parent chain traversal
349
+ span_map = {span.get_span_context().span_id: span for span in spans}
350
+
351
+ history = []
352
+ for span in spans:
353
+ attributes = dict(span.attributes) if span.attributes else {}
354
+
355
+ input_value = attributes.get("input.value")
356
+ output_value = attributes.get("output.value")
357
+
358
+ if not input_value or not output_value:
359
+ continue
360
+
361
+ # Skip spans that are internal LLM calls (eg. for tool mocking in evals)
362
+ if _SpanUtils._has_ancestor_with_name(span, "__mocker__", span_map):
363
+ continue
364
+
365
+ history.append(f"Function: {span.name}")
366
+ history.append(f"Input: {input_value}")
367
+ history.append(f"Output: {output_value}")
368
+ history.append("")
369
+
370
+ if not history:
371
+ return "(empty)"
372
+
373
+ return "\n".join(history)
@@ -1,4 +1,5 @@
1
1
  from typing import Any
2
+ from unittest.mock import MagicMock
2
3
 
3
4
  import pytest
4
5
  from _pytest.monkeypatch import MonkeyPatch
@@ -10,9 +11,11 @@ from uipath._cli._evals._models._evaluation_set import (
10
11
  MockitoMockingStrategy,
11
12
  )
12
13
  from uipath._cli._evals.mocks.mocker import UiPathMockResponseGenerationError
13
- from uipath._cli._evals.mocks.mocks import set_evaluation_item
14
+ from uipath._cli._evals.mocks.mocks import set_execution_context
14
15
  from uipath.eval.mocks import mockable
15
16
 
17
+ _mock_span_collector = MagicMock()
18
+
16
19
 
17
20
  def test_mockito_mockable_sync():
18
21
  # Arrange
@@ -51,7 +54,7 @@ def test_mockito_mockable_sync():
51
54
  assert isinstance(evaluation.mocking_strategy, MockitoMockingStrategy)
52
55
 
53
56
  # Act & Assert
54
- set_evaluation_item(evaluation)
57
+ set_execution_context(evaluation, _mock_span_collector)
55
58
  assert foo() == "bar1"
56
59
  assert foo() == "bar2"
57
60
  assert foo() == "bar2"
@@ -63,13 +66,13 @@ def test_mockito_mockable_sync():
63
66
  assert foofoo()
64
67
 
65
68
  evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {"x": 1}
66
- set_evaluation_item(evaluation)
69
+ set_execution_context(evaluation, _mock_span_collector)
67
70
  assert foo(x=1) == "bar1"
68
71
 
69
72
  evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {
70
73
  "x": {"_target_": "mockito.any"}
71
74
  }
72
- set_evaluation_item(evaluation)
75
+ set_execution_context(evaluation, _mock_span_collector)
73
76
  assert foo(x=2) == "bar1"
74
77
 
75
78
 
@@ -111,7 +114,7 @@ async def test_mockito_mockable_async():
111
114
  assert isinstance(evaluation.mocking_strategy, MockitoMockingStrategy)
112
115
 
113
116
  # Act & Assert
114
- set_evaluation_item(evaluation)
117
+ set_execution_context(evaluation, _mock_span_collector)
115
118
  assert await foo() == "bar1"
116
119
  assert await foo() == "bar2"
117
120
  assert await foo() == "bar2"
@@ -123,13 +126,13 @@ async def test_mockito_mockable_async():
123
126
  assert await foofoo()
124
127
 
125
128
  evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {"x": 1}
126
- set_evaluation_item(evaluation)
129
+ set_execution_context(evaluation, _mock_span_collector)
127
130
  assert await foo(x=1) == "bar1"
128
131
 
129
132
  evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {
130
133
  "x": {"_target_": "mockito.any"}
131
134
  }
132
- set_evaluation_item(evaluation)
135
+ set_execution_context(evaluation, _mock_span_collector)
133
136
  assert await foo(x=2) == "bar1"
134
137
 
135
138
 
@@ -201,7 +204,7 @@ def test_llm_mockable_sync(httpx_mock: HTTPXMock, monkeypatch: MonkeyPatch):
201
204
  },
202
205
  )
203
206
  # Act & Assert
204
- set_evaluation_item(evaluation)
207
+ set_execution_context(evaluation, _mock_span_collector)
205
208
 
206
209
  assert foo() == "bar1"
207
210
  with pytest.raises(NotImplementedError):
@@ -274,7 +277,7 @@ async def test_llm_mockable_async(httpx_mock: HTTPXMock, monkeypatch: MonkeyPatc
274
277
  },
275
278
  )
276
279
  # Act & Assert
277
- set_evaluation_item(evaluation)
280
+ set_execution_context(evaluation, _mock_span_collector)
278
281
 
279
282
  assert await foo() == "bar1"
280
283
  with pytest.raises(NotImplementedError):
@@ -0,0 +1,96 @@
1
+ """
2
+ Unit tests for OidcUtils.get_auth_config() method.
3
+
4
+ IMPORTANT: Backwards Compatibility Notice
5
+ =========================================
6
+ If any values in auth_config.json are changed, we MUST maintain backwards
7
+ compatibility with release/2025.10 branches or later.
8
+ """
9
+
10
+ import json
11
+ import os
12
+
13
+
14
+ class TestOidcUtils:
15
+ """Test suite for OidcUtils class."""
16
+
17
+ def test_auth_config_backwards_compatibility_v2025_10(self):
18
+ """
19
+ Test that auth_config.json maintains backwards compatibility with release/v2025.10.
20
+
21
+ This test validates that the authentication configuration values remain
22
+ unchanged to ensure compatibility with release/v2025.10 and later branches.
23
+
24
+ CRITICAL: Any failure indicates a breaking change that requires coordination
25
+ across all supported release branches.
26
+ """
27
+ # Read the actual auth_config.json file
28
+ config_path = os.path.join(
29
+ os.path.dirname(__file__),
30
+ "..",
31
+ "..",
32
+ "src",
33
+ "uipath",
34
+ "_cli",
35
+ "_auth",
36
+ "auth_config.json",
37
+ )
38
+
39
+ with open(config_path, "r") as f:
40
+ actual_config = json.load(f)
41
+
42
+ # Assert exact values for non-scope fields
43
+ assert actual_config["client_id"] == "36dea5b8-e8bb-423d-8e7b-c808df8f1c00", (
44
+ f"BACKWARDS COMPATIBILITY VIOLATION: client_id has changed! "
45
+ f"Expected: 36dea5b8-e8bb-423d-8e7b-c808df8f1c00, Got: {actual_config['client_id']}"
46
+ )
47
+
48
+ assert (
49
+ actual_config["redirect_uri"]
50
+ == "http://localhost:__PY_REPLACE_PORT__/oidc/login"
51
+ ), (
52
+ f"BACKWARDS COMPATIBILITY VIOLATION: redirect_uri has changed! "
53
+ f"Expected: http://localhost:__PY_REPLACE_PORT__/oidc/login, Got: {actual_config['redirect_uri']}"
54
+ )
55
+
56
+ assert actual_config["port"] == 8104, (
57
+ f"BACKWARDS COMPATIBILITY VIOLATION: port has changed! "
58
+ f"Expected: 8104, Got: {actual_config['port']}"
59
+ )
60
+
61
+ # For scopes, ensure actual scopes are a subset of the allowed scopes (no new scopes allowed)
62
+ allowed_scopes = set(
63
+ [
64
+ "offline_access",
65
+ "ProcessMining",
66
+ "OrchestratorApiUserAccess",
67
+ "StudioWebBackend",
68
+ "IdentityServerApi",
69
+ "ConnectionService",
70
+ "DataService",
71
+ "DocumentUnderstanding",
72
+ "Du.Digitization.Api",
73
+ "Du.Classification.Api",
74
+ "Du.Extraction.Api",
75
+ "Du.Validation.Api",
76
+ "EnterpriseContextService",
77
+ "Directory",
78
+ "JamJamApi",
79
+ "LLMGateway",
80
+ "LLMOps",
81
+ "OMS",
82
+ "RCS.FolderAuthorization",
83
+ "TM.Projects",
84
+ "TM.TestCases",
85
+ "TM.Requirements",
86
+ "TM.TestSets",
87
+ ]
88
+ )
89
+
90
+ actual_scopes = set(actual_config["scope"].split())
91
+
92
+ assert actual_scopes.issubset(allowed_scopes), (
93
+ f"BACKWARDS COMPATIBILITY VIOLATION: New scopes detected that are not allowed on v2025.10! "
94
+ f"New scopes: {actual_scopes - allowed_scopes}. "
95
+ f"Only subsets of the following scopes are permitted: {sorted(allowed_scopes)}"
96
+ )
@@ -2146,7 +2146,7 @@ wheels = [
2146
2146
 
2147
2147
  [[package]]
2148
2148
  name = "uipath"
2149
- version = "2.1.81"
2149
+ version = "2.1.83"
2150
2150
  source = { editable = "." }
2151
2151
  dependencies = [
2152
2152
  { name = "azure-monitor-opentelemetry" },
File without changes
File without changes
File without changes
File without changes