uipath 2.1.82__tar.gz → 2.1.84__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.82 → uipath-2.1.84}/PKG-INFO +1 -1
  2. {uipath-2.1.82 → uipath-2.1.84}/pyproject.toml +1 -1
  3. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_runtime.py +38 -6
  4. uipath-2.1.84/src/uipath/_cli/_evals/_span_collection.py +24 -0
  5. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/mocks/llm_mocker.py +16 -2
  6. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/mocks/mocks.py +25 -6
  7. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_push/sw_file_handler.py +10 -1
  8. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_studio_project.py +46 -0
  9. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/_utils.py +16 -0
  10. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/telemetry/_track.py +1 -0
  11. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/tracing/_utils.py +52 -0
  12. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/eval/mocks/test_mocks.py +12 -9
  13. {uipath-2.1.82 → uipath-2.1.84}/uv.lock +1 -1
  14. {uipath-2.1.82 → uipath-2.1.84}/.cursorrules +0 -0
  15. {uipath-2.1.82 → uipath-2.1.84}/.editorconfig +0 -0
  16. {uipath-2.1.82 → uipath-2.1.84}/.gitattributes +0 -0
  17. {uipath-2.1.82 → uipath-2.1.84}/.github/labeler.yml +0 -0
  18. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/auto-label.yml +0 -0
  19. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/cd.yml +0 -0
  20. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/ci.yml +0 -0
  21. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/commitlint.yml +0 -0
  22. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/integration_tests.yml +0 -0
  23. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/lint.yml +0 -0
  24. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/publish-dev.yml +0 -0
  25. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/publish-docs.yml +0 -0
  26. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/slack.yml +0 -0
  27. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/test-uipath-langchain.yml +0 -0
  28. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/test-uipath-llamaindex.yml +0 -0
  29. {uipath-2.1.82 → uipath-2.1.84}/.github/workflows/test.yml +0 -0
  30. {uipath-2.1.82 → uipath-2.1.84}/.gitignore +0 -0
  31. {uipath-2.1.82 → uipath-2.1.84}/.pre-commit-config.yaml +0 -0
  32. {uipath-2.1.82 → uipath-2.1.84}/.python-version +0 -0
  33. {uipath-2.1.82 → uipath-2.1.84}/.vscode/extensions.json +0 -0
  34. {uipath-2.1.82 → uipath-2.1.84}/.vscode/launch.json +0 -0
  35. {uipath-2.1.82 → uipath-2.1.84}/.vscode/settings.json +0 -0
  36. {uipath-2.1.82 → uipath-2.1.84}/CONTRIBUTING.md +0 -0
  37. {uipath-2.1.82 → uipath-2.1.84}/LICENSE +0 -0
  38. {uipath-2.1.82 → uipath-2.1.84}/README.md +0 -0
  39. {uipath-2.1.82 → uipath-2.1.84}/docs/CONTRIBUTING.md +0 -0
  40. {uipath-2.1.82 → uipath-2.1.84}/docs/FAQ.md +0 -0
  41. {uipath-2.1.82 → uipath-2.1.84}/docs/assets/env-preparation-failed-dark.png +0 -0
  42. {uipath-2.1.82 → uipath-2.1.84}/docs/assets/env-preparation-failed-light.png +0 -0
  43. {uipath-2.1.82 → uipath-2.1.84}/docs/assets/favicon.png +0 -0
  44. {uipath-2.1.82 → uipath-2.1.84}/docs/assets/llms.txt +0 -0
  45. {uipath-2.1.82 → uipath-2.1.84}/docs/assets/logo-dark.svg +0 -0
  46. {uipath-2.1.82 → uipath-2.1.84}/docs/assets/logo-light.svg +0 -0
  47. {uipath-2.1.82 → uipath-2.1.84}/docs/cli/index.md +0 -0
  48. {uipath-2.1.82 → uipath-2.1.84}/docs/core/actions.md +0 -0
  49. {uipath-2.1.82 → uipath-2.1.84}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  50. {uipath-2.1.82 → uipath-2.1.84}/docs/core/assets/cloud_env_var_light.gif +0 -0
  51. {uipath-2.1.82 → uipath-2.1.84}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  52. {uipath-2.1.82 → uipath-2.1.84}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  53. {uipath-2.1.82 → uipath-2.1.84}/docs/core/assets/copy_path_dark.png +0 -0
  54. {uipath-2.1.82 → uipath-2.1.84}/docs/core/assets/copy_path_light.png +0 -0
  55. {uipath-2.1.82 → uipath-2.1.84}/docs/core/assets.md +0 -0
  56. {uipath-2.1.82 → uipath-2.1.84}/docs/core/attachments.md +0 -0
  57. {uipath-2.1.82 → uipath-2.1.84}/docs/core/buckets.md +0 -0
  58. {uipath-2.1.82 → uipath-2.1.84}/docs/core/connections.md +0 -0
  59. {uipath-2.1.82 → uipath-2.1.84}/docs/core/context_grounding.md +0 -0
  60. {uipath-2.1.82 → uipath-2.1.84}/docs/core/documents.md +0 -0
  61. {uipath-2.1.82 → uipath-2.1.84}/docs/core/documents_models.md +0 -0
  62. {uipath-2.1.82 → uipath-2.1.84}/docs/core/environment_variables.md +0 -0
  63. {uipath-2.1.82 → uipath-2.1.84}/docs/core/getting_started.md +0 -0
  64. {uipath-2.1.82 → uipath-2.1.84}/docs/core/jobs.md +0 -0
  65. {uipath-2.1.82 → uipath-2.1.84}/docs/core/llm_gateway.md +0 -0
  66. {uipath-2.1.82 → uipath-2.1.84}/docs/core/processes.md +0 -0
  67. {uipath-2.1.82 → uipath-2.1.84}/docs/core/queues.md +0 -0
  68. {uipath-2.1.82 → uipath-2.1.84}/docs/core/traced.md +0 -0
  69. {uipath-2.1.82 → uipath-2.1.84}/docs/hooks.py +0 -0
  70. {uipath-2.1.82 → uipath-2.1.84}/docs/index.md +0 -0
  71. {uipath-2.1.82 → uipath-2.1.84}/docs/javascripts/extra.js +0 -0
  72. {uipath-2.1.82 → uipath-2.1.84}/docs/overrides/main.html +0 -0
  73. {uipath-2.1.82 → uipath-2.1.84}/docs/overrides/partials/actions.html +0 -0
  74. {uipath-2.1.82 → uipath-2.1.84}/docs/overrides/partials/logo.html +0 -0
  75. {uipath-2.1.82 → uipath-2.1.84}/docs/release_policy.md +0 -0
  76. {uipath-2.1.82 → uipath-2.1.84}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  77. {uipath-2.1.82 → uipath-2.1.84}/docs/stylesheets/extra.css +0 -0
  78. {uipath-2.1.82 → uipath-2.1.84}/justfile +0 -0
  79. {uipath-2.1.82 → uipath-2.1.84}/mkdocs.yml +0 -0
  80. {uipath-2.1.82 → uipath-2.1.84}/py.typed +0 -0
  81. {uipath-2.1.82 → uipath-2.1.84}/samples/asset-modifier-agent/.env.example +0 -0
  82. {uipath-2.1.82 → uipath-2.1.84}/samples/asset-modifier-agent/README.md +0 -0
  83. {uipath-2.1.82 → uipath-2.1.84}/samples/asset-modifier-agent/input.json +0 -0
  84. {uipath-2.1.82 → uipath-2.1.84}/samples/asset-modifier-agent/main.py +0 -0
  85. {uipath-2.1.82 → uipath-2.1.84}/samples/asset-modifier-agent/pyproject.toml +0 -0
  86. {uipath-2.1.82 → uipath-2.1.84}/samples/asset-modifier-agent/uv.lock +0 -0
  87. {uipath-2.1.82 → uipath-2.1.84}/samples/calculator/README.md +0 -0
  88. {uipath-2.1.82 → uipath-2.1.84}/samples/calculator/evals/eval-sets/default.json +0 -0
  89. {uipath-2.1.82 → uipath-2.1.84}/samples/calculator/evals/evaluators/equality.json +0 -0
  90. {uipath-2.1.82 → uipath-2.1.84}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
  91. {uipath-2.1.82 → uipath-2.1.84}/samples/calculator/main.py +0 -0
  92. {uipath-2.1.82 → uipath-2.1.84}/samples/calculator/pyproject.toml +0 -0
  93. {uipath-2.1.82 → uipath-2.1.84}/samples/event-trigger/.python-version +0 -0
  94. {uipath-2.1.82 → uipath-2.1.84}/samples/event-trigger/README.md +0 -0
  95. {uipath-2.1.82 → uipath-2.1.84}/samples/event-trigger/main.py +0 -0
  96. {uipath-2.1.82 → uipath-2.1.84}/samples/event-trigger/pyproject.toml +0 -0
  97. {uipath-2.1.82 → uipath-2.1.84}/samples/google-ADK-agent/.env.example +0 -0
  98. {uipath-2.1.82 → uipath-2.1.84}/samples/google-ADK-agent/README.md +0 -0
  99. {uipath-2.1.82 → uipath-2.1.84}/samples/google-ADK-agent/input.json +0 -0
  100. {uipath-2.1.82 → uipath-2.1.84}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  101. {uipath-2.1.82 → uipath-2.1.84}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  102. {uipath-2.1.82 → uipath-2.1.84}/samples/google-ADK-agent/pyproject.toml +0 -0
  103. {uipath-2.1.82 → uipath-2.1.84}/samples/google-ADK-agent/uv.lock +0 -0
  104. {uipath-2.1.82 → uipath-2.1.84}/scripts/debug_test.py +0 -0
  105. {uipath-2.1.82 → uipath-2.1.84}/scripts/lint_httpx_client.py +0 -0
  106. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/__init__.py +0 -0
  107. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/README.md +0 -0
  108. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/__init__.py +0 -0
  109. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  110. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/_auth_service.py +0 -0
  111. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/_models.py +0 -0
  112. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  113. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  114. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  115. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/_utils.py +0 -0
  116. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/auth_config.json +0 -0
  117. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/index.html +0 -0
  118. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/localhost.crt +0 -0
  119. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_auth/localhost.key +0 -0
  120. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  121. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  122. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  123. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  124. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  125. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  126. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  127. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  128. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  129. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  130. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  131. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  132. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
  133. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
  134. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  135. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
  136. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
  137. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
  138. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
  139. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_models/_output.py +0 -0
  140. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
  141. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
  142. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
  143. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
  144. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
  145. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
  146. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_runtime/_contracts.py +0 -0
  147. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  148. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  149. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_runtime/_logging.py +0 -0
  150. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  151. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
  152. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  153. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_templates/.rels.template +0 -0
  154. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  155. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_templates/main.py.template +0 -0
  156. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  157. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_common.py +0 -0
  158. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_console.py +0 -0
  159. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_constants.py +0 -0
  160. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_debug.py +0 -0
  161. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  162. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_folders.py +0 -0
  163. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_input_args.py +0 -0
  164. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  165. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_processes.py +0 -0
  166. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_project_files.py +0 -0
  167. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_tracing.py +0 -0
  168. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  169. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_auth.py +0 -0
  170. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_deploy.py +0 -0
  171. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_dev.py +0 -0
  172. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_eval.py +0 -0
  173. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_init.py +0 -0
  174. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_invoke.py +0 -0
  175. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_new.py +0 -0
  176. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_pack.py +0 -0
  177. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_publish.py +0 -0
  178. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_pull.py +0 -0
  179. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_push.py +0 -0
  180. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/cli_run.py +0 -0
  181. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/middlewares.py +0 -0
  182. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_cli/spinner.py +0 -0
  183. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_config.py +0 -0
  184. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_events/__init__.py +0 -0
  185. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_events/_event_bus.py +0 -0
  186. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_events/_events.py +0 -0
  187. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_execution_context.py +0 -0
  188. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_folder_context.py +0 -0
  189. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_resources/AGENTS.md +0 -0
  190. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/__init__.py +0 -0
  191. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/_base_service.py +0 -0
  192. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/actions_service.py +0 -0
  193. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/api_client.py +0 -0
  194. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/assets_service.py +0 -0
  195. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/attachments_service.py +0 -0
  196. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/buckets_service.py +0 -0
  197. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/connections_service.py +0 -0
  198. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/context_grounding_service.py +0 -0
  199. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/documents_service.py +0 -0
  200. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/entities_service.py +0 -0
  201. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/external_application_service.py +0 -0
  202. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/folder_service.py +0 -0
  203. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/jobs_service.py +0 -0
  204. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/llm_gateway_service.py +0 -0
  205. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/processes_service.py +0 -0
  206. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_services/queues_service.py +0 -0
  207. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_uipath.py +0 -0
  208. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/__init__.py +0 -0
  209. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_auth.py +0 -0
  210. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_endpoint.py +0 -0
  211. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_infer_bindings.py +0 -0
  212. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_logs.py +0 -0
  213. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_read_overwrites.py +0 -0
  214. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_request_override.py +0 -0
  215. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_request_spec.py +0 -0
  216. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_ssl_context.py +0 -0
  217. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_url.py +0 -0
  218. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/_user_agent.py +0 -0
  219. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/_utils/constants.py +0 -0
  220. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/__init__.py +0 -0
  221. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/async_stream.py +0 -0
  222. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/citation.py +0 -0
  223. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/content.py +0 -0
  224. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/conversation.py +0 -0
  225. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/event.py +0 -0
  226. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/exchange.py +0 -0
  227. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/message.py +0 -0
  228. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/meta.py +0 -0
  229. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/conversation/tool.py +0 -0
  230. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/agent/models/agent.py +0 -0
  231. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/_helpers/__init__.py +0 -0
  232. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/_helpers/helpers.py +0 -0
  233. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/evaluators/__init__.py +0 -0
  234. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
  235. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
  236. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
  237. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
  238. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
  239. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
  240. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/mocks/__init__.py +0 -0
  241. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/mocks/mockable.py +0 -0
  242. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/models/__init__.py +0 -0
  243. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/eval/models/models.py +0 -0
  244. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/__init__.py +0 -0
  245. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/action_schema.py +0 -0
  246. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/actions.py +0 -0
  247. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/assets.py +0 -0
  248. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/attachment.py +0 -0
  249. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/auth.py +0 -0
  250. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/buckets.py +0 -0
  251. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/connections.py +0 -0
  252. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/context_grounding.py +0 -0
  253. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/context_grounding_index.py +0 -0
  254. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/documents.py +0 -0
  255. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/entities.py +0 -0
  256. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/errors.py +0 -0
  257. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/exceptions.py +0 -0
  258. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/interrupt_models.py +0 -0
  259. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/job.py +0 -0
  260. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/llm_gateway.py +0 -0
  261. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/processes.py +0 -0
  262. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/models/queues.py +0 -0
  263. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/py.typed +0 -0
  264. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/telemetry/__init__.py +0 -0
  265. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/telemetry/_constants.py +0 -0
  266. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/tracing/__init__.py +0 -0
  267. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/tracing/_otel_exporters.py +0 -0
  268. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/tracing/_traced.py +0 -0
  269. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/utils/__init__.py +0 -0
  270. {uipath-2.1.82 → uipath-2.1.84}/src/uipath/utils/_endpoints_manager.py +0 -0
  271. {uipath-2.1.82 → uipath-2.1.84}/testcases/apicalls-testcase/main.py +0 -0
  272. {uipath-2.1.82 → uipath-2.1.84}/testcases/apicalls-testcase/pyproject.toml +0 -0
  273. {uipath-2.1.82 → uipath-2.1.84}/testcases/apicalls-testcase/run.sh +0 -0
  274. {uipath-2.1.82 → uipath-2.1.84}/testcases/apicalls-testcase/src/assert.py +0 -0
  275. {uipath-2.1.82 → uipath-2.1.84}/testcases/basic-testcase/main.py +0 -0
  276. {uipath-2.1.82 → uipath-2.1.84}/testcases/basic-testcase/pyproject.toml +0 -0
  277. {uipath-2.1.82 → uipath-2.1.84}/testcases/basic-testcase/run.sh +0 -0
  278. {uipath-2.1.82 → uipath-2.1.84}/testcases/basic-testcase/src/assert.py +0 -0
  279. {uipath-2.1.82 → uipath-2.1.84}/testcases/common/validate_output.sh +0 -0
  280. {uipath-2.1.82 → uipath-2.1.84}/testcases/langchain-cross/agent.mermaid +0 -0
  281. {uipath-2.1.82 → uipath-2.1.84}/testcases/langchain-cross/langgraph.json +0 -0
  282. {uipath-2.1.82 → uipath-2.1.84}/testcases/langchain-cross/pyproject.toml +0 -0
  283. {uipath-2.1.82 → uipath-2.1.84}/testcases/langchain-cross/run.sh +0 -0
  284. {uipath-2.1.82 → uipath-2.1.84}/testcases/langchain-cross/src/assert.py +0 -0
  285. {uipath-2.1.82 → uipath-2.1.84}/testcases/langchain-cross/src/main.py +0 -0
  286. {uipath-2.1.82 → uipath-2.1.84}/testcases/llamaindex-cross/agent.mermaid +0 -0
  287. {uipath-2.1.82 → uipath-2.1.84}/testcases/llamaindex-cross/llama_index.json +0 -0
  288. {uipath-2.1.82 → uipath-2.1.84}/testcases/llamaindex-cross/pyproject.toml +0 -0
  289. {uipath-2.1.82 → uipath-2.1.84}/testcases/llamaindex-cross/run.sh +0 -0
  290. {uipath-2.1.82 → uipath-2.1.84}/testcases/llamaindex-cross/src/assert.py +0 -0
  291. {uipath-2.1.82 → uipath-2.1.84}/testcases/llamaindex-cross/src/main.py +0 -0
  292. {uipath-2.1.82 → uipath-2.1.84}/tests/__init__.py +0 -0
  293. {uipath-2.1.82 → uipath-2.1.84}/tests/agent/models/test_agent.py +0 -0
  294. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/conftest.py +0 -0
  295. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  296. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/mocks/bindings_script.py +0 -0
  297. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/mocks/pyproject.toml +0 -0
  298. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/mocks/simple_script.py +0 -0
  299. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/mocks/uipath-mock.json +0 -0
  300. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  301. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_auth.py +0 -0
  302. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_hitl.py +0 -0
  303. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_init.py +0 -0
  304. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_init_agents_md.py +0 -0
  305. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_input_args.py +0 -0
  306. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_invoke.py +0 -0
  307. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_new.py +0 -0
  308. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_oidc_utils.py +0 -0
  309. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_pack.py +0 -0
  310. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  311. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_portal_service_refresh_token.py +0 -0
  312. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_publish.py +0 -0
  313. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_pull.py +0 -0
  314. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_push.py +0 -0
  315. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_run.py +0 -0
  316. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/test_utils.py +0 -0
  317. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/utils/common.py +0 -0
  318. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/utils/project_details.py +0 -0
  319. {uipath-2.1.82 → uipath-2.1.84}/tests/cli/utils/uipath_json.py +0 -0
  320. {uipath-2.1.82 → uipath-2.1.84}/tests/conftest.py +0 -0
  321. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/conftest.py +0 -0
  322. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_actions_service.py +0 -0
  323. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_api_client.py +0 -0
  324. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_assets_service.py +0 -0
  325. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_attachments_service.py +0 -0
  326. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_base_service.py +0 -0
  327. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_buckets_service.py +0 -0
  328. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_connections_service.py +0 -0
  329. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_context_grounding_service.py +0 -0
  330. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_documents_service.py +0 -0
  331. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_entities_service.py +0 -0
  332. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_external_application_service.py +0 -0
  333. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_folder_service.py +0 -0
  334. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_jobs_service.py +0 -0
  335. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_llm_integration.py +0 -0
  336. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  337. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_llm_service.py +0 -0
  338. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_processes_service.py +0 -0
  339. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_queues_service.py +0 -0
  340. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  341. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
  342. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
  343. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
  344. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/test_bindings_inference.py +0 -0
  345. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/test_config.py +0 -0
  346. {uipath-2.1.82 → uipath-2.1.84}/tests/sdk/test_overwrites.py +0 -0
  347. {uipath-2.1.82 → uipath-2.1.84}/tests/tracing/test_otel_exporters.py +0 -0
  348. {uipath-2.1.82 → uipath-2.1.84}/tests/tracing/test_span_utils.py +0 -0
  349. {uipath-2.1.82 → uipath-2.1.84}/tests/tracing/test_traced.py +0 -0
  350. {uipath-2.1.82 → uipath-2.1.84}/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.82
3
+ Version: 2.1.84
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.82"
3
+ version = "2.1.84"
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,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
@@ -7,6 +7,7 @@ from typing import Any, Dict, Optional, Set
7
7
 
8
8
  import click
9
9
 
10
+ from ...models.exceptions import EnrichedException
10
11
  from .._utils._console import ConsoleLogger
11
12
  from .._utils._constants import (
12
13
  AGENT_INITIAL_CODE_VERSION,
@@ -483,7 +484,15 @@ class SwFileHandler:
483
484
  Raises:
484
485
  Exception: If any step in the process fails
485
486
  """
486
- structure = await self._studio_client.get_project_structure_async()
487
+ try:
488
+ structure = await self._studio_client.get_project_structure_async()
489
+ except EnrichedException as e:
490
+ if e.status_code == 404:
491
+ structure = ProjectStructure(name="", files=[], folders=[])
492
+ await self._studio_client._put_lock()
493
+ else:
494
+ raise
495
+
487
496
  source_code_folder = self._get_folder_by_name(structure, "source_code")
488
497
  root_files, source_code_files = self._get_remote_files(
489
498
  structure, source_code_folder
@@ -224,6 +224,45 @@ def with_lock_retry(func: Callable[..., Any]) -> Callable[..., Any]:
224
224
  return wrapper
225
225
 
226
226
 
227
+ class StudioSolutionsClient:
228
+ def __init__(self, solution_id: str):
229
+ from uipath import UiPath
230
+
231
+ self.uipath: UiPath = UiPath()
232
+ self._solutions_base_url: str = f"/studio_/backend/api/Solution/{solution_id}"
233
+
234
+ async def create_project_async(
235
+ self,
236
+ project_name: str,
237
+ project_type: str = "Agent",
238
+ trigger_type: str = "Manual",
239
+ ):
240
+ """Create a new project in the specified solution.
241
+
242
+ Args:
243
+ project_name: The name for the new project
244
+ project_type: The type of project to create (default: "Agent")
245
+ trigger_type: The trigger type for the project (default: "Manual")
246
+
247
+ Returns:
248
+ dict: The created project details including project ID
249
+ """
250
+ data = {
251
+ "createDefaultProjectCommand[projectType]": project_type,
252
+ "createDefaultProjectCommand[triggerType]": trigger_type,
253
+ "createDefaultProjectCommand[name]": project_name,
254
+ }
255
+
256
+ response = await self.uipath.api_client.request_async(
257
+ "POST",
258
+ url=f"{self._solutions_base_url}/projects",
259
+ data=data,
260
+ scoped="org",
261
+ )
262
+
263
+ return response.json()
264
+
265
+
227
266
  class StudioClient:
228
267
  def __init__(self, project_id: str):
229
268
  from uipath import UiPath
@@ -464,3 +503,10 @@ class StudioClient:
464
503
  scoped="org",
465
504
  )
466
505
  return LockInfo.model_validate(response.json())
506
+
507
+ async def _put_lock(self):
508
+ await self.uipath.api_client.request_async(
509
+ "PUT",
510
+ url=f"{self._lock_operations_base_url}/dummy-uuid-Shared?api-version=2",
511
+ scoped="org",
512
+ )
@@ -5,10 +5,12 @@ from httpx import Response
5
5
  from pydantic import TypeAdapter
6
6
 
7
7
  from uipath._cli._evals._models._evaluation_set import LLMMockingStrategy
8
+ from uipath._cli._push.sw_file_handler import SwFileHandler
8
9
  from uipath._cli._utils._studio_project import (
9
10
  ProjectFile,
10
11
  ProjectFolder,
11
12
  StudioClient,
13
+ StudioSolutionsClient,
12
14
  resolve_path,
13
15
  )
14
16
  from uipath.agent.models.agent import (
@@ -27,6 +29,20 @@ async def get_file(
27
29
  return await studio_client.download_file_async(resolved.id)
28
30
 
29
31
 
32
+ async def create_agent_project(solution_id: str, project_name: str) -> str:
33
+ studio_client = StudioSolutionsClient(solution_id=solution_id)
34
+ project = await studio_client.create_project_async(project_name=project_name)
35
+ return project["id"]
36
+
37
+
38
+ async def upload_project_files(project_id: str, root: str) -> None:
39
+ sw_file_handler = SwFileHandler(
40
+ project_id=project_id,
41
+ directory=root,
42
+ )
43
+ await sw_file_handler.upload_source_files({})
44
+
45
+
30
46
  async def load_agent_definition(project_id: str) -> AgentDefinition:
31
47
  studio_client = StudioClient(project_id=project_id)
32
48
  project_structure = await studio_client.get_project_structure_async()
@@ -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):
@@ -2146,7 +2146,7 @@ wheels = [
2146
2146
 
2147
2147
  [[package]]
2148
2148
  name = "uipath"
2149
- version = "2.1.82"
2149
+ version = "2.1.84"
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes