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