uipath 2.1.102__tar.gz → 2.1.104__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 (384) hide show
  1. {uipath-2.1.102 → uipath-2.1.104}/PKG-INFO +1 -1
  2. {uipath-2.1.102 → uipath-2.1.104}/pyproject.toml +1 -1
  3. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/__init__.py +1 -1
  4. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_debug/_bridge.py +2 -1
  5. uipath-2.1.104/src/uipath/_cli/_evals/_evaluate.py +28 -0
  6. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_runtime.py +1 -1
  7. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_contracts.py +1 -0
  8. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_eval.py +5 -15
  9. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_run.py +15 -1
  10. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/CLI_REFERENCE.md +1 -0
  11. uipath-2.1.104/src/uipath/py.typed +0 -0
  12. uipath-2.1.104/src/uipath/tracing/__init__.py +13 -0
  13. uipath-2.1.104/src/uipath/tracing/_otel_exporters.py +339 -0
  14. uipath-2.1.104/tests/cli/eval/evals/eval-sets/default.json +24 -0
  15. uipath-2.1.104/tests/cli/eval/evals/evaluators/equality.json +11 -0
  16. uipath-2.1.104/tests/cli/eval/test_evaluate.py +41 -0
  17. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_run.py +1 -0
  18. uipath-2.1.104/tests/tracing/test_otel_exporters.py +448 -0
  19. {uipath-2.1.102 → uipath-2.1.104}/uv.lock +1 -1
  20. uipath-2.1.102/src/uipath/tracing/__init__.py +0 -4
  21. uipath-2.1.102/src/uipath/tracing/_otel_exporters.py +0 -95
  22. uipath-2.1.102/tests/tracing/test_otel_exporters.py +0 -190
  23. {uipath-2.1.102 → uipath-2.1.104}/.claude/agents/command-tester.md +0 -0
  24. {uipath-2.1.102 → uipath-2.1.104}/.claude/commands/prepare-pr.md +0 -0
  25. {uipath-2.1.102 → uipath-2.1.104}/.cursorrules +0 -0
  26. {uipath-2.1.102 → uipath-2.1.104}/.editorconfig +0 -0
  27. {uipath-2.1.102 → uipath-2.1.104}/.gitattributes +0 -0
  28. {uipath-2.1.102 → uipath-2.1.104}/.github/labeler.yml +0 -0
  29. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/auto-label.yml +0 -0
  30. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/cd.yml +0 -0
  31. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/ci.yml +0 -0
  32. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/commitlint.yml +0 -0
  33. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/integration_tests.yml +0 -0
  34. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/lint.yml +0 -0
  35. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/publish-dev.yml +0 -0
  36. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/publish-docs.yml +0 -0
  37. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/slack.yml +0 -0
  38. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/test-uipath-langchain.yml +0 -0
  39. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/test-uipath-llamaindex.yml +0 -0
  40. {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/test.yml +0 -0
  41. {uipath-2.1.102 → uipath-2.1.104}/.gitignore +0 -0
  42. {uipath-2.1.102 → uipath-2.1.104}/.pre-commit-config.yaml +0 -0
  43. {uipath-2.1.102 → uipath-2.1.104}/.python-version +0 -0
  44. {uipath-2.1.102 → uipath-2.1.104}/.vscode/extensions.json +0 -0
  45. {uipath-2.1.102 → uipath-2.1.104}/.vscode/launch.json +0 -0
  46. {uipath-2.1.102 → uipath-2.1.104}/.vscode/settings.json +0 -0
  47. {uipath-2.1.102 → uipath-2.1.104}/CONTRIBUTING.md +0 -0
  48. {uipath-2.1.102 → uipath-2.1.104}/LICENSE +0 -0
  49. {uipath-2.1.102 → uipath-2.1.104}/README.md +0 -0
  50. {uipath-2.1.102 → uipath-2.1.104}/docs/AutomationSuite.md +0 -0
  51. {uipath-2.1.102 → uipath-2.1.104}/docs/CONTRIBUTING.md +0 -0
  52. {uipath-2.1.102 → uipath-2.1.104}/docs/FAQ.md +0 -0
  53. {uipath-2.1.102 → uipath-2.1.104}/docs/assets/env-preparation-failed-dark.png +0 -0
  54. {uipath-2.1.102 → uipath-2.1.104}/docs/assets/env-preparation-failed-light.png +0 -0
  55. {uipath-2.1.102 → uipath-2.1.104}/docs/assets/favicon.png +0 -0
  56. {uipath-2.1.102 → uipath-2.1.104}/docs/assets/llms.txt +0 -0
  57. {uipath-2.1.102 → uipath-2.1.104}/docs/assets/logo-dark.svg +0 -0
  58. {uipath-2.1.102 → uipath-2.1.104}/docs/assets/logo-light.svg +0 -0
  59. {uipath-2.1.102 → uipath-2.1.104}/docs/cli/index.md +0 -0
  60. {uipath-2.1.102 → uipath-2.1.104}/docs/core/actions.md +0 -0
  61. {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  62. {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/cloud_env_var_light.gif +0 -0
  63. {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  64. {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  65. {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/copy_path_dark.png +0 -0
  66. {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/copy_path_light.png +0 -0
  67. {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets.md +0 -0
  68. {uipath-2.1.102 → uipath-2.1.104}/docs/core/attachments.md +0 -0
  69. {uipath-2.1.102 → uipath-2.1.104}/docs/core/buckets.md +0 -0
  70. {uipath-2.1.102 → uipath-2.1.104}/docs/core/connections.md +0 -0
  71. {uipath-2.1.102 → uipath-2.1.104}/docs/core/context_grounding.md +0 -0
  72. {uipath-2.1.102 → uipath-2.1.104}/docs/core/documents.md +0 -0
  73. {uipath-2.1.102 → uipath-2.1.104}/docs/core/documents_models.md +0 -0
  74. {uipath-2.1.102 → uipath-2.1.104}/docs/core/environment_variables.md +0 -0
  75. {uipath-2.1.102 → uipath-2.1.104}/docs/core/getting_started.md +0 -0
  76. {uipath-2.1.102 → uipath-2.1.104}/docs/core/jobs.md +0 -0
  77. {uipath-2.1.102 → uipath-2.1.104}/docs/core/llm_gateway.md +0 -0
  78. {uipath-2.1.102 → uipath-2.1.104}/docs/core/processes.md +0 -0
  79. {uipath-2.1.102 → uipath-2.1.104}/docs/core/queues.md +0 -0
  80. {uipath-2.1.102 → uipath-2.1.104}/docs/core/traced.md +0 -0
  81. {uipath-2.1.102 → uipath-2.1.104}/docs/hooks.py +0 -0
  82. {uipath-2.1.102 → uipath-2.1.104}/docs/index.md +0 -0
  83. {uipath-2.1.102 → uipath-2.1.104}/docs/javascripts/extra.js +0 -0
  84. {uipath-2.1.102 → uipath-2.1.104}/docs/overrides/main.html +0 -0
  85. {uipath-2.1.102 → uipath-2.1.104}/docs/overrides/partials/actions.html +0 -0
  86. {uipath-2.1.102 → uipath-2.1.104}/docs/overrides/partials/logo.html +0 -0
  87. {uipath-2.1.102 → uipath-2.1.104}/docs/release_policy.md +0 -0
  88. {uipath-2.1.102 → uipath-2.1.104}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  89. {uipath-2.1.102 → uipath-2.1.104}/docs/stylesheets/extra.css +0 -0
  90. {uipath-2.1.102 → uipath-2.1.104}/justfile +0 -0
  91. {uipath-2.1.102 → uipath-2.1.104}/mkdocs.yml +0 -0
  92. {uipath-2.1.102 → uipath-2.1.104}/py.typed +0 -0
  93. {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/.env.example +0 -0
  94. {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/README.md +0 -0
  95. {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/input.json +0 -0
  96. {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/main.py +0 -0
  97. {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/pyproject.toml +0 -0
  98. {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/uv.lock +0 -0
  99. {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/README.md +0 -0
  100. {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/evals/eval-sets/default.json +0 -0
  101. {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/evals/evaluators/equality.json +0 -0
  102. {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
  103. {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/main.py +0 -0
  104. {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/pyproject.toml +0 -0
  105. {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/uipath.json +0 -0
  106. {uipath-2.1.102 → uipath-2.1.104}/samples/event-trigger/.python-version +0 -0
  107. {uipath-2.1.102 → uipath-2.1.104}/samples/event-trigger/README.md +0 -0
  108. {uipath-2.1.102 → uipath-2.1.104}/samples/event-trigger/main.py +0 -0
  109. {uipath-2.1.102 → uipath-2.1.104}/samples/event-trigger/pyproject.toml +0 -0
  110. {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/.env.example +0 -0
  111. {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/README.md +0 -0
  112. {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/input.json +0 -0
  113. {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  114. {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  115. {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/pyproject.toml +0 -0
  116. {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/uv.lock +0 -0
  117. {uipath-2.1.102 → uipath-2.1.104}/scripts/debug_test.py +0 -0
  118. {uipath-2.1.102 → uipath-2.1.104}/scripts/lint_httpx_client.py +0 -0
  119. {uipath-2.1.102 → uipath-2.1.104}/scripts/update_agents_md.py +0 -0
  120. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/__init__.py +0 -0
  121. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/README.md +0 -0
  122. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  123. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_auth_service.py +0 -0
  124. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_models.py +0 -0
  125. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  126. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  127. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  128. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_utils.py +0 -0
  129. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/auth_config.json +0 -0
  130. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/index.html +0 -0
  131. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/localhost.crt +0 -0
  132. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/localhost.key +0 -0
  133. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_debug/_runtime.py +0 -0
  134. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  135. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  136. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  137. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  138. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  139. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  140. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  141. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  142. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  143. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  144. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  145. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  146. {uipath-2.1.102/src/uipath/_cli/models → uipath-2.1.104/src/uipath/_cli/_evals}/__init__.py +0 -0
  147. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
  148. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
  149. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  150. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
  151. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
  152. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
  153. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
  154. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_output.py +0 -0
  155. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
  156. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
  157. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_span_collection.py +0 -0
  158. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
  159. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/input_mocker.py +0 -0
  160. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/llm_mocker.py +0 -0
  161. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
  162. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
  163. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
  164. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/mocks.py +0 -0
  165. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  166. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  167. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  168. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_logging.py +0 -0
  169. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  170. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_runtime_factory.py +0 -0
  171. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
  172. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  173. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/.rels.template +0 -0
  174. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  175. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/main.py.template +0 -0
  176. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  177. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_common.py +0 -0
  178. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_console.py +0 -0
  179. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_constants.py +0 -0
  180. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_debug.py +0 -0
  181. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  182. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_folders.py +0 -0
  183. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_input_args.py +0 -0
  184. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  185. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_processes.py +0 -0
  186. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_project_files.py +0 -0
  187. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  188. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_tracing.py +0 -0
  189. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  190. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_auth.py +0 -0
  191. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_debug.py +0 -0
  192. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_deploy.py +0 -0
  193. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_dev.py +0 -0
  194. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_init.py +0 -0
  195. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_invoke.py +0 -0
  196. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_new.py +0 -0
  197. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_pack.py +0 -0
  198. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_publish.py +0 -0
  199. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_pull.py +0 -0
  200. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_push.py +0 -0
  201. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/middlewares.py +0 -0
  202. {uipath-2.1.102/src/uipath/_events → uipath-2.1.104/src/uipath/_cli/models}/__init__.py +0 -0
  203. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/models/runtime_schema.py +0 -0
  204. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/spinner.py +0 -0
  205. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_config.py +0 -0
  206. /uipath-2.1.102/src/uipath/py.typed → /uipath-2.1.104/src/uipath/_events/__init__.py +0 -0
  207. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_events/_event_bus.py +0 -0
  208. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_events/_events.py +0 -0
  209. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_execution_context.py +0 -0
  210. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_folder_context.py +0 -0
  211. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/AGENTS.md +0 -0
  212. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/CLAUDE.md +0 -0
  213. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/REQUIRED_STRUCTURE.md +0 -0
  214. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/SDK_REFERENCE.md +0 -0
  215. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/__init__.py +0 -0
  216. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/_base_service.py +0 -0
  217. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/actions_service.py +0 -0
  218. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/api_client.py +0 -0
  219. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/assets_service.py +0 -0
  220. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/attachments_service.py +0 -0
  221. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/buckets_service.py +0 -0
  222. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/connections_service.py +0 -0
  223. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/context_grounding_service.py +0 -0
  224. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/documents_service.py +0 -0
  225. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/entities_service.py +0 -0
  226. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/external_application_service.py +0 -0
  227. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/folder_service.py +0 -0
  228. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/jobs_service.py +0 -0
  229. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/llm_gateway_service.py +0 -0
  230. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/processes_service.py +0 -0
  231. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/queues_service.py +0 -0
  232. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_uipath.py +0 -0
  233. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/__init__.py +0 -0
  234. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_auth.py +0 -0
  235. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_endpoint.py +0 -0
  236. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_infer_bindings.py +0 -0
  237. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_logs.py +0 -0
  238. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_read_overwrites.py +0 -0
  239. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_request_override.py +0 -0
  240. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_request_spec.py +0 -0
  241. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_ssl_context.py +0 -0
  242. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_url.py +0 -0
  243. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_user_agent.py +0 -0
  244. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/constants.py +0 -0
  245. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/_utils.py +0 -0
  246. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/__init__.py +0 -0
  247. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/async_stream.py +0 -0
  248. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/citation.py +0 -0
  249. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/content.py +0 -0
  250. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/conversation.py +0 -0
  251. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/event.py +0 -0
  252. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/exchange.py +0 -0
  253. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/message.py +0 -0
  254. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/meta.py +0 -0
  255. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/tool.py +0 -0
  256. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/models/agent.py +0 -0
  257. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/models/evals.py +0 -0
  258. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/react/__init__.py +0 -0
  259. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/react/prompts.py +0 -0
  260. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/react/tools.py +0 -0
  261. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/_helpers/__init__.py +0 -0
  262. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/_helpers/helpers.py +0 -0
  263. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/__init__.py +0 -0
  264. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
  265. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
  266. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
  267. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
  268. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
  269. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
  270. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/mocks/__init__.py +0 -0
  271. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/mocks/mockable.py +0 -0
  272. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/models/__init__.py +0 -0
  273. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/models/models.py +0 -0
  274. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/__init__.py +0 -0
  275. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/action_schema.py +0 -0
  276. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/actions.py +0 -0
  277. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/assets.py +0 -0
  278. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/attachment.py +0 -0
  279. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/auth.py +0 -0
  280. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/buckets.py +0 -0
  281. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/connections.py +0 -0
  282. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/context_grounding.py +0 -0
  283. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/context_grounding_index.py +0 -0
  284. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/documents.py +0 -0
  285. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/entities.py +0 -0
  286. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/errors.py +0 -0
  287. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/exceptions.py +0 -0
  288. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/guardrails.py +0 -0
  289. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/interrupt_models.py +0 -0
  290. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/job.py +0 -0
  291. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/llm_gateway.py +0 -0
  292. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/processes.py +0 -0
  293. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/queues.py +0 -0
  294. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/telemetry/__init__.py +0 -0
  295. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/telemetry/_constants.py +0 -0
  296. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/telemetry/_track.py +0 -0
  297. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/tracing/_traced.py +0 -0
  298. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/tracing/_utils.py +0 -0
  299. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/utils/__init__.py +0 -0
  300. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/utils/_endpoints_manager.py +0 -0
  301. {uipath-2.1.102 → uipath-2.1.104}/src/uipath/utils/dynamic_schema.py +0 -0
  302. {uipath-2.1.102 → uipath-2.1.104}/testcases/apicalls-testcase/main.py +0 -0
  303. {uipath-2.1.102 → uipath-2.1.104}/testcases/apicalls-testcase/pyproject.toml +0 -0
  304. {uipath-2.1.102 → uipath-2.1.104}/testcases/apicalls-testcase/run.sh +0 -0
  305. {uipath-2.1.102 → uipath-2.1.104}/testcases/apicalls-testcase/src/assert.py +0 -0
  306. {uipath-2.1.102 → uipath-2.1.104}/testcases/basic-testcase/main.py +0 -0
  307. {uipath-2.1.102 → uipath-2.1.104}/testcases/basic-testcase/pyproject.toml +0 -0
  308. {uipath-2.1.102 → uipath-2.1.104}/testcases/basic-testcase/run.sh +0 -0
  309. {uipath-2.1.102 → uipath-2.1.104}/testcases/basic-testcase/src/assert.py +0 -0
  310. {uipath-2.1.102 → uipath-2.1.104}/testcases/common/validate_output.sh +0 -0
  311. {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/agent.mermaid +0 -0
  312. {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/langgraph.json +0 -0
  313. {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/pyproject.toml +0 -0
  314. {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/run.sh +0 -0
  315. {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/src/assert.py +0 -0
  316. {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/src/main.py +0 -0
  317. {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/agent.mermaid +0 -0
  318. {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/llama_index.json +0 -0
  319. {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/pyproject.toml +0 -0
  320. {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/run.sh +0 -0
  321. {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/src/assert.py +0 -0
  322. {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/src/main.py +0 -0
  323. {uipath-2.1.102 → uipath-2.1.104}/tests/__init__.py +0 -0
  324. {uipath-2.1.102 → uipath-2.1.104}/tests/agent/models/test_agent.py +0 -0
  325. {uipath-2.1.102 → uipath-2.1.104}/tests/agent/models/test_evals.py +0 -0
  326. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/conftest.py +0 -0
  327. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/eval/mocks/test_input_mocker.py +0 -0
  328. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/eval/mocks/test_mocks.py +0 -0
  329. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  330. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/bindings_script.py +0 -0
  331. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/pyproject.toml +0 -0
  332. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/simple_script.py +0 -0
  333. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/uipath-mock.json +0 -0
  334. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  335. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/models/test_runtime_schema.py +0 -0
  336. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_auth.py +0 -0
  337. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_hitl.py +0 -0
  338. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_init.py +0 -0
  339. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_init_agents_md.py +0 -0
  340. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_input_args.py +0 -0
  341. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_invoke.py +0 -0
  342. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_new.py +0 -0
  343. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_oidc_utils.py +0 -0
  344. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_pack.py +0 -0
  345. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  346. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_portal_service_refresh_token.py +0 -0
  347. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_publish.py +0 -0
  348. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_pull.py +0 -0
  349. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_push.py +0 -0
  350. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_utils.py +0 -0
  351. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/utils/common.py +0 -0
  352. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/utils/project_details.py +0 -0
  353. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/utils/test_dynamic_schema.py +0 -0
  354. {uipath-2.1.102 → uipath-2.1.104}/tests/cli/utils/uipath_json.py +0 -0
  355. {uipath-2.1.102 → uipath-2.1.104}/tests/conftest.py +0 -0
  356. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/conftest.py +0 -0
  357. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_actions_service.py +0 -0
  358. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_api_client.py +0 -0
  359. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_assets_service.py +0 -0
  360. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_attachments_service.py +0 -0
  361. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_base_service.py +0 -0
  362. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_buckets_service.py +0 -0
  363. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_connections_service.py +0 -0
  364. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_context_grounding_service.py +0 -0
  365. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_documents_service.py +0 -0
  366. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_entities_service.py +0 -0
  367. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_external_application_service.py +0 -0
  368. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_folder_service.py +0 -0
  369. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_jobs_service.py +0 -0
  370. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_llm_integration.py +0 -0
  371. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  372. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_llm_service.py +0 -0
  373. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_processes_service.py +0 -0
  374. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_queues_service.py +0 -0
  375. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  376. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
  377. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
  378. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
  379. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/test_bindings_inference.py +0 -0
  380. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/test_config.py +0 -0
  381. {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/test_overwrites.py +0 -0
  382. {uipath-2.1.102 → uipath-2.1.104}/tests/tracing/test_span_utils.py +0 -0
  383. {uipath-2.1.102 → uipath-2.1.104}/tests/tracing/test_traced.py +0 -0
  384. {uipath-2.1.102 → uipath-2.1.104}/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.102
3
+ Version: 2.1.104
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.102"
3
+ version = "2.1.104"
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"
@@ -8,7 +8,7 @@ from .cli_auth import auth as auth
8
8
  from .cli_debug import debug as debug # type: ignore
9
9
  from .cli_deploy import deploy as deploy # type: ignore
10
10
  from .cli_dev import dev as dev
11
- from .cli_eval import eval as eval # type: ignore
11
+ from .cli_eval import eval as eval
12
12
  from .cli_init import init as init # type: ignore
13
13
  from .cli_invoke import invoke as invoke # type: ignore
14
14
  from .cli_new import new as new # type: ignore
@@ -434,7 +434,8 @@ def get_remote_debug_bridge(context: UiPathRuntimeContext) -> UiPathDebugBridge:
434
434
  if not context.trace_context:
435
435
  raise ValueError("trace_context is required for remote debugging")
436
436
 
437
- signalr_url = uipath_url + "/agenthub_/wsstunnel?jobId=" + context.job_id
437
+ signalr_url = f"{uipath_url.rstrip('/')}/orchestrator_/signalr/robotdebug?sessionId={context.job_id}"
438
+
438
439
  return SignalRDebugBridge(
439
440
  hub_url=signalr_url,
440
441
  access_token=os.environ.get("UIPATH_ACCESS_TOKEN"),
@@ -0,0 +1,28 @@
1
+ from typing import TypeVar
2
+
3
+ from uipath._cli._evals._runtime import UiPathEvalContext, UiPathEvalRuntime
4
+ from uipath._cli._runtime._contracts import (
5
+ UiPathBaseRuntime,
6
+ UiPathRuntimeContext,
7
+ UiPathRuntimeFactory,
8
+ UiPathRuntimeResult,
9
+ )
10
+ from uipath._events._event_bus import EventBus
11
+
12
+ T = TypeVar("T", bound=UiPathBaseRuntime)
13
+ C = TypeVar("C", bound=UiPathRuntimeContext)
14
+
15
+
16
+ async def evaluate(
17
+ runtime_factory: UiPathRuntimeFactory[T, C],
18
+ eval_context: UiPathEvalContext,
19
+ event_bus: EventBus,
20
+ ) -> UiPathRuntimeResult:
21
+ async with UiPathEvalRuntime.from_eval_context(
22
+ factory=runtime_factory,
23
+ context=eval_context,
24
+ event_bus=event_bus,
25
+ ) as eval_runtime:
26
+ results = await eval_runtime.execute()
27
+ await event_bus.wait_for_all(timeout=10)
28
+ return results
@@ -176,7 +176,7 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
176
176
  ) -> "UiPathEvalRuntime[T, C]":
177
177
  return cls(context, factory, event_bus)
178
178
 
179
- async def execute(self) -> Optional[UiPathRuntimeResult]:
179
+ async def execute(self) -> UiPathRuntimeResult:
180
180
  if self.context.eval_set is None:
181
181
  raise ValueError("eval_set must be provided for evaluation runs")
182
182
 
@@ -341,6 +341,7 @@ class UiPathRuntimeContext(BaseModel):
341
341
  result: Optional[UiPathRuntimeResult] = None
342
342
  execution_output_file: Optional[str] = None
343
343
  input_file: Optional[str] = None
344
+ trace_file: Optional[str] = None
344
345
  is_eval_run: bool = False
345
346
  log_handler: Optional[logging.Handler] = None
346
347
  chat_handler: Optional[UiPathConversationHandler] = None
@@ -1,4 +1,3 @@
1
- # type: ignore
2
1
  import ast
3
2
  import asyncio
4
3
  import os
@@ -7,10 +6,10 @@ from typing import List, Optional
7
6
  import click
8
7
 
9
8
  from uipath._cli._evals._console_progress_reporter import ConsoleProgressReporter
9
+ from uipath._cli._evals._evaluate import evaluate
10
10
  from uipath._cli._evals._progress_reporter import StudioWebProgressReporter
11
11
  from uipath._cli._evals._runtime import (
12
12
  UiPathEvalContext,
13
- UiPathEvalRuntime,
14
13
  )
15
14
  from uipath._cli._runtime._runtime_factory import generate_runtime_factory
16
15
  from uipath._cli._utils._constants import UIPATH_PROJECT_ID
@@ -46,9 +45,9 @@ def setup_reporting_prereq(no_report: bool) -> bool:
46
45
  )
47
46
  return False
48
47
  if not os.getenv("UIPATH_FOLDER_KEY"):
49
- os.environ["UIPATH_FOLDER_KEY"] = asyncio.run(
50
- get_personal_workspace_key_async()
51
- )
48
+ folder_key = asyncio.run(get_personal_workspace_key_async())
49
+ if folder_key:
50
+ os.environ["UIPATH_FOLDER_KEY"] = folder_key
52
51
  return True
53
52
 
54
53
 
@@ -141,17 +140,8 @@ def eval(
141
140
  runtime_factory = generate_runtime_factory()
142
141
  if eval_context.job_id:
143
142
  runtime_factory.add_span_exporter(LlmOpsHttpExporter())
143
+ asyncio.run(evaluate(runtime_factory, eval_context, event_bus))
144
144
 
145
- async def execute():
146
- async with UiPathEvalRuntime.from_eval_context(
147
- factory=runtime_factory,
148
- context=eval_context,
149
- event_bus=event_bus,
150
- ) as eval_runtime:
151
- await eval_runtime.execute()
152
- await event_bus.wait_for_all(timeout=10)
153
-
154
- asyncio.run(execute())
155
145
  except Exception as e:
156
146
  console.error(
157
147
  f"Error occurred: {e or 'Execution failed'}", include_traceback=True
@@ -8,7 +8,7 @@ import click
8
8
 
9
9
  from uipath._cli._runtime._runtime_factory import generate_runtime_factory
10
10
  from uipath._cli._utils._debug import setup_debugging
11
- from uipath.tracing import LlmOpsHttpExporter
11
+ from uipath.tracing import JsonLinesFileExporter, LlmOpsHttpExporter
12
12
 
13
13
  from .._utils.constants import (
14
14
  ENV_JOB_ID,
@@ -44,6 +44,12 @@ console = ConsoleLogger()
44
44
  type=click.Path(exists=False),
45
45
  help="File path where the output will be written",
46
46
  )
47
+ @click.option(
48
+ "--trace-file",
49
+ required=False,
50
+ type=click.Path(exists=False),
51
+ help="File path where the trace spans will be written (JSON Lines format)",
52
+ )
47
53
  @click.option(
48
54
  "--debug",
49
55
  is_flag=True,
@@ -63,6 +69,7 @@ def run(
63
69
  file: Optional[str],
64
70
  input_file: Optional[str],
65
71
  output_file: Optional[str],
72
+ trace_file: Optional[str],
66
73
  debug: bool,
67
74
  debug_port: int,
68
75
  ) -> None:
@@ -73,6 +80,7 @@ def run(
73
80
  "resume": resume,
74
81
  "input_file": file or input_file,
75
82
  "execution_output_file": output_file,
83
+ "trace_file": trace_file,
76
84
  "debug": debug,
77
85
  }
78
86
  input_file = file or input_file
@@ -87,6 +95,7 @@ def run(
87
95
  resume,
88
96
  input_file=input_file,
89
97
  execution_output_file=output_file,
98
+ trace_file=trace_file,
90
99
  debug=debug,
91
100
  debug_port=debug_port,
92
101
  )
@@ -110,7 +119,12 @@ def run(
110
119
  context = runtime_factory.new_context(**context_args)
111
120
  if context.job_id:
112
121
  runtime_factory.add_span_exporter(LlmOpsHttpExporter())
122
+
123
+ if trace_file:
124
+ runtime_factory.add_span_exporter(JsonLinesFileExporter(trace_file))
125
+
113
126
  result = await runtime_factory.execute(context)
127
+
114
128
  if not context.job_id:
115
129
  console.info(result.output)
116
130
 
@@ -65,6 +65,7 @@ uv run uipath init --infer-bindings
65
65
  | `-f`, `--file` | value | none | File path for the .json input |
66
66
  | `--input-file` | value | none | Alias for '-f/--file' arguments |
67
67
  | `--output-file` | value | none | File path where the output will be written |
68
+ | `--trace-file` | value | none | File path where the trace spans will be written (JSON Lines format) |
68
69
  | `--debug` | flag | false | Enable debugging with debugpy. The process will wait for a debugger to attach. |
69
70
  | `--debug-port` | value | `5678` | Port for the debug server (default: 5678) |
70
71
 
File without changes
@@ -0,0 +1,13 @@
1
+ from ._otel_exporters import ( # noqa: D104
2
+ JsonLinesFileExporter,
3
+ LlmOpsHttpExporter,
4
+ )
5
+ from ._traced import TracingManager, traced, wait_for_tracers # noqa: D104
6
+
7
+ __all__ = [
8
+ "TracingManager",
9
+ "traced",
10
+ "wait_for_tracers",
11
+ "LlmOpsHttpExporter",
12
+ "JsonLinesFileExporter",
13
+ ]
@@ -0,0 +1,339 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ import time
5
+ from typing import Any, Dict, List, Optional, Sequence
6
+
7
+ import httpx
8
+ from opentelemetry.sdk.trace import ReadableSpan
9
+ from opentelemetry.sdk.trace.export import (
10
+ SpanExporter,
11
+ SpanExportResult,
12
+ )
13
+
14
+ from uipath._utils._ssl_context import get_httpx_client_kwargs
15
+
16
+ from ._utils import _SpanUtils
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ def _safe_parse_json(s: Any) -> Any:
22
+ """Safely parse a JSON string, returning the original if not a string or on error."""
23
+ if not isinstance(s, str):
24
+ return s
25
+ try:
26
+ return json.loads(s)
27
+ except (json.JSONDecodeError, TypeError):
28
+ return s
29
+
30
+
31
+ def _get_llm_messages(attributes: Dict[str, Any], prefix: str) -> List[Dict[str, Any]]:
32
+ """Extracts and reconstructs LLM messages from flattened attributes."""
33
+ messages: dict[int, dict[str, Any]] = {}
34
+ message_prefix = f"{prefix}."
35
+
36
+ for key, value in attributes.items():
37
+ if key.startswith(message_prefix):
38
+ parts = key[len(message_prefix) :].split(".")
39
+ if len(parts) >= 2 and parts[0].isdigit():
40
+ index = int(parts[0])
41
+ if index not in messages:
42
+ messages[index] = {}
43
+ current: Any = messages[index]
44
+
45
+ for i, part in enumerate(parts[1:-1]):
46
+ key_part: str | int = part
47
+ if part.isdigit() and (
48
+ i + 2 < len(parts) and parts[i + 2].isdigit()
49
+ ):
50
+ key_part = int(part)
51
+
52
+ if isinstance(current, dict):
53
+ if key_part not in current:
54
+ current[key_part] = {}
55
+ current = current[key_part]
56
+ elif isinstance(current, list) and isinstance(key_part, int):
57
+ if key_part >= len(current):
58
+ current.append({})
59
+ current = current[key_part]
60
+
61
+ current[parts[-1]] = value
62
+
63
+ # Convert dict to list, ordered by index
64
+ return [messages[i] for i in sorted(messages.keys())]
65
+
66
+
67
+ class LlmOpsHttpExporter(SpanExporter):
68
+ """An OpenTelemetry span exporter that sends spans to UiPath LLM Ops."""
69
+
70
+ ATTRIBUTE_MAPPING: dict[str, str | tuple[str, Any]] = {
71
+ "input.value": ("input", _safe_parse_json),
72
+ "output.value": ("output", _safe_parse_json),
73
+ "llm.model_name": "model",
74
+ }
75
+
76
+ # Mapping of span types
77
+ SPAN_TYPE_MAPPING: dict[str, str] = {
78
+ "LLM": "completion",
79
+ "TOOL": "toolCall",
80
+ # Add more mappings as needed
81
+ }
82
+
83
+ class Status:
84
+ SUCCESS = 1
85
+ ERROR = 2
86
+ INTERRUPTED = 3
87
+
88
+ def __init__(
89
+ self,
90
+ trace_id: Optional[str] = None,
91
+ extra_process_spans: Optional[bool] = False,
92
+ **kwargs,
93
+ ):
94
+ """Initialize the exporter with the base URL and authentication token."""
95
+ super().__init__(**kwargs)
96
+ self.base_url = self._get_base_url()
97
+ self.auth_token = os.environ.get("UIPATH_ACCESS_TOKEN")
98
+ self.headers = {
99
+ "Content-Type": "application/json",
100
+ "Authorization": f"Bearer {self.auth_token}",
101
+ }
102
+ self._extra_process_spans = extra_process_spans
103
+
104
+ client_kwargs = get_httpx_client_kwargs()
105
+
106
+ self.http_client = httpx.Client(**client_kwargs, headers=self.headers)
107
+ self.trace_id = trace_id
108
+
109
+ def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult:
110
+ """Export spans to UiPath LLM Ops."""
111
+ logger.debug(
112
+ f"Exporting {len(spans)} spans to {self.base_url}/llmopstenant_/api/Traces/spans"
113
+ )
114
+
115
+ span_list = [
116
+ _SpanUtils.otel_span_to_uipath_span(
117
+ span, custom_trace_id=self.trace_id
118
+ ).to_dict()
119
+ for span in spans
120
+ ]
121
+ url = self._build_url(span_list)
122
+
123
+ if self._extra_process_spans:
124
+ span_list = [self._process_span_attributes(span) for span in span_list]
125
+
126
+ logger.debug("Payload: %s", json.dumps(span_list))
127
+
128
+ return self._send_with_retries(url, span_list)
129
+
130
+ def force_flush(self, timeout_millis: int = 30000) -> bool:
131
+ """Force flush the exporter."""
132
+ return True
133
+
134
+ def _map_llm_call_attributes(self, attributes: Dict[str, Any]) -> Dict[str, Any]:
135
+ """Maps attributes for LLM calls, handling flattened keys."""
136
+ result = attributes.copy() # Keep original attributes including basic mappings
137
+
138
+ # Token Usage
139
+ token_keys = {
140
+ "llm.token_count.prompt": "promptTokens",
141
+ "llm.token_count.completion": "completionTokens",
142
+ "llm.token_count.total": "totalTokens",
143
+ }
144
+ usage = {
145
+ new_key: attributes.get(old_key)
146
+ for old_key, new_key in token_keys.items()
147
+ if old_key in attributes
148
+ }
149
+ if usage:
150
+ result["usage"] = usage
151
+
152
+ # Input/Output Messages
153
+ result["input"] = _get_llm_messages(attributes, "llm.input_messages")
154
+ output_messages = _get_llm_messages(attributes, "llm.output_messages")
155
+ result["output"] = output_messages
156
+
157
+ # Invocation Parameters
158
+ invocation_params = _safe_parse_json(
159
+ attributes.get("llm.invocation_parameters", "{}")
160
+ )
161
+ if isinstance(invocation_params, dict):
162
+ result["model"] = invocation_params.get("model", result.get("model"))
163
+ settings: dict[str, Any] = {}
164
+ if "max_tokens" in invocation_params:
165
+ settings["maxTokens"] = invocation_params["max_tokens"]
166
+ if "temperature" in invocation_params:
167
+ settings["temperature"] = invocation_params["temperature"]
168
+ if settings:
169
+ result["settings"] = settings
170
+
171
+ # Tool Calls
172
+ tool_calls: list[dict[str, Any]] = []
173
+ for msg in output_messages:
174
+ # Ensure msg is a dictionary before proceeding
175
+ if not isinstance(msg, dict):
176
+ continue
177
+ msg_tool_calls = msg.get("message", {}).get("tool_calls", [])
178
+
179
+ # Ensure msg_tool_calls is a list
180
+ if not isinstance(msg_tool_calls, list):
181
+ continue
182
+
183
+ for tc in msg_tool_calls:
184
+ if not isinstance(tc, dict):
185
+ continue
186
+ tool_call_data = tc.get("tool_call", {})
187
+ if not isinstance(tool_call_data, dict):
188
+ continue
189
+ tool_calls.append(
190
+ {
191
+ "id": tool_call_data.get("id"),
192
+ "name": tool_call_data.get("function", {}).get("name"),
193
+ "arguments": _safe_parse_json(
194
+ tool_call_data.get("function", {}).get("arguments", "{}")
195
+ ),
196
+ }
197
+ )
198
+ if tool_calls:
199
+ result["toolCalls"] = tool_calls
200
+
201
+ return result
202
+
203
+ def _map_tool_call_attributes(self, attributes: Dict[str, Any]) -> Dict[str, Any]:
204
+ """Maps attributes for tool calls."""
205
+ result = attributes.copy() # Keep original attributes
206
+
207
+ result["type"] = "toolCall"
208
+ result["callId"] = attributes.get("call_id") or attributes.get("id")
209
+ result["toolName"] = attributes.get("tool.name")
210
+ result["arguments"] = _safe_parse_json(
211
+ attributes.get("input", attributes.get("input.value", "{}"))
212
+ )
213
+ result["toolType"] = "Integration"
214
+ result["result"] = _safe_parse_json(
215
+ attributes.get("output", attributes.get("output.value"))
216
+ )
217
+ result["error"] = None
218
+
219
+ return result
220
+
221
+ def _determine_status(self, error: Optional[str]) -> int:
222
+ if error:
223
+ if error and error.startswith("GraphInterrupt("):
224
+ return self.Status.INTERRUPTED
225
+ return self.Status.ERROR
226
+ return self.Status.SUCCESS
227
+
228
+ def _process_span_attributes(self, span_data: Dict[str, Any]) -> Dict[str, Any]:
229
+ """Extracts, transforms, and maps attributes for a span."""
230
+ if "Attributes" not in span_data:
231
+ return span_data
232
+
233
+ attributes_val = span_data["Attributes"]
234
+ if isinstance(attributes_val, str):
235
+ try:
236
+ attributes: Dict[str, Any] = json.loads(attributes_val)
237
+ except json.JSONDecodeError as e:
238
+ logger.warning(f"Failed to parse attributes JSON: {e}")
239
+ return span_data
240
+ elif isinstance(attributes_val, dict):
241
+ attributes = attributes_val
242
+ else:
243
+ return span_data
244
+
245
+ # Determine SpanType
246
+ if "openinference.span.kind" in attributes:
247
+ span_type = attributes["openinference.span.kind"]
248
+ span_data["SpanType"] = self.SPAN_TYPE_MAPPING.get(span_type, span_type)
249
+
250
+ # Apply basic attribute mapping
251
+ for old_key, mapping in self.ATTRIBUTE_MAPPING.items():
252
+ if old_key in attributes:
253
+ if isinstance(mapping, tuple):
254
+ new_key, func = mapping
255
+ attributes[new_key] = func(attributes[old_key])
256
+ else:
257
+ new_key = mapping
258
+ attributes[new_key] = attributes[old_key]
259
+
260
+ # Apply detailed mapping based on SpanType
261
+ span_type = span_data.get("SpanType")
262
+ if span_type == "completion":
263
+ processed_attributes = self._map_llm_call_attributes(attributes)
264
+ elif span_type == "toolCall":
265
+ processed_attributes = self._map_tool_call_attributes(attributes)
266
+ else:
267
+ processed_attributes = attributes.copy()
268
+
269
+ span_data["Attributes"] = json.dumps(processed_attributes)
270
+
271
+ # Determine status based on error information
272
+ error = attributes.get("error") or attributes.get("exception.message")
273
+ status = self._determine_status(error)
274
+ span_data["Status"] = status
275
+
276
+ return span_data
277
+
278
+ def _build_url(self, span_list: list[Dict[str, Any]]) -> str:
279
+ """Construct the URL for the API request."""
280
+ trace_id = str(span_list[0]["TraceId"])
281
+ return f"{self.base_url}/llmopstenant_/api/Traces/spans?traceId={trace_id}&source=Robots"
282
+
283
+ def _send_with_retries(
284
+ self, url: str, payload: list[Dict[str, Any]], max_retries: int = 4
285
+ ) -> SpanExportResult:
286
+ """Send the HTTP request with retry logic."""
287
+ for attempt in range(max_retries):
288
+ try:
289
+ response = self.http_client.post(url, json=payload)
290
+ if response.status_code == 200:
291
+ return SpanExportResult.SUCCESS
292
+ else:
293
+ logger.warning(
294
+ f"Attempt {attempt + 1} failed with status code {response.status_code}: {response.text}"
295
+ )
296
+ except Exception as e:
297
+ logger.error(f"Attempt {attempt + 1} failed with exception: {e}")
298
+
299
+ if attempt < max_retries - 1:
300
+ time.sleep(1.5**attempt) # Exponential backoff
301
+
302
+ return SpanExportResult.FAILURE
303
+
304
+ def _get_base_url(self) -> str:
305
+ uipath_url = (
306
+ os.environ.get("UIPATH_URL")
307
+ or "https://cloud.uipath.com/dummyOrg/dummyTennant/"
308
+ )
309
+
310
+ uipath_url = uipath_url.rstrip("/")
311
+
312
+ return uipath_url
313
+
314
+
315
+ class JsonLinesFileExporter(SpanExporter):
316
+ def __init__(self, file_path: str):
317
+ self.file_path = file_path
318
+ # Ensure the directory exists
319
+ dir_path = os.path.dirname(self.file_path)
320
+ if dir_path: # Only create if there's an actual directory path
321
+ os.makedirs(dir_path, exist_ok=True)
322
+
323
+ def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult:
324
+ try:
325
+ uipath_spans = [
326
+ _SpanUtils.otel_span_to_uipath_span(span).to_dict() for span in spans
327
+ ]
328
+
329
+ with open(self.file_path, "a") as f:
330
+ for span in uipath_spans:
331
+ f.write(json.dumps(span) + "\n")
332
+ return SpanExportResult.SUCCESS
333
+ except Exception as e:
334
+ logger.error(f"Failed to export spans to {self.file_path}: {e}")
335
+ return SpanExportResult.FAILURE
336
+
337
+ def shutdown(self) -> None:
338
+ """Shuts down the exporter."""
339
+ pass
@@ -0,0 +1,24 @@
1
+ {
2
+ "fileName": "default.json",
3
+ "id": "default-eval-set-id",
4
+ "name": "Basic Calculator Evaluation Set",
5
+ "batchSize": 10,
6
+ "evaluatorRefs": [
7
+ "equality"
8
+ ],
9
+ "evaluations": [
10
+ {
11
+ "id": "test-addition",
12
+ "name": "Test Addition",
13
+ "inputs": {"foo": "bar"},
14
+ "expectedOutput": {"foo": "bar"},
15
+ "expectedAgentBehavior": "",
16
+ "evalSetId": "default-eval-set-id",
17
+ "createdAt": "2025-09-04T18:54:58.378Z",
18
+ "updatedAt": "2025-09-04T18:55:55.416Z"
19
+ }
20
+ ],
21
+ "modelSettings": [],
22
+ "createdAt": "2025-09-04T18:54:58.379Z",
23
+ "updatedAt": "2025-09-04T18:55:55.416Z"
24
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "fileName": "equality.json",
3
+ "id": "equality",
4
+ "name": "Equality Evaluator",
5
+ "description": "An evaluator that judges the agent based on expected output.",
6
+ "category": 0,
7
+ "type": 1,
8
+ "targetOutputKey": "*",
9
+ "createdAt": "2025-06-26T17:45:39.651Z",
10
+ "updatedAt": "2025-06-26T17:45:39.651Z"
11
+ }
@@ -0,0 +1,41 @@
1
+ from pathlib import Path
2
+ from typing import Any
3
+
4
+ from uipath._cli._evals._evaluate import evaluate
5
+ from uipath._cli._evals._runtime import UiPathEvalContext
6
+ from uipath._cli._runtime._contracts import UiPathRuntimeContext, UiPathRuntimeFactory
7
+ from uipath._cli._runtime._runtime import UiPathRuntime
8
+ from uipath._events._event_bus import EventBus
9
+
10
+
11
+ async def test_evaluate():
12
+ # Arrange
13
+ event_bus = EventBus()
14
+ context = UiPathEvalContext(
15
+ eval_set=str(Path(__file__).parent / "evals" / "eval-sets" / "default.json")
16
+ )
17
+
18
+ async def identity(input: Any) -> Any:
19
+ return input
20
+
21
+ class MyFactory(UiPathRuntimeFactory[UiPathRuntime, UiPathRuntimeContext]):
22
+ def __init__(self):
23
+ super().__init__(
24
+ UiPathRuntime,
25
+ UiPathRuntimeContext,
26
+ runtime_generator=lambda context: UiPathRuntime(
27
+ context, executor=identity
28
+ ),
29
+ )
30
+
31
+ # Act
32
+ result = await evaluate(MyFactory(), context, event_bus)
33
+
34
+ # Assert
35
+ assert result.output
36
+ assert (
37
+ result.output["evaluationSetResults"][0]["evaluationRunResults"][0]["result"][
38
+ "score"
39
+ ]
40
+ == 100.0
41
+ )
@@ -120,6 +120,7 @@ class TestRun:
120
120
  debug=False,
121
121
  debug_port=5678,
122
122
  execution_output_file=None,
123
+ trace_file=None,
123
124
  )
124
125
 
125
126
  class TestMiddleware: