uipath 2.1.57__tar.gz → 2.1.58__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.57 → uipath-2.1.58}/PKG-INFO +1 -1
- {uipath-2.1.57 → uipath-2.1.58}/pyproject.toml +1 -1
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/tracing/_traced.py +24 -8
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/tracing/_utils.py +54 -13
- {uipath-2.1.57 → uipath-2.1.58}/tests/tracing/test_traced.py +105 -27
- {uipath-2.1.57 → uipath-2.1.58}/uv.lock +1 -1
- {uipath-2.1.57 → uipath-2.1.58}/.cursorrules +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.editorconfig +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.gitattributes +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/integration_tests.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.github/workflows/test.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.gitignore +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.python-version +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.vscode/extensions.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.vscode/launch.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/.vscode/settings.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/CONTRIBUTING.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/LICENSE +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/README.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/FAQ.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/assets/favicon.png +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/cli/index.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/actions.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/assets.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/attachments.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/buckets.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/connections.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/getting_started.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/jobs.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/processes.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/queues.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/core/traced.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/hooks.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/index.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/overrides/main.html +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/release_policy.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/justfile +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/mkdocs.yml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/py.typed +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/calculator/README.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/calculator/main.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/scripts/debug_test.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/_auth_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_evals/_runtime.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_config.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/_utils.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/agent/models/agent.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/job.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/py.typed +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/apicalls-testcase/main.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/apicalls-testcase/pyproject.toml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/apicalls-testcase/run.sh +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/apicalls-testcase/src/assert.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/basic-testcase/main.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/basic-testcase/pyproject.toml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/basic-testcase/run.sh +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/basic-testcase/src/assert.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/common/validate_output.sh +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/langchain-cross/agent.mermaid +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/langchain-cross/langgraph.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/langchain-cross/pyproject.toml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/langchain-cross/run.sh +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/langchain-cross/src/assert.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/langchain-cross/src/main.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/llamaindex-cross/agent.mermaid +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/llamaindex-cross/llama_index.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/llamaindex-cross/pyproject.toml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/llamaindex-cross/run.sh +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/llamaindex-cross/src/assert.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/testcases/llamaindex-cross/src/main.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/__init__.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/agent/models/test_agent.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/conftest.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_init.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_new.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_push.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_run.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/conftest.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.57 → uipath-2.1.58}/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.
|
3
|
+
Version: 2.1.58
|
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.
|
3
|
+
version = "2.1.58"
|
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"
|
@@ -215,11 +215,15 @@ def _opentelemetry_traced(
|
|
215
215
|
if input_processor:
|
216
216
|
processed_inputs = input_processor(json.loads(inputs))
|
217
217
|
inputs = json.dumps(processed_inputs, default=str)
|
218
|
-
span.set_attribute("
|
218
|
+
span.set_attribute("input.mime_type", "application/json")
|
219
|
+
span.set_attribute("input.value", inputs)
|
219
220
|
|
220
221
|
result = func(*args, **kwargs)
|
221
222
|
output = output_processor(result) if output_processor else result
|
222
|
-
span.set_attribute(
|
223
|
+
span.set_attribute(
|
224
|
+
"output.value", _SpanUtils.format_object_for_trace_json(output)
|
225
|
+
)
|
226
|
+
span.set_attribute("output.mime_type", "application/json")
|
223
227
|
return result
|
224
228
|
except Exception as e:
|
225
229
|
span.record_exception(e)
|
@@ -249,11 +253,15 @@ def _opentelemetry_traced(
|
|
249
253
|
if input_processor:
|
250
254
|
processed_inputs = input_processor(json.loads(inputs))
|
251
255
|
inputs = json.dumps(processed_inputs, default=str)
|
252
|
-
span.set_attribute("
|
256
|
+
span.set_attribute("input.mime_type", "application/json")
|
257
|
+
span.set_attribute("input.value", inputs)
|
253
258
|
|
254
259
|
result = await func(*args, **kwargs)
|
255
260
|
output = output_processor(result) if output_processor else result
|
256
|
-
span.set_attribute(
|
261
|
+
span.set_attribute(
|
262
|
+
"output.value", _SpanUtils.format_object_for_trace_json(output)
|
263
|
+
)
|
264
|
+
span.set_attribute("output.mime_type", "application/json")
|
257
265
|
return result
|
258
266
|
except Exception as e:
|
259
267
|
span.record_exception(e)
|
@@ -285,7 +293,8 @@ def _opentelemetry_traced(
|
|
285
293
|
if input_processor:
|
286
294
|
processed_inputs = input_processor(json.loads(inputs))
|
287
295
|
inputs = json.dumps(processed_inputs, default=str)
|
288
|
-
span.set_attribute("
|
296
|
+
span.set_attribute("input.mime_type", "application/json")
|
297
|
+
span.set_attribute("input.value", inputs)
|
289
298
|
|
290
299
|
outputs = []
|
291
300
|
for item in func(*args, **kwargs):
|
@@ -293,7 +302,10 @@ def _opentelemetry_traced(
|
|
293
302
|
span.add_event(f"Yielded: {item}")
|
294
303
|
yield item
|
295
304
|
output = output_processor(outputs) if output_processor else outputs
|
296
|
-
span.set_attribute(
|
305
|
+
span.set_attribute(
|
306
|
+
"output.value", _SpanUtils.format_object_for_trace_json(output)
|
307
|
+
)
|
308
|
+
span.set_attribute("output.mime_type", "application/json")
|
297
309
|
except Exception as e:
|
298
310
|
span.record_exception(e)
|
299
311
|
span.set_status(
|
@@ -324,7 +336,8 @@ def _opentelemetry_traced(
|
|
324
336
|
if input_processor:
|
325
337
|
processed_inputs = input_processor(json.loads(inputs))
|
326
338
|
inputs = json.dumps(processed_inputs, default=str)
|
327
|
-
span.set_attribute("
|
339
|
+
span.set_attribute("input.mime_type", "application/json")
|
340
|
+
span.set_attribute("input.value", inputs)
|
328
341
|
|
329
342
|
outputs = []
|
330
343
|
async for item in func(*args, **kwargs):
|
@@ -332,7 +345,10 @@ def _opentelemetry_traced(
|
|
332
345
|
span.add_event(f"Yielded: {item}")
|
333
346
|
yield item
|
334
347
|
output = output_processor(outputs) if output_processor else outputs
|
335
|
-
span.set_attribute(
|
348
|
+
span.set_attribute(
|
349
|
+
"output.value", _SpanUtils.format_object_for_trace_json(output)
|
350
|
+
)
|
351
|
+
span.set_attribute("output.mime_type", "application/json")
|
336
352
|
except Exception as e:
|
337
353
|
span.record_exception(e)
|
338
354
|
span.set_status(
|
@@ -4,10 +4,12 @@ import logging
|
|
4
4
|
import os
|
5
5
|
import random
|
6
6
|
import uuid
|
7
|
-
from dataclasses import dataclass, field
|
8
|
-
from datetime import datetime
|
7
|
+
from dataclasses import asdict, dataclass, field, is_dataclass
|
8
|
+
from datetime import datetime, timezone
|
9
|
+
from enum import Enum
|
9
10
|
from os import environ as env
|
10
11
|
from typing import Any, Dict, Optional
|
12
|
+
from zoneinfo import ZoneInfo
|
11
13
|
|
12
14
|
from opentelemetry.sdk.trace import ReadableSpan
|
13
15
|
from opentelemetry.trace import StatusCode
|
@@ -15,6 +17,36 @@ from opentelemetry.trace import StatusCode
|
|
15
17
|
logger = logging.getLogger(__name__)
|
16
18
|
|
17
19
|
|
20
|
+
def _simple_serialize_defaults(obj):
|
21
|
+
if hasattr(obj, "model_dump"):
|
22
|
+
return obj.model_dump(exclude_none=True, mode="json")
|
23
|
+
if hasattr(obj, "dict"):
|
24
|
+
return obj.dict()
|
25
|
+
if hasattr(obj, "to_dict"):
|
26
|
+
return obj.to_dict()
|
27
|
+
|
28
|
+
# Handle dataclasses
|
29
|
+
if is_dataclass(obj) and not isinstance(obj, type):
|
30
|
+
return asdict(obj)
|
31
|
+
|
32
|
+
# Handle enums
|
33
|
+
if isinstance(obj, Enum):
|
34
|
+
return obj.value
|
35
|
+
|
36
|
+
if isinstance(obj, (set, tuple)):
|
37
|
+
if hasattr(obj, "_asdict") and callable(obj._asdict):
|
38
|
+
return obj._asdict()
|
39
|
+
return list(obj)
|
40
|
+
|
41
|
+
if isinstance(obj, datetime):
|
42
|
+
return obj.isoformat()
|
43
|
+
|
44
|
+
if isinstance(obj, (timezone, ZoneInfo)):
|
45
|
+
return obj.tzname(None)
|
46
|
+
|
47
|
+
return str(obj)
|
48
|
+
|
49
|
+
|
18
50
|
@dataclass
|
19
51
|
class UiPathSpan:
|
20
52
|
"""Represents a span in the UiPath tracing system."""
|
@@ -150,30 +182,32 @@ class _SpanUtils:
|
|
150
182
|
status = 2 # Error
|
151
183
|
attributes_dict["error"] = otel_span.status.description
|
152
184
|
|
153
|
-
original_inputs = attributes_dict.get("
|
154
|
-
original_outputs = attributes_dict.get("
|
185
|
+
original_inputs = attributes_dict.get("input", None)
|
186
|
+
original_outputs = attributes_dict.get("output", None)
|
155
187
|
|
156
188
|
if original_inputs:
|
157
189
|
try:
|
158
190
|
if isinstance(original_inputs, str):
|
159
191
|
json_inputs = json.loads(original_inputs)
|
160
|
-
attributes_dict["
|
192
|
+
attributes_dict["input.value"] = json_inputs
|
193
|
+
attributes_dict["input.mime_type"] = "application/json"
|
161
194
|
else:
|
162
|
-
attributes_dict["
|
195
|
+
attributes_dict["input.value"] = original_inputs
|
163
196
|
except Exception as e:
|
164
|
-
|
165
|
-
attributes_dict["
|
197
|
+
logger.warning(f"Error parsing inputs: {e}")
|
198
|
+
attributes_dict["input.value"] = str(original_inputs)
|
166
199
|
|
167
200
|
if original_outputs:
|
168
201
|
try:
|
169
202
|
if isinstance(original_outputs, str):
|
170
203
|
json_outputs = json.loads(original_outputs)
|
171
|
-
attributes_dict["
|
204
|
+
attributes_dict["output.value"] = json_outputs
|
205
|
+
attributes_dict["output.mime_type"] = "application/json"
|
172
206
|
else:
|
173
|
-
attributes_dict["
|
207
|
+
attributes_dict["output.value"] = original_outputs
|
174
208
|
except Exception as e:
|
175
|
-
|
176
|
-
attributes_dict["
|
209
|
+
logger.warning(f"Error parsing output: {e}")
|
210
|
+
attributes_dict["output.value"] = str(original_outputs)
|
177
211
|
|
178
212
|
# Add events as additional attributes if they exist
|
179
213
|
if otel_span.events:
|
@@ -233,7 +267,14 @@ class _SpanUtils:
|
|
233
267
|
) -> str:
|
234
268
|
"""Return a JSON string of inputs from the function signature."""
|
235
269
|
result = _SpanUtils.format_args_for_trace(signature, *args, **kwargs)
|
236
|
-
return json.dumps(result, default=
|
270
|
+
return json.dumps(result, default=_simple_serialize_defaults)
|
271
|
+
|
272
|
+
@staticmethod
|
273
|
+
def format_object_for_trace_json(
|
274
|
+
input_object: Any,
|
275
|
+
) -> str:
|
276
|
+
"""Return a JSON string of inputs from the function signature."""
|
277
|
+
return json.dumps(input_object, default=_simple_serialize_defaults)
|
237
278
|
|
238
279
|
@staticmethod
|
239
280
|
def format_args_for_trace(
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import json
|
2
2
|
from asyncio import sleep
|
3
3
|
from dataclasses import asdict, dataclass
|
4
|
+
from enum import Enum
|
4
5
|
from typing import Any, Dict, List, Sequence
|
5
6
|
|
6
7
|
import pytest
|
@@ -70,9 +71,9 @@ def test_traced_sync_function(setup_tracer):
|
|
70
71
|
span = spans[0]
|
71
72
|
assert span.name == "sample_function"
|
72
73
|
assert span.attributes["span_type"] == "function_call_sync"
|
73
|
-
assert "
|
74
|
-
assert "output" in span.attributes
|
75
|
-
assert span.attributes["output"] == "5"
|
74
|
+
assert "input.value" in span.attributes
|
75
|
+
assert "output.value" in span.attributes
|
76
|
+
assert span.attributes["output.value"] == "5"
|
76
77
|
|
77
78
|
|
78
79
|
@pytest.mark.asyncio
|
@@ -95,9 +96,9 @@ async def test_traced_async_function(setup_tracer):
|
|
95
96
|
span = spans[0]
|
96
97
|
assert span.name == "sample_async_function"
|
97
98
|
assert span.attributes["span_type"] == "function_call_async"
|
98
|
-
assert "
|
99
|
-
assert "output" in span.attributes
|
100
|
-
assert span.attributes["output"] == "6"
|
99
|
+
assert "input.value" in span.attributes
|
100
|
+
assert "output.value" in span.attributes
|
101
|
+
assert span.attributes["output.value"] == "6"
|
101
102
|
|
102
103
|
|
103
104
|
def test_traced_generator_function(setup_tracer):
|
@@ -118,9 +119,9 @@ def test_traced_generator_function(setup_tracer):
|
|
118
119
|
span = spans[0]
|
119
120
|
assert span.name == "sample_generator_function"
|
120
121
|
assert span.attributes["span_type"] == "function_call_generator_sync"
|
121
|
-
assert "
|
122
|
-
assert "output" in span.attributes
|
123
|
-
assert span.attributes["output"] == "[0, 1, 2]"
|
122
|
+
assert "input.value" in span.attributes
|
123
|
+
assert "output.value" in span.attributes
|
124
|
+
assert span.attributes["output.value"] == "[0, 1, 2]"
|
124
125
|
|
125
126
|
|
126
127
|
@pytest.mark.asyncio
|
@@ -142,9 +143,9 @@ async def test_traced_async_generator_function(setup_tracer):
|
|
142
143
|
span = spans[0]
|
143
144
|
assert span.name == "sample_async_generator_function"
|
144
145
|
assert span.attributes["span_type"] == "function_call_generator_async"
|
145
|
-
assert "
|
146
|
-
assert "output" in span.attributes
|
147
|
-
assert span.attributes["output"] == "[0, 1, 2]"
|
146
|
+
assert "input.value" in span.attributes
|
147
|
+
assert "output.value" in span.attributes
|
148
|
+
assert span.attributes["output.value"] == "[0, 1, 2]"
|
148
149
|
|
149
150
|
|
150
151
|
def test_traced_with_basic_processors(setup_tracer):
|
@@ -178,13 +179,13 @@ def test_traced_with_basic_processors(setup_tracer):
|
|
178
179
|
span = spans[0]
|
179
180
|
|
180
181
|
# Check that input processor was applied (doubles the inputs)
|
181
|
-
inputs_json = span.attributes["
|
182
|
+
inputs_json = span.attributes["input.value"]
|
182
183
|
inputs = json.loads(inputs_json)
|
183
184
|
assert inputs["x"] == 6 # 3 doubled to 6
|
184
185
|
assert inputs["y"] == 8 # 4 doubled to 8
|
185
186
|
|
186
187
|
# Check that output processor was applied (formatted as string in dict)
|
187
|
-
output_json = span.attributes["output"]
|
188
|
+
output_json = span.attributes["output.value"]
|
188
189
|
output = json.loads(output_json)
|
189
190
|
assert output == {"result": "12"} # Result wrapped in dict with string conversion
|
190
191
|
|
@@ -225,13 +226,13 @@ async def test_traced_async_with_basic_processors(setup_tracer):
|
|
225
226
|
span = spans[0]
|
226
227
|
|
227
228
|
# Check that input processor was applied
|
228
|
-
inputs_json = span.attributes["
|
229
|
+
inputs_json = span.attributes["input.value"]
|
229
230
|
inputs = json.loads(inputs_json)
|
230
231
|
assert inputs["message"] == "hello"
|
231
232
|
assert inputs["context"] == "test" # Added by processor
|
232
233
|
|
233
234
|
# Check that output processor was applied
|
234
|
-
output_json = span.attributes["output"]
|
235
|
+
output_json = span.attributes["output.value"]
|
235
236
|
output = json.loads(output_json)
|
236
237
|
assert output["status"] == "completed"
|
237
238
|
assert output["message"] == "hello"
|
@@ -345,7 +346,7 @@ def test_traced_with_input_processor(setup_tracer):
|
|
345
346
|
assert span.name == "process_payment"
|
346
347
|
|
347
348
|
# Verify inputs were processed
|
348
|
-
inputs_json = span.attributes["
|
349
|
+
inputs_json = span.attributes["input.value"]
|
349
350
|
inputs = json.loads(inputs_json)
|
350
351
|
assert "card_number" in inputs
|
351
352
|
assert inputs["card_number"] == "**** **** **** 1111" # Should be masked
|
@@ -381,7 +382,7 @@ def test_traced_with_output_processor(setup_tracer):
|
|
381
382
|
span = spans[0]
|
382
383
|
|
383
384
|
# Verify output was processed for tracing
|
384
|
-
output_json = span.attributes["output"]
|
385
|
+
output_json = span.attributes["output.value"]
|
385
386
|
output = json.loads(output_json)
|
386
387
|
assert output["user_info"]["name"] == "Anonymous User"
|
387
388
|
assert output["user_info"]["email"] == "anonymous@example.com"
|
@@ -412,7 +413,7 @@ def test_traced_with_dataclass_output(setup_tracer):
|
|
412
413
|
spans = exporter.get_exported_spans()
|
413
414
|
|
414
415
|
# Verify the output was processed for tracing
|
415
|
-
output_json = spans[0].attributes["output"]
|
416
|
+
output_json = spans[0].attributes["output.value"]
|
416
417
|
output = json.loads(output_json)
|
417
418
|
assert "email" in output
|
418
419
|
assert output["email"] == "anonymous@example.com" # Masked in the trace
|
@@ -450,12 +451,12 @@ async def test_traced_async_with_processors(setup_tracer):
|
|
450
451
|
span = spans[0]
|
451
452
|
|
452
453
|
# Verify inputs were processed
|
453
|
-
inputs_json = span.attributes["
|
454
|
+
inputs_json = span.attributes["input.value"]
|
454
455
|
inputs = json.loads(inputs_json)
|
455
456
|
assert inputs["card_number"] == "**** **** **** 4444"
|
456
457
|
|
457
458
|
# Verify outputs were processed
|
458
|
-
output_json = span.attributes["output"]
|
459
|
+
output_json = span.attributes["output.value"]
|
459
460
|
output = json.loads(output_json)
|
460
461
|
assert output["user_info"]["name"] == "Anonymous User"
|
461
462
|
assert output["user_info"]["email"] == "anonymous@example.com"
|
@@ -488,12 +489,12 @@ def test_traced_generator_with_processors(setup_tracer):
|
|
488
489
|
span = spans[0]
|
489
490
|
|
490
491
|
# Verify inputs were processed
|
491
|
-
inputs_json = span.attributes["
|
492
|
+
inputs_json = span.attributes["input.value"]
|
492
493
|
inputs = json.loads(inputs_json)
|
493
494
|
assert inputs["card_number"] == "**** **** **** 1111"
|
494
495
|
|
495
496
|
# Verify outputs were processed
|
496
|
-
output_json = span.attributes["output"]
|
497
|
+
output_json = span.attributes["output.value"]
|
497
498
|
output = json.loads(output_json)
|
498
499
|
assert len(output) == 3
|
499
500
|
for transaction in output:
|
@@ -532,12 +533,12 @@ async def test_traced_async_generator_with_processors(setup_tracer):
|
|
532
533
|
span = spans[0]
|
533
534
|
|
534
535
|
# Verify inputs were processed
|
535
|
-
inputs_json = span.attributes["
|
536
|
+
inputs_json = span.attributes["input.value"]
|
536
537
|
inputs = json.loads(inputs_json)
|
537
538
|
assert inputs["card_number"] == "**** **** **** 4444"
|
538
539
|
|
539
540
|
# Verify outputs were processed
|
540
|
-
output_json = span.attributes["output"]
|
541
|
+
output_json = span.attributes["output.value"]
|
541
542
|
output = json.loads(output_json)
|
542
543
|
assert len(output) == 2
|
543
544
|
for transaction in output:
|
@@ -565,10 +566,87 @@ def test_traced_with_hide_input_outputs(setup_tracer):
|
|
565
566
|
span = spans[0]
|
566
567
|
|
567
568
|
# Verify both inputs and outputs were redacted
|
568
|
-
inputs_json = span.attributes["
|
569
|
+
inputs_json = span.attributes["input.value"]
|
569
570
|
inputs = json.loads(inputs_json)
|
570
571
|
assert inputs == {"redacted": "Input data not logged for privacy/security"}
|
571
572
|
|
572
|
-
output_json = span.attributes["output"]
|
573
|
+
output_json = span.attributes["output.value"]
|
573
574
|
output = json.loads(output_json)
|
574
575
|
assert output == {"redacted": "Output data not logged for privacy/security"}
|
576
|
+
|
577
|
+
|
578
|
+
class Operator(Enum):
|
579
|
+
ADD = "+"
|
580
|
+
SUBTRACT = "-"
|
581
|
+
MULTIPLY = "*"
|
582
|
+
DIVIDE = "/"
|
583
|
+
|
584
|
+
|
585
|
+
@dataclass
|
586
|
+
class CalculatorInput:
|
587
|
+
a: float = 0.0
|
588
|
+
b: float = 0.0
|
589
|
+
operator: Operator = Operator.ADD
|
590
|
+
|
591
|
+
|
592
|
+
@dataclass
|
593
|
+
class CalculatorOutput:
|
594
|
+
result: float = 0.0
|
595
|
+
operator: Operator = Operator.ADD
|
596
|
+
|
597
|
+
|
598
|
+
def test_traced_complex_input_serialization(setup_tracer):
|
599
|
+
"""Test that traced decorator properly serializes complex inputs like dataclasses with enums."""
|
600
|
+
exporter, provider = setup_tracer
|
601
|
+
|
602
|
+
@traced()
|
603
|
+
def test_complex_input(input: CalculatorInput) -> CalculatorOutput:
|
604
|
+
assert isinstance(input.a, float)
|
605
|
+
assert isinstance(input.b, float)
|
606
|
+
assert isinstance(input.operator, Operator)
|
607
|
+
return CalculatorOutput(result=(input.a * input.b), operator=Operator.MULTIPLY)
|
608
|
+
|
609
|
+
# Create a complex input with dataclass and enum
|
610
|
+
calculator_input = CalculatorInput(a=10.5, b=5.2, operator=Operator.MULTIPLY)
|
611
|
+
test_complex_input(calculator_input)
|
612
|
+
|
613
|
+
provider.shutdown() # Ensure spans are flushed
|
614
|
+
spans = exporter.get_exported_spans()
|
615
|
+
|
616
|
+
assert len(spans) == 1
|
617
|
+
span = spans[0]
|
618
|
+
assert span.name == "test_complex_input"
|
619
|
+
assert span.attributes["span_type"] == "function_call_sync"
|
620
|
+
|
621
|
+
# Verify that inputs are properly serialized as JSON
|
622
|
+
assert "input.value" in span.attributes
|
623
|
+
inputs_json = span.attributes["input.value"]
|
624
|
+
inputs = json.loads(inputs_json)
|
625
|
+
|
626
|
+
# Debug: Print the actual inputs structure
|
627
|
+
print(f"Inputs JSON: {inputs_json}")
|
628
|
+
print(f"Parsed inputs: {inputs}")
|
629
|
+
|
630
|
+
# Check that the dataclass is properly serialized
|
631
|
+
assert "input" in inputs
|
632
|
+
input_data = inputs["input"]
|
633
|
+
|
634
|
+
# Verify the dataclass fields are properly serialized
|
635
|
+
assert input_data["a"] == 10.5
|
636
|
+
assert input_data["b"] == 5.2
|
637
|
+
# Verify the enum is serialized as its value
|
638
|
+
assert input_data["operator"] == "*"
|
639
|
+
|
640
|
+
# Verify that outputs are properly serialized as JSON
|
641
|
+
assert "output.value" in span.attributes
|
642
|
+
output_json = span.attributes["output.value"]
|
643
|
+
output = json.loads(output_json)
|
644
|
+
|
645
|
+
# Debug: Print the actual output structure
|
646
|
+
print(f"Output JSON: {output_json}")
|
647
|
+
print(f"Parsed output: {output}")
|
648
|
+
|
649
|
+
# Verify the output dataclass fields are properly serialized
|
650
|
+
assert output["result"] == 54.6 # 10.5 * 5.2 = 54.6
|
651
|
+
# Verify the enum is serialized as its value
|
652
|
+
assert output["operator"] == "*"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|