uipath 2.1.102__tar.gz → 2.1.104__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.102 → uipath-2.1.104}/PKG-INFO +1 -1
- {uipath-2.1.102 → uipath-2.1.104}/pyproject.toml +1 -1
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/__init__.py +1 -1
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_debug/_bridge.py +2 -1
- uipath-2.1.104/src/uipath/_cli/_evals/_evaluate.py +28 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_runtime.py +1 -1
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_contracts.py +1 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_eval.py +5 -15
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_run.py +15 -1
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/CLI_REFERENCE.md +1 -0
- uipath-2.1.104/src/uipath/py.typed +0 -0
- uipath-2.1.104/src/uipath/tracing/__init__.py +13 -0
- uipath-2.1.104/src/uipath/tracing/_otel_exporters.py +339 -0
- uipath-2.1.104/tests/cli/eval/evals/eval-sets/default.json +24 -0
- uipath-2.1.104/tests/cli/eval/evals/evaluators/equality.json +11 -0
- uipath-2.1.104/tests/cli/eval/test_evaluate.py +41 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_run.py +1 -0
- uipath-2.1.104/tests/tracing/test_otel_exporters.py +448 -0
- {uipath-2.1.102 → uipath-2.1.104}/uv.lock +1 -1
- uipath-2.1.102/src/uipath/tracing/__init__.py +0 -4
- uipath-2.1.102/src/uipath/tracing/_otel_exporters.py +0 -95
- uipath-2.1.102/tests/tracing/test_otel_exporters.py +0 -190
- {uipath-2.1.102 → uipath-2.1.104}/.claude/agents/command-tester.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.claude/commands/prepare-pr.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.cursorrules +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.editorconfig +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.gitattributes +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/labeler.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/auto-label.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/integration_tests.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/test-uipath-langchain.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/test-uipath-llamaindex.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.github/workflows/test.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.gitignore +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.python-version +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.vscode/extensions.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.vscode/launch.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/.vscode/settings.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/CONTRIBUTING.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/LICENSE +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/README.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/AutomationSuite.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/FAQ.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/assets/favicon.png +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/assets/llms.txt +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/cli/index.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/actions.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/assets.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/attachments.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/buckets.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/connections.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/documents.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/documents_models.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/getting_started.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/jobs.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/processes.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/queues.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/core/traced.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/hooks.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/index.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/overrides/main.html +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/release_policy.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/justfile +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/mkdocs.yml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/py.typed +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/.env.example +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/README.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/input.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/main.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/asset-modifier-agent/uv.lock +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/README.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/evals/eval-sets/default.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/evals/evaluators/equality.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/main.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/calculator/uipath.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/scripts/debug_test.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/scripts/update_agents_md.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_auth_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_debug/_runtime.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.102/src/uipath/_cli/models → uipath-2.1.104/src/uipath/_cli/_evals}/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/_span_collection.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/input_mocker.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/llm_mocker.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_evals/mocks/mocks.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_runtime_factory.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_debug.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.102/src/uipath/_events → uipath-2.1.104/src/uipath/_cli/models}/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/models/runtime_schema.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_config.py +0 -0
- /uipath-2.1.102/src/uipath/py.typed → /uipath-2.1.104/src/uipath/_events/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_events/_event_bus.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_events/_events.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/CLAUDE.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/REQUIRED_STRUCTURE.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_resources/SDK_REFERENCE.md +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/documents_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/external_application_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_auth.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/_utils.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/models/agent.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/models/evals.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/react/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/react/prompts.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/agent/react/tools.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/mocks/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/mocks/mockable.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/auth.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/documents.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/guardrails.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/job.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/src/uipath/utils/dynamic_schema.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/apicalls-testcase/main.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/apicalls-testcase/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/apicalls-testcase/run.sh +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/apicalls-testcase/src/assert.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/basic-testcase/main.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/basic-testcase/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/basic-testcase/run.sh +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/basic-testcase/src/assert.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/common/validate_output.sh +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/agent.mermaid +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/langgraph.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/run.sh +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/src/assert.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/langchain-cross/src/main.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/agent.mermaid +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/llama_index.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/run.sh +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/src/assert.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/testcases/llamaindex-cross/src/main.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/__init__.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/agent/models/test_agent.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/agent/models/test_evals.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/conftest.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/eval/mocks/test_input_mocker.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/eval/mocks/test_mocks.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/models/test_runtime_schema.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_init.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_new.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_oidc_utils.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_push.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/utils/test_dynamic_schema.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/conftest.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_documents_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_external_application_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.102 → uipath-2.1.104}/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.104
|
|
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.104"
|
|
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"
|
|
@@ -8,7 +8,7 @@ from .cli_auth import auth as auth
|
|
|
8
8
|
from .cli_debug import debug as debug # type: ignore
|
|
9
9
|
from .cli_deploy import deploy as deploy # type: ignore
|
|
10
10
|
from .cli_dev import dev as dev
|
|
11
|
-
from .cli_eval import eval as eval
|
|
11
|
+
from .cli_eval import eval as eval
|
|
12
12
|
from .cli_init import init as init # type: ignore
|
|
13
13
|
from .cli_invoke import invoke as invoke # type: ignore
|
|
14
14
|
from .cli_new import new as new # type: ignore
|
|
@@ -434,7 +434,8 @@ def get_remote_debug_bridge(context: UiPathRuntimeContext) -> UiPathDebugBridge:
|
|
|
434
434
|
if not context.trace_context:
|
|
435
435
|
raise ValueError("trace_context is required for remote debugging")
|
|
436
436
|
|
|
437
|
-
signalr_url = uipath_url
|
|
437
|
+
signalr_url = f"{uipath_url.rstrip('/')}/orchestrator_/signalr/robotdebug?sessionId={context.job_id}"
|
|
438
|
+
|
|
438
439
|
return SignalRDebugBridge(
|
|
439
440
|
hub_url=signalr_url,
|
|
440
441
|
access_token=os.environ.get("UIPATH_ACCESS_TOKEN"),
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from typing import TypeVar
|
|
2
|
+
|
|
3
|
+
from uipath._cli._evals._runtime import UiPathEvalContext, UiPathEvalRuntime
|
|
4
|
+
from uipath._cli._runtime._contracts import (
|
|
5
|
+
UiPathBaseRuntime,
|
|
6
|
+
UiPathRuntimeContext,
|
|
7
|
+
UiPathRuntimeFactory,
|
|
8
|
+
UiPathRuntimeResult,
|
|
9
|
+
)
|
|
10
|
+
from uipath._events._event_bus import EventBus
|
|
11
|
+
|
|
12
|
+
T = TypeVar("T", bound=UiPathBaseRuntime)
|
|
13
|
+
C = TypeVar("C", bound=UiPathRuntimeContext)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
async def evaluate(
|
|
17
|
+
runtime_factory: UiPathRuntimeFactory[T, C],
|
|
18
|
+
eval_context: UiPathEvalContext,
|
|
19
|
+
event_bus: EventBus,
|
|
20
|
+
) -> UiPathRuntimeResult:
|
|
21
|
+
async with UiPathEvalRuntime.from_eval_context(
|
|
22
|
+
factory=runtime_factory,
|
|
23
|
+
context=eval_context,
|
|
24
|
+
event_bus=event_bus,
|
|
25
|
+
) as eval_runtime:
|
|
26
|
+
results = await eval_runtime.execute()
|
|
27
|
+
await event_bus.wait_for_all(timeout=10)
|
|
28
|
+
return results
|
|
@@ -176,7 +176,7 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
176
176
|
) -> "UiPathEvalRuntime[T, C]":
|
|
177
177
|
return cls(context, factory, event_bus)
|
|
178
178
|
|
|
179
|
-
async def execute(self) ->
|
|
179
|
+
async def execute(self) -> UiPathRuntimeResult:
|
|
180
180
|
if self.context.eval_set is None:
|
|
181
181
|
raise ValueError("eval_set must be provided for evaluation runs")
|
|
182
182
|
|
|
@@ -341,6 +341,7 @@ class UiPathRuntimeContext(BaseModel):
|
|
|
341
341
|
result: Optional[UiPathRuntimeResult] = None
|
|
342
342
|
execution_output_file: Optional[str] = None
|
|
343
343
|
input_file: Optional[str] = None
|
|
344
|
+
trace_file: Optional[str] = None
|
|
344
345
|
is_eval_run: bool = False
|
|
345
346
|
log_handler: Optional[logging.Handler] = None
|
|
346
347
|
chat_handler: Optional[UiPathConversationHandler] = None
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# type: ignore
|
|
2
1
|
import ast
|
|
3
2
|
import asyncio
|
|
4
3
|
import os
|
|
@@ -7,10 +6,10 @@ from typing import List, Optional
|
|
|
7
6
|
import click
|
|
8
7
|
|
|
9
8
|
from uipath._cli._evals._console_progress_reporter import ConsoleProgressReporter
|
|
9
|
+
from uipath._cli._evals._evaluate import evaluate
|
|
10
10
|
from uipath._cli._evals._progress_reporter import StudioWebProgressReporter
|
|
11
11
|
from uipath._cli._evals._runtime import (
|
|
12
12
|
UiPathEvalContext,
|
|
13
|
-
UiPathEvalRuntime,
|
|
14
13
|
)
|
|
15
14
|
from uipath._cli._runtime._runtime_factory import generate_runtime_factory
|
|
16
15
|
from uipath._cli._utils._constants import UIPATH_PROJECT_ID
|
|
@@ -46,9 +45,9 @@ def setup_reporting_prereq(no_report: bool) -> bool:
|
|
|
46
45
|
)
|
|
47
46
|
return False
|
|
48
47
|
if not os.getenv("UIPATH_FOLDER_KEY"):
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
folder_key = asyncio.run(get_personal_workspace_key_async())
|
|
49
|
+
if folder_key:
|
|
50
|
+
os.environ["UIPATH_FOLDER_KEY"] = folder_key
|
|
52
51
|
return True
|
|
53
52
|
|
|
54
53
|
|
|
@@ -141,17 +140,8 @@ def eval(
|
|
|
141
140
|
runtime_factory = generate_runtime_factory()
|
|
142
141
|
if eval_context.job_id:
|
|
143
142
|
runtime_factory.add_span_exporter(LlmOpsHttpExporter())
|
|
143
|
+
asyncio.run(evaluate(runtime_factory, eval_context, event_bus))
|
|
144
144
|
|
|
145
|
-
async def execute():
|
|
146
|
-
async with UiPathEvalRuntime.from_eval_context(
|
|
147
|
-
factory=runtime_factory,
|
|
148
|
-
context=eval_context,
|
|
149
|
-
event_bus=event_bus,
|
|
150
|
-
) as eval_runtime:
|
|
151
|
-
await eval_runtime.execute()
|
|
152
|
-
await event_bus.wait_for_all(timeout=10)
|
|
153
|
-
|
|
154
|
-
asyncio.run(execute())
|
|
155
145
|
except Exception as e:
|
|
156
146
|
console.error(
|
|
157
147
|
f"Error occurred: {e or 'Execution failed'}", include_traceback=True
|
|
@@ -8,7 +8,7 @@ import click
|
|
|
8
8
|
|
|
9
9
|
from uipath._cli._runtime._runtime_factory import generate_runtime_factory
|
|
10
10
|
from uipath._cli._utils._debug import setup_debugging
|
|
11
|
-
from uipath.tracing import LlmOpsHttpExporter
|
|
11
|
+
from uipath.tracing import JsonLinesFileExporter, LlmOpsHttpExporter
|
|
12
12
|
|
|
13
13
|
from .._utils.constants import (
|
|
14
14
|
ENV_JOB_ID,
|
|
@@ -44,6 +44,12 @@ console = ConsoleLogger()
|
|
|
44
44
|
type=click.Path(exists=False),
|
|
45
45
|
help="File path where the output will be written",
|
|
46
46
|
)
|
|
47
|
+
@click.option(
|
|
48
|
+
"--trace-file",
|
|
49
|
+
required=False,
|
|
50
|
+
type=click.Path(exists=False),
|
|
51
|
+
help="File path where the trace spans will be written (JSON Lines format)",
|
|
52
|
+
)
|
|
47
53
|
@click.option(
|
|
48
54
|
"--debug",
|
|
49
55
|
is_flag=True,
|
|
@@ -63,6 +69,7 @@ def run(
|
|
|
63
69
|
file: Optional[str],
|
|
64
70
|
input_file: Optional[str],
|
|
65
71
|
output_file: Optional[str],
|
|
72
|
+
trace_file: Optional[str],
|
|
66
73
|
debug: bool,
|
|
67
74
|
debug_port: int,
|
|
68
75
|
) -> None:
|
|
@@ -73,6 +80,7 @@ def run(
|
|
|
73
80
|
"resume": resume,
|
|
74
81
|
"input_file": file or input_file,
|
|
75
82
|
"execution_output_file": output_file,
|
|
83
|
+
"trace_file": trace_file,
|
|
76
84
|
"debug": debug,
|
|
77
85
|
}
|
|
78
86
|
input_file = file or input_file
|
|
@@ -87,6 +95,7 @@ def run(
|
|
|
87
95
|
resume,
|
|
88
96
|
input_file=input_file,
|
|
89
97
|
execution_output_file=output_file,
|
|
98
|
+
trace_file=trace_file,
|
|
90
99
|
debug=debug,
|
|
91
100
|
debug_port=debug_port,
|
|
92
101
|
)
|
|
@@ -110,7 +119,12 @@ def run(
|
|
|
110
119
|
context = runtime_factory.new_context(**context_args)
|
|
111
120
|
if context.job_id:
|
|
112
121
|
runtime_factory.add_span_exporter(LlmOpsHttpExporter())
|
|
122
|
+
|
|
123
|
+
if trace_file:
|
|
124
|
+
runtime_factory.add_span_exporter(JsonLinesFileExporter(trace_file))
|
|
125
|
+
|
|
113
126
|
result = await runtime_factory.execute(context)
|
|
127
|
+
|
|
114
128
|
if not context.job_id:
|
|
115
129
|
console.info(result.output)
|
|
116
130
|
|
|
@@ -65,6 +65,7 @@ uv run uipath init --infer-bindings
|
|
|
65
65
|
| `-f`, `--file` | value | none | File path for the .json input |
|
|
66
66
|
| `--input-file` | value | none | Alias for '-f/--file' arguments |
|
|
67
67
|
| `--output-file` | value | none | File path where the output will be written |
|
|
68
|
+
| `--trace-file` | value | none | File path where the trace spans will be written (JSON Lines format) |
|
|
68
69
|
| `--debug` | flag | false | Enable debugging with debugpy. The process will wait for a debugger to attach. |
|
|
69
70
|
| `--debug-port` | value | `5678` | Port for the debug server (default: 5678) |
|
|
70
71
|
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from ._otel_exporters import ( # noqa: D104
|
|
2
|
+
JsonLinesFileExporter,
|
|
3
|
+
LlmOpsHttpExporter,
|
|
4
|
+
)
|
|
5
|
+
from ._traced import TracingManager, traced, wait_for_tracers # noqa: D104
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"TracingManager",
|
|
9
|
+
"traced",
|
|
10
|
+
"wait_for_tracers",
|
|
11
|
+
"LlmOpsHttpExporter",
|
|
12
|
+
"JsonLinesFileExporter",
|
|
13
|
+
]
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import time
|
|
5
|
+
from typing import Any, Dict, List, Optional, Sequence
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
from opentelemetry.sdk.trace import ReadableSpan
|
|
9
|
+
from opentelemetry.sdk.trace.export import (
|
|
10
|
+
SpanExporter,
|
|
11
|
+
SpanExportResult,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from uipath._utils._ssl_context import get_httpx_client_kwargs
|
|
15
|
+
|
|
16
|
+
from ._utils import _SpanUtils
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _safe_parse_json(s: Any) -> Any:
|
|
22
|
+
"""Safely parse a JSON string, returning the original if not a string or on error."""
|
|
23
|
+
if not isinstance(s, str):
|
|
24
|
+
return s
|
|
25
|
+
try:
|
|
26
|
+
return json.loads(s)
|
|
27
|
+
except (json.JSONDecodeError, TypeError):
|
|
28
|
+
return s
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _get_llm_messages(attributes: Dict[str, Any], prefix: str) -> List[Dict[str, Any]]:
|
|
32
|
+
"""Extracts and reconstructs LLM messages from flattened attributes."""
|
|
33
|
+
messages: dict[int, dict[str, Any]] = {}
|
|
34
|
+
message_prefix = f"{prefix}."
|
|
35
|
+
|
|
36
|
+
for key, value in attributes.items():
|
|
37
|
+
if key.startswith(message_prefix):
|
|
38
|
+
parts = key[len(message_prefix) :].split(".")
|
|
39
|
+
if len(parts) >= 2 and parts[0].isdigit():
|
|
40
|
+
index = int(parts[0])
|
|
41
|
+
if index not in messages:
|
|
42
|
+
messages[index] = {}
|
|
43
|
+
current: Any = messages[index]
|
|
44
|
+
|
|
45
|
+
for i, part in enumerate(parts[1:-1]):
|
|
46
|
+
key_part: str | int = part
|
|
47
|
+
if part.isdigit() and (
|
|
48
|
+
i + 2 < len(parts) and parts[i + 2].isdigit()
|
|
49
|
+
):
|
|
50
|
+
key_part = int(part)
|
|
51
|
+
|
|
52
|
+
if isinstance(current, dict):
|
|
53
|
+
if key_part not in current:
|
|
54
|
+
current[key_part] = {}
|
|
55
|
+
current = current[key_part]
|
|
56
|
+
elif isinstance(current, list) and isinstance(key_part, int):
|
|
57
|
+
if key_part >= len(current):
|
|
58
|
+
current.append({})
|
|
59
|
+
current = current[key_part]
|
|
60
|
+
|
|
61
|
+
current[parts[-1]] = value
|
|
62
|
+
|
|
63
|
+
# Convert dict to list, ordered by index
|
|
64
|
+
return [messages[i] for i in sorted(messages.keys())]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class LlmOpsHttpExporter(SpanExporter):
|
|
68
|
+
"""An OpenTelemetry span exporter that sends spans to UiPath LLM Ops."""
|
|
69
|
+
|
|
70
|
+
ATTRIBUTE_MAPPING: dict[str, str | tuple[str, Any]] = {
|
|
71
|
+
"input.value": ("input", _safe_parse_json),
|
|
72
|
+
"output.value": ("output", _safe_parse_json),
|
|
73
|
+
"llm.model_name": "model",
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Mapping of span types
|
|
77
|
+
SPAN_TYPE_MAPPING: dict[str, str] = {
|
|
78
|
+
"LLM": "completion",
|
|
79
|
+
"TOOL": "toolCall",
|
|
80
|
+
# Add more mappings as needed
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
class Status:
|
|
84
|
+
SUCCESS = 1
|
|
85
|
+
ERROR = 2
|
|
86
|
+
INTERRUPTED = 3
|
|
87
|
+
|
|
88
|
+
def __init__(
|
|
89
|
+
self,
|
|
90
|
+
trace_id: Optional[str] = None,
|
|
91
|
+
extra_process_spans: Optional[bool] = False,
|
|
92
|
+
**kwargs,
|
|
93
|
+
):
|
|
94
|
+
"""Initialize the exporter with the base URL and authentication token."""
|
|
95
|
+
super().__init__(**kwargs)
|
|
96
|
+
self.base_url = self._get_base_url()
|
|
97
|
+
self.auth_token = os.environ.get("UIPATH_ACCESS_TOKEN")
|
|
98
|
+
self.headers = {
|
|
99
|
+
"Content-Type": "application/json",
|
|
100
|
+
"Authorization": f"Bearer {self.auth_token}",
|
|
101
|
+
}
|
|
102
|
+
self._extra_process_spans = extra_process_spans
|
|
103
|
+
|
|
104
|
+
client_kwargs = get_httpx_client_kwargs()
|
|
105
|
+
|
|
106
|
+
self.http_client = httpx.Client(**client_kwargs, headers=self.headers)
|
|
107
|
+
self.trace_id = trace_id
|
|
108
|
+
|
|
109
|
+
def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult:
|
|
110
|
+
"""Export spans to UiPath LLM Ops."""
|
|
111
|
+
logger.debug(
|
|
112
|
+
f"Exporting {len(spans)} spans to {self.base_url}/llmopstenant_/api/Traces/spans"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
span_list = [
|
|
116
|
+
_SpanUtils.otel_span_to_uipath_span(
|
|
117
|
+
span, custom_trace_id=self.trace_id
|
|
118
|
+
).to_dict()
|
|
119
|
+
for span in spans
|
|
120
|
+
]
|
|
121
|
+
url = self._build_url(span_list)
|
|
122
|
+
|
|
123
|
+
if self._extra_process_spans:
|
|
124
|
+
span_list = [self._process_span_attributes(span) for span in span_list]
|
|
125
|
+
|
|
126
|
+
logger.debug("Payload: %s", json.dumps(span_list))
|
|
127
|
+
|
|
128
|
+
return self._send_with_retries(url, span_list)
|
|
129
|
+
|
|
130
|
+
def force_flush(self, timeout_millis: int = 30000) -> bool:
|
|
131
|
+
"""Force flush the exporter."""
|
|
132
|
+
return True
|
|
133
|
+
|
|
134
|
+
def _map_llm_call_attributes(self, attributes: Dict[str, Any]) -> Dict[str, Any]:
|
|
135
|
+
"""Maps attributes for LLM calls, handling flattened keys."""
|
|
136
|
+
result = attributes.copy() # Keep original attributes including basic mappings
|
|
137
|
+
|
|
138
|
+
# Token Usage
|
|
139
|
+
token_keys = {
|
|
140
|
+
"llm.token_count.prompt": "promptTokens",
|
|
141
|
+
"llm.token_count.completion": "completionTokens",
|
|
142
|
+
"llm.token_count.total": "totalTokens",
|
|
143
|
+
}
|
|
144
|
+
usage = {
|
|
145
|
+
new_key: attributes.get(old_key)
|
|
146
|
+
for old_key, new_key in token_keys.items()
|
|
147
|
+
if old_key in attributes
|
|
148
|
+
}
|
|
149
|
+
if usage:
|
|
150
|
+
result["usage"] = usage
|
|
151
|
+
|
|
152
|
+
# Input/Output Messages
|
|
153
|
+
result["input"] = _get_llm_messages(attributes, "llm.input_messages")
|
|
154
|
+
output_messages = _get_llm_messages(attributes, "llm.output_messages")
|
|
155
|
+
result["output"] = output_messages
|
|
156
|
+
|
|
157
|
+
# Invocation Parameters
|
|
158
|
+
invocation_params = _safe_parse_json(
|
|
159
|
+
attributes.get("llm.invocation_parameters", "{}")
|
|
160
|
+
)
|
|
161
|
+
if isinstance(invocation_params, dict):
|
|
162
|
+
result["model"] = invocation_params.get("model", result.get("model"))
|
|
163
|
+
settings: dict[str, Any] = {}
|
|
164
|
+
if "max_tokens" in invocation_params:
|
|
165
|
+
settings["maxTokens"] = invocation_params["max_tokens"]
|
|
166
|
+
if "temperature" in invocation_params:
|
|
167
|
+
settings["temperature"] = invocation_params["temperature"]
|
|
168
|
+
if settings:
|
|
169
|
+
result["settings"] = settings
|
|
170
|
+
|
|
171
|
+
# Tool Calls
|
|
172
|
+
tool_calls: list[dict[str, Any]] = []
|
|
173
|
+
for msg in output_messages:
|
|
174
|
+
# Ensure msg is a dictionary before proceeding
|
|
175
|
+
if not isinstance(msg, dict):
|
|
176
|
+
continue
|
|
177
|
+
msg_tool_calls = msg.get("message", {}).get("tool_calls", [])
|
|
178
|
+
|
|
179
|
+
# Ensure msg_tool_calls is a list
|
|
180
|
+
if not isinstance(msg_tool_calls, list):
|
|
181
|
+
continue
|
|
182
|
+
|
|
183
|
+
for tc in msg_tool_calls:
|
|
184
|
+
if not isinstance(tc, dict):
|
|
185
|
+
continue
|
|
186
|
+
tool_call_data = tc.get("tool_call", {})
|
|
187
|
+
if not isinstance(tool_call_data, dict):
|
|
188
|
+
continue
|
|
189
|
+
tool_calls.append(
|
|
190
|
+
{
|
|
191
|
+
"id": tool_call_data.get("id"),
|
|
192
|
+
"name": tool_call_data.get("function", {}).get("name"),
|
|
193
|
+
"arguments": _safe_parse_json(
|
|
194
|
+
tool_call_data.get("function", {}).get("arguments", "{}")
|
|
195
|
+
),
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
if tool_calls:
|
|
199
|
+
result["toolCalls"] = tool_calls
|
|
200
|
+
|
|
201
|
+
return result
|
|
202
|
+
|
|
203
|
+
def _map_tool_call_attributes(self, attributes: Dict[str, Any]) -> Dict[str, Any]:
|
|
204
|
+
"""Maps attributes for tool calls."""
|
|
205
|
+
result = attributes.copy() # Keep original attributes
|
|
206
|
+
|
|
207
|
+
result["type"] = "toolCall"
|
|
208
|
+
result["callId"] = attributes.get("call_id") or attributes.get("id")
|
|
209
|
+
result["toolName"] = attributes.get("tool.name")
|
|
210
|
+
result["arguments"] = _safe_parse_json(
|
|
211
|
+
attributes.get("input", attributes.get("input.value", "{}"))
|
|
212
|
+
)
|
|
213
|
+
result["toolType"] = "Integration"
|
|
214
|
+
result["result"] = _safe_parse_json(
|
|
215
|
+
attributes.get("output", attributes.get("output.value"))
|
|
216
|
+
)
|
|
217
|
+
result["error"] = None
|
|
218
|
+
|
|
219
|
+
return result
|
|
220
|
+
|
|
221
|
+
def _determine_status(self, error: Optional[str]) -> int:
|
|
222
|
+
if error:
|
|
223
|
+
if error and error.startswith("GraphInterrupt("):
|
|
224
|
+
return self.Status.INTERRUPTED
|
|
225
|
+
return self.Status.ERROR
|
|
226
|
+
return self.Status.SUCCESS
|
|
227
|
+
|
|
228
|
+
def _process_span_attributes(self, span_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
229
|
+
"""Extracts, transforms, and maps attributes for a span."""
|
|
230
|
+
if "Attributes" not in span_data:
|
|
231
|
+
return span_data
|
|
232
|
+
|
|
233
|
+
attributes_val = span_data["Attributes"]
|
|
234
|
+
if isinstance(attributes_val, str):
|
|
235
|
+
try:
|
|
236
|
+
attributes: Dict[str, Any] = json.loads(attributes_val)
|
|
237
|
+
except json.JSONDecodeError as e:
|
|
238
|
+
logger.warning(f"Failed to parse attributes JSON: {e}")
|
|
239
|
+
return span_data
|
|
240
|
+
elif isinstance(attributes_val, dict):
|
|
241
|
+
attributes = attributes_val
|
|
242
|
+
else:
|
|
243
|
+
return span_data
|
|
244
|
+
|
|
245
|
+
# Determine SpanType
|
|
246
|
+
if "openinference.span.kind" in attributes:
|
|
247
|
+
span_type = attributes["openinference.span.kind"]
|
|
248
|
+
span_data["SpanType"] = self.SPAN_TYPE_MAPPING.get(span_type, span_type)
|
|
249
|
+
|
|
250
|
+
# Apply basic attribute mapping
|
|
251
|
+
for old_key, mapping in self.ATTRIBUTE_MAPPING.items():
|
|
252
|
+
if old_key in attributes:
|
|
253
|
+
if isinstance(mapping, tuple):
|
|
254
|
+
new_key, func = mapping
|
|
255
|
+
attributes[new_key] = func(attributes[old_key])
|
|
256
|
+
else:
|
|
257
|
+
new_key = mapping
|
|
258
|
+
attributes[new_key] = attributes[old_key]
|
|
259
|
+
|
|
260
|
+
# Apply detailed mapping based on SpanType
|
|
261
|
+
span_type = span_data.get("SpanType")
|
|
262
|
+
if span_type == "completion":
|
|
263
|
+
processed_attributes = self._map_llm_call_attributes(attributes)
|
|
264
|
+
elif span_type == "toolCall":
|
|
265
|
+
processed_attributes = self._map_tool_call_attributes(attributes)
|
|
266
|
+
else:
|
|
267
|
+
processed_attributes = attributes.copy()
|
|
268
|
+
|
|
269
|
+
span_data["Attributes"] = json.dumps(processed_attributes)
|
|
270
|
+
|
|
271
|
+
# Determine status based on error information
|
|
272
|
+
error = attributes.get("error") or attributes.get("exception.message")
|
|
273
|
+
status = self._determine_status(error)
|
|
274
|
+
span_data["Status"] = status
|
|
275
|
+
|
|
276
|
+
return span_data
|
|
277
|
+
|
|
278
|
+
def _build_url(self, span_list: list[Dict[str, Any]]) -> str:
|
|
279
|
+
"""Construct the URL for the API request."""
|
|
280
|
+
trace_id = str(span_list[0]["TraceId"])
|
|
281
|
+
return f"{self.base_url}/llmopstenant_/api/Traces/spans?traceId={trace_id}&source=Robots"
|
|
282
|
+
|
|
283
|
+
def _send_with_retries(
|
|
284
|
+
self, url: str, payload: list[Dict[str, Any]], max_retries: int = 4
|
|
285
|
+
) -> SpanExportResult:
|
|
286
|
+
"""Send the HTTP request with retry logic."""
|
|
287
|
+
for attempt in range(max_retries):
|
|
288
|
+
try:
|
|
289
|
+
response = self.http_client.post(url, json=payload)
|
|
290
|
+
if response.status_code == 200:
|
|
291
|
+
return SpanExportResult.SUCCESS
|
|
292
|
+
else:
|
|
293
|
+
logger.warning(
|
|
294
|
+
f"Attempt {attempt + 1} failed with status code {response.status_code}: {response.text}"
|
|
295
|
+
)
|
|
296
|
+
except Exception as e:
|
|
297
|
+
logger.error(f"Attempt {attempt + 1} failed with exception: {e}")
|
|
298
|
+
|
|
299
|
+
if attempt < max_retries - 1:
|
|
300
|
+
time.sleep(1.5**attempt) # Exponential backoff
|
|
301
|
+
|
|
302
|
+
return SpanExportResult.FAILURE
|
|
303
|
+
|
|
304
|
+
def _get_base_url(self) -> str:
|
|
305
|
+
uipath_url = (
|
|
306
|
+
os.environ.get("UIPATH_URL")
|
|
307
|
+
or "https://cloud.uipath.com/dummyOrg/dummyTennant/"
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
uipath_url = uipath_url.rstrip("/")
|
|
311
|
+
|
|
312
|
+
return uipath_url
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
class JsonLinesFileExporter(SpanExporter):
|
|
316
|
+
def __init__(self, file_path: str):
|
|
317
|
+
self.file_path = file_path
|
|
318
|
+
# Ensure the directory exists
|
|
319
|
+
dir_path = os.path.dirname(self.file_path)
|
|
320
|
+
if dir_path: # Only create if there's an actual directory path
|
|
321
|
+
os.makedirs(dir_path, exist_ok=True)
|
|
322
|
+
|
|
323
|
+
def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult:
|
|
324
|
+
try:
|
|
325
|
+
uipath_spans = [
|
|
326
|
+
_SpanUtils.otel_span_to_uipath_span(span).to_dict() for span in spans
|
|
327
|
+
]
|
|
328
|
+
|
|
329
|
+
with open(self.file_path, "a") as f:
|
|
330
|
+
for span in uipath_spans:
|
|
331
|
+
f.write(json.dumps(span) + "\n")
|
|
332
|
+
return SpanExportResult.SUCCESS
|
|
333
|
+
except Exception as e:
|
|
334
|
+
logger.error(f"Failed to export spans to {self.file_path}: {e}")
|
|
335
|
+
return SpanExportResult.FAILURE
|
|
336
|
+
|
|
337
|
+
def shutdown(self) -> None:
|
|
338
|
+
"""Shuts down the exporter."""
|
|
339
|
+
pass
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fileName": "default.json",
|
|
3
|
+
"id": "default-eval-set-id",
|
|
4
|
+
"name": "Basic Calculator Evaluation Set",
|
|
5
|
+
"batchSize": 10,
|
|
6
|
+
"evaluatorRefs": [
|
|
7
|
+
"equality"
|
|
8
|
+
],
|
|
9
|
+
"evaluations": [
|
|
10
|
+
{
|
|
11
|
+
"id": "test-addition",
|
|
12
|
+
"name": "Test Addition",
|
|
13
|
+
"inputs": {"foo": "bar"},
|
|
14
|
+
"expectedOutput": {"foo": "bar"},
|
|
15
|
+
"expectedAgentBehavior": "",
|
|
16
|
+
"evalSetId": "default-eval-set-id",
|
|
17
|
+
"createdAt": "2025-09-04T18:54:58.378Z",
|
|
18
|
+
"updatedAt": "2025-09-04T18:55:55.416Z"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"modelSettings": [],
|
|
22
|
+
"createdAt": "2025-09-04T18:54:58.379Z",
|
|
23
|
+
"updatedAt": "2025-09-04T18:55:55.416Z"
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fileName": "equality.json",
|
|
3
|
+
"id": "equality",
|
|
4
|
+
"name": "Equality Evaluator",
|
|
5
|
+
"description": "An evaluator that judges the agent based on expected output.",
|
|
6
|
+
"category": 0,
|
|
7
|
+
"type": 1,
|
|
8
|
+
"targetOutputKey": "*",
|
|
9
|
+
"createdAt": "2025-06-26T17:45:39.651Z",
|
|
10
|
+
"updatedAt": "2025-06-26T17:45:39.651Z"
|
|
11
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from uipath._cli._evals._evaluate import evaluate
|
|
5
|
+
from uipath._cli._evals._runtime import UiPathEvalContext
|
|
6
|
+
from uipath._cli._runtime._contracts import UiPathRuntimeContext, UiPathRuntimeFactory
|
|
7
|
+
from uipath._cli._runtime._runtime import UiPathRuntime
|
|
8
|
+
from uipath._events._event_bus import EventBus
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
async def test_evaluate():
|
|
12
|
+
# Arrange
|
|
13
|
+
event_bus = EventBus()
|
|
14
|
+
context = UiPathEvalContext(
|
|
15
|
+
eval_set=str(Path(__file__).parent / "evals" / "eval-sets" / "default.json")
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
async def identity(input: Any) -> Any:
|
|
19
|
+
return input
|
|
20
|
+
|
|
21
|
+
class MyFactory(UiPathRuntimeFactory[UiPathRuntime, UiPathRuntimeContext]):
|
|
22
|
+
def __init__(self):
|
|
23
|
+
super().__init__(
|
|
24
|
+
UiPathRuntime,
|
|
25
|
+
UiPathRuntimeContext,
|
|
26
|
+
runtime_generator=lambda context: UiPathRuntime(
|
|
27
|
+
context, executor=identity
|
|
28
|
+
),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# Act
|
|
32
|
+
result = await evaluate(MyFactory(), context, event_bus)
|
|
33
|
+
|
|
34
|
+
# Assert
|
|
35
|
+
assert result.output
|
|
36
|
+
assert (
|
|
37
|
+
result.output["evaluationSetResults"][0]["evaluationRunResults"][0]["result"][
|
|
38
|
+
"score"
|
|
39
|
+
]
|
|
40
|
+
== 100.0
|
|
41
|
+
)
|