uipath 2.1.54__tar.gz → 2.1.56__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.56/.github/workflows/integration_tests.yml +72 -0
- {uipath-2.1.54 → uipath-2.1.56}/.github/workflows/test.yml +1 -1
- {uipath-2.1.54 → uipath-2.1.56}/PKG-INFO +1 -1
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/getting_started.md +6 -2
- {uipath-2.1.54 → uipath-2.1.56}/pyproject.toml +3 -3
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_runtime/_contracts.py +1 -3
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_eval.py +3 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_run.py +4 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/tracing/_traced.py +130 -134
- uipath-2.1.56/testcases/apicalls-testcase/main.py +47 -0
- uipath-2.1.56/testcases/apicalls-testcase/pyproject.toml +12 -0
- uipath-2.1.56/testcases/apicalls-testcase/run.sh +16 -0
- uipath-2.1.56/testcases/apicalls-testcase/src/assert.py +32 -0
- uipath-2.1.56/testcases/basic-testcase/main.py +31 -0
- uipath-2.1.56/testcases/basic-testcase/pyproject.toml +12 -0
- uipath-2.1.56/testcases/basic-testcase/run.sh +15 -0
- uipath-2.1.56/testcases/basic-testcase/src/assert.py +32 -0
- uipath-2.1.56/testcases/common/validate_output.sh +35 -0
- uipath-2.1.56/testcases/langchain-cross/agent.mermaid +14 -0
- uipath-2.1.56/testcases/langchain-cross/langgraph.json +7 -0
- uipath-2.1.56/testcases/langchain-cross/pyproject.toml +13 -0
- uipath-2.1.56/testcases/langchain-cross/run.sh +15 -0
- uipath-2.1.56/testcases/langchain-cross/src/assert.py +45 -0
- uipath-2.1.56/testcases/langchain-cross/src/main.py +22 -0
- uipath-2.1.56/testcases/llamaindex-cross/agent.mermaid +17 -0
- uipath-2.1.56/testcases/llamaindex-cross/llama_index.json +7 -0
- uipath-2.1.56/testcases/llamaindex-cross/pyproject.toml +13 -0
- uipath-2.1.56/testcases/llamaindex-cross/run.sh +15 -0
- uipath-2.1.56/testcases/llamaindex-cross/src/assert.py +47 -0
- uipath-2.1.56/testcases/llamaindex-cross/src/main.py +38 -0
- {uipath-2.1.54 → uipath-2.1.56}/uv.lock +1 -1
- {uipath-2.1.54 → uipath-2.1.56}/.cursorrules +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.editorconfig +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.gitattributes +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.gitignore +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.python-version +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.vscode/extensions.json +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.vscode/launch.json +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/.vscode/settings.json +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/CONTRIBUTING.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/LICENSE +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/README.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/FAQ.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/assets/favicon.png +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/cli/index.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/actions.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/assets.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/attachments.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/buckets.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/connections.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/jobs.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/processes.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/queues.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/core/traced.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/hooks.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/index.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/overrides/main.html +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/release_policy.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/justfile +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/mkdocs.yml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/py.typed +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/calculator/README.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/calculator/main.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/scripts/debug_test.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/_auth_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_evals/_runtime.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_config.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/job.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/py.typed +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/__init__.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/conftest.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_init.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_new.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_push.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_run.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/conftest.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.54 → uipath-2.1.56}/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.56
|
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.56"
|
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
|
@@ -24,7 +24,7 @@ from opentelemetry.trace import Tracer
|
|
24
24
|
from pydantic import BaseModel, Field
|
25
25
|
|
26
26
|
from uipath.agent.conversation import UiPathConversationEvent, UiPathConversationMessage
|
27
|
-
from uipath.tracing import
|
27
|
+
from uipath.tracing import TracingManager
|
28
28
|
|
29
29
|
from ._logging import LogsInterceptor
|
30
30
|
|
@@ -698,8 +698,6 @@ class UiPathRuntimeFactory(Generic[T, C]):
|
|
698
698
|
self.tracer_provider: TracerProvider = TracerProvider()
|
699
699
|
self.tracer_span_processors: List[SpanProcessor] = []
|
700
700
|
trace.set_tracer_provider(self.tracer_provider)
|
701
|
-
if os.getenv("UIPATH_JOB_KEY"):
|
702
|
-
self.add_span_exporter(LlmOpsHttpExporter())
|
703
701
|
|
704
702
|
def add_span_exporter(
|
705
703
|
self,
|
@@ -14,6 +14,7 @@ from uipath._cli._runtime._contracts import (
|
|
14
14
|
from uipath._cli._runtime._runtime import UiPathScriptRuntime
|
15
15
|
from uipath._cli.middlewares import Middlewares
|
16
16
|
from uipath.eval._helpers import auto_discover_entrypoint
|
17
|
+
from uipath.tracing import LlmOpsHttpExporter
|
17
18
|
|
18
19
|
from .._utils.constants import ENV_JOB_ID
|
19
20
|
from ..telemetry import track
|
@@ -108,6 +109,8 @@ def eval(
|
|
108
109
|
UiPathRuntimeContext,
|
109
110
|
context_generator=generate_runtime_context,
|
110
111
|
)
|
112
|
+
if not no_report or eval_context.job_id:
|
113
|
+
runtime_factory.add_span_exporter(LlmOpsHttpExporter())
|
111
114
|
|
112
115
|
async def execute():
|
113
116
|
async with UiPathEvalRuntime.from_eval_context(
|
@@ -7,6 +7,7 @@ from typing import Optional
|
|
7
7
|
import click
|
8
8
|
|
9
9
|
from uipath._cli._utils._debug import setup_debugging
|
10
|
+
from uipath.tracing import LlmOpsHttpExporter
|
10
11
|
|
11
12
|
from .._utils.constants import (
|
12
13
|
ENV_JOB_ID,
|
@@ -102,6 +103,7 @@ def run(
|
|
102
103
|
runtime_factory = UiPathRuntimeFactory(
|
103
104
|
UiPathScriptRuntime, UiPathRuntimeContext
|
104
105
|
)
|
106
|
+
|
105
107
|
context = UiPathRuntimeContext.with_defaults(
|
106
108
|
entrypoint=entrypoint,
|
107
109
|
input=input,
|
@@ -110,6 +112,8 @@ def run(
|
|
110
112
|
execution_output_file=output_file,
|
111
113
|
debug=debug,
|
112
114
|
)
|
115
|
+
if context.job_id:
|
116
|
+
runtime_factory.add_span_exporter(LlmOpsHttpExporter())
|
113
117
|
|
114
118
|
asyncio.run(runtime_factory.execute(context))
|
115
119
|
|
@@ -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" }'
|