uipath 2.1.102__tar.gz → 2.1.103__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 (379) hide show
  1. {uipath-2.1.102 → uipath-2.1.103}/PKG-INFO +1 -1
  2. {uipath-2.1.102 → uipath-2.1.103}/pyproject.toml +1 -1
  3. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_runtime/_contracts.py +1 -0
  4. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_run.py +15 -1
  5. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_resources/CLI_REFERENCE.md +1 -0
  6. uipath-2.1.103/src/uipath/tracing/__init__.py +13 -0
  7. uipath-2.1.103/src/uipath/tracing/_otel_exporters.py +339 -0
  8. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_run.py +1 -0
  9. uipath-2.1.103/tests/tracing/test_otel_exporters.py +448 -0
  10. {uipath-2.1.102 → uipath-2.1.103}/uv.lock +1 -1
  11. uipath-2.1.102/src/uipath/tracing/__init__.py +0 -4
  12. uipath-2.1.102/src/uipath/tracing/_otel_exporters.py +0 -95
  13. uipath-2.1.102/tests/tracing/test_otel_exporters.py +0 -190
  14. {uipath-2.1.102 → uipath-2.1.103}/.claude/agents/command-tester.md +0 -0
  15. {uipath-2.1.102 → uipath-2.1.103}/.claude/commands/prepare-pr.md +0 -0
  16. {uipath-2.1.102 → uipath-2.1.103}/.cursorrules +0 -0
  17. {uipath-2.1.102 → uipath-2.1.103}/.editorconfig +0 -0
  18. {uipath-2.1.102 → uipath-2.1.103}/.gitattributes +0 -0
  19. {uipath-2.1.102 → uipath-2.1.103}/.github/labeler.yml +0 -0
  20. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/auto-label.yml +0 -0
  21. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/cd.yml +0 -0
  22. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/ci.yml +0 -0
  23. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/commitlint.yml +0 -0
  24. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/integration_tests.yml +0 -0
  25. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/lint.yml +0 -0
  26. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/publish-dev.yml +0 -0
  27. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/publish-docs.yml +0 -0
  28. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/slack.yml +0 -0
  29. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/test-uipath-langchain.yml +0 -0
  30. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/test-uipath-llamaindex.yml +0 -0
  31. {uipath-2.1.102 → uipath-2.1.103}/.github/workflows/test.yml +0 -0
  32. {uipath-2.1.102 → uipath-2.1.103}/.gitignore +0 -0
  33. {uipath-2.1.102 → uipath-2.1.103}/.pre-commit-config.yaml +0 -0
  34. {uipath-2.1.102 → uipath-2.1.103}/.python-version +0 -0
  35. {uipath-2.1.102 → uipath-2.1.103}/.vscode/extensions.json +0 -0
  36. {uipath-2.1.102 → uipath-2.1.103}/.vscode/launch.json +0 -0
  37. {uipath-2.1.102 → uipath-2.1.103}/.vscode/settings.json +0 -0
  38. {uipath-2.1.102 → uipath-2.1.103}/CONTRIBUTING.md +0 -0
  39. {uipath-2.1.102 → uipath-2.1.103}/LICENSE +0 -0
  40. {uipath-2.1.102 → uipath-2.1.103}/README.md +0 -0
  41. {uipath-2.1.102 → uipath-2.1.103}/docs/AutomationSuite.md +0 -0
  42. {uipath-2.1.102 → uipath-2.1.103}/docs/CONTRIBUTING.md +0 -0
  43. {uipath-2.1.102 → uipath-2.1.103}/docs/FAQ.md +0 -0
  44. {uipath-2.1.102 → uipath-2.1.103}/docs/assets/env-preparation-failed-dark.png +0 -0
  45. {uipath-2.1.102 → uipath-2.1.103}/docs/assets/env-preparation-failed-light.png +0 -0
  46. {uipath-2.1.102 → uipath-2.1.103}/docs/assets/favicon.png +0 -0
  47. {uipath-2.1.102 → uipath-2.1.103}/docs/assets/llms.txt +0 -0
  48. {uipath-2.1.102 → uipath-2.1.103}/docs/assets/logo-dark.svg +0 -0
  49. {uipath-2.1.102 → uipath-2.1.103}/docs/assets/logo-light.svg +0 -0
  50. {uipath-2.1.102 → uipath-2.1.103}/docs/cli/index.md +0 -0
  51. {uipath-2.1.102 → uipath-2.1.103}/docs/core/actions.md +0 -0
  52. {uipath-2.1.102 → uipath-2.1.103}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  53. {uipath-2.1.102 → uipath-2.1.103}/docs/core/assets/cloud_env_var_light.gif +0 -0
  54. {uipath-2.1.102 → uipath-2.1.103}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  55. {uipath-2.1.102 → uipath-2.1.103}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  56. {uipath-2.1.102 → uipath-2.1.103}/docs/core/assets/copy_path_dark.png +0 -0
  57. {uipath-2.1.102 → uipath-2.1.103}/docs/core/assets/copy_path_light.png +0 -0
  58. {uipath-2.1.102 → uipath-2.1.103}/docs/core/assets.md +0 -0
  59. {uipath-2.1.102 → uipath-2.1.103}/docs/core/attachments.md +0 -0
  60. {uipath-2.1.102 → uipath-2.1.103}/docs/core/buckets.md +0 -0
  61. {uipath-2.1.102 → uipath-2.1.103}/docs/core/connections.md +0 -0
  62. {uipath-2.1.102 → uipath-2.1.103}/docs/core/context_grounding.md +0 -0
  63. {uipath-2.1.102 → uipath-2.1.103}/docs/core/documents.md +0 -0
  64. {uipath-2.1.102 → uipath-2.1.103}/docs/core/documents_models.md +0 -0
  65. {uipath-2.1.102 → uipath-2.1.103}/docs/core/environment_variables.md +0 -0
  66. {uipath-2.1.102 → uipath-2.1.103}/docs/core/getting_started.md +0 -0
  67. {uipath-2.1.102 → uipath-2.1.103}/docs/core/jobs.md +0 -0
  68. {uipath-2.1.102 → uipath-2.1.103}/docs/core/llm_gateway.md +0 -0
  69. {uipath-2.1.102 → uipath-2.1.103}/docs/core/processes.md +0 -0
  70. {uipath-2.1.102 → uipath-2.1.103}/docs/core/queues.md +0 -0
  71. {uipath-2.1.102 → uipath-2.1.103}/docs/core/traced.md +0 -0
  72. {uipath-2.1.102 → uipath-2.1.103}/docs/hooks.py +0 -0
  73. {uipath-2.1.102 → uipath-2.1.103}/docs/index.md +0 -0
  74. {uipath-2.1.102 → uipath-2.1.103}/docs/javascripts/extra.js +0 -0
  75. {uipath-2.1.102 → uipath-2.1.103}/docs/overrides/main.html +0 -0
  76. {uipath-2.1.102 → uipath-2.1.103}/docs/overrides/partials/actions.html +0 -0
  77. {uipath-2.1.102 → uipath-2.1.103}/docs/overrides/partials/logo.html +0 -0
  78. {uipath-2.1.102 → uipath-2.1.103}/docs/release_policy.md +0 -0
  79. {uipath-2.1.102 → uipath-2.1.103}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  80. {uipath-2.1.102 → uipath-2.1.103}/docs/stylesheets/extra.css +0 -0
  81. {uipath-2.1.102 → uipath-2.1.103}/justfile +0 -0
  82. {uipath-2.1.102 → uipath-2.1.103}/mkdocs.yml +0 -0
  83. {uipath-2.1.102 → uipath-2.1.103}/py.typed +0 -0
  84. {uipath-2.1.102 → uipath-2.1.103}/samples/asset-modifier-agent/.env.example +0 -0
  85. {uipath-2.1.102 → uipath-2.1.103}/samples/asset-modifier-agent/README.md +0 -0
  86. {uipath-2.1.102 → uipath-2.1.103}/samples/asset-modifier-agent/input.json +0 -0
  87. {uipath-2.1.102 → uipath-2.1.103}/samples/asset-modifier-agent/main.py +0 -0
  88. {uipath-2.1.102 → uipath-2.1.103}/samples/asset-modifier-agent/pyproject.toml +0 -0
  89. {uipath-2.1.102 → uipath-2.1.103}/samples/asset-modifier-agent/uv.lock +0 -0
  90. {uipath-2.1.102 → uipath-2.1.103}/samples/calculator/README.md +0 -0
  91. {uipath-2.1.102 → uipath-2.1.103}/samples/calculator/evals/eval-sets/default.json +0 -0
  92. {uipath-2.1.102 → uipath-2.1.103}/samples/calculator/evals/evaluators/equality.json +0 -0
  93. {uipath-2.1.102 → uipath-2.1.103}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
  94. {uipath-2.1.102 → uipath-2.1.103}/samples/calculator/main.py +0 -0
  95. {uipath-2.1.102 → uipath-2.1.103}/samples/calculator/pyproject.toml +0 -0
  96. {uipath-2.1.102 → uipath-2.1.103}/samples/calculator/uipath.json +0 -0
  97. {uipath-2.1.102 → uipath-2.1.103}/samples/event-trigger/.python-version +0 -0
  98. {uipath-2.1.102 → uipath-2.1.103}/samples/event-trigger/README.md +0 -0
  99. {uipath-2.1.102 → uipath-2.1.103}/samples/event-trigger/main.py +0 -0
  100. {uipath-2.1.102 → uipath-2.1.103}/samples/event-trigger/pyproject.toml +0 -0
  101. {uipath-2.1.102 → uipath-2.1.103}/samples/google-ADK-agent/.env.example +0 -0
  102. {uipath-2.1.102 → uipath-2.1.103}/samples/google-ADK-agent/README.md +0 -0
  103. {uipath-2.1.102 → uipath-2.1.103}/samples/google-ADK-agent/input.json +0 -0
  104. {uipath-2.1.102 → uipath-2.1.103}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  105. {uipath-2.1.102 → uipath-2.1.103}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  106. {uipath-2.1.102 → uipath-2.1.103}/samples/google-ADK-agent/pyproject.toml +0 -0
  107. {uipath-2.1.102 → uipath-2.1.103}/samples/google-ADK-agent/uv.lock +0 -0
  108. {uipath-2.1.102 → uipath-2.1.103}/scripts/debug_test.py +0 -0
  109. {uipath-2.1.102 → uipath-2.1.103}/scripts/lint_httpx_client.py +0 -0
  110. {uipath-2.1.102 → uipath-2.1.103}/scripts/update_agents_md.py +0 -0
  111. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/__init__.py +0 -0
  112. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/README.md +0 -0
  113. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/__init__.py +0 -0
  114. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  115. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/_auth_service.py +0 -0
  116. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/_models.py +0 -0
  117. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  118. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  119. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  120. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/_utils.py +0 -0
  121. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/auth_config.json +0 -0
  122. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/index.html +0 -0
  123. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/localhost.crt +0 -0
  124. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_auth/localhost.key +0 -0
  125. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_debug/_bridge.py +0 -0
  126. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_debug/_runtime.py +0 -0
  127. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  128. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  129. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  130. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  131. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  132. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  133. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  134. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  135. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  136. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  137. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  138. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  139. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
  140. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
  141. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  142. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
  143. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
  144. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
  145. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
  146. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_models/_output.py +0 -0
  147. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
  148. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
  149. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_runtime.py +0 -0
  150. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/_span_collection.py +0 -0
  151. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
  152. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/mocks/input_mocker.py +0 -0
  153. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/mocks/llm_mocker.py +0 -0
  154. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
  155. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
  156. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
  157. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_evals/mocks/mocks.py +0 -0
  158. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  159. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  160. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  161. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_runtime/_logging.py +0 -0
  162. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  163. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_runtime/_runtime_factory.py +0 -0
  164. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
  165. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  166. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_templates/.rels.template +0 -0
  167. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  168. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_templates/main.py.template +0 -0
  169. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  170. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_common.py +0 -0
  171. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_console.py +0 -0
  172. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_constants.py +0 -0
  173. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_debug.py +0 -0
  174. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  175. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_folders.py +0 -0
  176. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_input_args.py +0 -0
  177. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  178. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_processes.py +0 -0
  179. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_project_files.py +0 -0
  180. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  181. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_tracing.py +0 -0
  182. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  183. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_auth.py +0 -0
  184. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_debug.py +0 -0
  185. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_deploy.py +0 -0
  186. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_dev.py +0 -0
  187. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_eval.py +0 -0
  188. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_init.py +0 -0
  189. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_invoke.py +0 -0
  190. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_new.py +0 -0
  191. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_pack.py +0 -0
  192. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_publish.py +0 -0
  193. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_pull.py +0 -0
  194. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/cli_push.py +0 -0
  195. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/middlewares.py +0 -0
  196. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/models/__init__.py +0 -0
  197. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/models/runtime_schema.py +0 -0
  198. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_cli/spinner.py +0 -0
  199. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_config.py +0 -0
  200. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_events/__init__.py +0 -0
  201. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_events/_event_bus.py +0 -0
  202. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_events/_events.py +0 -0
  203. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_execution_context.py +0 -0
  204. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_folder_context.py +0 -0
  205. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_resources/AGENTS.md +0 -0
  206. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_resources/CLAUDE.md +0 -0
  207. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_resources/REQUIRED_STRUCTURE.md +0 -0
  208. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_resources/SDK_REFERENCE.md +0 -0
  209. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/__init__.py +0 -0
  210. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/_base_service.py +0 -0
  211. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/actions_service.py +0 -0
  212. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/api_client.py +0 -0
  213. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/assets_service.py +0 -0
  214. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/attachments_service.py +0 -0
  215. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/buckets_service.py +0 -0
  216. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/connections_service.py +0 -0
  217. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/context_grounding_service.py +0 -0
  218. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/documents_service.py +0 -0
  219. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/entities_service.py +0 -0
  220. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/external_application_service.py +0 -0
  221. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/folder_service.py +0 -0
  222. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/jobs_service.py +0 -0
  223. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/llm_gateway_service.py +0 -0
  224. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/processes_service.py +0 -0
  225. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_services/queues_service.py +0 -0
  226. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_uipath.py +0 -0
  227. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/__init__.py +0 -0
  228. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_auth.py +0 -0
  229. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_endpoint.py +0 -0
  230. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_infer_bindings.py +0 -0
  231. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_logs.py +0 -0
  232. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_read_overwrites.py +0 -0
  233. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_request_override.py +0 -0
  234. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_request_spec.py +0 -0
  235. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_ssl_context.py +0 -0
  236. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_url.py +0 -0
  237. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/_user_agent.py +0 -0
  238. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/_utils/constants.py +0 -0
  239. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/_utils.py +0 -0
  240. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/__init__.py +0 -0
  241. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/async_stream.py +0 -0
  242. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/citation.py +0 -0
  243. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/content.py +0 -0
  244. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/conversation.py +0 -0
  245. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/event.py +0 -0
  246. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/exchange.py +0 -0
  247. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/message.py +0 -0
  248. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/meta.py +0 -0
  249. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/conversation/tool.py +0 -0
  250. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/models/agent.py +0 -0
  251. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/models/evals.py +0 -0
  252. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/react/__init__.py +0 -0
  253. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/react/prompts.py +0 -0
  254. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/agent/react/tools.py +0 -0
  255. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/_helpers/__init__.py +0 -0
  256. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/_helpers/helpers.py +0 -0
  257. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/evaluators/__init__.py +0 -0
  258. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
  259. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
  260. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
  261. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
  262. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
  263. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
  264. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/mocks/__init__.py +0 -0
  265. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/mocks/mockable.py +0 -0
  266. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/models/__init__.py +0 -0
  267. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/eval/models/models.py +0 -0
  268. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/__init__.py +0 -0
  269. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/action_schema.py +0 -0
  270. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/actions.py +0 -0
  271. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/assets.py +0 -0
  272. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/attachment.py +0 -0
  273. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/auth.py +0 -0
  274. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/buckets.py +0 -0
  275. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/connections.py +0 -0
  276. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/context_grounding.py +0 -0
  277. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/context_grounding_index.py +0 -0
  278. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/documents.py +0 -0
  279. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/entities.py +0 -0
  280. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/errors.py +0 -0
  281. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/exceptions.py +0 -0
  282. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/guardrails.py +0 -0
  283. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/interrupt_models.py +0 -0
  284. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/job.py +0 -0
  285. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/llm_gateway.py +0 -0
  286. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/processes.py +0 -0
  287. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/models/queues.py +0 -0
  288. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/py.typed +0 -0
  289. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/telemetry/__init__.py +0 -0
  290. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/telemetry/_constants.py +0 -0
  291. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/telemetry/_track.py +0 -0
  292. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/tracing/_traced.py +0 -0
  293. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/tracing/_utils.py +0 -0
  294. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/utils/__init__.py +0 -0
  295. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/utils/_endpoints_manager.py +0 -0
  296. {uipath-2.1.102 → uipath-2.1.103}/src/uipath/utils/dynamic_schema.py +0 -0
  297. {uipath-2.1.102 → uipath-2.1.103}/testcases/apicalls-testcase/main.py +0 -0
  298. {uipath-2.1.102 → uipath-2.1.103}/testcases/apicalls-testcase/pyproject.toml +0 -0
  299. {uipath-2.1.102 → uipath-2.1.103}/testcases/apicalls-testcase/run.sh +0 -0
  300. {uipath-2.1.102 → uipath-2.1.103}/testcases/apicalls-testcase/src/assert.py +0 -0
  301. {uipath-2.1.102 → uipath-2.1.103}/testcases/basic-testcase/main.py +0 -0
  302. {uipath-2.1.102 → uipath-2.1.103}/testcases/basic-testcase/pyproject.toml +0 -0
  303. {uipath-2.1.102 → uipath-2.1.103}/testcases/basic-testcase/run.sh +0 -0
  304. {uipath-2.1.102 → uipath-2.1.103}/testcases/basic-testcase/src/assert.py +0 -0
  305. {uipath-2.1.102 → uipath-2.1.103}/testcases/common/validate_output.sh +0 -0
  306. {uipath-2.1.102 → uipath-2.1.103}/testcases/langchain-cross/agent.mermaid +0 -0
  307. {uipath-2.1.102 → uipath-2.1.103}/testcases/langchain-cross/langgraph.json +0 -0
  308. {uipath-2.1.102 → uipath-2.1.103}/testcases/langchain-cross/pyproject.toml +0 -0
  309. {uipath-2.1.102 → uipath-2.1.103}/testcases/langchain-cross/run.sh +0 -0
  310. {uipath-2.1.102 → uipath-2.1.103}/testcases/langchain-cross/src/assert.py +0 -0
  311. {uipath-2.1.102 → uipath-2.1.103}/testcases/langchain-cross/src/main.py +0 -0
  312. {uipath-2.1.102 → uipath-2.1.103}/testcases/llamaindex-cross/agent.mermaid +0 -0
  313. {uipath-2.1.102 → uipath-2.1.103}/testcases/llamaindex-cross/llama_index.json +0 -0
  314. {uipath-2.1.102 → uipath-2.1.103}/testcases/llamaindex-cross/pyproject.toml +0 -0
  315. {uipath-2.1.102 → uipath-2.1.103}/testcases/llamaindex-cross/run.sh +0 -0
  316. {uipath-2.1.102 → uipath-2.1.103}/testcases/llamaindex-cross/src/assert.py +0 -0
  317. {uipath-2.1.102 → uipath-2.1.103}/testcases/llamaindex-cross/src/main.py +0 -0
  318. {uipath-2.1.102 → uipath-2.1.103}/tests/__init__.py +0 -0
  319. {uipath-2.1.102 → uipath-2.1.103}/tests/agent/models/test_agent.py +0 -0
  320. {uipath-2.1.102 → uipath-2.1.103}/tests/agent/models/test_evals.py +0 -0
  321. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/conftest.py +0 -0
  322. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/eval/mocks/test_input_mocker.py +0 -0
  323. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/eval/mocks/test_mocks.py +0 -0
  324. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  325. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/mocks/bindings_script.py +0 -0
  326. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/mocks/pyproject.toml +0 -0
  327. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/mocks/simple_script.py +0 -0
  328. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/mocks/uipath-mock.json +0 -0
  329. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  330. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/models/test_runtime_schema.py +0 -0
  331. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_auth.py +0 -0
  332. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_hitl.py +0 -0
  333. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_init.py +0 -0
  334. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_init_agents_md.py +0 -0
  335. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_input_args.py +0 -0
  336. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_invoke.py +0 -0
  337. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_new.py +0 -0
  338. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_oidc_utils.py +0 -0
  339. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_pack.py +0 -0
  340. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  341. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_portal_service_refresh_token.py +0 -0
  342. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_publish.py +0 -0
  343. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_pull.py +0 -0
  344. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_push.py +0 -0
  345. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/test_utils.py +0 -0
  346. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/utils/common.py +0 -0
  347. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/utils/project_details.py +0 -0
  348. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/utils/test_dynamic_schema.py +0 -0
  349. {uipath-2.1.102 → uipath-2.1.103}/tests/cli/utils/uipath_json.py +0 -0
  350. {uipath-2.1.102 → uipath-2.1.103}/tests/conftest.py +0 -0
  351. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/conftest.py +0 -0
  352. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_actions_service.py +0 -0
  353. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_api_client.py +0 -0
  354. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_assets_service.py +0 -0
  355. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_attachments_service.py +0 -0
  356. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_base_service.py +0 -0
  357. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_buckets_service.py +0 -0
  358. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_connections_service.py +0 -0
  359. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_context_grounding_service.py +0 -0
  360. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_documents_service.py +0 -0
  361. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_entities_service.py +0 -0
  362. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_external_application_service.py +0 -0
  363. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_folder_service.py +0 -0
  364. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_jobs_service.py +0 -0
  365. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_llm_integration.py +0 -0
  366. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  367. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_llm_service.py +0 -0
  368. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_processes_service.py +0 -0
  369. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_queues_service.py +0 -0
  370. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  371. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
  372. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
  373. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
  374. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/test_bindings_inference.py +0 -0
  375. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/test_config.py +0 -0
  376. {uipath-2.1.102 → uipath-2.1.103}/tests/sdk/test_overwrites.py +0 -0
  377. {uipath-2.1.102 → uipath-2.1.103}/tests/tracing/test_span_utils.py +0 -0
  378. {uipath-2.1.102 → uipath-2.1.103}/tests/tracing/test_traced.py +0 -0
  379. {uipath-2.1.102 → uipath-2.1.103}/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.103
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.103"
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"
@@ -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
@@ -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
 
@@ -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
@@ -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: