uipath 2.1.82__tar.gz → 2.1.83__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of uipath might be problematic. Click here for more details.
- {uipath-2.1.82 → uipath-2.1.83}/PKG-INFO +1 -1
- {uipath-2.1.82 → uipath-2.1.83}/pyproject.toml +1 -1
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_runtime.py +38 -6
- uipath-2.1.83/src/uipath/_cli/_evals/_span_collection.py +24 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/llm_mocker.py +16 -2
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocks.py +25 -6
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/telemetry/_track.py +1 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/tracing/_utils.py +52 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/eval/mocks/test_mocks.py +12 -9
- {uipath-2.1.82 → uipath-2.1.83}/uv.lock +1 -1
- {uipath-2.1.82 → uipath-2.1.83}/.cursorrules +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.editorconfig +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.gitattributes +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/labeler.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/auto-label.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/integration_tests.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/test-uipath-langchain.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/test-uipath-llamaindex.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.github/workflows/test.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.gitignore +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.python-version +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.vscode/extensions.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.vscode/launch.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/.vscode/settings.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/CONTRIBUTING.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/LICENSE +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/README.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/FAQ.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/assets/favicon.png +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/assets/llms.txt +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/cli/index.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/actions.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/assets.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/attachments.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/buckets.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/connections.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/documents.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/documents_models.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/getting_started.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/jobs.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/processes.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/queues.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/core/traced.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/hooks.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/index.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/overrides/main.html +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/release_policy.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/justfile +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/mkdocs.yml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/py.typed +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/asset-modifier-agent/.env.example +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/asset-modifier-agent/README.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/asset-modifier-agent/input.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/asset-modifier-agent/main.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/asset-modifier-agent/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/asset-modifier-agent/uv.lock +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/calculator/README.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/calculator/evals/eval-sets/default.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/calculator/evals/evaluators/equality.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/calculator/main.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/scripts/debug_test.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/_auth_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_config.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_events/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_events/_event_bus.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_events/_events.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/documents_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/external_application_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_auth.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/_utils.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/agent/models/agent.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/mocks/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/mocks/mockable.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/auth.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/documents.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/job.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/py.typed +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/apicalls-testcase/main.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/apicalls-testcase/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/apicalls-testcase/run.sh +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/apicalls-testcase/src/assert.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/basic-testcase/main.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/basic-testcase/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/basic-testcase/run.sh +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/basic-testcase/src/assert.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/common/validate_output.sh +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/langchain-cross/agent.mermaid +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/langchain-cross/langgraph.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/langchain-cross/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/langchain-cross/run.sh +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/langchain-cross/src/assert.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/langchain-cross/src/main.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/llamaindex-cross/agent.mermaid +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/llamaindex-cross/llama_index.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/llamaindex-cross/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/llamaindex-cross/run.sh +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/llamaindex-cross/src/assert.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/testcases/llamaindex-cross/src/main.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/__init__.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/agent/models/test_agent.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/conftest.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_init.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_new.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_oidc_utils.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_push.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_run.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/conftest.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_documents_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_external_application_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.82 → uipath-2.1.83}/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.83
|
|
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.83"
|
|
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"
|
|
@@ -7,7 +7,8 @@ from pathlib import Path
|
|
|
7
7
|
from time import time
|
|
8
8
|
from typing import Any, Dict, Generic, List, Optional, Sequence, TypeVar
|
|
9
9
|
|
|
10
|
-
from opentelemetry
|
|
10
|
+
from opentelemetry import context as context_api
|
|
11
|
+
from opentelemetry.sdk.trace import ReadableSpan, Span
|
|
11
12
|
from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
|
|
12
13
|
|
|
13
14
|
from ..._events._event_bus import EventBus
|
|
@@ -24,6 +25,7 @@ from ...eval.models import EvaluationResult
|
|
|
24
25
|
from ...eval.models.models import AgentExecution, EvalItemResult
|
|
25
26
|
from .._runtime._contracts import (
|
|
26
27
|
UiPathBaseRuntime,
|
|
28
|
+
UiPathExecutionBatchTraceProcessor,
|
|
27
29
|
UiPathRuntimeContext,
|
|
28
30
|
UiPathRuntimeFactory,
|
|
29
31
|
UiPathRuntimeResult,
|
|
@@ -41,7 +43,11 @@ from ._models._output import (
|
|
|
41
43
|
UiPathEvalOutput,
|
|
42
44
|
UiPathEvalRunExecutionOutput,
|
|
43
45
|
)
|
|
44
|
-
from .
|
|
46
|
+
from ._span_collection import ExecutionSpanCollector
|
|
47
|
+
from .mocks.mocks import (
|
|
48
|
+
clear_execution_context,
|
|
49
|
+
set_execution_context,
|
|
50
|
+
)
|
|
45
51
|
|
|
46
52
|
T = TypeVar("T", bound=UiPathBaseRuntime)
|
|
47
53
|
C = TypeVar("C", bound=UiPathRuntimeContext)
|
|
@@ -78,6 +84,24 @@ class ExecutionSpanExporter(SpanExporter):
|
|
|
78
84
|
self.clear()
|
|
79
85
|
|
|
80
86
|
|
|
87
|
+
class ExecutionSpanProcessor(UiPathExecutionBatchTraceProcessor):
|
|
88
|
+
"""Span processor that adds spans to ExecutionSpanCollector when they start."""
|
|
89
|
+
|
|
90
|
+
def __init__(self, span_exporter: SpanExporter, collector: ExecutionSpanCollector):
|
|
91
|
+
super().__init__(span_exporter)
|
|
92
|
+
self.collector = collector
|
|
93
|
+
|
|
94
|
+
def on_start(
|
|
95
|
+
self, span: Span, parent_context: Optional[context_api.Context] = None
|
|
96
|
+
) -> None:
|
|
97
|
+
super().on_start(span, parent_context)
|
|
98
|
+
|
|
99
|
+
if span.attributes and "execution.id" in span.attributes:
|
|
100
|
+
exec_id = span.attributes["execution.id"]
|
|
101
|
+
if isinstance(exec_id, str):
|
|
102
|
+
self.collector.add_span(span, exec_id)
|
|
103
|
+
|
|
104
|
+
|
|
81
105
|
class ExecutionLogsExporter:
|
|
82
106
|
"""Custom exporter that stores multiple execution log handlers."""
|
|
83
107
|
|
|
@@ -127,8 +151,15 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
127
151
|
self.context: UiPathEvalContext = context
|
|
128
152
|
self.factory: UiPathRuntimeFactory[T, C] = factory
|
|
129
153
|
self.event_bus: EventBus = event_bus
|
|
154
|
+
|
|
130
155
|
self.span_exporter: ExecutionSpanExporter = ExecutionSpanExporter()
|
|
131
|
-
self.
|
|
156
|
+
self.span_collector: ExecutionSpanCollector = ExecutionSpanCollector()
|
|
157
|
+
|
|
158
|
+
# Span processor feeds both exporter and collector
|
|
159
|
+
span_processor = ExecutionSpanProcessor(self.span_exporter, self.span_collector)
|
|
160
|
+
self.factory.tracer_span_processors.append(span_processor)
|
|
161
|
+
self.factory.tracer_provider.add_span_processor(span_processor)
|
|
162
|
+
|
|
132
163
|
self.logs_exporter: ExecutionLogsExporter = ExecutionLogsExporter()
|
|
133
164
|
self.execution_id = str(uuid.uuid4())
|
|
134
165
|
|
|
@@ -180,7 +211,6 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
180
211
|
evaluation_set_name=evaluation_set.name,
|
|
181
212
|
evaluation_set_results=eval_run_result_list,
|
|
182
213
|
)
|
|
183
|
-
|
|
184
214
|
# Computing evaluator averages
|
|
185
215
|
evaluator_averages: Dict[str, float] = defaultdict(float)
|
|
186
216
|
evaluator_count: Dict[str, int] = defaultdict(int)
|
|
@@ -194,7 +224,6 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
194
224
|
evaluator_averages[eval_id] = (
|
|
195
225
|
evaluator_averages[eval_id] / evaluator_count[eval_id]
|
|
196
226
|
)
|
|
197
|
-
|
|
198
227
|
await event_bus.publish(
|
|
199
228
|
EvaluationEvents.UPDATE_EVAL_SET_RUN,
|
|
200
229
|
EvalSetRunUpdatedEvent(
|
|
@@ -289,7 +318,7 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
289
318
|
evaluators: List[BaseEvaluator[Any]],
|
|
290
319
|
event_bus: EventBus,
|
|
291
320
|
) -> EvaluationRunResult:
|
|
292
|
-
|
|
321
|
+
set_execution_context(eval_item, self.span_collector)
|
|
293
322
|
|
|
294
323
|
await event_bus.publish(
|
|
295
324
|
EvaluationEvents.CREATE_EVAL_RUN,
|
|
@@ -383,6 +412,8 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
383
412
|
eval_run_updated_event,
|
|
384
413
|
wait_for_completion=False,
|
|
385
414
|
)
|
|
415
|
+
finally:
|
|
416
|
+
clear_execution_context()
|
|
386
417
|
|
|
387
418
|
return evaluation_run_results
|
|
388
419
|
|
|
@@ -391,6 +422,7 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
391
422
|
) -> tuple[List[ReadableSpan], list[logging.LogRecord]]:
|
|
392
423
|
spans = self.span_exporter.get_spans(execution_id)
|
|
393
424
|
self.span_exporter.clear(execution_id)
|
|
425
|
+
self.span_collector.clear(execution_id)
|
|
394
426
|
|
|
395
427
|
logs = self.logs_exporter.get_logs(execution_id)
|
|
396
428
|
self.logs_exporter.clear(execution_id)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from collections import defaultdict
|
|
2
|
+
from typing import Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
from opentelemetry.sdk.trace import ReadableSpan, Span
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ExecutionSpanCollector:
|
|
8
|
+
"""Collects spans as they are created during execution."""
|
|
9
|
+
|
|
10
|
+
def __init__(self):
|
|
11
|
+
# { execution_id -> list of spans }
|
|
12
|
+
self._spans: Dict[str, List[ReadableSpan]] = defaultdict(list)
|
|
13
|
+
|
|
14
|
+
def add_span(self, span: Span, execution_id: str) -> None:
|
|
15
|
+
self._spans[execution_id].append(span)
|
|
16
|
+
|
|
17
|
+
def get_spans(self, execution_id: str) -> List[ReadableSpan]:
|
|
18
|
+
return self._spans.get(execution_id, [])
|
|
19
|
+
|
|
20
|
+
def clear(self, execution_id: Optional[str] = None) -> None:
|
|
21
|
+
if execution_id:
|
|
22
|
+
self._spans.pop(execution_id, None)
|
|
23
|
+
else:
|
|
24
|
+
self._spans.clear()
|
|
@@ -6,6 +6,9 @@ from typing import Any, Callable
|
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel
|
|
8
8
|
|
|
9
|
+
from uipath.tracing._traced import traced
|
|
10
|
+
from uipath.tracing._utils import _SpanUtils
|
|
11
|
+
|
|
9
12
|
from .._models._evaluation_set import (
|
|
10
13
|
EvaluationItem,
|
|
11
14
|
LLMMockingStrategy,
|
|
@@ -51,7 +54,7 @@ Based on the above information, provide a realistic response for this tool call.
|
|
|
51
54
|
3. Always include the entire output regardless of token length.
|
|
52
55
|
3. Consider the context of the current test run and the agent being tested. If the agent is acting on a property, make sure the output includes that property.
|
|
53
56
|
|
|
54
|
-
Respond ONLY with valid JSON that would be a realistic and
|
|
57
|
+
Respond ONLY with valid JSON that would be a realistic and complete tool response. Do not include any explanations or markdown.
|
|
55
58
|
"""
|
|
56
59
|
|
|
57
60
|
logger = logging.getLogger(__name__)
|
|
@@ -79,6 +82,7 @@ class LLMMocker(Mocker):
|
|
|
79
82
|
self.evaluation_item = evaluation_item
|
|
80
83
|
assert isinstance(self.evaluation_item.mocking_strategy, LLMMockingStrategy)
|
|
81
84
|
|
|
85
|
+
@traced(name="__mocker__")
|
|
82
86
|
async def response(
|
|
83
87
|
self, func: Callable[[T], R], params: dict[str, Any], *args: T, **kwargs
|
|
84
88
|
) -> R:
|
|
@@ -92,6 +96,8 @@ class LLMMocker(Mocker):
|
|
|
92
96
|
from uipath import UiPath
|
|
93
97
|
from uipath._services.llm_gateway_service import _cleanup_schema
|
|
94
98
|
|
|
99
|
+
from .mocks import evaluation_context, span_collector_context
|
|
100
|
+
|
|
95
101
|
llm = UiPath().llm
|
|
96
102
|
return_type: Any = func.__annotations__.get("return", None)
|
|
97
103
|
if return_type is None:
|
|
@@ -116,9 +122,17 @@ class LLMMocker(Mocker):
|
|
|
116
122
|
example_calls = [
|
|
117
123
|
call for call in example_calls if isinstance(call, ExampleCall)
|
|
118
124
|
]
|
|
125
|
+
|
|
126
|
+
test_run_history = "(empty)"
|
|
127
|
+
eval_item = evaluation_context.get()
|
|
128
|
+
span_collector = span_collector_context.get()
|
|
129
|
+
if eval_item and span_collector:
|
|
130
|
+
spans = span_collector.get_spans(eval_item.id)
|
|
131
|
+
test_run_history = _SpanUtils.spans_to_llm_context(spans)
|
|
132
|
+
|
|
119
133
|
prompt_input: dict[str, Any] = {
|
|
120
134
|
"toolRunExamples": example_calls,
|
|
121
|
-
"testRunHistory":
|
|
135
|
+
"testRunHistory": test_run_history,
|
|
122
136
|
"toolInfo": {
|
|
123
137
|
"name": function_name,
|
|
124
138
|
"description": params.get("description"),
|
|
@@ -5,30 +5,49 @@ from contextvars import ContextVar
|
|
|
5
5
|
from typing import Any, Callable, Optional
|
|
6
6
|
|
|
7
7
|
from uipath._cli._evals._models._evaluation_set import EvaluationItem
|
|
8
|
+
from uipath._cli._evals._span_collection import ExecutionSpanCollector
|
|
8
9
|
from uipath._cli._evals.mocks.mocker import Mocker, UiPathNoMockFoundError
|
|
9
10
|
from uipath._cli._evals.mocks.mocker_factory import MockerFactory
|
|
10
11
|
|
|
12
|
+
# Context variables for evaluation items and mockers
|
|
11
13
|
evaluation_context: ContextVar[Optional[EvaluationItem]] = ContextVar(
|
|
12
14
|
"evaluation", default=None
|
|
13
15
|
)
|
|
14
16
|
|
|
15
17
|
mocker_context: ContextVar[Optional[Mocker]] = ContextVar("mocker", default=None)
|
|
16
18
|
|
|
19
|
+
# Span collector for trace access during mocking
|
|
20
|
+
span_collector_context: ContextVar[Optional[ExecutionSpanCollector]] = ContextVar(
|
|
21
|
+
"span_collector", default=None
|
|
22
|
+
)
|
|
23
|
+
|
|
17
24
|
logger = logging.getLogger(__name__)
|
|
18
25
|
|
|
19
26
|
|
|
20
|
-
def
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
def set_execution_context(
|
|
28
|
+
eval_item: EvaluationItem, span_collector: ExecutionSpanCollector
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Set the execution context for an evaluation run for mocking and trace access."""
|
|
31
|
+
evaluation_context.set(eval_item)
|
|
32
|
+
|
|
23
33
|
try:
|
|
24
|
-
if
|
|
25
|
-
mocker_context.set(MockerFactory.create(
|
|
34
|
+
if eval_item.mocking_strategy:
|
|
35
|
+
mocker_context.set(MockerFactory.create(eval_item))
|
|
26
36
|
else:
|
|
27
37
|
mocker_context.set(None)
|
|
28
38
|
except Exception:
|
|
29
|
-
logger.warning(f"Failed to create mocker for evaluation {
|
|
39
|
+
logger.warning(f"Failed to create mocker for evaluation {eval_item.name}")
|
|
30
40
|
mocker_context.set(None)
|
|
31
41
|
|
|
42
|
+
span_collector_context.set(span_collector)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def clear_execution_context() -> None:
|
|
46
|
+
"""Clear the execution context after evaluation completes."""
|
|
47
|
+
evaluation_context.set(None)
|
|
48
|
+
mocker_context.set(None)
|
|
49
|
+
span_collector_context.set(None)
|
|
50
|
+
|
|
32
51
|
|
|
33
52
|
async def get_mocked_response(
|
|
34
53
|
func: Callable[[Any], Any], params: dict[str, Any], *args, **kwargs
|
|
@@ -319,3 +319,55 @@ class _SpanUtils:
|
|
|
319
319
|
f"Error formatting arguments for trace: {e}. Using args and kwargs directly."
|
|
320
320
|
)
|
|
321
321
|
return {"args": args, "kwargs": kwargs}
|
|
322
|
+
|
|
323
|
+
@staticmethod
|
|
324
|
+
def _has_ancestor_with_name(
|
|
325
|
+
span: ReadableSpan, ancestor_name: str, span_map: Dict[int, ReadableSpan]
|
|
326
|
+
) -> bool:
|
|
327
|
+
"""Check if this span or any of its ancestors has a given name."""
|
|
328
|
+
if span.name == ancestor_name:
|
|
329
|
+
return True
|
|
330
|
+
|
|
331
|
+
current = span
|
|
332
|
+
while current.parent is not None:
|
|
333
|
+
parent_span = span_map.get(current.parent.span_id)
|
|
334
|
+
if parent_span is None:
|
|
335
|
+
break
|
|
336
|
+
if parent_span.name == ancestor_name:
|
|
337
|
+
return True
|
|
338
|
+
current = parent_span
|
|
339
|
+
|
|
340
|
+
return False
|
|
341
|
+
|
|
342
|
+
@staticmethod
|
|
343
|
+
def spans_to_llm_context(spans: list[ReadableSpan]) -> str:
|
|
344
|
+
"""Convert spans to a formatted conversation history string suitable for LLM context.
|
|
345
|
+
|
|
346
|
+
Includes function calls (including LLM calls) with their inputs and outputs.
|
|
347
|
+
"""
|
|
348
|
+
# Build span_id -> span map for parent chain traversal
|
|
349
|
+
span_map = {span.get_span_context().span_id: span for span in spans}
|
|
350
|
+
|
|
351
|
+
history = []
|
|
352
|
+
for span in spans:
|
|
353
|
+
attributes = dict(span.attributes) if span.attributes else {}
|
|
354
|
+
|
|
355
|
+
input_value = attributes.get("input.value")
|
|
356
|
+
output_value = attributes.get("output.value")
|
|
357
|
+
|
|
358
|
+
if not input_value or not output_value:
|
|
359
|
+
continue
|
|
360
|
+
|
|
361
|
+
# Skip spans that are internal LLM calls (eg. for tool mocking in evals)
|
|
362
|
+
if _SpanUtils._has_ancestor_with_name(span, "__mocker__", span_map):
|
|
363
|
+
continue
|
|
364
|
+
|
|
365
|
+
history.append(f"Function: {span.name}")
|
|
366
|
+
history.append(f"Input: {input_value}")
|
|
367
|
+
history.append(f"Output: {output_value}")
|
|
368
|
+
history.append("")
|
|
369
|
+
|
|
370
|
+
if not history:
|
|
371
|
+
return "(empty)"
|
|
372
|
+
|
|
373
|
+
return "\n".join(history)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from typing import Any
|
|
2
|
+
from unittest.mock import MagicMock
|
|
2
3
|
|
|
3
4
|
import pytest
|
|
4
5
|
from _pytest.monkeypatch import MonkeyPatch
|
|
@@ -10,9 +11,11 @@ from uipath._cli._evals._models._evaluation_set import (
|
|
|
10
11
|
MockitoMockingStrategy,
|
|
11
12
|
)
|
|
12
13
|
from uipath._cli._evals.mocks.mocker import UiPathMockResponseGenerationError
|
|
13
|
-
from uipath._cli._evals.mocks.mocks import
|
|
14
|
+
from uipath._cli._evals.mocks.mocks import set_execution_context
|
|
14
15
|
from uipath.eval.mocks import mockable
|
|
15
16
|
|
|
17
|
+
_mock_span_collector = MagicMock()
|
|
18
|
+
|
|
16
19
|
|
|
17
20
|
def test_mockito_mockable_sync():
|
|
18
21
|
# Arrange
|
|
@@ -51,7 +54,7 @@ def test_mockito_mockable_sync():
|
|
|
51
54
|
assert isinstance(evaluation.mocking_strategy, MockitoMockingStrategy)
|
|
52
55
|
|
|
53
56
|
# Act & Assert
|
|
54
|
-
|
|
57
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
55
58
|
assert foo() == "bar1"
|
|
56
59
|
assert foo() == "bar2"
|
|
57
60
|
assert foo() == "bar2"
|
|
@@ -63,13 +66,13 @@ def test_mockito_mockable_sync():
|
|
|
63
66
|
assert foofoo()
|
|
64
67
|
|
|
65
68
|
evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {"x": 1}
|
|
66
|
-
|
|
69
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
67
70
|
assert foo(x=1) == "bar1"
|
|
68
71
|
|
|
69
72
|
evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {
|
|
70
73
|
"x": {"_target_": "mockito.any"}
|
|
71
74
|
}
|
|
72
|
-
|
|
75
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
73
76
|
assert foo(x=2) == "bar1"
|
|
74
77
|
|
|
75
78
|
|
|
@@ -111,7 +114,7 @@ async def test_mockito_mockable_async():
|
|
|
111
114
|
assert isinstance(evaluation.mocking_strategy, MockitoMockingStrategy)
|
|
112
115
|
|
|
113
116
|
# Act & Assert
|
|
114
|
-
|
|
117
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
115
118
|
assert await foo() == "bar1"
|
|
116
119
|
assert await foo() == "bar2"
|
|
117
120
|
assert await foo() == "bar2"
|
|
@@ -123,13 +126,13 @@ async def test_mockito_mockable_async():
|
|
|
123
126
|
assert await foofoo()
|
|
124
127
|
|
|
125
128
|
evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {"x": 1}
|
|
126
|
-
|
|
129
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
127
130
|
assert await foo(x=1) == "bar1"
|
|
128
131
|
|
|
129
132
|
evaluation.mocking_strategy.behaviors[0].arguments.kwargs = {
|
|
130
133
|
"x": {"_target_": "mockito.any"}
|
|
131
134
|
}
|
|
132
|
-
|
|
135
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
133
136
|
assert await foo(x=2) == "bar1"
|
|
134
137
|
|
|
135
138
|
|
|
@@ -201,7 +204,7 @@ def test_llm_mockable_sync(httpx_mock: HTTPXMock, monkeypatch: MonkeyPatch):
|
|
|
201
204
|
},
|
|
202
205
|
)
|
|
203
206
|
# Act & Assert
|
|
204
|
-
|
|
207
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
205
208
|
|
|
206
209
|
assert foo() == "bar1"
|
|
207
210
|
with pytest.raises(NotImplementedError):
|
|
@@ -274,7 +277,7 @@ async def test_llm_mockable_async(httpx_mock: HTTPXMock, monkeypatch: MonkeyPatc
|
|
|
274
277
|
},
|
|
275
278
|
)
|
|
276
279
|
# Act & Assert
|
|
277
|
-
|
|
280
|
+
set_execution_context(evaluation, _mock_span_collector)
|
|
278
281
|
|
|
279
282
|
assert await foo() == "bar1"
|
|
280
283
|
with pytest.raises(NotImplementedError):
|
|
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
|
|
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
|