uipath 2.1.84__tar.gz → 2.1.86__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 (354) hide show
  1. uipath-2.1.86/.github/workflows/test-uipath-langchain.yml +144 -0
  2. {uipath-2.1.84 → uipath-2.1.86}/PKG-INFO +1 -1
  3. {uipath-2.1.84 → uipath-2.1.86}/pyproject.toml +1 -1
  4. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_runtime.py +4 -5
  5. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_project_files.py +122 -0
  6. uipath-2.1.86/src/uipath/_cli/cli_pull.py +59 -0
  7. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/connections_service.py +67 -1
  8. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/__init__.py +2 -1
  9. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/connections.py +8 -0
  10. uipath-2.1.86/src/uipath/utils/dynamic_schema.py +111 -0
  11. {uipath-2.1.84 → uipath-2.1.86}/testcases/apicalls-testcase/run.sh +1 -0
  12. {uipath-2.1.84 → uipath-2.1.86}/testcases/basic-testcase/run.sh +2 -0
  13. {uipath-2.1.84 → uipath-2.1.86}/testcases/common/validate_output.sh +2 -2
  14. {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/run.sh +2 -0
  15. {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/run.sh +2 -0
  16. uipath-2.1.86/tests/cli/utils/test_dynamic_schema.py +95 -0
  17. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_connections_service.py +246 -1
  18. {uipath-2.1.84 → uipath-2.1.86}/uv.lock +1 -1
  19. uipath-2.1.84/.github/workflows/test-uipath-langchain.yml +0 -184
  20. uipath-2.1.84/src/uipath/_cli/cli_pull.py +0 -199
  21. {uipath-2.1.84 → uipath-2.1.86}/.cursorrules +0 -0
  22. {uipath-2.1.84 → uipath-2.1.86}/.editorconfig +0 -0
  23. {uipath-2.1.84 → uipath-2.1.86}/.gitattributes +0 -0
  24. {uipath-2.1.84 → uipath-2.1.86}/.github/labeler.yml +0 -0
  25. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/auto-label.yml +0 -0
  26. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/cd.yml +0 -0
  27. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/ci.yml +0 -0
  28. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/commitlint.yml +0 -0
  29. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/integration_tests.yml +0 -0
  30. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/lint.yml +0 -0
  31. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/publish-dev.yml +0 -0
  32. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/publish-docs.yml +0 -0
  33. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/slack.yml +0 -0
  34. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/test-uipath-llamaindex.yml +0 -0
  35. {uipath-2.1.84 → uipath-2.1.86}/.github/workflows/test.yml +0 -0
  36. {uipath-2.1.84 → uipath-2.1.86}/.gitignore +0 -0
  37. {uipath-2.1.84 → uipath-2.1.86}/.pre-commit-config.yaml +0 -0
  38. {uipath-2.1.84 → uipath-2.1.86}/.python-version +0 -0
  39. {uipath-2.1.84 → uipath-2.1.86}/.vscode/extensions.json +0 -0
  40. {uipath-2.1.84 → uipath-2.1.86}/.vscode/launch.json +0 -0
  41. {uipath-2.1.84 → uipath-2.1.86}/.vscode/settings.json +0 -0
  42. {uipath-2.1.84 → uipath-2.1.86}/CONTRIBUTING.md +0 -0
  43. {uipath-2.1.84 → uipath-2.1.86}/LICENSE +0 -0
  44. {uipath-2.1.84 → uipath-2.1.86}/README.md +0 -0
  45. {uipath-2.1.84 → uipath-2.1.86}/docs/CONTRIBUTING.md +0 -0
  46. {uipath-2.1.84 → uipath-2.1.86}/docs/FAQ.md +0 -0
  47. {uipath-2.1.84 → uipath-2.1.86}/docs/assets/env-preparation-failed-dark.png +0 -0
  48. {uipath-2.1.84 → uipath-2.1.86}/docs/assets/env-preparation-failed-light.png +0 -0
  49. {uipath-2.1.84 → uipath-2.1.86}/docs/assets/favicon.png +0 -0
  50. {uipath-2.1.84 → uipath-2.1.86}/docs/assets/llms.txt +0 -0
  51. {uipath-2.1.84 → uipath-2.1.86}/docs/assets/logo-dark.svg +0 -0
  52. {uipath-2.1.84 → uipath-2.1.86}/docs/assets/logo-light.svg +0 -0
  53. {uipath-2.1.84 → uipath-2.1.86}/docs/cli/index.md +0 -0
  54. {uipath-2.1.84 → uipath-2.1.86}/docs/core/actions.md +0 -0
  55. {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  56. {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/cloud_env_var_light.gif +0 -0
  57. {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  58. {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  59. {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/copy_path_dark.png +0 -0
  60. {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets/copy_path_light.png +0 -0
  61. {uipath-2.1.84 → uipath-2.1.86}/docs/core/assets.md +0 -0
  62. {uipath-2.1.84 → uipath-2.1.86}/docs/core/attachments.md +0 -0
  63. {uipath-2.1.84 → uipath-2.1.86}/docs/core/buckets.md +0 -0
  64. {uipath-2.1.84 → uipath-2.1.86}/docs/core/connections.md +0 -0
  65. {uipath-2.1.84 → uipath-2.1.86}/docs/core/context_grounding.md +0 -0
  66. {uipath-2.1.84 → uipath-2.1.86}/docs/core/documents.md +0 -0
  67. {uipath-2.1.84 → uipath-2.1.86}/docs/core/documents_models.md +0 -0
  68. {uipath-2.1.84 → uipath-2.1.86}/docs/core/environment_variables.md +0 -0
  69. {uipath-2.1.84 → uipath-2.1.86}/docs/core/getting_started.md +0 -0
  70. {uipath-2.1.84 → uipath-2.1.86}/docs/core/jobs.md +0 -0
  71. {uipath-2.1.84 → uipath-2.1.86}/docs/core/llm_gateway.md +0 -0
  72. {uipath-2.1.84 → uipath-2.1.86}/docs/core/processes.md +0 -0
  73. {uipath-2.1.84 → uipath-2.1.86}/docs/core/queues.md +0 -0
  74. {uipath-2.1.84 → uipath-2.1.86}/docs/core/traced.md +0 -0
  75. {uipath-2.1.84 → uipath-2.1.86}/docs/hooks.py +0 -0
  76. {uipath-2.1.84 → uipath-2.1.86}/docs/index.md +0 -0
  77. {uipath-2.1.84 → uipath-2.1.86}/docs/javascripts/extra.js +0 -0
  78. {uipath-2.1.84 → uipath-2.1.86}/docs/overrides/main.html +0 -0
  79. {uipath-2.1.84 → uipath-2.1.86}/docs/overrides/partials/actions.html +0 -0
  80. {uipath-2.1.84 → uipath-2.1.86}/docs/overrides/partials/logo.html +0 -0
  81. {uipath-2.1.84 → uipath-2.1.86}/docs/release_policy.md +0 -0
  82. {uipath-2.1.84 → uipath-2.1.86}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  83. {uipath-2.1.84 → uipath-2.1.86}/docs/stylesheets/extra.css +0 -0
  84. {uipath-2.1.84 → uipath-2.1.86}/justfile +0 -0
  85. {uipath-2.1.84 → uipath-2.1.86}/mkdocs.yml +0 -0
  86. {uipath-2.1.84 → uipath-2.1.86}/py.typed +0 -0
  87. {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/.env.example +0 -0
  88. {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/README.md +0 -0
  89. {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/input.json +0 -0
  90. {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/main.py +0 -0
  91. {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/pyproject.toml +0 -0
  92. {uipath-2.1.84 → uipath-2.1.86}/samples/asset-modifier-agent/uv.lock +0 -0
  93. {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/README.md +0 -0
  94. {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/evals/eval-sets/default.json +0 -0
  95. {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/evals/evaluators/equality.json +0 -0
  96. {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
  97. {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/main.py +0 -0
  98. {uipath-2.1.84 → uipath-2.1.86}/samples/calculator/pyproject.toml +0 -0
  99. {uipath-2.1.84 → uipath-2.1.86}/samples/event-trigger/.python-version +0 -0
  100. {uipath-2.1.84 → uipath-2.1.86}/samples/event-trigger/README.md +0 -0
  101. {uipath-2.1.84 → uipath-2.1.86}/samples/event-trigger/main.py +0 -0
  102. {uipath-2.1.84 → uipath-2.1.86}/samples/event-trigger/pyproject.toml +0 -0
  103. {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/.env.example +0 -0
  104. {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/README.md +0 -0
  105. {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/input.json +0 -0
  106. {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  107. {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  108. {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/pyproject.toml +0 -0
  109. {uipath-2.1.84 → uipath-2.1.86}/samples/google-ADK-agent/uv.lock +0 -0
  110. {uipath-2.1.84 → uipath-2.1.86}/scripts/debug_test.py +0 -0
  111. {uipath-2.1.84 → uipath-2.1.86}/scripts/lint_httpx_client.py +0 -0
  112. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/__init__.py +0 -0
  113. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/README.md +0 -0
  114. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/__init__.py +0 -0
  115. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  116. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_auth_service.py +0 -0
  117. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_models.py +0 -0
  118. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  119. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  120. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  121. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/_utils.py +0 -0
  122. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/auth_config.json +0 -0
  123. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/index.html +0 -0
  124. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/localhost.crt +0 -0
  125. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_auth/localhost.key +0 -0
  126. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  127. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  128. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  129. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  130. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  131. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  132. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  133. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  134. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  135. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  136. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  137. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  138. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
  139. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
  140. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  141. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
  142. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
  143. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
  144. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
  145. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_output.py +0 -0
  146. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
  147. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
  148. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/_span_collection.py +0 -0
  149. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
  150. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/llm_mocker.py +0 -0
  151. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
  152. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
  153. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
  154. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_evals/mocks/mocks.py +0 -0
  155. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  156. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_contracts.py +0 -0
  157. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  158. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  159. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_logging.py +0 -0
  160. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  161. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
  162. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  163. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/.rels.template +0 -0
  164. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  165. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/main.py.template +0 -0
  166. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  167. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_common.py +0 -0
  168. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_console.py +0 -0
  169. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_constants.py +0 -0
  170. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_debug.py +0 -0
  171. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  172. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_folders.py +0 -0
  173. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_input_args.py +0 -0
  174. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  175. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_processes.py +0 -0
  176. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  177. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_tracing.py +0 -0
  178. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  179. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_auth.py +0 -0
  180. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_deploy.py +0 -0
  181. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_dev.py +0 -0
  182. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_eval.py +0 -0
  183. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_init.py +0 -0
  184. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_invoke.py +0 -0
  185. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_new.py +0 -0
  186. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_pack.py +0 -0
  187. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_publish.py +0 -0
  188. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_push.py +0 -0
  189. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/cli_run.py +0 -0
  190. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/middlewares.py +0 -0
  191. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_cli/spinner.py +0 -0
  192. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_config.py +0 -0
  193. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_events/__init__.py +0 -0
  194. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_events/_event_bus.py +0 -0
  195. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_events/_events.py +0 -0
  196. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_execution_context.py +0 -0
  197. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_folder_context.py +0 -0
  198. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_resources/AGENTS.md +0 -0
  199. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/__init__.py +0 -0
  200. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/_base_service.py +0 -0
  201. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/actions_service.py +0 -0
  202. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/api_client.py +0 -0
  203. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/assets_service.py +0 -0
  204. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/attachments_service.py +0 -0
  205. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/buckets_service.py +0 -0
  206. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/context_grounding_service.py +0 -0
  207. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/documents_service.py +0 -0
  208. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/entities_service.py +0 -0
  209. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/external_application_service.py +0 -0
  210. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/folder_service.py +0 -0
  211. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/jobs_service.py +0 -0
  212. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/llm_gateway_service.py +0 -0
  213. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/processes_service.py +0 -0
  214. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_services/queues_service.py +0 -0
  215. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_uipath.py +0 -0
  216. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/__init__.py +0 -0
  217. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_auth.py +0 -0
  218. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_endpoint.py +0 -0
  219. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_infer_bindings.py +0 -0
  220. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_logs.py +0 -0
  221. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_read_overwrites.py +0 -0
  222. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_request_override.py +0 -0
  223. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_request_spec.py +0 -0
  224. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_ssl_context.py +0 -0
  225. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_url.py +0 -0
  226. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/_user_agent.py +0 -0
  227. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/_utils/constants.py +0 -0
  228. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/_utils.py +0 -0
  229. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/__init__.py +0 -0
  230. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/async_stream.py +0 -0
  231. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/citation.py +0 -0
  232. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/content.py +0 -0
  233. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/conversation.py +0 -0
  234. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/event.py +0 -0
  235. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/exchange.py +0 -0
  236. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/message.py +0 -0
  237. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/meta.py +0 -0
  238. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/conversation/tool.py +0 -0
  239. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/agent/models/agent.py +0 -0
  240. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/_helpers/__init__.py +0 -0
  241. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/_helpers/helpers.py +0 -0
  242. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/__init__.py +0 -0
  243. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
  244. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
  245. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
  246. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
  247. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
  248. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
  249. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/mocks/__init__.py +0 -0
  250. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/mocks/mockable.py +0 -0
  251. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/models/__init__.py +0 -0
  252. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/eval/models/models.py +0 -0
  253. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/action_schema.py +0 -0
  254. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/actions.py +0 -0
  255. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/assets.py +0 -0
  256. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/attachment.py +0 -0
  257. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/auth.py +0 -0
  258. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/buckets.py +0 -0
  259. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/context_grounding.py +0 -0
  260. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/context_grounding_index.py +0 -0
  261. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/documents.py +0 -0
  262. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/entities.py +0 -0
  263. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/errors.py +0 -0
  264. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/exceptions.py +0 -0
  265. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/interrupt_models.py +0 -0
  266. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/job.py +0 -0
  267. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/llm_gateway.py +0 -0
  268. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/processes.py +0 -0
  269. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/models/queues.py +0 -0
  270. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/py.typed +0 -0
  271. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/telemetry/__init__.py +0 -0
  272. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/telemetry/_constants.py +0 -0
  273. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/telemetry/_track.py +0 -0
  274. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/tracing/__init__.py +0 -0
  275. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/tracing/_otel_exporters.py +0 -0
  276. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/tracing/_traced.py +0 -0
  277. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/tracing/_utils.py +0 -0
  278. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/utils/__init__.py +0 -0
  279. {uipath-2.1.84 → uipath-2.1.86}/src/uipath/utils/_endpoints_manager.py +0 -0
  280. {uipath-2.1.84 → uipath-2.1.86}/testcases/apicalls-testcase/main.py +0 -0
  281. {uipath-2.1.84 → uipath-2.1.86}/testcases/apicalls-testcase/pyproject.toml +0 -0
  282. {uipath-2.1.84 → uipath-2.1.86}/testcases/apicalls-testcase/src/assert.py +0 -0
  283. {uipath-2.1.84 → uipath-2.1.86}/testcases/basic-testcase/main.py +0 -0
  284. {uipath-2.1.84 → uipath-2.1.86}/testcases/basic-testcase/pyproject.toml +0 -0
  285. {uipath-2.1.84 → uipath-2.1.86}/testcases/basic-testcase/src/assert.py +0 -0
  286. {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/agent.mermaid +0 -0
  287. {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/langgraph.json +0 -0
  288. {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/pyproject.toml +0 -0
  289. {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/src/assert.py +0 -0
  290. {uipath-2.1.84 → uipath-2.1.86}/testcases/langchain-cross/src/main.py +0 -0
  291. {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/agent.mermaid +0 -0
  292. {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/llama_index.json +0 -0
  293. {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/pyproject.toml +0 -0
  294. {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/src/assert.py +0 -0
  295. {uipath-2.1.84 → uipath-2.1.86}/testcases/llamaindex-cross/src/main.py +0 -0
  296. {uipath-2.1.84 → uipath-2.1.86}/tests/__init__.py +0 -0
  297. {uipath-2.1.84 → uipath-2.1.86}/tests/agent/models/test_agent.py +0 -0
  298. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/conftest.py +0 -0
  299. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/eval/mocks/test_mocks.py +0 -0
  300. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  301. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/bindings_script.py +0 -0
  302. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/pyproject.toml +0 -0
  303. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/simple_script.py +0 -0
  304. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/uipath-mock.json +0 -0
  305. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  306. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_auth.py +0 -0
  307. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_hitl.py +0 -0
  308. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_init.py +0 -0
  309. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_init_agents_md.py +0 -0
  310. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_input_args.py +0 -0
  311. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_invoke.py +0 -0
  312. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_new.py +0 -0
  313. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_oidc_utils.py +0 -0
  314. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_pack.py +0 -0
  315. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  316. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_portal_service_refresh_token.py +0 -0
  317. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_publish.py +0 -0
  318. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_pull.py +0 -0
  319. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_push.py +0 -0
  320. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_run.py +0 -0
  321. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/test_utils.py +0 -0
  322. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/utils/common.py +0 -0
  323. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/utils/project_details.py +0 -0
  324. {uipath-2.1.84 → uipath-2.1.86}/tests/cli/utils/uipath_json.py +0 -0
  325. {uipath-2.1.84 → uipath-2.1.86}/tests/conftest.py +0 -0
  326. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/conftest.py +0 -0
  327. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_actions_service.py +0 -0
  328. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_api_client.py +0 -0
  329. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_assets_service.py +0 -0
  330. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_attachments_service.py +0 -0
  331. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_base_service.py +0 -0
  332. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_buckets_service.py +0 -0
  333. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_context_grounding_service.py +0 -0
  334. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_documents_service.py +0 -0
  335. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_entities_service.py +0 -0
  336. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_external_application_service.py +0 -0
  337. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_folder_service.py +0 -0
  338. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_jobs_service.py +0 -0
  339. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_llm_integration.py +0 -0
  340. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  341. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_llm_service.py +0 -0
  342. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_processes_service.py +0 -0
  343. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_queues_service.py +0 -0
  344. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  345. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
  346. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
  347. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
  348. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/test_bindings_inference.py +0 -0
  349. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/test_config.py +0 -0
  350. {uipath-2.1.84 → uipath-2.1.86}/tests/sdk/test_overwrites.py +0 -0
  351. {uipath-2.1.84 → uipath-2.1.86}/tests/tracing/test_otel_exporters.py +0 -0
  352. {uipath-2.1.84 → uipath-2.1.86}/tests/tracing/test_span_utils.py +0 -0
  353. {uipath-2.1.84 → uipath-2.1.86}/tests/tracing/test_traced.py +0 -0
  354. {uipath-2.1.84 → uipath-2.1.86}/tests/tracing/test_tracing_manager.py +0 -0
@@ -0,0 +1,144 @@
1
+ name: Test UiPath Langchain
2
+
3
+ on:
4
+ pull_request:
5
+ types: [ opened, synchronize, reopened, labeled ]
6
+
7
+ jobs:
8
+ test-uipath-langchain:
9
+ runs-on: ${{ matrix.os }}
10
+ strategy:
11
+ matrix:
12
+ python-version: [ "3.10", "3.11", "3.12", "3.13" ]
13
+ os: [ ubuntu-latest, windows-latest ]
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ # Only run if PR has the test:uipath-langchain label
19
+ if: contains(github.event.pull_request.labels.*.name, 'test:uipath-langchain')
20
+
21
+ steps:
22
+ - name: Checkout uipath-python
23
+ uses: actions/checkout@v4
24
+ with:
25
+ path: 'uipath-python'
26
+
27
+ - name: Setup uv
28
+ uses: astral-sh/setup-uv@v5
29
+
30
+ - name: Setup Python
31
+ uses: actions/setup-python@v5
32
+ with:
33
+ python-version: ${{ matrix.python-version }}
34
+
35
+ - name: Build uipath-python package
36
+ working-directory: uipath-python
37
+ run: uv build
38
+
39
+ - name: Checkout uipath-langchain-python
40
+ uses: actions/checkout@v4
41
+ with:
42
+ repository: 'UiPath/uipath-langchain-python'
43
+ path: 'uipath-langchain-python'
44
+
45
+ - name: Update uipath-python version
46
+ shell: bash
47
+ working-directory: uipath-langchain-python
48
+ run: uv add ../uipath-python/dist/*.whl --dev
49
+
50
+ - name: Run uipath-langchain tests
51
+ working-directory: uipath-langchain-python
52
+ run: |
53
+ uv sync
54
+ uv run pytest
55
+
56
+ discover-testcases:
57
+ runs-on: ubuntu-latest
58
+ permissions:
59
+ contents: read
60
+ needs: [test-uipath-langchain]
61
+ outputs:
62
+ testcases: ${{ steps.discover.outputs.testcases }}
63
+ steps:
64
+ - name: Checkout uipath-langchain-python
65
+ uses: actions/checkout@v4
66
+ with:
67
+ repository: 'UiPath/uipath-langchain-python'
68
+ path: 'uipath-langchain-python'
69
+
70
+ - name: Discover testcases
71
+ id: discover
72
+ working-directory: uipath-langchain-python
73
+ run: |
74
+ # Find all testcase folders (excluding common folders like README, etc.)
75
+ testcase_dirs=$(find testcases -maxdepth 1 -type d -name "*-*" | sed 's|testcases/||' | sort)
76
+
77
+ echo "Found testcase directories:"
78
+ echo "$testcase_dirs"
79
+
80
+ # Convert to JSON array for matrix
81
+ testcases_json=$(echo "$testcase_dirs" | jq -R -s -c 'split("\n")[:-1]')
82
+ echo "testcases=$testcases_json" >> $GITHUB_OUTPUT
83
+
84
+ run-uipath-langchain-integration-tests:
85
+ runs-on: ubuntu-latest
86
+ needs: [discover-testcases]
87
+ container:
88
+ image: ghcr.io/astral-sh/uv:python3.12-bookworm
89
+ env:
90
+ UIPATH_JOB_KEY: "3a03d5cb-fa21-4021-894d-a8e2eda0afe0"
91
+ permissions:
92
+ contents: read
93
+ strategy:
94
+ fail-fast: false
95
+ matrix:
96
+ testcase: ${{ fromJson(needs.discover-testcases.outputs.testcases) }}
97
+ environment: [alpha, staging] # temporary disable [cloud]
98
+ use_azure_chat: [true, false]
99
+
100
+ name: "${{ matrix.testcase }} / ${{ matrix.environment }} / ${{ matrix.use_azure_chat && 'UiPathAzureChatOpenAI' || 'UiPathChat' }}"
101
+
102
+ steps:
103
+ - name: Checkout uipath-python
104
+ uses: actions/checkout@v4
105
+ with:
106
+ path: 'uipath-python'
107
+
108
+ - name: Build uipath-python package
109
+ working-directory: uipath-python
110
+ run: uv build
111
+
112
+ - name: Checkout uipath-langchain-python
113
+ uses: actions/checkout@v4
114
+ with:
115
+ repository: 'UiPath/uipath-langchain-python'
116
+ path: 'uipath-langchain-python'
117
+
118
+ - name: Update uipath-python version
119
+ shell: bash
120
+ working-directory: uipath-langchain-python
121
+ run: uv add ../uipath-python/dist/*.whl
122
+
123
+ - name: Install dependencies
124
+ working-directory: uipath-langchain-python
125
+ run: uv sync
126
+
127
+ - name: Run testcase
128
+ env:
129
+ CLIENT_ID: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_ID || matrix.environment == 'staging' && secrets.STAGING_TEST_CLIENT_ID || matrix.environment == 'cloud' && secrets.CLOUD_TEST_CLIENT_ID }}
130
+ CLIENT_SECRET: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_SECRET || matrix.environment == 'staging' && secrets.STAGING_TEST_CLIENT_SECRET || matrix.environment == 'cloud' && secrets.CLOUD_TEST_CLIENT_SECRET }}
131
+ BASE_URL: ${{ matrix.environment == 'alpha' && secrets.ALPHA_BASE_URL || matrix.environment == 'staging' && secrets.STAGING_BASE_URL || matrix.environment == 'cloud' && secrets.CLOUD_BASE_URL }}
132
+ USE_AZURE_CHAT: ${{ matrix.use_azure_chat }}
133
+ UV_PYTHON: "3.12"
134
+ working-directory: uipath-langchain-python/testcases/${{ matrix.testcase }}
135
+ run: |
136
+ echo "Running testcase: ${{ matrix.testcase }}"
137
+ echo "Environment: ${{ matrix.environment }}"
138
+ echo "LLM: ${{ matrix.use_azure_chat && 'UiPathAzureChatOpenAI' || 'UiPathChat' }}"
139
+ echo "USE_AZURE_CHAT: ${{ matrix.use_azure_chat }}"
140
+
141
+ # Execute the testcase run script directly
142
+ bash run.sh
143
+ bash ../common/validate_output.sh
144
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath
3
- Version: 2.1.84
3
+ Version: 2.1.86
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.84"
3
+ version = "2.1.86"
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"
@@ -432,12 +432,12 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
432
432
  async def execute_runtime(
433
433
  self, eval_item: EvaluationItem
434
434
  ) -> UiPathEvalRunExecutionOutput:
435
- eval_item_id = eval_item.id
435
+ execution_id = str(uuid.uuid4())
436
436
  runtime_context: C = self.factory.new_context(
437
- execution_id=eval_item_id,
437
+ execution_id=execution_id,
438
438
  input_json=eval_item.inputs,
439
439
  is_eval_run=True,
440
- log_handler=self._setup_execution_logging(eval_item_id),
440
+ log_handler=self._setup_execution_logging(execution_id),
441
441
  )
442
442
  if runtime_context.execution_id is None:
443
443
  raise ValueError("execution_id must be set for eval runs")
@@ -445,9 +445,8 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
445
445
  attributes = {
446
446
  "evalId": eval_item.id,
447
447
  "span_type": "eval",
448
+ "execution.id": runtime_context.execution_id,
448
449
  }
449
- if runtime_context.execution_id:
450
- attributes["execution.id"] = runtime_context.execution_id
451
450
 
452
451
  start_time = time()
453
452
  try:
@@ -1,13 +1,22 @@
1
1
  # type: ignore
2
+ import hashlib
2
3
  import json
3
4
  import os
4
5
  import re
6
+ from pathlib import Path
5
7
  from typing import Any, Dict, Optional, Tuple
6
8
 
9
+ import click
7
10
  from pydantic import BaseModel
8
11
 
9
12
  from .._utils._console import ConsoleLogger
10
13
  from ._constants import is_binary_file
14
+ from ._studio_project import (
15
+ ProjectFile,
16
+ ProjectFolder,
17
+ StudioClient,
18
+ get_folder_by_name,
19
+ )
11
20
 
12
21
  try:
13
22
  import tomllib
@@ -431,3 +440,116 @@ def files_to_include(
431
440
  )
432
441
  )
433
442
  return extra_files
443
+
444
+
445
+ def compute_normalized_hash(content: str) -> str:
446
+ """Compute hash of normalized content.
447
+
448
+ Args:
449
+ content: Content to hash
450
+
451
+ Returns:
452
+ str: SHA256 hash of the normalized content
453
+ """
454
+ try:
455
+ # Try to parse as JSON to handle formatting
456
+ json_content = json.loads(content)
457
+ normalized = json.dumps(json_content, indent=2)
458
+ except json.JSONDecodeError:
459
+ # Not JSON, normalize line endings
460
+ normalized = content.replace("\r\n", "\n").replace("\r", "\n")
461
+
462
+ return hashlib.sha256(normalized.encode("utf-8")).hexdigest()
463
+
464
+
465
+ def collect_files_from_folder(
466
+ folder: ProjectFolder, base_path: str, files_dict: Dict[str, ProjectFile]
467
+ ) -> None:
468
+ """Recursively collect all files from a folder and its subfolders.
469
+
470
+ Args:
471
+ folder: The folder to collect files from
472
+ base_path: Base path for file paths
473
+ files_dict: Dictionary to store collected files
474
+ """
475
+ # Add files from current folder
476
+ for file in folder.files:
477
+ file_path = os.path.join(base_path, file.name)
478
+ files_dict[file_path] = file
479
+
480
+ # Recursively process subfolders
481
+ for subfolder in folder.folders:
482
+ subfolder_path = os.path.join(base_path, subfolder.name)
483
+ collect_files_from_folder(subfolder, subfolder_path, files_dict)
484
+
485
+
486
+ async def download_folder_files(
487
+ studio_client: StudioClient,
488
+ folder: ProjectFolder,
489
+ base_path: Path,
490
+ ) -> None:
491
+ """Download files from a folder recursively.
492
+
493
+ Args:
494
+ studio_client: Studio client
495
+ folder: The folder to download files from
496
+ base_path: Base path for local file storage
497
+ """
498
+ files_dict: Dict[str, ProjectFile] = {}
499
+ collect_files_from_folder(folder, "", files_dict)
500
+ for file_path, remote_file in files_dict.items():
501
+ local_path = base_path / file_path
502
+ local_path.parent.mkdir(parents=True, exist_ok=True)
503
+
504
+ # Download remote file
505
+ response = await studio_client.download_file_async(remote_file.id)
506
+ remote_content = response.read().decode("utf-8")
507
+ remote_hash = compute_normalized_hash(remote_content)
508
+
509
+ if os.path.exists(local_path):
510
+ # Read and hash local file
511
+ with open(local_path, "r", encoding="utf-8") as f:
512
+ local_content = f.read()
513
+ local_hash = compute_normalized_hash(local_content)
514
+
515
+ # Compare hashes
516
+ if local_hash != remote_hash:
517
+ styled_path = click.style(str(file_path), fg="cyan")
518
+ console.warning(f"File {styled_path}" + " differs from remote version.")
519
+ response = click.prompt("Do you want to overwrite it? (y/n)", type=str)
520
+ if response.lower() == "y":
521
+ with open(local_path, "w", encoding="utf-8", newline="\n") as f:
522
+ f.write(remote_content)
523
+ console.success(f"Updated {click.style(str(file_path), fg='cyan')}")
524
+ else:
525
+ console.info(f"Skipped {click.style(str(file_path), fg='cyan')}")
526
+ else:
527
+ console.info(
528
+ f"File {click.style(str(file_path), fg='cyan')} is up to date"
529
+ )
530
+ else:
531
+ # File doesn't exist locally, create it
532
+ with open(local_path, "w", encoding="utf-8", newline="\n") as f:
533
+ f.write(remote_content)
534
+ console.success(f"Downloaded {click.style(str(file_path), fg='cyan')}")
535
+
536
+
537
+ async def pull_project(project_id: str, download_configuration: dict[str, Path]):
538
+ studio_client = StudioClient(project_id)
539
+
540
+ with console.spinner("Pulling UiPath project files..."):
541
+ try:
542
+ structure = await studio_client.get_project_structure_async()
543
+ for source_key, destination in download_configuration.items():
544
+ source_folder = get_folder_by_name(structure, source_key)
545
+ if source_folder:
546
+ await download_folder_files(
547
+ studio_client,
548
+ source_folder,
549
+ destination,
550
+ )
551
+ else:
552
+ console.warning(f"No {source_key} folder found in remote project")
553
+
554
+ except Exception as e:
555
+ console.error(f"Failed to pull UiPath project: {str(e)}")
@@ -0,0 +1,59 @@
1
+ # type: ignore
2
+ """CLI command for pulling remote project files from UiPath StudioWeb solution.
3
+
4
+ This module provides functionality to pull remote project files from a UiPath StudioWeb solution.
5
+ It handles:
6
+ - File downloads from source_code and evals folders
7
+ - Maintaining folder structure locally
8
+ - File comparison using hashes
9
+ - Interactive confirmation for overwriting files
10
+ """
11
+
12
+ # type: ignore
13
+ import asyncio
14
+ import os
15
+ from pathlib import Path
16
+
17
+ import click
18
+
19
+ from ..telemetry import track
20
+ from ._utils._console import ConsoleLogger
21
+ from ._utils._constants import UIPATH_PROJECT_ID
22
+ from ._utils._project_files import pull_project
23
+
24
+ console = ConsoleLogger()
25
+
26
+
27
+ @click.command()
28
+ @click.argument(
29
+ "root",
30
+ type=click.Path(exists=False, file_okay=False, dir_okay=True, path_type=Path),
31
+ default=Path("."),
32
+ )
33
+ @track
34
+ def pull(root: Path) -> None:
35
+ """Pull remote project files from Studio Web Project.
36
+
37
+ This command pulls the remote project files from a UiPath Studio Web project.
38
+ It downloads files from the source_code and evals folders, maintaining the
39
+ folder structure locally. Files are compared using hashes before overwriting,
40
+ and user confirmation is required for differing files.
41
+
42
+ Args:
43
+ root: The root directory to pull files into
44
+
45
+ Environment Variables:
46
+ UIPATH_PROJECT_ID: Required. The ID of the UiPath Studio Web project
47
+
48
+ Example:
49
+ $ uipath pull
50
+ $ uipath pull /path/to/project
51
+ """
52
+ if not (project_id := os.getenv(UIPATH_PROJECT_ID, False)):
53
+ console.error("UIPATH_PROJECT_ID environment variable not found.")
54
+
55
+ default_download_configuration = {
56
+ "source_code": root,
57
+ "evals": root / "evals",
58
+ }
59
+ asyncio.run(pull_project(project_id, default_download_configuration))
@@ -7,7 +7,7 @@ from httpx import Response
7
7
  from .._config import Config
8
8
  from .._execution_context import ExecutionContext
9
9
  from .._utils import Endpoint, RequestSpec, header_folder, infer_bindings
10
- from ..models import Connection, ConnectionToken, EventArguments
10
+ from ..models import Connection, ConnectionMetadata, ConnectionToken, EventArguments
11
11
  from ..models.connections import ConnectionTokenType
12
12
  from ..tracing._traced import traced
13
13
  from ._base_service import BaseService
@@ -54,6 +54,31 @@ class ConnectionsService(BaseService):
54
54
  response = self.request(spec.method, url=spec.endpoint)
55
55
  return Connection.model_validate(response.json())
56
56
 
57
+ @traced(
58
+ name="connections_metadata",
59
+ run_type="uipath",
60
+ hide_output=True,
61
+ )
62
+ def metadata(
63
+ self, element_instance_id: int, tool_path: str, schema_mode: bool = True
64
+ ) -> ConnectionMetadata:
65
+ """Synchronously retrieve connection API metadata.
66
+
67
+ This method fetches the metadata for a connection,
68
+ which can be used to establish communication with an external service.
69
+
70
+ Args:
71
+ element_instance_id (int): The element instance ID of the connection.
72
+ tool_path (str): The tool path to retrieve metadata for.
73
+ schema_mode (bool): Whether or not to represent the output schema in the response fields.
74
+
75
+ Returns:
76
+ ConnectionMetadata: The connection metadata.
77
+ """
78
+ spec = self._metadata_spec(element_instance_id, tool_path, schema_mode)
79
+ response = self.request(spec.method, url=spec.endpoint, headers=spec.headers)
80
+ return ConnectionMetadata.model_validate(response.json())
81
+
57
82
  @traced(name="connections_list", run_type="uipath")
58
83
  def list(
59
84
  self,
@@ -186,6 +211,33 @@ class ConnectionsService(BaseService):
186
211
  response = await self.request_async(spec.method, url=spec.endpoint)
187
212
  return Connection.model_validate(response.json())
188
213
 
214
+ @traced(
215
+ name="connections_metadata",
216
+ run_type="uipath",
217
+ hide_output=True,
218
+ )
219
+ async def metadata_async(
220
+ self, element_instance_id: int, tool_path: str, schema_mode: bool = True
221
+ ) -> ConnectionMetadata:
222
+ """Asynchronously retrieve connection API metadata.
223
+
224
+ This method fetches the metadata for a connection,
225
+ which can be used to establish communication with an external service.
226
+
227
+ Args:
228
+ element_instance_id (int): The element instance ID of the connection.
229
+ tool_path (str): The tool path to retrieve metadata for.
230
+ schema_mode (bool): Whether or not to represent the output schema in the response fields.
231
+
232
+ Returns:
233
+ ConnectionMetadata: The connection metadata.
234
+ """
235
+ spec = self._metadata_spec(element_instance_id, tool_path, schema_mode)
236
+ response = await self.request_async(
237
+ spec.method, url=spec.endpoint, headers=spec.headers
238
+ )
239
+ return ConnectionMetadata.model_validate(response.json())
240
+
189
241
  @traced(
190
242
  name="connections_retrieve_token",
191
243
  run_type="uipath",
@@ -324,6 +376,20 @@ class ConnectionsService(BaseService):
324
376
  endpoint=Endpoint(f"/connections_/api/v1/Connections/{key}"),
325
377
  )
326
378
 
379
+ def _metadata_spec(
380
+ self, element_instance_id: int, tool_path: str, schema_mode: bool
381
+ ) -> RequestSpec:
382
+ metadata_endpoint_url = f"/elements_/v3/element/instances/{element_instance_id}/elements/{tool_path}/metadata"
383
+ return RequestSpec(
384
+ method="GET",
385
+ endpoint=Endpoint(metadata_endpoint_url),
386
+ headers={
387
+ "accept": "application/schema+json"
388
+ if schema_mode
389
+ else "application/json"
390
+ },
391
+ )
392
+
327
393
  def _retrieve_token_spec(
328
394
  self, key: str, token_type: ConnectionTokenType = ConnectionTokenType.DIRECT
329
395
  ) -> RequestSpec:
@@ -3,7 +3,7 @@ from .actions import Action
3
3
  from .assets import Asset, UserAsset
4
4
  from .attachment import Attachment
5
5
  from .buckets import Bucket
6
- from .connections import Connection, ConnectionToken, EventArguments
6
+ from .connections import Connection, ConnectionMetadata, ConnectionToken, EventArguments
7
7
  from .context_grounding import ContextGroundingQueryResponse
8
8
  from .context_grounding_index import ContextGroundingIndex
9
9
  from .errors import BaseUrlMissingError, SecretMissingError
@@ -38,6 +38,7 @@ __all__ = [
38
38
  "QueueItemPriority",
39
39
  "TransactionItemResult",
40
40
  "Connection",
41
+ "ConnectionMetadata",
41
42
  "ConnectionToken",
42
43
  "EventArguments",
43
44
  "Job",
@@ -4,6 +4,14 @@ from typing import Any, Optional
4
4
  from pydantic import BaseModel, ConfigDict, Field
5
5
 
6
6
 
7
+ class ConnectionMetadata(BaseModel):
8
+ """Metadata about a connection."""
9
+
10
+ fields: dict[str, Any] = Field(default_factory=dict, alias="fields")
11
+
12
+ model_config = ConfigDict(populate_by_name=True, extra="allow")
13
+
14
+
7
15
  class Connection(BaseModel):
8
16
  model_config = ConfigDict(
9
17
  validate_by_name=True,
@@ -0,0 +1,111 @@
1
+ """Json schema to dynamic pydantic model."""
2
+
3
+ from typing import Any, Dict, List, Optional, Type, Union
4
+
5
+ from pydantic import BaseModel, Field, create_model
6
+
7
+
8
+ def jsonschema_to_pydantic(
9
+ schema: dict[str, Any],
10
+ definitions: Optional[dict[str, Any]] = None,
11
+ ) -> Type[BaseModel]:
12
+ """Convert a schema dict to a pydantic model.
13
+
14
+ Modified version of https://github.com/kreneskyp/jsonschema-pydantic to account for two unresolved issues.
15
+
16
+ Args:
17
+ schema: JSON schema.
18
+ definitions: Definitions dict. Defaults to `$def`.
19
+
20
+ Returns: Pydantic model.
21
+ """
22
+ title = schema.get("title", "DynamicModel")
23
+ assert isinstance(title, str), "Title of a model must be a string."
24
+
25
+ description = schema.get("description", None)
26
+
27
+ # top level schema provides definitions
28
+ if definitions is None:
29
+ if "$defs" in schema:
30
+ definitions = schema["$defs"]
31
+ elif "definitions" in schema:
32
+ definitions = schema["definitions"]
33
+ else:
34
+ definitions = {}
35
+
36
+ def convert_type(prop: dict[str, Any]) -> Any:
37
+ if "$ref" in prop:
38
+ ref_path = prop["$ref"].split("/")
39
+ ref = definitions[ref_path[-1]]
40
+ return jsonschema_to_pydantic(ref, definitions)
41
+
42
+ if "type" in prop:
43
+ type_mapping = {
44
+ "string": str,
45
+ "number": float,
46
+ "integer": int,
47
+ "boolean": bool,
48
+ "array": List,
49
+ "object": Dict[str, Any],
50
+ "null": None,
51
+ }
52
+
53
+ type_ = prop["type"]
54
+
55
+ if type_ == "array":
56
+ item_type: Any = convert_type(prop.get("items", {}))
57
+ assert isinstance(item_type, type)
58
+ return List[item_type] # noqa F821
59
+ elif type_ == "object":
60
+ if "properties" in prop:
61
+ return jsonschema_to_pydantic(prop, definitions)
62
+ else:
63
+ return Dict[str, Any]
64
+ else:
65
+ return type_mapping.get(type_, Any)
66
+
67
+ elif "allOf" in prop:
68
+ combined_fields = {}
69
+ for sub_schema in prop["allOf"]:
70
+ model = jsonschema_to_pydantic(sub_schema, definitions)
71
+ combined_fields.update(model.__annotations__)
72
+ return create_model("CombinedModel", **combined_fields)
73
+
74
+ elif "anyOf" in prop:
75
+ unioned_types = tuple(
76
+ convert_type(sub_schema) for sub_schema in prop["anyOf"]
77
+ )
78
+ return Union[unioned_types]
79
+ elif prop == {} or "type" not in prop:
80
+ return Any
81
+ else:
82
+ raise ValueError(f"Unsupported schema: {prop}")
83
+
84
+ fields: dict[str, Any] = {}
85
+ required_fields = schema.get("required", [])
86
+
87
+ for name, prop in schema.get("properties", {}).items():
88
+ pydantic_type = convert_type(prop)
89
+ field_kwargs = {}
90
+ if "default" in prop:
91
+ field_kwargs["default"] = prop["default"]
92
+ if name not in required_fields:
93
+ # Note that we do not make this optional. This is due to a limitation in Pydantic/Python.
94
+ # If we convert the Optional type back to json schema, it is represented as type | None.
95
+ # pydantic_type = Optional[pydantic_type]
96
+
97
+ if "default" not in field_kwargs:
98
+ field_kwargs["default"] = None
99
+ if "description" in prop:
100
+ field_kwargs["description"] = prop["description"]
101
+ if "title" in prop:
102
+ field_kwargs["title"] = prop["title"]
103
+
104
+ fields[name] = (pydantic_type, Field(**field_kwargs))
105
+
106
+ convert_type(schema.get("properties", {}).get("choices", {}))
107
+
108
+ model = create_model(title, **fields)
109
+ if description:
110
+ model.__doc__ = description
111
+ return model
@@ -1,4 +1,5 @@
1
1
  #!/bin/bash
2
+ set -e
2
3
 
3
4
  echo "Syncing dependencies..."
4
5
  uv sync
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ set -e
3
+
2
4
  echo "Syncing dependencies..."
3
5
  uv sync
4
6
 
@@ -1,7 +1,7 @@
1
1
  #!/bin/bash
2
2
 
3
3
  # Common utility to print UiPath output file
4
- # Usage: source /app/testcases/common/print_output.sh
4
+ # Usage: source /app/testcases/common/validate_output.sh
5
5
 
6
6
  debug_print_uipath_output() {
7
7
  echo "Printing output file..."
@@ -32,4 +32,4 @@ validate_output() {
32
32
  echo "Testcase completed successfully."
33
33
  }
34
34
 
35
- validate_output
35
+ validate_output
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ set -e
3
+
2
4
  echo "Syncing dependencies..."
3
5
  uv sync
4
6
 
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ set -e
3
+
2
4
  echo "Syncing dependencies..."
3
5
  uv sync
4
6