uipath 2.1.53__tar.gz → 2.1.55__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. uipath-2.1.55/.github/workflows/integration_tests.yml +72 -0
  2. {uipath-2.1.53 → uipath-2.1.55}/PKG-INFO +1 -1
  3. {uipath-2.1.53 → uipath-2.1.55}/docs/core/getting_started.md +6 -2
  4. {uipath-2.1.53 → uipath-2.1.55}/pyproject.toml +3 -3
  5. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_runtime/_contracts.py +1 -1
  6. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_studio_project.py +30 -29
  7. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/tracing/_traced.py +130 -134
  8. uipath-2.1.55/testcases/apicalls-testcase/main.py +47 -0
  9. uipath-2.1.55/testcases/apicalls-testcase/pyproject.toml +12 -0
  10. uipath-2.1.55/testcases/apicalls-testcase/run.sh +16 -0
  11. uipath-2.1.55/testcases/apicalls-testcase/src/assert.py +32 -0
  12. uipath-2.1.55/testcases/basic-testcase/main.py +31 -0
  13. uipath-2.1.55/testcases/basic-testcase/pyproject.toml +12 -0
  14. uipath-2.1.55/testcases/basic-testcase/run.sh +15 -0
  15. uipath-2.1.55/testcases/basic-testcase/src/assert.py +32 -0
  16. uipath-2.1.55/testcases/common/validate_output.sh +35 -0
  17. uipath-2.1.55/testcases/langchain-cross/agent.mermaid +14 -0
  18. uipath-2.1.55/testcases/langchain-cross/langgraph.json +7 -0
  19. uipath-2.1.55/testcases/langchain-cross/pyproject.toml +13 -0
  20. uipath-2.1.55/testcases/langchain-cross/run.sh +15 -0
  21. uipath-2.1.55/testcases/langchain-cross/src/assert.py +45 -0
  22. uipath-2.1.55/testcases/langchain-cross/src/main.py +22 -0
  23. uipath-2.1.55/testcases/llamaindex-cross/agent.mermaid +17 -0
  24. uipath-2.1.55/testcases/llamaindex-cross/llama_index.json +7 -0
  25. uipath-2.1.55/testcases/llamaindex-cross/pyproject.toml +13 -0
  26. uipath-2.1.55/testcases/llamaindex-cross/run.sh +15 -0
  27. uipath-2.1.55/testcases/llamaindex-cross/src/assert.py +47 -0
  28. uipath-2.1.55/testcases/llamaindex-cross/src/main.py +38 -0
  29. {uipath-2.1.53 → uipath-2.1.55}/uv.lock +1 -1
  30. {uipath-2.1.53 → uipath-2.1.55}/.cursorrules +0 -0
  31. {uipath-2.1.53 → uipath-2.1.55}/.editorconfig +0 -0
  32. {uipath-2.1.53 → uipath-2.1.55}/.gitattributes +0 -0
  33. {uipath-2.1.53 → uipath-2.1.55}/.github/workflows/cd.yml +0 -0
  34. {uipath-2.1.53 → uipath-2.1.55}/.github/workflows/ci.yml +0 -0
  35. {uipath-2.1.53 → uipath-2.1.55}/.github/workflows/commitlint.yml +0 -0
  36. {uipath-2.1.53 → uipath-2.1.55}/.github/workflows/lint.yml +0 -0
  37. {uipath-2.1.53 → uipath-2.1.55}/.github/workflows/publish-dev.yml +0 -0
  38. {uipath-2.1.53 → uipath-2.1.55}/.github/workflows/publish-docs.yml +0 -0
  39. {uipath-2.1.53 → uipath-2.1.55}/.github/workflows/slack.yml +0 -0
  40. {uipath-2.1.53 → uipath-2.1.55}/.github/workflows/test.yml +0 -0
  41. {uipath-2.1.53 → uipath-2.1.55}/.gitignore +0 -0
  42. {uipath-2.1.53 → uipath-2.1.55}/.pre-commit-config.yaml +0 -0
  43. {uipath-2.1.53 → uipath-2.1.55}/.python-version +0 -0
  44. {uipath-2.1.53 → uipath-2.1.55}/.vscode/extensions.json +0 -0
  45. {uipath-2.1.53 → uipath-2.1.55}/.vscode/launch.json +0 -0
  46. {uipath-2.1.53 → uipath-2.1.55}/.vscode/settings.json +0 -0
  47. {uipath-2.1.53 → uipath-2.1.55}/CONTRIBUTING.md +0 -0
  48. {uipath-2.1.53 → uipath-2.1.55}/LICENSE +0 -0
  49. {uipath-2.1.53 → uipath-2.1.55}/README.md +0 -0
  50. {uipath-2.1.53 → uipath-2.1.55}/docs/CONTRIBUTING.md +0 -0
  51. {uipath-2.1.53 → uipath-2.1.55}/docs/FAQ.md +0 -0
  52. {uipath-2.1.53 → uipath-2.1.55}/docs/assets/env-preparation-failed-dark.png +0 -0
  53. {uipath-2.1.53 → uipath-2.1.55}/docs/assets/env-preparation-failed-light.png +0 -0
  54. {uipath-2.1.53 → uipath-2.1.55}/docs/assets/favicon.png +0 -0
  55. {uipath-2.1.53 → uipath-2.1.55}/docs/assets/logo-dark.svg +0 -0
  56. {uipath-2.1.53 → uipath-2.1.55}/docs/assets/logo-light.svg +0 -0
  57. {uipath-2.1.53 → uipath-2.1.55}/docs/cli/index.md +0 -0
  58. {uipath-2.1.53 → uipath-2.1.55}/docs/core/actions.md +0 -0
  59. {uipath-2.1.53 → uipath-2.1.55}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  60. {uipath-2.1.53 → uipath-2.1.55}/docs/core/assets/cloud_env_var_light.gif +0 -0
  61. {uipath-2.1.53 → uipath-2.1.55}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  62. {uipath-2.1.53 → uipath-2.1.55}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  63. {uipath-2.1.53 → uipath-2.1.55}/docs/core/assets/copy_path_dark.png +0 -0
  64. {uipath-2.1.53 → uipath-2.1.55}/docs/core/assets/copy_path_light.png +0 -0
  65. {uipath-2.1.53 → uipath-2.1.55}/docs/core/assets.md +0 -0
  66. {uipath-2.1.53 → uipath-2.1.55}/docs/core/attachments.md +0 -0
  67. {uipath-2.1.53 → uipath-2.1.55}/docs/core/buckets.md +0 -0
  68. {uipath-2.1.53 → uipath-2.1.55}/docs/core/connections.md +0 -0
  69. {uipath-2.1.53 → uipath-2.1.55}/docs/core/context_grounding.md +0 -0
  70. {uipath-2.1.53 → uipath-2.1.55}/docs/core/environment_variables.md +0 -0
  71. {uipath-2.1.53 → uipath-2.1.55}/docs/core/jobs.md +0 -0
  72. {uipath-2.1.53 → uipath-2.1.55}/docs/core/llm_gateway.md +0 -0
  73. {uipath-2.1.53 → uipath-2.1.55}/docs/core/processes.md +0 -0
  74. {uipath-2.1.53 → uipath-2.1.55}/docs/core/queues.md +0 -0
  75. {uipath-2.1.53 → uipath-2.1.55}/docs/core/traced.md +0 -0
  76. {uipath-2.1.53 → uipath-2.1.55}/docs/hooks.py +0 -0
  77. {uipath-2.1.53 → uipath-2.1.55}/docs/index.md +0 -0
  78. {uipath-2.1.53 → uipath-2.1.55}/docs/javascripts/extra.js +0 -0
  79. {uipath-2.1.53 → uipath-2.1.55}/docs/overrides/main.html +0 -0
  80. {uipath-2.1.53 → uipath-2.1.55}/docs/overrides/partials/actions.html +0 -0
  81. {uipath-2.1.53 → uipath-2.1.55}/docs/overrides/partials/logo.html +0 -0
  82. {uipath-2.1.53 → uipath-2.1.55}/docs/release_policy.md +0 -0
  83. {uipath-2.1.53 → uipath-2.1.55}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  84. {uipath-2.1.53 → uipath-2.1.55}/docs/stylesheets/extra.css +0 -0
  85. {uipath-2.1.53 → uipath-2.1.55}/justfile +0 -0
  86. {uipath-2.1.53 → uipath-2.1.55}/mkdocs.yml +0 -0
  87. {uipath-2.1.53 → uipath-2.1.55}/py.typed +0 -0
  88. {uipath-2.1.53 → uipath-2.1.55}/samples/calculator/README.md +0 -0
  89. {uipath-2.1.53 → uipath-2.1.55}/samples/calculator/main.py +0 -0
  90. {uipath-2.1.53 → uipath-2.1.55}/samples/calculator/pyproject.toml +0 -0
  91. {uipath-2.1.53 → uipath-2.1.55}/samples/event-trigger/.python-version +0 -0
  92. {uipath-2.1.53 → uipath-2.1.55}/samples/event-trigger/README.md +0 -0
  93. {uipath-2.1.53 → uipath-2.1.55}/samples/event-trigger/main.py +0 -0
  94. {uipath-2.1.53 → uipath-2.1.55}/samples/event-trigger/pyproject.toml +0 -0
  95. {uipath-2.1.53 → uipath-2.1.55}/samples/google-ADK-agent/.env.example +0 -0
  96. {uipath-2.1.53 → uipath-2.1.55}/samples/google-ADK-agent/README.md +0 -0
  97. {uipath-2.1.53 → uipath-2.1.55}/samples/google-ADK-agent/input.json +0 -0
  98. {uipath-2.1.53 → uipath-2.1.55}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  99. {uipath-2.1.53 → uipath-2.1.55}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  100. {uipath-2.1.53 → uipath-2.1.55}/samples/google-ADK-agent/pyproject.toml +0 -0
  101. {uipath-2.1.53 → uipath-2.1.55}/samples/google-ADK-agent/uv.lock +0 -0
  102. {uipath-2.1.53 → uipath-2.1.55}/scripts/debug_test.py +0 -0
  103. {uipath-2.1.53 → uipath-2.1.55}/scripts/lint_httpx_client.py +0 -0
  104. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/__init__.py +0 -0
  105. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/README.md +0 -0
  106. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/__init__.py +0 -0
  107. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  108. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/_auth_service.py +0 -0
  109. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
  110. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/_models.py +0 -0
  111. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  112. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  113. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  114. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/_utils.py +0 -0
  115. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/auth_config.json +0 -0
  116. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/index.html +0 -0
  117. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/localhost.crt +0 -0
  118. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_auth/localhost.key +0 -0
  119. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  120. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  121. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  122. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  123. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  124. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  125. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  126. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  127. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  128. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  129. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  130. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  131. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
  132. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  133. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
  134. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_evals/_models/_output.py +0 -0
  135. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_evals/_runtime.py +0 -0
  136. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  137. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  138. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  139. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_runtime/_logging.py +0 -0
  140. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  141. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
  142. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  143. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_templates/.rels.template +0 -0
  144. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  145. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_templates/main.py.template +0 -0
  146. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  147. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_common.py +0 -0
  148. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_console.py +0 -0
  149. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_constants.py +0 -0
  150. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_debug.py +0 -0
  151. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  152. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_folders.py +0 -0
  153. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_input_args.py +0 -0
  154. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  155. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_processes.py +0 -0
  156. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_project_files.py +0 -0
  157. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_tracing.py +0 -0
  158. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  159. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_auth.py +0 -0
  160. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_deploy.py +0 -0
  161. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_dev.py +0 -0
  162. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_eval.py +0 -0
  163. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_init.py +0 -0
  164. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_invoke.py +0 -0
  165. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_new.py +0 -0
  166. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_pack.py +0 -0
  167. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_publish.py +0 -0
  168. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_pull.py +0 -0
  169. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_push.py +0 -0
  170. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/cli_run.py +0 -0
  171. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/middlewares.py +0 -0
  172. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_cli/spinner.py +0 -0
  173. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_config.py +0 -0
  174. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_execution_context.py +0 -0
  175. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_folder_context.py +0 -0
  176. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_resources/AGENTS.md +0 -0
  177. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/__init__.py +0 -0
  178. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/_base_service.py +0 -0
  179. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/actions_service.py +0 -0
  180. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/api_client.py +0 -0
  181. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/assets_service.py +0 -0
  182. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/attachments_service.py +0 -0
  183. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/buckets_service.py +0 -0
  184. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/connections_service.py +0 -0
  185. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/context_grounding_service.py +0 -0
  186. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/entities_service.py +0 -0
  187. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/folder_service.py +0 -0
  188. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/jobs_service.py +0 -0
  189. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/llm_gateway_service.py +0 -0
  190. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/processes_service.py +0 -0
  191. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_services/queues_service.py +0 -0
  192. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_uipath.py +0 -0
  193. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/__init__.py +0 -0
  194. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_endpoint.py +0 -0
  195. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_infer_bindings.py +0 -0
  196. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_logs.py +0 -0
  197. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_read_overwrites.py +0 -0
  198. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_request_override.py +0 -0
  199. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_request_spec.py +0 -0
  200. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_ssl_context.py +0 -0
  201. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_url.py +0 -0
  202. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/_user_agent.py +0 -0
  203. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/_utils/constants.py +0 -0
  204. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/__init__.py +0 -0
  205. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/async_stream.py +0 -0
  206. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/citation.py +0 -0
  207. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/content.py +0 -0
  208. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/conversation.py +0 -0
  209. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/event.py +0 -0
  210. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/exchange.py +0 -0
  211. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/message.py +0 -0
  212. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/meta.py +0 -0
  213. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/agent/conversation/tool.py +0 -0
  214. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/_helpers/__init__.py +0 -0
  215. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/_helpers/helpers.py +0 -0
  216. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/evaluators/__init__.py +0 -0
  217. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
  218. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
  219. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
  220. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
  221. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
  222. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
  223. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/models/__init__.py +0 -0
  224. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/eval/models/models.py +0 -0
  225. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/__init__.py +0 -0
  226. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/action_schema.py +0 -0
  227. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/actions.py +0 -0
  228. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/assets.py +0 -0
  229. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/attachment.py +0 -0
  230. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/buckets.py +0 -0
  231. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/connections.py +0 -0
  232. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/context_grounding.py +0 -0
  233. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/context_grounding_index.py +0 -0
  234. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/entities.py +0 -0
  235. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/errors.py +0 -0
  236. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/exceptions.py +0 -0
  237. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/interrupt_models.py +0 -0
  238. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/job.py +0 -0
  239. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/llm_gateway.py +0 -0
  240. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/processes.py +0 -0
  241. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/models/queues.py +0 -0
  242. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/py.typed +0 -0
  243. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/telemetry/__init__.py +0 -0
  244. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/telemetry/_constants.py +0 -0
  245. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/telemetry/_track.py +0 -0
  246. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/tracing/__init__.py +0 -0
  247. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/tracing/_otel_exporters.py +0 -0
  248. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/tracing/_utils.py +0 -0
  249. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/utils/__init__.py +0 -0
  250. {uipath-2.1.53 → uipath-2.1.55}/src/uipath/utils/_endpoints_manager.py +0 -0
  251. {uipath-2.1.53 → uipath-2.1.55}/tests/__init__.py +0 -0
  252. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/conftest.py +0 -0
  253. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  254. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/mocks/bindings_script.py +0 -0
  255. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/mocks/pyproject.toml +0 -0
  256. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/mocks/simple_script.py +0 -0
  257. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/mocks/uipath-mock.json +0 -0
  258. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  259. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_auth.py +0 -0
  260. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_hitl.py +0 -0
  261. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_init.py +0 -0
  262. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_init_agents_md.py +0 -0
  263. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_input_args.py +0 -0
  264. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_invoke.py +0 -0
  265. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_new.py +0 -0
  266. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_pack.py +0 -0
  267. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  268. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_portal_service_refresh_token.py +0 -0
  269. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_publish.py +0 -0
  270. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_pull.py +0 -0
  271. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_push.py +0 -0
  272. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_run.py +0 -0
  273. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/test_utils.py +0 -0
  274. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/utils/common.py +0 -0
  275. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/utils/project_details.py +0 -0
  276. {uipath-2.1.53 → uipath-2.1.55}/tests/cli/utils/uipath_json.py +0 -0
  277. {uipath-2.1.53 → uipath-2.1.55}/tests/conftest.py +0 -0
  278. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/conftest.py +0 -0
  279. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_actions_service.py +0 -0
  280. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_api_client.py +0 -0
  281. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_assets_service.py +0 -0
  282. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_attachments_service.py +0 -0
  283. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_base_service.py +0 -0
  284. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_buckets_service.py +0 -0
  285. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_connections_service.py +0 -0
  286. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_context_grounding_service.py +0 -0
  287. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_entities_service.py +0 -0
  288. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_folder_service.py +0 -0
  289. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_jobs_service.py +0 -0
  290. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_llm_integration.py +0 -0
  291. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  292. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_llm_service.py +0 -0
  293. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_processes_service.py +0 -0
  294. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_queues_service.py +0 -0
  295. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  296. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/test_bindings_inference.py +0 -0
  297. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/test_config.py +0 -0
  298. {uipath-2.1.53 → uipath-2.1.55}/tests/sdk/test_overwrites.py +0 -0
  299. {uipath-2.1.53 → uipath-2.1.55}/tests/tracing/test_otel_exporters.py +0 -0
  300. {uipath-2.1.53 → uipath-2.1.55}/tests/tracing/test_span_utils.py +0 -0
  301. {uipath-2.1.53 → uipath-2.1.55}/tests/tracing/test_traced.py +0 -0
  302. {uipath-2.1.53 → uipath-2.1.55}/tests/tracing/test_tracing_manager.py +0 -0
@@ -0,0 +1,72 @@
1
+ name: Integration testing
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, develop ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ permissions:
10
+ contents: read
11
+ pull-requests: write
12
+ actions: read
13
+
14
+ jobs:
15
+ discover-testcases:
16
+ runs-on: ubuntu-latest
17
+ outputs:
18
+ testcases: ${{ steps.discover.outputs.testcases }}
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Discover testcases
24
+ id: discover
25
+ run: |
26
+ # Find all testcase folders (excluding common folders like README, etc.)
27
+ testcase_dirs=$(find testcases -maxdepth 1 -type d -name "*-*" | sed 's|testcases/||' | sort)
28
+
29
+ echo "Found testcase directories:"
30
+ echo "$testcase_dirs"
31
+
32
+ # Convert to JSON array for matrix
33
+ testcases_json=$(echo "$testcase_dirs" | jq -R -s -c 'split("\n")[:-1]')
34
+ echo "testcases=$testcases_json" >> $GITHUB_OUTPUT
35
+
36
+ integration-tests:
37
+ needs: [discover-testcases]
38
+ runs-on: ubuntu-latest
39
+ container:
40
+ image: ghcr.io/astral-sh/uv:python3.12-bookworm
41
+ env:
42
+ UIPATH_JOB_KEY: "3a03d5cb-fa21-4021-894d-a8e2eda0afe0"
43
+ strategy:
44
+ fail-fast: false
45
+ matrix:
46
+ testcase: ${{ fromJson(needs.discover-testcases.outputs.testcases) }}
47
+ environment: [alpha, cloud]
48
+
49
+ name: "${{ matrix.testcase }} / ${{ matrix.environment }}"
50
+
51
+ steps:
52
+ - name: Checkout code
53
+ uses: actions/checkout@v4
54
+
55
+ - name: Install dependencies
56
+ run: uv sync
57
+
58
+ - name: Run testcase
59
+ env:
60
+ CLIENT_ID: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_ID || secrets.CLOUD_TEST_CLIENT_ID }}
61
+ CLIENT_SECRET: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_SECRET || secrets.CLOUD_TEST_CLIENT_SECRET }}
62
+ BASE_URL: ${{ matrix.environment == 'alpha' && secrets.ALPHA_BASE_URL || secrets.CLOUD_BASE_URL }}
63
+ USE_AZURE_CHAT: ${{ matrix.use_azure_chat }}
64
+ working-directory: testcases/${{ matrix.testcase }}
65
+ run: |
66
+ echo "Running testcase: ${{ matrix.testcase }}"
67
+ echo "Environment: ${{ matrix.environment }}"
68
+ echo "Working directory: $(pwd)"
69
+
70
+ # Execute the testcase run script directly
71
+ bash run.sh
72
+ bash ../common/validate_output.sh
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath
3
- Version: 2.1.53
3
+ Version: 2.1.55
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
@@ -239,9 +239,9 @@ Selected feed: Orchestrator Tenant Processes Feed
239
239
 
240
240
  After selecting your publishing destination (tenant or personal workspace), you'll see details about your package and a confirmation message.
241
241
 
242
- ## Getting Started with the SDK
242
+ ## Integrating with the UiPath Platform
243
243
 
244
- Create a new project following the same steps as above.
244
+ Create a **new project** (separate from the one you just packaged and published) following the same steps as above. This new project will invoke your previous process using the UiPath SDK.
245
245
 
246
246
  Open `main.py` in your code editor and add the following code:
247
247
 
@@ -262,6 +262,10 @@ def main():
262
262
  )
263
263
  ```
264
264
 
265
+ /// warning
266
+ An agent can invoke itself if needed, but this must be done with caution. Be mindful that using the same name for invocation may lead to unintentional loops. To prevent recursion issues, implement safeguards like exit conditions.
267
+ ///
268
+
265
269
  ### Verifying the Execution
266
270
 
267
271
  <!-- termynal -->
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "uipath"
3
- version = "2.1.53"
3
+ version = "2.1.55"
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"
@@ -79,7 +79,7 @@ include = [
79
79
  [tool.ruff]
80
80
  line-length = 88
81
81
  indent-width = 4
82
- exclude = ["samples/**"]
82
+ exclude = ["samples/**", "testcases/**"]
83
83
 
84
84
  [tool.ruff.lint]
85
85
  select = ["E", "F", "B", "I", "D"]
@@ -107,7 +107,7 @@ line-ending = "auto"
107
107
 
108
108
  [tool.mypy]
109
109
  plugins = ["pydantic.mypy"]
110
- exclude = ["samples/.*"]
110
+ exclude = ["samples/.*", "testcases/.*"]
111
111
 
112
112
  follow_imports = "silent"
113
113
  warn_redundant_casts = true
@@ -319,7 +319,7 @@ class UiPathRuntimeContext(BaseModel):
319
319
  chat_handler: Optional[UiPathConversationHandler] = None
320
320
  is_conversational: Optional[bool] = None
321
321
 
322
- model_config = {"arbitrary_types_allowed": True}
322
+ model_config = {"arbitrary_types_allowed": True, "extra": "allow"}
323
323
 
324
324
  @classmethod
325
325
  def with_defaults(cls: type[C], config_path: Optional[str] = None, **kwargs) -> C:
@@ -1,6 +1,7 @@
1
1
  import json
2
2
  import os
3
3
  from functools import wraps
4
+ from pathlib import PurePath
4
5
  from typing import Any, Callable, List, Optional, Union
5
6
 
6
7
  from pydantic import BaseModel, ConfigDict, Field, field_validator
@@ -103,7 +104,7 @@ class ProjectFolder(BaseModel):
103
104
  return v
104
105
 
105
106
 
106
- class ProjectStructure(BaseModel):
107
+ class ProjectStructure(ProjectFolder):
107
108
  """Model representing the complete file structure of a UiPath project.
108
109
 
109
110
  Attributes:
@@ -114,34 +115,7 @@ class ProjectStructure(BaseModel):
114
115
  folder_type: The type of the root folder (optional)
115
116
  """
116
117
 
117
- model_config = ConfigDict(
118
- validate_by_name=True,
119
- validate_by_alias=True,
120
- use_enum_values=True,
121
- arbitrary_types_allowed=True,
122
- extra="allow",
123
- )
124
-
125
- id: Optional[str] = Field(default=None, alias="id")
126
- name: Optional[str] = Field(default=None, alias="name")
127
- folders: List[ProjectFolder] = Field(default_factory=list)
128
- files: List[ProjectFile] = Field(default_factory=list)
129
- folder_type: Optional[str] = Field(default=None, alias="folderType")
130
-
131
- @field_validator("folder_type", mode="before")
132
- @classmethod
133
- def convert_folder_type(cls, v: Union[str, int, None]) -> Optional[str]:
134
- """Convert numeric folder type to string.
135
-
136
- Args:
137
- v: The value to convert
138
-
139
- Returns:
140
- Optional[str]: The converted value or None
141
- """
142
- if isinstance(v, int):
143
- return str(v)
144
- return v
118
+ pass
145
119
 
146
120
 
147
121
  class LockInfo(BaseModel):
@@ -174,6 +148,33 @@ def get_folder_by_name(
174
148
  return None
175
149
 
176
150
 
151
+ def resolve_path(
152
+ folder: ProjectFolder,
153
+ path: PurePath,
154
+ ) -> ProjectFile | ProjectFolder:
155
+ """Resolve a path relative to the folder.
156
+
157
+ Args:
158
+ folder: Project folder
159
+ path: Path relative to the folder
160
+
161
+ Returns: The resolved folder or file. If resolution fails, an assertion is raised.
162
+ """
163
+ root = path.parts
164
+ while len(root) > 1:
165
+ child = next(
166
+ (folder for folder in folder.folders if folder.name == root[0]), None
167
+ )
168
+ assert child, "Path not found."
169
+ folder = child
170
+ root = root[1:]
171
+ file = next((f for f in folder.files if f.name == root[0]), None)
172
+ child = next((folder for folder in folder.folders if folder.name == root[0]), None)
173
+ resolved = file or child
174
+ assert resolved, "Path not found."
175
+ return resolved
176
+
177
+
177
178
  class AddedResource(BaseModel):
178
179
  """Represents a new file to be added during a structural migration."""
179
180
 
@@ -2,25 +2,28 @@ import importlib
2
2
  import inspect
3
3
  import json
4
4
  import logging
5
+ from contextvars import ContextVar
5
6
  from functools import wraps
6
7
  from typing import Any, Callable, List, Optional, Tuple
7
8
 
8
- from opentelemetry import trace
9
+ from opentelemetry import context, trace
10
+ from opentelemetry.trace import set_span_in_context
9
11
 
10
12
  from ._utils import _SpanUtils
11
13
 
12
14
  logger = logging.getLogger(__name__)
13
15
 
14
16
  _tracer_instance: Optional[trace.Tracer] = None
17
+ # ContextVar to track the currently active span for nesting
18
+ _active_traced_span: ContextVar[Optional[trace.Span]] = ContextVar(
19
+ "_active_traced_span", default=None
20
+ )
15
21
 
16
22
 
17
23
  def get_tracer() -> trace.Tracer:
18
24
  """Lazily initializes and returns the tracer instance."""
19
25
  global _tracer_instance
20
26
  if _tracer_instance is None:
21
- logger.warning(
22
- "Initializing tracer instance. This should only be done once per process."
23
- )
24
27
  _tracer_instance = trace.get_tracer(__name__)
25
28
  return _tracer_instance
26
29
 
@@ -53,24 +56,24 @@ class TracingManager:
53
56
  """
54
57
  cls._current_span_provider = current_span_provider
55
58
 
56
- @classmethod
57
- def get_parent_context(cls):
58
- """Get the parent context using the registered current span provider.
59
+ @staticmethod
60
+ def get_parent_context():
61
+ # Always use the currently active OTel span if valid (recursion / children)
62
+ current_span = trace.get_current_span()
63
+ if current_span is not None and current_span.get_span_context().is_valid:
64
+ return set_span_in_context(current_span)
59
65
 
60
- Returns:
61
- Context object with the current span set, or None if no provider is registered.
62
- """
63
- if cls._current_span_provider is not None:
66
+ # Only for the very top-level call, fallback to LangGraph span
67
+ if TracingManager._current_span_provider is not None:
64
68
  try:
65
- current_span = cls._current_span_provider()
66
- if current_span is not None:
67
- from opentelemetry.trace import set_span_in_context
68
-
69
- return set_span_in_context(current_span)
69
+ external_span = TracingManager._current_span_provider()
70
+ if external_span is not None:
71
+ return set_span_in_context(external_span)
70
72
  except Exception as e:
71
73
  logger.warning(f"Error getting current span from provider: {e}")
72
- return None
73
- return None
74
+
75
+ # Last fallback
76
+ return context.get_current()
74
77
 
75
78
  @classmethod
76
79
  def register_traced_function(cls, original_func, decorated_func, params):
@@ -176,176 +179,169 @@ def _opentelemetry_traced(
176
179
  """Default tracer implementation using OpenTelemetry."""
177
180
 
178
181
  def decorator(func):
179
- trace_name = name if name is not None else func.__name__
182
+ trace_name = name or func.__name__
183
+
184
+ def get_parent_context():
185
+ """Return a context object for starting the new span."""
186
+ current_span = _active_traced_span.get()
187
+ if current_span is not None and current_span.get_span_context().is_valid:
188
+ return set_span_in_context(current_span)
180
189
 
190
+ if TracingManager._current_span_provider is not None:
191
+ try:
192
+ external_span = TracingManager._current_span_provider()
193
+ if external_span is not None:
194
+ return set_span_in_context(external_span)
195
+ except Exception as e:
196
+ logger.warning(f"Error getting current span from provider: {e}")
197
+
198
+ return context.get_current()
199
+
200
+ # --------- Sync wrapper ---------
181
201
  @wraps(func)
182
202
  def sync_wrapper(*args, **kwargs):
183
- context = TracingManager.get_parent_context()
184
-
185
- with get_tracer().start_as_current_span(
186
- trace_name, context=context
187
- ) as span:
188
- default_span_type = "function_call_sync"
189
- span.set_attribute(
190
- "span_type",
191
- span_type if span_type is not None else default_span_type,
192
- )
203
+ ctx = get_parent_context()
204
+ span_cm = get_tracer().start_as_current_span(trace_name, context=ctx)
205
+ span = span_cm.__enter__()
206
+ token = _active_traced_span.set(span)
207
+ try:
208
+ span.set_attribute("span_type", span_type or "function_call_sync")
193
209
  if run_type is not None:
194
210
  span.set_attribute("run_type", run_type)
195
211
 
196
- # Format arguments for tracing
197
212
  inputs = _SpanUtils.format_args_for_trace_json(
198
213
  inspect.signature(func), *args, **kwargs
199
214
  )
200
- # Apply input processor if provided
201
- if input_processor is not None:
215
+ if input_processor:
202
216
  processed_inputs = input_processor(json.loads(inputs))
203
217
  inputs = json.dumps(processed_inputs, default=str)
204
218
  span.set_attribute("inputs", inputs)
205
- try:
206
- result = func(*args, **kwargs)
207
- # Process output if processor is provided
208
- output = result
209
- if output_processor is not None:
210
- output = output_processor(result)
211
- span.set_attribute("output", json.dumps(output, default=str))
212
- return result
213
- except Exception as e:
214
- span.record_exception(e)
215
- span.set_status(
216
- trace.status.Status(trace.status.StatusCode.ERROR, str(e))
217
- )
218
- raise
219
219
 
220
+ result = func(*args, **kwargs)
221
+ output = output_processor(result) if output_processor else result
222
+ span.set_attribute("output", json.dumps(output, default=str))
223
+ return result
224
+ except Exception as e:
225
+ span.record_exception(e)
226
+ span.set_status(
227
+ trace.status.Status(trace.status.StatusCode.ERROR, str(e))
228
+ )
229
+ raise
230
+ finally:
231
+ _active_traced_span.reset(token)
232
+ span_cm.__exit__(None, None, None)
233
+
234
+ # --------- Async wrapper ---------
220
235
  @wraps(func)
221
236
  async def async_wrapper(*args, **kwargs):
222
- context = TracingManager.get_parent_context()
223
-
224
- with get_tracer().start_as_current_span(
225
- trace_name, context=context
226
- ) as span:
227
- default_span_type = "function_call_async"
228
- span.set_attribute(
229
- "span_type",
230
- span_type if span_type is not None else default_span_type,
231
- )
237
+ ctx = get_parent_context()
238
+ span_cm = get_tracer().start_as_current_span(trace_name, context=ctx)
239
+ span = span_cm.__enter__()
240
+ token = _active_traced_span.set(span)
241
+ try:
242
+ span.set_attribute("span_type", span_type or "function_call_async")
232
243
  if run_type is not None:
233
244
  span.set_attribute("run_type", run_type)
234
245
 
235
- # Format arguments for tracing
236
246
  inputs = _SpanUtils.format_args_for_trace_json(
237
247
  inspect.signature(func), *args, **kwargs
238
248
  )
239
- # Apply input processor if provided
240
- if input_processor is not None:
249
+ if input_processor:
241
250
  processed_inputs = input_processor(json.loads(inputs))
242
251
  inputs = json.dumps(processed_inputs, default=str)
243
252
  span.set_attribute("inputs", inputs)
244
- try:
245
- result = await func(*args, **kwargs)
246
- # Process output if processor is provided
247
- output = result
248
- if output_processor is not None:
249
- output = output_processor(result)
250
- span.set_attribute("output", json.dumps(output, default=str))
251
- return result
252
- except Exception as e:
253
- span.record_exception(e)
254
- span.set_status(
255
- trace.status.Status(trace.status.StatusCode.ERROR, str(e))
256
- )
257
- raise
258
253
 
254
+ result = await func(*args, **kwargs)
255
+ output = output_processor(result) if output_processor else result
256
+ span.set_attribute("output", json.dumps(output, default=str))
257
+ return result
258
+ except Exception as e:
259
+ span.record_exception(e)
260
+ span.set_status(
261
+ trace.status.Status(trace.status.StatusCode.ERROR, str(e))
262
+ )
263
+ raise
264
+ finally:
265
+ _active_traced_span.reset(token)
266
+ span_cm.__exit__(None, None, None)
267
+
268
+ # --------- Generator wrapper ---------
259
269
  @wraps(func)
260
270
  def generator_wrapper(*args, **kwargs):
261
- context = TracingManager.get_parent_context()
262
-
263
- with get_tracer().start_as_current_span(
264
- trace_name, context=context
265
- ) as span:
266
- span.get_span_context()
267
- default_span_type = "function_call_generator_sync"
271
+ ctx = get_parent_context()
272
+ span_cm = get_tracer().start_as_current_span(trace_name, context=ctx)
273
+ span = span_cm.__enter__()
274
+ token = _active_traced_span.set(span)
275
+ try:
268
276
  span.set_attribute(
269
- "span_type",
270
- span_type if span_type is not None else default_span_type,
277
+ "span_type", span_type or "function_call_generator_sync"
271
278
  )
272
279
  if run_type is not None:
273
280
  span.set_attribute("run_type", run_type)
274
281
 
275
- # Format arguments for tracing
276
282
  inputs = _SpanUtils.format_args_for_trace_json(
277
283
  inspect.signature(func), *args, **kwargs
278
284
  )
279
- # Apply input processor if provided
280
- if input_processor is not None:
285
+ if input_processor:
281
286
  processed_inputs = input_processor(json.loads(inputs))
282
287
  inputs = json.dumps(processed_inputs, default=str)
283
288
  span.set_attribute("inputs", inputs)
289
+
284
290
  outputs = []
285
- try:
286
- for item in func(*args, **kwargs):
287
- outputs.append(item)
288
- span.add_event(f"Yielded: {item}") # Add event for each yield
289
- yield item
290
-
291
- # Process output if processor is provided
292
- output_to_record = outputs
293
- if output_processor is not None:
294
- output_to_record = output_processor(outputs)
295
- span.set_attribute(
296
- "output", json.dumps(output_to_record, default=str)
297
- )
298
- except Exception as e:
299
- span.record_exception(e)
300
- span.set_status(
301
- trace.status.Status(trace.status.StatusCode.ERROR, str(e))
302
- )
303
- raise
291
+ for item in func(*args, **kwargs):
292
+ outputs.append(item)
293
+ span.add_event(f"Yielded: {item}")
294
+ yield item
295
+ output = output_processor(outputs) if output_processor else outputs
296
+ span.set_attribute("output", json.dumps(output, default=str))
297
+ except Exception as e:
298
+ span.record_exception(e)
299
+ span.set_status(
300
+ trace.status.Status(trace.status.StatusCode.ERROR, str(e))
301
+ )
302
+ raise
303
+ finally:
304
+ _active_traced_span.reset(token)
305
+ span_cm.__exit__(None, None, None)
304
306
 
307
+ # --------- Async generator wrapper ---------
305
308
  @wraps(func)
306
309
  async def async_generator_wrapper(*args, **kwargs):
307
- context = TracingManager.get_parent_context()
308
-
309
- with get_tracer().start_as_current_span(
310
- trace_name, context=context
311
- ) as span:
312
- default_span_type = "function_call_generator_async"
310
+ ctx = get_parent_context()
311
+ span_cm = get_tracer().start_as_current_span(trace_name, context=ctx)
312
+ span = span_cm.__enter__()
313
+ token = _active_traced_span.set(span)
314
+ try:
313
315
  span.set_attribute(
314
- "span_type",
315
- span_type if span_type is not None else default_span_type,
316
+ "span_type", span_type or "function_call_generator_async"
316
317
  )
317
318
  if run_type is not None:
318
319
  span.set_attribute("run_type", run_type)
319
320
 
320
- # Format arguments for tracing
321
321
  inputs = _SpanUtils.format_args_for_trace_json(
322
322
  inspect.signature(func), *args, **kwargs
323
323
  )
324
- # Apply input processor if provided
325
- if input_processor is not None:
324
+ if input_processor:
326
325
  processed_inputs = input_processor(json.loads(inputs))
327
326
  inputs = json.dumps(processed_inputs, default=str)
328
327
  span.set_attribute("inputs", inputs)
328
+
329
329
  outputs = []
330
- try:
331
- async for item in func(*args, **kwargs):
332
- outputs.append(item)
333
- span.add_event(f"Yielded: {item}") # Add event for each yield
334
- yield item
335
-
336
- # Process output if processor is provided
337
- output_to_record = outputs
338
- if output_processor is not None:
339
- output_to_record = output_processor(outputs)
340
- span.set_attribute(
341
- "output", json.dumps(output_to_record, default=str)
342
- )
343
- except Exception as e:
344
- span.record_exception(e)
345
- span.set_status(
346
- trace.status.Status(trace.status.StatusCode.ERROR, str(e))
347
- )
348
- raise
330
+ async for item in func(*args, **kwargs):
331
+ outputs.append(item)
332
+ span.add_event(f"Yielded: {item}")
333
+ yield item
334
+ output = output_processor(outputs) if output_processor else outputs
335
+ span.set_attribute("output", json.dumps(output, default=str))
336
+ except Exception as e:
337
+ span.record_exception(e)
338
+ span.set_status(
339
+ trace.status.Status(trace.status.StatusCode.ERROR, str(e))
340
+ )
341
+ raise
342
+ finally:
343
+ _active_traced_span.reset(token)
344
+ span_cm.__exit__(None, None, None)
349
345
 
350
346
  if inspect.iscoroutinefunction(func):
351
347
  return async_wrapper
@@ -0,0 +1,47 @@
1
+ import logging
2
+ from dataclasses import dataclass
3
+ from typing import Optional
4
+
5
+ from uipath import UiPath
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ sdk = None
10
+
11
+
12
+ def test_assets(sdk: UiPath):
13
+ sdk.assets.retrieve(name="MyAsset")
14
+
15
+
16
+ async def test_llm(sdk: UiPath):
17
+ messages = [
18
+ {"role": "system", "content": "You are a helpful programming assistant."},
19
+ {"role": "user", "content": "How do I read a file in Python?"},
20
+ {"role": "assistant", "content": "You can use the built-in open() function."},
21
+ {"role": "user", "content": "Can you show an example?"},
22
+ ]
23
+
24
+ result_openai = await sdk.llm_openai.chat_completions(messages)
25
+ logger.info("LLM OpenAI Response: %s", result_openai.choices[0].message.content)
26
+
27
+ result_normalized = await sdk.llm.chat_completions(messages)
28
+ logger.info(
29
+ "LLM Normalized Response: %s", result_normalized.choices[0].message.content
30
+ )
31
+
32
+
33
+ @dataclass
34
+ class EchoIn:
35
+ message: str
36
+
37
+
38
+ @dataclass
39
+ class EchoOut:
40
+ message: str
41
+
42
+
43
+ async def main(input: EchoIn) -> EchoOut:
44
+ sdk = UiPath()
45
+
46
+ await test_llm(sdk)
47
+ return EchoOut(message=input.message)
@@ -0,0 +1,12 @@
1
+ [project]
2
+ name = "agent"
3
+ version = "0.0.1"
4
+ description = "agent"
5
+ authors = [{ name = "John Doe", email = "john.doe@myemail.com" }]
6
+ dependencies = [
7
+ "uipath",
8
+ ]
9
+ requires-python = ">=3.10"
10
+
11
+ [tool.uv.sources]
12
+ uipath = { path = "../../", editable = true }
@@ -0,0 +1,16 @@
1
+ #!/bin/bash
2
+
3
+ echo "Syncing dependencies..."
4
+ uv sync
5
+
6
+ echo "Authenticating with UiPath..."
7
+ uv run uipath auth --client-id="$CLIENT_ID" --client-secret="$CLIENT_SECRET" --base-url="$BASE_URL"
8
+
9
+ echo "Run init..."
10
+ uv run uipath init
11
+
12
+ echo "Packing agent..."
13
+ uv run uipath pack
14
+
15
+ echo "Input from input.json file"
16
+ uv run uipath run main.py '{"message": "abc" }'