uipath 2.1.88__tar.gz → 2.1.89__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 (365) hide show
  1. {uipath-2.1.88 → uipath-2.1.89}/PKG-INFO +1 -1
  2. {uipath-2.1.88 → uipath-2.1.89}/pyproject.toml +1 -1
  3. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_models/_evaluation_set.py +13 -0
  4. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_runtime.py +18 -0
  5. uipath-2.1.89/src/uipath/_cli/_evals/mocks/input_mocker.py +111 -0
  6. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/mocks/mocker.py +6 -0
  7. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_push/sw_file_handler.py +24 -40
  8. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_runtime/_logging.py +4 -0
  9. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_project_files.py +67 -37
  10. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_pull.py +22 -1
  11. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/_utils.py +14 -1
  12. uipath-2.1.89/src/uipath/agent/loop/__init__.py +17 -0
  13. uipath-2.1.89/src/uipath/agent/loop/prompts.py +57 -0
  14. uipath-2.1.89/src/uipath/agent/loop/tools.py +42 -0
  15. uipath-2.1.89/tests/cli/eval/mocks/test_input_mocker.py +106 -0
  16. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/eval/mocks/test_mocks.py +1 -0
  17. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_pull.py +7 -7
  18. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_push.py +21 -21
  19. {uipath-2.1.88 → uipath-2.1.89}/uv.lock +1 -1
  20. {uipath-2.1.88 → uipath-2.1.89}/.claude/agents/command-tester.md +0 -0
  21. {uipath-2.1.88 → uipath-2.1.89}/.claude/commands/prepare-pr.md +0 -0
  22. {uipath-2.1.88 → uipath-2.1.89}/.cursorrules +0 -0
  23. {uipath-2.1.88 → uipath-2.1.89}/.editorconfig +0 -0
  24. {uipath-2.1.88 → uipath-2.1.89}/.gitattributes +0 -0
  25. {uipath-2.1.88 → uipath-2.1.89}/.github/labeler.yml +0 -0
  26. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/auto-label.yml +0 -0
  27. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/cd.yml +0 -0
  28. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/ci.yml +0 -0
  29. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/commitlint.yml +0 -0
  30. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/integration_tests.yml +0 -0
  31. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/lint.yml +0 -0
  32. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/publish-dev.yml +0 -0
  33. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/publish-docs.yml +0 -0
  34. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/slack.yml +0 -0
  35. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/test-uipath-langchain.yml +0 -0
  36. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/test-uipath-llamaindex.yml +0 -0
  37. {uipath-2.1.88 → uipath-2.1.89}/.github/workflows/test.yml +0 -0
  38. {uipath-2.1.88 → uipath-2.1.89}/.gitignore +0 -0
  39. {uipath-2.1.88 → uipath-2.1.89}/.pre-commit-config.yaml +0 -0
  40. {uipath-2.1.88 → uipath-2.1.89}/.python-version +0 -0
  41. {uipath-2.1.88 → uipath-2.1.89}/.vscode/extensions.json +0 -0
  42. {uipath-2.1.88 → uipath-2.1.89}/.vscode/launch.json +0 -0
  43. {uipath-2.1.88 → uipath-2.1.89}/.vscode/settings.json +0 -0
  44. {uipath-2.1.88 → uipath-2.1.89}/CONTRIBUTING.md +0 -0
  45. {uipath-2.1.88 → uipath-2.1.89}/LICENSE +0 -0
  46. {uipath-2.1.88 → uipath-2.1.89}/README.md +0 -0
  47. {uipath-2.1.88 → uipath-2.1.89}/docs/CONTRIBUTING.md +0 -0
  48. {uipath-2.1.88 → uipath-2.1.89}/docs/FAQ.md +0 -0
  49. {uipath-2.1.88 → uipath-2.1.89}/docs/assets/env-preparation-failed-dark.png +0 -0
  50. {uipath-2.1.88 → uipath-2.1.89}/docs/assets/env-preparation-failed-light.png +0 -0
  51. {uipath-2.1.88 → uipath-2.1.89}/docs/assets/favicon.png +0 -0
  52. {uipath-2.1.88 → uipath-2.1.89}/docs/assets/llms.txt +0 -0
  53. {uipath-2.1.88 → uipath-2.1.89}/docs/assets/logo-dark.svg +0 -0
  54. {uipath-2.1.88 → uipath-2.1.89}/docs/assets/logo-light.svg +0 -0
  55. {uipath-2.1.88 → uipath-2.1.89}/docs/cli/index.md +0 -0
  56. {uipath-2.1.88 → uipath-2.1.89}/docs/core/actions.md +0 -0
  57. {uipath-2.1.88 → uipath-2.1.89}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  58. {uipath-2.1.88 → uipath-2.1.89}/docs/core/assets/cloud_env_var_light.gif +0 -0
  59. {uipath-2.1.88 → uipath-2.1.89}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  60. {uipath-2.1.88 → uipath-2.1.89}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  61. {uipath-2.1.88 → uipath-2.1.89}/docs/core/assets/copy_path_dark.png +0 -0
  62. {uipath-2.1.88 → uipath-2.1.89}/docs/core/assets/copy_path_light.png +0 -0
  63. {uipath-2.1.88 → uipath-2.1.89}/docs/core/assets.md +0 -0
  64. {uipath-2.1.88 → uipath-2.1.89}/docs/core/attachments.md +0 -0
  65. {uipath-2.1.88 → uipath-2.1.89}/docs/core/buckets.md +0 -0
  66. {uipath-2.1.88 → uipath-2.1.89}/docs/core/connections.md +0 -0
  67. {uipath-2.1.88 → uipath-2.1.89}/docs/core/context_grounding.md +0 -0
  68. {uipath-2.1.88 → uipath-2.1.89}/docs/core/documents.md +0 -0
  69. {uipath-2.1.88 → uipath-2.1.89}/docs/core/documents_models.md +0 -0
  70. {uipath-2.1.88 → uipath-2.1.89}/docs/core/environment_variables.md +0 -0
  71. {uipath-2.1.88 → uipath-2.1.89}/docs/core/getting_started.md +0 -0
  72. {uipath-2.1.88 → uipath-2.1.89}/docs/core/jobs.md +0 -0
  73. {uipath-2.1.88 → uipath-2.1.89}/docs/core/llm_gateway.md +0 -0
  74. {uipath-2.1.88 → uipath-2.1.89}/docs/core/processes.md +0 -0
  75. {uipath-2.1.88 → uipath-2.1.89}/docs/core/queues.md +0 -0
  76. {uipath-2.1.88 → uipath-2.1.89}/docs/core/traced.md +0 -0
  77. {uipath-2.1.88 → uipath-2.1.89}/docs/hooks.py +0 -0
  78. {uipath-2.1.88 → uipath-2.1.89}/docs/index.md +0 -0
  79. {uipath-2.1.88 → uipath-2.1.89}/docs/javascripts/extra.js +0 -0
  80. {uipath-2.1.88 → uipath-2.1.89}/docs/overrides/main.html +0 -0
  81. {uipath-2.1.88 → uipath-2.1.89}/docs/overrides/partials/actions.html +0 -0
  82. {uipath-2.1.88 → uipath-2.1.89}/docs/overrides/partials/logo.html +0 -0
  83. {uipath-2.1.88 → uipath-2.1.89}/docs/release_policy.md +0 -0
  84. {uipath-2.1.88 → uipath-2.1.89}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  85. {uipath-2.1.88 → uipath-2.1.89}/docs/stylesheets/extra.css +0 -0
  86. {uipath-2.1.88 → uipath-2.1.89}/justfile +0 -0
  87. {uipath-2.1.88 → uipath-2.1.89}/mkdocs.yml +0 -0
  88. {uipath-2.1.88 → uipath-2.1.89}/py.typed +0 -0
  89. {uipath-2.1.88 → uipath-2.1.89}/samples/asset-modifier-agent/.env.example +0 -0
  90. {uipath-2.1.88 → uipath-2.1.89}/samples/asset-modifier-agent/README.md +0 -0
  91. {uipath-2.1.88 → uipath-2.1.89}/samples/asset-modifier-agent/input.json +0 -0
  92. {uipath-2.1.88 → uipath-2.1.89}/samples/asset-modifier-agent/main.py +0 -0
  93. {uipath-2.1.88 → uipath-2.1.89}/samples/asset-modifier-agent/pyproject.toml +0 -0
  94. {uipath-2.1.88 → uipath-2.1.89}/samples/asset-modifier-agent/uv.lock +0 -0
  95. {uipath-2.1.88 → uipath-2.1.89}/samples/calculator/README.md +0 -0
  96. {uipath-2.1.88 → uipath-2.1.89}/samples/calculator/evals/eval-sets/default.json +0 -0
  97. {uipath-2.1.88 → uipath-2.1.89}/samples/calculator/evals/evaluators/equality.json +0 -0
  98. {uipath-2.1.88 → uipath-2.1.89}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
  99. {uipath-2.1.88 → uipath-2.1.89}/samples/calculator/main.py +0 -0
  100. {uipath-2.1.88 → uipath-2.1.89}/samples/calculator/pyproject.toml +0 -0
  101. {uipath-2.1.88 → uipath-2.1.89}/samples/calculator/uipath.json +0 -0
  102. {uipath-2.1.88 → uipath-2.1.89}/samples/event-trigger/.python-version +0 -0
  103. {uipath-2.1.88 → uipath-2.1.89}/samples/event-trigger/README.md +0 -0
  104. {uipath-2.1.88 → uipath-2.1.89}/samples/event-trigger/main.py +0 -0
  105. {uipath-2.1.88 → uipath-2.1.89}/samples/event-trigger/pyproject.toml +0 -0
  106. {uipath-2.1.88 → uipath-2.1.89}/samples/google-ADK-agent/.env.example +0 -0
  107. {uipath-2.1.88 → uipath-2.1.89}/samples/google-ADK-agent/README.md +0 -0
  108. {uipath-2.1.88 → uipath-2.1.89}/samples/google-ADK-agent/input.json +0 -0
  109. {uipath-2.1.88 → uipath-2.1.89}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  110. {uipath-2.1.88 → uipath-2.1.89}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  111. {uipath-2.1.88 → uipath-2.1.89}/samples/google-ADK-agent/pyproject.toml +0 -0
  112. {uipath-2.1.88 → uipath-2.1.89}/samples/google-ADK-agent/uv.lock +0 -0
  113. {uipath-2.1.88 → uipath-2.1.89}/scripts/debug_test.py +0 -0
  114. {uipath-2.1.88 → uipath-2.1.89}/scripts/lint_httpx_client.py +0 -0
  115. {uipath-2.1.88 → uipath-2.1.89}/scripts/update_agents_md.py +0 -0
  116. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/__init__.py +0 -0
  117. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/README.md +0 -0
  118. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/__init__.py +0 -0
  119. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  120. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/_auth_service.py +0 -0
  121. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/_models.py +0 -0
  122. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  123. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  124. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  125. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/_utils.py +0 -0
  126. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/auth_config.json +0 -0
  127. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/index.html +0 -0
  128. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/localhost.crt +0 -0
  129. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_auth/localhost.key +0 -0
  130. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
  131. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
  132. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
  133. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
  134. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
  135. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
  136. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
  137. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  138. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
  139. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
  140. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
  141. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
  142. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
  143. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
  144. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
  145. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
  146. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
  147. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
  148. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_models/_output.py +0 -0
  149. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
  150. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
  151. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/_span_collection.py +0 -0
  152. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
  153. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/mocks/llm_mocker.py +0 -0
  154. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
  155. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
  156. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_evals/mocks/mocks.py +0 -0
  157. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_runtime/_contracts.py +0 -0
  158. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  159. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  160. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_runtime/_runtime.py +0 -0
  161. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
  162. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  163. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_templates/.rels.template +0 -0
  164. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  165. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_templates/main.py.template +0 -0
  166. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  167. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_common.py +0 -0
  168. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_console.py +0 -0
  169. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_constants.py +0 -0
  170. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_debug.py +0 -0
  171. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_eval_set.py +0 -0
  172. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_folders.py +0 -0
  173. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_input_args.py +0 -0
  174. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  175. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_processes.py +0 -0
  176. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  177. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_tracing.py +0 -0
  178. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  179. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_auth.py +0 -0
  180. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_deploy.py +0 -0
  181. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_dev.py +0 -0
  182. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_eval.py +0 -0
  183. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_init.py +0 -0
  184. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_invoke.py +0 -0
  185. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_new.py +0 -0
  186. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_pack.py +0 -0
  187. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_publish.py +0 -0
  188. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_push.py +0 -0
  189. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/cli_run.py +0 -0
  190. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/middlewares.py +0 -0
  191. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_cli/spinner.py +0 -0
  192. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_config.py +0 -0
  193. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_events/__init__.py +0 -0
  194. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_events/_event_bus.py +0 -0
  195. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_events/_events.py +0 -0
  196. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_execution_context.py +0 -0
  197. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_folder_context.py +0 -0
  198. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_resources/AGENTS.md +0 -0
  199. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_resources/CLAUDE.md +0 -0
  200. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_resources/CLI_REFERENCE.md +0 -0
  201. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_resources/REQUIRED_STRUCTURE.md +0 -0
  202. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_resources/SDK_REFERENCE.md +0 -0
  203. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/__init__.py +0 -0
  204. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/_base_service.py +0 -0
  205. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/actions_service.py +0 -0
  206. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/api_client.py +0 -0
  207. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/assets_service.py +0 -0
  208. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/attachments_service.py +0 -0
  209. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/buckets_service.py +0 -0
  210. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/connections_service.py +0 -0
  211. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/context_grounding_service.py +0 -0
  212. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/documents_service.py +0 -0
  213. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/entities_service.py +0 -0
  214. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/external_application_service.py +0 -0
  215. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/folder_service.py +0 -0
  216. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/jobs_service.py +0 -0
  217. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/llm_gateway_service.py +0 -0
  218. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/processes_service.py +0 -0
  219. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_services/queues_service.py +0 -0
  220. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_uipath.py +0 -0
  221. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/__init__.py +0 -0
  222. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_auth.py +0 -0
  223. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_endpoint.py +0 -0
  224. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_infer_bindings.py +0 -0
  225. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_logs.py +0 -0
  226. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_read_overwrites.py +0 -0
  227. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_request_override.py +0 -0
  228. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_request_spec.py +0 -0
  229. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_ssl_context.py +0 -0
  230. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_url.py +0 -0
  231. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/_user_agent.py +0 -0
  232. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/_utils/constants.py +0 -0
  233. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/__init__.py +0 -0
  234. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/async_stream.py +0 -0
  235. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/citation.py +0 -0
  236. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/content.py +0 -0
  237. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/conversation.py +0 -0
  238. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/event.py +0 -0
  239. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/exchange.py +0 -0
  240. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/message.py +0 -0
  241. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/meta.py +0 -0
  242. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/conversation/tool.py +0 -0
  243. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/agent/models/agent.py +0 -0
  244. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/_helpers/__init__.py +0 -0
  245. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/_helpers/helpers.py +0 -0
  246. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/evaluators/__init__.py +0 -0
  247. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
  248. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
  249. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
  250. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
  251. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
  252. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
  253. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/mocks/__init__.py +0 -0
  254. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/mocks/mockable.py +0 -0
  255. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/models/__init__.py +0 -0
  256. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/eval/models/models.py +0 -0
  257. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/__init__.py +0 -0
  258. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/action_schema.py +0 -0
  259. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/actions.py +0 -0
  260. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/assets.py +0 -0
  261. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/attachment.py +0 -0
  262. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/auth.py +0 -0
  263. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/buckets.py +0 -0
  264. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/connections.py +0 -0
  265. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/context_grounding.py +0 -0
  266. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/context_grounding_index.py +0 -0
  267. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/documents.py +0 -0
  268. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/entities.py +0 -0
  269. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/errors.py +0 -0
  270. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/exceptions.py +0 -0
  271. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/interrupt_models.py +0 -0
  272. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/job.py +0 -0
  273. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/llm_gateway.py +0 -0
  274. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/processes.py +0 -0
  275. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/models/queues.py +0 -0
  276. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/py.typed +0 -0
  277. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/telemetry/__init__.py +0 -0
  278. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/telemetry/_constants.py +0 -0
  279. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/telemetry/_track.py +0 -0
  280. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/tracing/__init__.py +0 -0
  281. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/tracing/_otel_exporters.py +0 -0
  282. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/tracing/_traced.py +0 -0
  283. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/tracing/_utils.py +0 -0
  284. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/utils/__init__.py +0 -0
  285. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/utils/_endpoints_manager.py +0 -0
  286. {uipath-2.1.88 → uipath-2.1.89}/src/uipath/utils/dynamic_schema.py +0 -0
  287. {uipath-2.1.88 → uipath-2.1.89}/testcases/apicalls-testcase/main.py +0 -0
  288. {uipath-2.1.88 → uipath-2.1.89}/testcases/apicalls-testcase/pyproject.toml +0 -0
  289. {uipath-2.1.88 → uipath-2.1.89}/testcases/apicalls-testcase/run.sh +0 -0
  290. {uipath-2.1.88 → uipath-2.1.89}/testcases/apicalls-testcase/src/assert.py +0 -0
  291. {uipath-2.1.88 → uipath-2.1.89}/testcases/basic-testcase/main.py +0 -0
  292. {uipath-2.1.88 → uipath-2.1.89}/testcases/basic-testcase/pyproject.toml +0 -0
  293. {uipath-2.1.88 → uipath-2.1.89}/testcases/basic-testcase/run.sh +0 -0
  294. {uipath-2.1.88 → uipath-2.1.89}/testcases/basic-testcase/src/assert.py +0 -0
  295. {uipath-2.1.88 → uipath-2.1.89}/testcases/common/validate_output.sh +0 -0
  296. {uipath-2.1.88 → uipath-2.1.89}/testcases/langchain-cross/agent.mermaid +0 -0
  297. {uipath-2.1.88 → uipath-2.1.89}/testcases/langchain-cross/langgraph.json +0 -0
  298. {uipath-2.1.88 → uipath-2.1.89}/testcases/langchain-cross/pyproject.toml +0 -0
  299. {uipath-2.1.88 → uipath-2.1.89}/testcases/langchain-cross/run.sh +0 -0
  300. {uipath-2.1.88 → uipath-2.1.89}/testcases/langchain-cross/src/assert.py +0 -0
  301. {uipath-2.1.88 → uipath-2.1.89}/testcases/langchain-cross/src/main.py +0 -0
  302. {uipath-2.1.88 → uipath-2.1.89}/testcases/llamaindex-cross/agent.mermaid +0 -0
  303. {uipath-2.1.88 → uipath-2.1.89}/testcases/llamaindex-cross/llama_index.json +0 -0
  304. {uipath-2.1.88 → uipath-2.1.89}/testcases/llamaindex-cross/pyproject.toml +0 -0
  305. {uipath-2.1.88 → uipath-2.1.89}/testcases/llamaindex-cross/run.sh +0 -0
  306. {uipath-2.1.88 → uipath-2.1.89}/testcases/llamaindex-cross/src/assert.py +0 -0
  307. {uipath-2.1.88 → uipath-2.1.89}/testcases/llamaindex-cross/src/main.py +0 -0
  308. {uipath-2.1.88 → uipath-2.1.89}/tests/__init__.py +0 -0
  309. {uipath-2.1.88 → uipath-2.1.89}/tests/agent/models/test_agent.py +0 -0
  310. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/conftest.py +0 -0
  311. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  312. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/mocks/bindings_script.py +0 -0
  313. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/mocks/pyproject.toml +0 -0
  314. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/mocks/simple_script.py +0 -0
  315. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/mocks/uipath-mock.json +0 -0
  316. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  317. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_auth.py +0 -0
  318. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_hitl.py +0 -0
  319. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_init.py +0 -0
  320. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_init_agents_md.py +0 -0
  321. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_input_args.py +0 -0
  322. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_invoke.py +0 -0
  323. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_new.py +0 -0
  324. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_oidc_utils.py +0 -0
  325. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_pack.py +0 -0
  326. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  327. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_portal_service_refresh_token.py +0 -0
  328. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_publish.py +0 -0
  329. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_run.py +0 -0
  330. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/test_utils.py +0 -0
  331. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/utils/common.py +0 -0
  332. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/utils/project_details.py +0 -0
  333. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/utils/test_dynamic_schema.py +0 -0
  334. {uipath-2.1.88 → uipath-2.1.89}/tests/cli/utils/uipath_json.py +0 -0
  335. {uipath-2.1.88 → uipath-2.1.89}/tests/conftest.py +0 -0
  336. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/conftest.py +0 -0
  337. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_actions_service.py +0 -0
  338. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_api_client.py +0 -0
  339. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_assets_service.py +0 -0
  340. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_attachments_service.py +0 -0
  341. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_base_service.py +0 -0
  342. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_buckets_service.py +0 -0
  343. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_connections_service.py +0 -0
  344. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_context_grounding_service.py +0 -0
  345. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_documents_service.py +0 -0
  346. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_entities_service.py +0 -0
  347. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_external_application_service.py +0 -0
  348. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_folder_service.py +0 -0
  349. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_jobs_service.py +0 -0
  350. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_llm_integration.py +0 -0
  351. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  352. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_llm_service.py +0 -0
  353. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_processes_service.py +0 -0
  354. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_queues_service.py +0 -0
  355. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  356. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
  357. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
  358. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
  359. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/test_bindings_inference.py +0 -0
  360. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/test_config.py +0 -0
  361. {uipath-2.1.88 → uipath-2.1.89}/tests/sdk/test_overwrites.py +0 -0
  362. {uipath-2.1.88 → uipath-2.1.89}/tests/tracing/test_otel_exporters.py +0 -0
  363. {uipath-2.1.88 → uipath-2.1.89}/tests/tracing/test_span_utils.py +0 -0
  364. {uipath-2.1.88 → uipath-2.1.89}/tests/tracing/test_traced.py +0 -0
  365. {uipath-2.1.88 → uipath-2.1.89}/tests/tracing/test_tracing_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath
3
- Version: 2.1.88
3
+ Version: 2.1.89
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.88"
3
+ version = "2.1.89"
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"
@@ -44,6 +44,15 @@ class LLMMockingStrategy(BaseMockingStrategy):
44
44
  )
45
45
 
46
46
 
47
+ class InputMockingStrategy(BaseModel):
48
+ prompt: str = Field(..., alias="prompt")
49
+ model: Optional[ModelSettings] = Field(None, alias="model")
50
+
51
+ model_config = ConfigDict(
52
+ validate_by_name=True, validate_by_alias=True, extra="allow"
53
+ )
54
+
55
+
47
56
  class MockingArgument(BaseModel):
48
57
  args: List[Any] = Field(default_factory=lambda: [], alias="args")
49
58
  kwargs: Dict[str, Any] = Field(default_factory=lambda: {}, alias="kwargs")
@@ -110,6 +119,10 @@ class EvaluationItem(BaseModel):
110
119
  default=None,
111
120
  alias="mockingStrategy",
112
121
  )
122
+ input_mocking_strategy: Optional[InputMockingStrategy] = Field(
123
+ default=None,
124
+ alias="inputMockingStrategy",
125
+ )
113
126
 
114
127
 
115
128
  class EvaluationSet(BaseModel):
@@ -11,6 +11,10 @@ from opentelemetry import context as context_api
11
11
  from opentelemetry.sdk.trace import ReadableSpan, Span
12
12
  from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
13
13
 
14
+ from uipath._cli._evals.mocks.input_mocker import (
15
+ generate_llm_input,
16
+ )
17
+
14
18
  from ..._events._event_bus import EventBus
15
19
  from ..._events._events import (
16
20
  EvalItemExceptionDetails,
@@ -318,6 +322,10 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
318
322
  evaluators: List[BaseEvaluator[Any]],
319
323
  event_bus: EventBus,
320
324
  ) -> EvaluationRunResult:
325
+ # Generate LLM-based input if input_mocking_strategy is defined
326
+ if eval_item.input_mocking_strategy:
327
+ eval_item = await self._generate_input_for_eval(eval_item)
328
+
321
329
  set_execution_context(eval_item, self.span_collector)
322
330
 
323
331
  await event_bus.publish(
@@ -417,6 +425,16 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
417
425
 
418
426
  return evaluation_run_results
419
427
 
428
+ async def _generate_input_for_eval(
429
+ self, eval_item: EvaluationItem
430
+ ) -> EvaluationItem:
431
+ """Use LLM to generate a mock input for an evaluation item."""
432
+ # TODO(bai): get the input schema from agent definition, once it is available there.
433
+ input_schema: dict[str, Any] = {}
434
+ generated_input = await generate_llm_input(eval_item, input_schema)
435
+ updated_eval_item = eval_item.model_copy(update={"inputs": generated_input})
436
+ return updated_eval_item
437
+
420
438
  def _get_and_clear_execution_data(
421
439
  self, execution_id: str
422
440
  ) -> tuple[List[ReadableSpan], list[logging.LogRecord]]:
@@ -0,0 +1,111 @@
1
+ """LLM Input Mocker implementation."""
2
+
3
+ import json
4
+ from datetime import datetime
5
+ from typing import Any, Dict
6
+
7
+ from uipath import UiPath
8
+ from uipath._cli._evals._models._evaluation_set import EvaluationItem
9
+ from uipath.tracing._traced import traced
10
+
11
+ from .mocker import UiPathInputMockingError
12
+
13
+
14
+ def get_input_mocking_prompt(
15
+ input_schema: str,
16
+ input_generation_instructions: str,
17
+ expected_behavior: str,
18
+ expected_output: str,
19
+ ) -> str:
20
+ """Generate the LLM input mocking prompt."""
21
+ current_datetime = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
22
+
23
+ return f"""You are simulating input for automated testing purposes of an Agent as part of a simulation run.
24
+ You will need to generate realistic input to a LLM agent which will call various tools to achieve a goal. This must be in the exact format of the INPUT_SCHEMA.
25
+ You may need to follow specific INPUT_GENERATION_INSTRUCTIONS. If no relevant instructions are provided pertaining to input generation, use the other provided information and your own judgement to generate input.
26
+ If the INPUT_GENERATION_INSTRUCTIONS are provided, you MUST follow them exactly. For example if the instructions say to generate a value for a field to be before a certain calendar date, you must generate a value that is before that date.
27
+
28
+ The current date and time is: {current_datetime}
29
+
30
+ #INPUT_SCHEMA: You MUST OUTPUT THIS EXACT JSON SCHEMA
31
+ {input_schema}
32
+ #END_INPUT_SCHEMA
33
+
34
+ #INPUT_GENERATION_INSTRUCTIONS
35
+ {input_generation_instructions}
36
+ #END_INPUT_GENERATION_INSTRUCTIONS
37
+
38
+ #EXPECTED_BEHAVIOR
39
+ {expected_behavior}
40
+ #END_EXPECTED_BEHAVIOR
41
+
42
+ #EXPECTED_OUTPUT
43
+ {expected_output}
44
+ #END_EXPECTED_OUTPUT
45
+
46
+ Based on the above information, provide a realistic input to the LLM agent. Your response should:
47
+ 1. Match the expected input format according to the INPUT_SCHEMA exactly
48
+ 2. Be consistent with the style and level of detail in the example inputs
49
+ 3. Consider the context of the the agent being tested
50
+ 4. Be realistic and representative of what a real user might say or ask
51
+
52
+ OUTPUT: ONLY the simulated agent input in the exact format of the INPUT_SCHEMA in valid JSON. Do not include any explanations, quotation marks, or markdown."""
53
+
54
+
55
+ @traced(name="__mocker__")
56
+ async def generate_llm_input(
57
+ evaluation_item: EvaluationItem,
58
+ input_schema: Dict[str, Any],
59
+ ) -> Dict[str, Any]:
60
+ """Generate synthetic input using an LLM based on the evaluation context."""
61
+ try:
62
+ llm = UiPath().llm
63
+
64
+ prompt = get_input_mocking_prompt(
65
+ input_schema=json.dumps(input_schema, indent=2),
66
+ input_generation_instructions=evaluation_item.input_mocking_strategy.prompt
67
+ if evaluation_item.input_mocking_strategy
68
+ else "",
69
+ expected_behavior=evaluation_item.expected_agent_behavior or "",
70
+ expected_output=json.dumps(evaluation_item.expected_output, indent=2)
71
+ if evaluation_item.expected_output
72
+ else "",
73
+ )
74
+
75
+ response_format = {
76
+ "type": "json_schema",
77
+ "json_schema": {
78
+ "name": "agent_input",
79
+ "strict": True,
80
+ "schema": input_schema,
81
+ },
82
+ }
83
+
84
+ model_parameters = (
85
+ evaluation_item.input_mocking_strategy.model
86
+ if evaluation_item.input_mocking_strategy
87
+ else None
88
+ )
89
+ completion_kwargs = (
90
+ model_parameters.model_dump(by_alias=False, exclude_none=True)
91
+ if model_parameters
92
+ else {}
93
+ )
94
+
95
+ response = await llm.chat_completions(
96
+ [{"role": "user", "content": prompt}],
97
+ response_format=response_format,
98
+ **completion_kwargs,
99
+ )
100
+
101
+ generated_input_str = response.choices[0].message.content
102
+
103
+ return json.loads(generated_input_str)
104
+ except json.JSONDecodeError as e:
105
+ raise UiPathInputMockingError(
106
+ f"Failed to parse LLM response as JSON: {str(e)}"
107
+ ) from e
108
+ except UiPathInputMockingError:
109
+ raise
110
+ except Exception as e:
111
+ raise UiPathInputMockingError(f"Failed to generate input: {str(e)}") from e
@@ -33,3 +33,9 @@ class UiPathMockResponseGenerationError(Exception):
33
33
  """Exception when a mocker is configured unable to generate a response."""
34
34
 
35
35
  pass
36
+
37
+
38
+ class UiPathInputMockingError(Exception):
39
+ """Exception when input mocking fails."""
40
+
41
+ pass
@@ -1,14 +1,12 @@
1
1
  """Studio Web File Handler for managing file operations in UiPath projects."""
2
2
 
3
3
  import json
4
+ import logging
4
5
  import os
5
6
  from datetime import datetime, timezone
6
7
  from typing import Any, Dict, Optional, Set
7
8
 
8
- import click
9
-
10
9
  from ...models.exceptions import EnrichedException
11
- from .._utils._console import ConsoleLogger
12
10
  from .._utils._constants import (
13
11
  AGENT_INITIAL_CODE_VERSION,
14
12
  AGENT_STORAGE_VERSION,
@@ -30,6 +28,8 @@ from .._utils._studio_project import (
30
28
  StudioClient,
31
29
  )
32
30
 
31
+ logger = logging.getLogger(__name__)
32
+
33
33
 
34
34
  class SwFileHandler:
35
35
  """Handler for Studio Web file operations.
@@ -58,7 +58,6 @@ class SwFileHandler:
58
58
  """
59
59
  self.directory = directory
60
60
  self.include_uv_lock = include_uv_lock
61
- self.console = ConsoleLogger()
62
61
  self._studio_client = StudioClient(project_id)
63
62
  self._project_structure: Optional[ProjectStructure] = None
64
63
 
@@ -156,9 +155,7 @@ class SwFileHandler:
156
155
 
157
156
  for local_file in local_files:
158
157
  if not os.path.exists(local_file.file_path):
159
- self.console.warning(
160
- f"File not found: {click.style(local_file.file_path, fg='cyan')}"
161
- )
158
+ logger.info(f"File not found: '{local_file.file_path}'")
162
159
  continue
163
160
 
164
161
  # Skip agent.json as it's handled separately
@@ -175,9 +172,7 @@ class SwFileHandler:
175
172
  id=remote_file.id, content_file_path=local_file.file_path
176
173
  )
177
174
  )
178
- self.console.info(
179
- f"Updating {click.style(local_file.file_name, fg='yellow')}"
180
- )
175
+ logger.info(f"Updating '{local_file.file_name}'")
181
176
  else:
182
177
  parent_path = os.path.dirname(local_file.relative_path)
183
178
  structural_migration.added_resources.append(
@@ -188,9 +183,7 @@ class SwFileHandler:
188
183
  else "source_code",
189
184
  )
190
185
  )
191
- self.console.info(
192
- f"Uploading {click.style(local_file.relative_path, fg='cyan')}"
193
- )
186
+ logger.info(f"Uploading '{local_file.relative_path}'")
194
187
 
195
188
  # identify and add deleted files
196
189
  structural_migration.deleted_resources.extend(
@@ -236,9 +229,7 @@ class SwFileHandler:
236
229
  for _, remote_file in source_code_files.items():
237
230
  if remote_file.id not in processed_source_file_paths:
238
231
  deleted_files.add(remote_file.id)
239
- self.console.info(
240
- f"Deleting {click.style(remote_file.name, fg='bright_red')}"
241
- )
232
+ logger.info(f"Deleting '{remote_file.name}'")
242
233
 
243
234
  return deleted_files
244
235
 
@@ -263,16 +254,14 @@ class SwFileHandler:
263
254
  for folder_info in empty_folder_ids:
264
255
  try:
265
256
  await self._studio_client.delete_item_async(folder_info["id"])
266
- self.console.info(
267
- f"Deleted empty folder {click.style(folder_info['name'], fg='bright_red')}"
268
- )
257
+ logger.info(f"Deleted empty folder '{folder_info['name']}'")
269
258
  except Exception as e:
270
- self.console.warning(
271
- f"Failed to delete empty folder {folder_info['name']}: {str(e)}"
259
+ logger.warning(
260
+ f"Failed to delete empty folder '{folder_info['name']}': {str(e)}"
272
261
  )
273
262
 
274
263
  except Exception as e:
275
- self.console.warning(f"Failed to cleanup empty folders: {str(e)}")
264
+ logger.warning(f"Failed to cleanup empty folders: {str(e)}")
276
265
 
277
266
  def _collect_empty_folders(self, folder: ProjectFolder) -> list[dict[str, str]]:
278
267
  """Recursively collect IDs and names of empty folders.
@@ -335,8 +324,8 @@ class SwFileHandler:
335
324
  entry_points_json["entryPoints"] = uipath_config["entryPoints"]
336
325
 
337
326
  except Exception:
338
- self.console.warning(
339
- "Could not parse existing entry-points.json file, using default version"
327
+ logger.info(
328
+ "Could not parse existing 'entry-points.json' file, using default version"
340
329
  )
341
330
  structural_migration.modified_resources.append(
342
331
  ModifiedResource(
@@ -344,12 +333,10 @@ class SwFileHandler:
344
333
  content_string=json.dumps(entry_points_json),
345
334
  )
346
335
  )
347
- self.console.info(
348
- f"Updating {click.style('entry-points.json', fg='yellow')}"
349
- )
336
+ logger.info("Updating 'entry-points.json'")
350
337
 
351
338
  else:
352
- self.console.warning(
339
+ logger.info(
353
340
  "'entry-points.json' file does not exist in Studio Web project, initializing using default version"
354
341
  )
355
342
  entry_points_json = {
@@ -363,9 +350,7 @@ class SwFileHandler:
363
350
  content_string=json.dumps(entry_points_json),
364
351
  )
365
352
  )
366
- self.console.info(
367
- f"Uploading {click.style('entry-points.json', fg='cyan')}"
368
- )
353
+ logger.info("Uploading 'entry-points.json'")
369
354
 
370
355
  async def _prepare_agent_json_migration(
371
356
  self,
@@ -400,9 +385,10 @@ class SwFileHandler:
400
385
  input_schema = uipath_config["entryPoints"][0]["input"]
401
386
  output_schema = uipath_config["entryPoints"][0]["output"]
402
387
  except (FileNotFoundError, KeyError) as e:
403
- self.console.error(
388
+ logger.error(
404
389
  f"Unable to extract entrypoints from configuration file. Please run 'uipath init' : {str(e)}",
405
390
  )
391
+ return
406
392
 
407
393
  author = get_author_from_token_or_toml()
408
394
 
@@ -444,8 +430,8 @@ class SwFileHandler:
444
430
  AGENT_INITIAL_CODE_VERSION[:-1] + "1"
445
431
  )
446
432
  except Exception:
447
- self.console.warning(
448
- "Could not parse existing agent.json file, using default version"
433
+ logger.info(
434
+ "Could not parse existing 'agent.json' file, using default version"
449
435
  )
450
436
 
451
437
  structural_migration.modified_resources.append(
@@ -454,9 +440,9 @@ class SwFileHandler:
454
440
  content_string=json.dumps(agent_json),
455
441
  )
456
442
  )
457
- self.console.info(f"Updating {click.style('agent.json', fg='yellow')}")
443
+ logger.info("Updating 'agent.json'")
458
444
  else:
459
- self.console.warning(
445
+ logger.info(
460
446
  "'agent.json' file does not exist in Studio Web project, initializing using default version"
461
447
  )
462
448
  structural_migration.added_resources.append(
@@ -465,7 +451,7 @@ class SwFileHandler:
465
451
  content_string=json.dumps(agent_json),
466
452
  )
467
453
  )
468
- self.console.info(f"Uploading {click.style('agent.json', fg='cyan')}")
454
+ logger.info("Uploading 'agent.json'")
469
455
 
470
456
  async def upload_source_files(self, config_data: dict[str, Any]) -> None:
471
457
  """Main method to upload source files to the UiPath project.
@@ -502,9 +488,7 @@ class SwFileHandler:
502
488
  if not source_code_folder:
503
489
  await self._studio_client.create_folder_async("source_code")
504
490
 
505
- self.console.success(
506
- f"Created {click.style('source_code', fg='cyan')} folder"
507
- )
491
+ logger.info("Created 'source_code' folder.")
508
492
  source_code_files = {}
509
493
 
510
494
  # Get files to upload and process them
@@ -266,6 +266,10 @@ class LogsInterceptor:
266
266
  def writable(self) -> bool:
267
267
  return True
268
268
 
269
+ def __getattr__(self, name):
270
+ # Delegate any unknown attributes to the original file
271
+ return getattr(self.sys_file, name)
272
+
269
273
  # Set up stdout and stderr loggers
270
274
  stdout_logger = logging.getLogger("stdout")
271
275
  stderr_logger = logging.getLogger("stderr")
@@ -1,12 +1,12 @@
1
1
  # type: ignore
2
2
  import hashlib
3
3
  import json
4
+ import logging
4
5
  import os
5
6
  import re
6
7
  from pathlib import Path
7
- from typing import Any, Dict, Optional, Tuple
8
+ from typing import Any, Dict, Optional, Protocol, Tuple
8
9
 
9
- import click
10
10
  from pydantic import BaseModel
11
11
 
12
12
  from .._utils._console import ConsoleLogger
@@ -22,6 +22,35 @@ try:
22
22
  import tomllib
23
23
  except ImportError:
24
24
  import tomli as tomllib
25
+ logger = logging.getLogger(__name__)
26
+
27
+
28
+ class FileConflictHandler(Protocol):
29
+ """Protocol for handling file conflicts."""
30
+
31
+ def should_overwrite(
32
+ self, file_path: str, local_hash: str, remote_hash: str
33
+ ) -> bool:
34
+ """Return True to overwrite, False to skip."""
35
+ ...
36
+
37
+
38
+ class AlwaysOverwriteHandler:
39
+ """Handler that always overwrites files."""
40
+
41
+ def should_overwrite(
42
+ self, file_path: str, local_hash: str, remote_hash: str
43
+ ) -> bool:
44
+ return True
45
+
46
+
47
+ class AlwaysSkipHandler:
48
+ """Handler that always skips conflicts."""
49
+
50
+ def should_overwrite(
51
+ self, file_path: str, local_hash: str, remote_hash: str
52
+ ) -> bool:
53
+ return False
25
54
 
26
55
 
27
56
  class FileInfo(BaseModel):
@@ -483,10 +512,37 @@ def collect_files_from_folder(
483
512
  collect_files_from_folder(subfolder, subfolder_path, files_dict)
484
513
 
485
514
 
515
+ async def pull_project(
516
+ project_id: str,
517
+ download_configuration: dict[str, Path],
518
+ conflict_handler: Optional[FileConflictHandler] = None,
519
+ ):
520
+ """Pull project with configurable conflict handling."""
521
+ if conflict_handler is None:
522
+ conflict_handler = AlwaysOverwriteHandler()
523
+
524
+ studio_client = StudioClient(project_id)
525
+
526
+ try:
527
+ structure = await studio_client.get_project_structure_async()
528
+ for source_key, destination in download_configuration.items():
529
+ source_folder = get_folder_by_name(structure, source_key)
530
+ if source_folder:
531
+ await download_folder_files(
532
+ studio_client, source_folder, destination, conflict_handler
533
+ )
534
+ else:
535
+ logger.warning(f"No '{source_key}' folder found in remote project")
536
+ except Exception:
537
+ logger.exception("Failed to pull UiPath project")
538
+ raise
539
+
540
+
486
541
  async def download_folder_files(
487
542
  studio_client: StudioClient,
488
543
  folder: ProjectFolder,
489
544
  base_path: Path,
545
+ conflict_handler: FileConflictHandler,
490
546
  ) -> None:
491
547
  """Download files from a folder recursively.
492
548
 
@@ -494,62 +550,36 @@ async def download_folder_files(
494
550
  studio_client: Studio client
495
551
  folder: The folder to download files from
496
552
  base_path: Base path for local file storage
553
+ conflict_handler: Handler for file conflicts
497
554
  """
498
555
  files_dict: Dict[str, ProjectFile] = {}
499
556
  collect_files_from_folder(folder, "", files_dict)
557
+
500
558
  for file_path, remote_file in files_dict.items():
501
559
  local_path = base_path / file_path
502
560
  local_path.parent.mkdir(parents=True, exist_ok=True)
503
561
 
504
- # Download remote file
505
562
  response = await studio_client.download_file_async(remote_file.id)
506
563
  remote_content = response.read().decode("utf-8")
507
564
  remote_hash = compute_normalized_hash(remote_content)
508
565
 
509
566
  if os.path.exists(local_path):
510
- # Read and hash local file
511
567
  with open(local_path, "r", encoding="utf-8") as f:
512
568
  local_content = f.read()
513
569
  local_hash = compute_normalized_hash(local_content)
514
570
 
515
- # Compare hashes
516
571
  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":
572
+ if conflict_handler.should_overwrite(
573
+ file_path, local_hash, remote_hash
574
+ ):
521
575
  with open(local_path, "w", encoding="utf-8", newline="\n") as f:
522
576
  f.write(remote_content)
523
- console.success(f"Updated {click.style(str(file_path), fg='cyan')}")
577
+ logger.info(f"Updated '{file_path}'")
524
578
  else:
525
- console.info(f"Skipped {click.style(str(file_path), fg='cyan')}")
579
+ logger.info(f"Skipped '{file_path}'")
526
580
  else:
527
- console.info(
528
- f"File {click.style(str(file_path), fg='cyan')} is up to date"
529
- )
581
+ logger.info(f"File '{file_path}' is up to date")
530
582
  else:
531
- # File doesn't exist locally, create it
532
583
  with open(local_path, "w", encoding="utf-8", newline="\n") as f:
533
584
  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)}")
585
+ logger.info(f"Downloaded '{file_path}'")
@@ -24,6 +24,20 @@ from ._utils._project_files import pull_project
24
24
  console = ConsoleLogger()
25
25
 
26
26
 
27
+ class InteractiveConflictHandler:
28
+ """Handler that prompts user for each conflict."""
29
+
30
+ def __init__(self, console: ConsoleLogger):
31
+ self.console = console
32
+
33
+ def should_overwrite(
34
+ self, file_path: str, local_hash: str, remote_hash: str
35
+ ) -> bool:
36
+ self.console.warning(f" File {file_path} differs from remote version.")
37
+ response = click.confirm("Do you want to overwrite it?", default=False)
38
+ return response
39
+
40
+
27
41
  @click.command()
28
42
  @click.argument(
29
43
  "root",
@@ -56,4 +70,11 @@ def pull(root: Path) -> None:
56
70
  "source_code": root,
57
71
  "evals": root / "evals",
58
72
  }
59
- asyncio.run(pull_project(project_id, default_download_configuration))
73
+ with console.spinner("Pulling UiPath project files..."):
74
+ asyncio.run(
75
+ pull_project(
76
+ project_id,
77
+ default_download_configuration,
78
+ InteractiveConflictHandler(console),
79
+ )
80
+ )
@@ -4,7 +4,10 @@ from pathlib import PurePath
4
4
  from httpx import Response
5
5
  from pydantic import TypeAdapter
6
6
 
7
- from uipath._cli._evals._models._evaluation_set import LLMMockingStrategy
7
+ from uipath._cli._evals._models._evaluation_set import (
8
+ InputMockingStrategy,
9
+ LLMMockingStrategy,
10
+ )
8
11
  from uipath._cli._push.sw_file_handler import SwFileHandler
9
12
  from uipath._cli._utils._studio_project import (
10
13
  ProjectFile,
@@ -137,4 +140,14 @@ async def load_agent_definition(project_id: str) -> AgentDefinition:
137
140
  evaluation.mocking_strategy = LLMMockingStrategy(
138
141
  prompt=prompt, tools_to_simulate=tools_to_simulate
139
142
  )
143
+
144
+ if not evaluation.input_mocking_strategy:
145
+ # Migrate lowCode input mocking fields
146
+ if evaluation.model_extra.get("simulateInput", False):
147
+ prompt = evaluation.model_extra.get(
148
+ "inputGenerationInstructions",
149
+ )
150
+ evaluation.input_mocking_strategy = InputMockingStrategy(
151
+ prompt=prompt
152
+ )
140
153
  return agent_definition
@@ -0,0 +1,17 @@
1
+ """LowCode Agent Loop Constructs.
2
+
3
+ This module includes agentic loop constructs specific to LowCode Agent
4
+ such as prompts, tools
5
+ """
6
+
7
+ from uipath.agent.loop.prompts import AGENT_SYSTEM_PROMPT_TEMPLATE
8
+ from uipath.agent.loop.tools import (
9
+ EndExecutionToolSchemaModel,
10
+ RaiseErrorToolSchemaModel,
11
+ )
12
+
13
+ __all__ = [
14
+ "AGENT_SYSTEM_PROMPT_TEMPLATE",
15
+ "EndExecutionToolSchemaModel",
16
+ "RaiseErrorToolSchemaModel",
17
+ ]