uipath 2.1.105__tar.gz → 2.1.107__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.105 → uipath-2.1.107}/PKG-INFO +1 -1
- {uipath-2.1.105 → uipath-2.1.107}/pyproject.toml +1 -1
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_debug/_bridge.py +181 -13
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_debug/_runtime.py +21 -5
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_runtime/_contracts.py +1 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_resources/SDK_REFERENCE.md +1 -1
- uipath-2.1.107/src/uipath/_services/guardrails_service.py +76 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/llm_gateway_service.py +15 -2
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/models/agent.py +147 -2
- uipath-2.1.107/src/uipath/models/guardrails.py +246 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/tracing/_utils.py +18 -4
- {uipath-2.1.105 → uipath-2.1.107}/tests/agent/models/test_agent.py +59 -10
- uipath-2.1.107/tests/sdk/services/test_guardrails_service.py +114 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/tracing/test_traced.py +78 -0
- {uipath-2.1.105 → uipath-2.1.107}/uv.lock +1 -1
- uipath-2.1.105/src/uipath/models/guardrails.py +0 -469
- {uipath-2.1.105 → uipath-2.1.107}/.claude/agents/command-tester.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.claude/commands/prepare-pr.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.cursorrules +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.editorconfig +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.gitattributes +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/labeler.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/auto-label.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/integration_tests.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/test-uipath-langchain.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/test-uipath-llamaindex.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.github/workflows/test.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.gitignore +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.python-version +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.vscode/extensions.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.vscode/launch.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/.vscode/settings.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/CONTRIBUTING.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/LICENSE +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/README.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/AutomationSuite.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/FAQ.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/assets/favicon.png +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/assets/llms.txt +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/cli/index.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/actions.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/assets.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/attachments.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/buckets.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/connections.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/documents.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/documents_models.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/getting_started.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/jobs.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/processes.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/queues.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/core/traced.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/hooks.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/index.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/overrides/main.html +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/release_policy.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/justfile +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/mkdocs.yml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/py.typed +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/asset-modifier-agent/.env.example +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/asset-modifier-agent/README.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/asset-modifier-agent/input.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/asset-modifier-agent/main.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/asset-modifier-agent/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/asset-modifier-agent/uv.lock +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/calculator/README.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/calculator/evals/eval-sets/default.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/calculator/evals/evaluators/equality.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/calculator/main.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/calculator/uipath.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/scripts/debug_test.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/scripts/update_agents_md.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/_auth_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_evaluate.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_runtime.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/_span_collection.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/mocks/input_mocker.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/mocks/llm_mocker.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_evals/mocks/mocks.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_runtime/_runtime_factory.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_debug.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/models/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/models/runtime_schema.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_config.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_events/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_events/_event_bus.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_events/_events.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_resources/CLAUDE.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_resources/CLI_REFERENCE.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_resources/REQUIRED_STRUCTURE.md +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/documents_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/external_application_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_auth.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/_utils.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/models/evals.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/react/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/react/prompts.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/agent/react/tools.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/mocks/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/mocks/mockable.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/auth.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/documents.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/job.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/py.typed +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/src/uipath/utils/dynamic_schema.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/apicalls-testcase/main.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/apicalls-testcase/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/apicalls-testcase/run.sh +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/apicalls-testcase/src/assert.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/basic-testcase/main.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/basic-testcase/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/basic-testcase/run.sh +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/basic-testcase/src/assert.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/common/validate_output.sh +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/langchain-cross/agent.mermaid +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/langchain-cross/langgraph.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/langchain-cross/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/langchain-cross/run.sh +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/langchain-cross/src/assert.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/langchain-cross/src/main.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/llamaindex-cross/agent.mermaid +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/llamaindex-cross/llama_index.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/llamaindex-cross/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/llamaindex-cross/run.sh +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/llamaindex-cross/src/assert.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/testcases/llamaindex-cross/src/main.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/__init__.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/agent/models/test_evals.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/conftest.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/eval/evals/eval-sets/default.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/eval/evals/evaluators/equality.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/eval/mocks/test_input_mocker.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/eval/mocks/test_mocks.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/eval/test_evaluate.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/models/test_runtime_schema.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_init.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_new.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_oidc_utils.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_push.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_run.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/utils/test_dynamic_schema.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/conftest.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_documents_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_external_application_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.105 → uipath-2.1.107}/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.107
|
|
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.107"
|
|
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"
|
|
@@ -3,7 +3,8 @@ import json
|
|
|
3
3
|
import logging
|
|
4
4
|
import os
|
|
5
5
|
from abc import ABC, abstractmethod
|
|
6
|
-
from
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from typing import Any, Dict, List, Optional, Set
|
|
7
8
|
|
|
8
9
|
from pydantic import BaseModel
|
|
9
10
|
from pysignalr.client import SignalRClient
|
|
@@ -22,6 +23,50 @@ from uipath._events._events import UiPathAgentStateEvent
|
|
|
22
23
|
logger = logging.getLogger(__name__)
|
|
23
24
|
|
|
24
25
|
|
|
26
|
+
class DebuggerQuitException(Exception):
|
|
27
|
+
"""Raised when user quits the debugger."""
|
|
28
|
+
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class DebugCommand(str, Enum):
|
|
33
|
+
"""Available debug commands."""
|
|
34
|
+
|
|
35
|
+
CONTINUE = "continue"
|
|
36
|
+
STEP = "step"
|
|
37
|
+
BREAKPOINT = "breakpoint"
|
|
38
|
+
LIST_BREAKPOINTS = "list"
|
|
39
|
+
CLEAR_BREAKPOINT = "clear"
|
|
40
|
+
HELP = "help"
|
|
41
|
+
QUIT = "quit"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class DebuggerState:
|
|
45
|
+
"""Maintains debugger state across execution."""
|
|
46
|
+
|
|
47
|
+
def __init__(self):
|
|
48
|
+
self.breakpoints: Set[str] = set()
|
|
49
|
+
self.step_mode: bool = False
|
|
50
|
+
|
|
51
|
+
def add_breakpoint(self, node_name: str) -> None:
|
|
52
|
+
"""Add a breakpoint at a node."""
|
|
53
|
+
self.breakpoints.add(node_name)
|
|
54
|
+
|
|
55
|
+
def remove_breakpoint(self, node_name: str) -> None:
|
|
56
|
+
"""Remove a breakpoint from a node."""
|
|
57
|
+
self.breakpoints.discard(node_name)
|
|
58
|
+
|
|
59
|
+
def clear_all_breakpoints(self) -> None:
|
|
60
|
+
"""Clear all breakpoints."""
|
|
61
|
+
self.breakpoints.clear()
|
|
62
|
+
|
|
63
|
+
def should_break(self, node_name: str) -> bool:
|
|
64
|
+
"""Check if execution should break at this node."""
|
|
65
|
+
if self.step_mode:
|
|
66
|
+
return True
|
|
67
|
+
return node_name in self.breakpoints
|
|
68
|
+
|
|
69
|
+
|
|
25
70
|
class UiPathDebugBridge(ABC):
|
|
26
71
|
"""Abstract interface for debug communication.
|
|
27
72
|
|
|
@@ -77,6 +122,15 @@ class UiPathDebugBridge(ABC):
|
|
|
77
122
|
"""Wait for resume command from debugger."""
|
|
78
123
|
pass
|
|
79
124
|
|
|
125
|
+
@abstractmethod
|
|
126
|
+
def get_breakpoints(self) -> List[str]:
|
|
127
|
+
"""Get nodes to suspend execution at.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
List of node names to suspend at, or ["*"] for all nodes (step mode)
|
|
131
|
+
"""
|
|
132
|
+
pass
|
|
133
|
+
|
|
80
134
|
|
|
81
135
|
class ConsoleDebugBridge(UiPathDebugBridge):
|
|
82
136
|
"""Console-based debug bridge for local development."""
|
|
@@ -89,15 +143,12 @@ class ConsoleDebugBridge(UiPathDebugBridge):
|
|
|
89
143
|
"""
|
|
90
144
|
self.console = Console()
|
|
91
145
|
self.verbose = verbose
|
|
146
|
+
self.state = DebuggerState()
|
|
92
147
|
|
|
93
148
|
async def connect(self) -> None:
|
|
94
149
|
"""Connect to console debugger."""
|
|
95
150
|
self.console.print()
|
|
96
|
-
self.
|
|
97
|
-
self.console.print("[bold cyan]Debug Mode")
|
|
98
|
-
self.console.print("[dim]Press ENTER to continue | Type 'quit' to exit")
|
|
99
|
-
self.console.print("[bold cyan]─" * 40)
|
|
100
|
-
self.console.print()
|
|
151
|
+
self._print_help()
|
|
101
152
|
|
|
102
153
|
async def disconnect(self) -> None:
|
|
103
154
|
"""Cleanup."""
|
|
@@ -182,18 +233,128 @@ class ConsoleDebugBridge(UiPathDebugBridge):
|
|
|
182
233
|
|
|
183
234
|
async def wait_for_resume(self) -> Any:
|
|
184
235
|
"""Wait for user to press Enter or type commands."""
|
|
185
|
-
|
|
186
|
-
|
|
236
|
+
while True: # Keep looping until we get a resume command
|
|
237
|
+
self.console.print()
|
|
187
238
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
239
|
+
# Run input() in executor to not block async loop
|
|
240
|
+
loop = asyncio.get_running_loop()
|
|
241
|
+
user_input = await loop.run_in_executor(None, lambda: input("> "))
|
|
191
242
|
|
|
192
|
-
|
|
243
|
+
command_result = self._parse_command(user_input.strip())
|
|
244
|
+
|
|
245
|
+
# Handle commands that need another prompt
|
|
246
|
+
if command_result["command"] in [
|
|
247
|
+
DebugCommand.BREAKPOINT,
|
|
248
|
+
DebugCommand.LIST_BREAKPOINTS,
|
|
249
|
+
DebugCommand.CLEAR_BREAKPOINT,
|
|
250
|
+
DebugCommand.HELP,
|
|
251
|
+
]:
|
|
252
|
+
# These commands don't resume execution, loop again
|
|
253
|
+
continue
|
|
254
|
+
|
|
255
|
+
# Reset step modes if continuing
|
|
256
|
+
if command_result["command"] == DebugCommand.CONTINUE:
|
|
257
|
+
self.state.step_mode = False
|
|
258
|
+
|
|
259
|
+
if command_result["command"] == DebugCommand.QUIT:
|
|
260
|
+
raise DebuggerQuitException("User requested exit")
|
|
261
|
+
|
|
262
|
+
# Commands that resume execution: CONTINUE, STEP
|
|
263
|
+
self.console.print()
|
|
264
|
+
return command_result
|
|
265
|
+
|
|
266
|
+
def get_breakpoints(self) -> List[str]:
|
|
267
|
+
"""Get nodes to suspend execution at."""
|
|
268
|
+
if self.state.step_mode:
|
|
269
|
+
return ["*"] # Suspend at all nodes
|
|
270
|
+
return list(self.state.breakpoints) # Only suspend at breakpoints
|
|
271
|
+
|
|
272
|
+
def _parse_command(self, user_input: str) -> Dict[str, Any]:
|
|
273
|
+
"""Parse user command input.
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
Dict with 'command' and optional 'args'
|
|
277
|
+
"""
|
|
278
|
+
if not user_input:
|
|
279
|
+
return {"command": DebugCommand.CONTINUE, "args": None}
|
|
280
|
+
|
|
281
|
+
parts = user_input.lower().split()
|
|
282
|
+
cmd = parts[0]
|
|
283
|
+
args = parts[1:] if len(parts) > 1 else []
|
|
284
|
+
|
|
285
|
+
if cmd in ["c", "continue"]:
|
|
286
|
+
return {"command": DebugCommand.CONTINUE, "args": None}
|
|
287
|
+
|
|
288
|
+
elif cmd in ["s", "step"]:
|
|
289
|
+
self.state.step_mode = True
|
|
290
|
+
return {"command": DebugCommand.STEP, "args": None}
|
|
291
|
+
|
|
292
|
+
elif cmd in ["b", "break", "breakpoint"]:
|
|
293
|
+
if not args:
|
|
294
|
+
self.console.print(
|
|
295
|
+
"[red]Error: breakpoint command requires a node name[/red]"
|
|
296
|
+
)
|
|
297
|
+
return {"command": DebugCommand.HELP, "args": None}
|
|
298
|
+
node_name = " ".join(args)
|
|
299
|
+
self.state.add_breakpoint(node_name)
|
|
300
|
+
self.console.print(f"[green]✓ Breakpoint set at: {node_name}[/green]")
|
|
301
|
+
return {"command": DebugCommand.BREAKPOINT, "args": {"node": node_name}}
|
|
302
|
+
|
|
303
|
+
elif cmd in ["l", "list"]:
|
|
304
|
+
self._list_breakpoints()
|
|
305
|
+
return {"command": DebugCommand.LIST_BREAKPOINTS, "args": None}
|
|
306
|
+
|
|
307
|
+
elif cmd in ["r", "remove", "delete"]:
|
|
308
|
+
if not args:
|
|
309
|
+
self.console.print("[yellow]Removing all breakpoints[/yellow]")
|
|
310
|
+
self.state.clear_all_breakpoints()
|
|
311
|
+
else:
|
|
312
|
+
node_name = " ".join(args)
|
|
313
|
+
self.state.remove_breakpoint(node_name)
|
|
314
|
+
self.console.print(f"[green]✓ Breakpoint removed: {node_name}[/green]")
|
|
315
|
+
return {
|
|
316
|
+
"command": DebugCommand.CLEAR_BREAKPOINT,
|
|
317
|
+
"args": {"node": " ".join(args) if args else None},
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
elif cmd in ["q", "quit", "exit"]:
|
|
193
321
|
raise KeyboardInterrupt("User requested exit")
|
|
194
322
|
|
|
323
|
+
elif cmd in ["h", "help", "?"]:
|
|
324
|
+
self._print_help()
|
|
325
|
+
return {"command": DebugCommand.HELP, "args": None}
|
|
326
|
+
|
|
327
|
+
else:
|
|
328
|
+
self.console.print(f"[red]Unknown command: {cmd}[/red]")
|
|
329
|
+
self.console.print("[dim]Type 'help' for available commands[/dim]")
|
|
330
|
+
return {"command": DebugCommand.HELP, "args": None}
|
|
331
|
+
|
|
332
|
+
def _list_breakpoints(self) -> None:
|
|
333
|
+
"""List all active breakpoints."""
|
|
334
|
+
if not self.state.breakpoints:
|
|
335
|
+
self.console.print("[dim]No breakpoints set[/dim]")
|
|
336
|
+
else:
|
|
337
|
+
self.console.print("[yellow]Active breakpoints:[/yellow]")
|
|
338
|
+
for i, bp in enumerate(sorted(self.state.breakpoints), 1):
|
|
339
|
+
self.console.print(f" {i}. [cyan]{bp}[/cyan]")
|
|
340
|
+
|
|
341
|
+
def _print_help(self) -> None:
|
|
342
|
+
"""Print available commands."""
|
|
343
|
+
self.console.print("[bold cyan]Debug Mode Commands[/bold cyan]")
|
|
344
|
+
self.console.print(
|
|
345
|
+
" [yellow]c, continue[/yellow] Continue until next breakpoint"
|
|
346
|
+
)
|
|
347
|
+
self.console.print(" [yellow]s, step[/yellow] Step to next node")
|
|
348
|
+
self.console.print(
|
|
349
|
+
" [yellow]b <node>[/yellow] Set breakpoint at <node>"
|
|
350
|
+
)
|
|
351
|
+
self.console.print(" [yellow]l, list[/yellow] List all breakpoints")
|
|
352
|
+
self.console.print(
|
|
353
|
+
" [yellow]r <node>[/yellow] Remove breakpoint at <node>"
|
|
354
|
+
)
|
|
355
|
+
self.console.print(" [yellow]h, help[/yellow] Show help")
|
|
356
|
+
self.console.print(" [yellow]q, quit[/yellow] Exit debugger")
|
|
195
357
|
self.console.print()
|
|
196
|
-
return user_input
|
|
197
358
|
|
|
198
359
|
def _print_json(self, data: Dict[str, Any], label: str = "data") -> None:
|
|
199
360
|
"""Print JSON data with enhanced hierarchy."""
|
|
@@ -289,6 +450,7 @@ class SignalRDebugBridge(UiPathDebugBridge):
|
|
|
289
450
|
self.hub_url = hub_url
|
|
290
451
|
self.access_token = access_token
|
|
291
452
|
self.headers = headers or {}
|
|
453
|
+
self.state = DebuggerState()
|
|
292
454
|
self._client: Optional[SignalRClient] = None
|
|
293
455
|
self._connected_event = asyncio.Event()
|
|
294
456
|
self._resume_event: Optional[asyncio.Event] = None
|
|
@@ -396,6 +558,12 @@ class SignalRDebugBridge(UiPathDebugBridge):
|
|
|
396
558
|
logger.info("Resume command received")
|
|
397
559
|
return self._resume_data
|
|
398
560
|
|
|
561
|
+
def get_breakpoints(self) -> List[str]:
|
|
562
|
+
"""Get nodes to suspend execution at."""
|
|
563
|
+
if self.state.step_mode:
|
|
564
|
+
return ["*"] # Suspend at all nodes
|
|
565
|
+
return list(self.state.breakpoints) # Only suspend at breakpoints
|
|
566
|
+
|
|
399
567
|
async def _send(self, method: str, data: Dict[str, Any]) -> None:
|
|
400
568
|
"""Send message to SignalR hub."""
|
|
401
569
|
if not self._client:
|
|
@@ -11,9 +11,10 @@ from .._runtime._contracts import (
|
|
|
11
11
|
UiPathRuntimeContext,
|
|
12
12
|
UiPathRuntimeFactory,
|
|
13
13
|
UiPathRuntimeResult,
|
|
14
|
+
UiPathRuntimeStatus,
|
|
14
15
|
UiPathRuntimeStreamNotSupportedError,
|
|
15
16
|
)
|
|
16
|
-
from ._bridge import UiPathDebugBridge
|
|
17
|
+
from ._bridge import DebuggerQuitException, UiPathDebugBridge
|
|
17
18
|
|
|
18
19
|
logger = logging.getLogger(__name__)
|
|
19
20
|
|
|
@@ -91,8 +92,15 @@ class UiPathDebugRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
91
92
|
final_result: Optional[UiPathRuntimeResult] = None
|
|
92
93
|
execution_completed = False
|
|
93
94
|
|
|
95
|
+
# Starting in paused state - wait for breakpoints and resume
|
|
96
|
+
await self.debug_bridge.wait_for_resume()
|
|
97
|
+
|
|
94
98
|
# Keep streaming until execution completes (not just paused at breakpoint)
|
|
95
99
|
while not execution_completed:
|
|
100
|
+
# Update breakpoints from debug bridge
|
|
101
|
+
self._inner_runtime.context.breakpoints = (
|
|
102
|
+
self.debug_bridge.get_breakpoints()
|
|
103
|
+
)
|
|
96
104
|
# Stream events from inner runtime
|
|
97
105
|
async for event in self._inner_runtime.stream():
|
|
98
106
|
# Handle final result
|
|
@@ -101,10 +109,18 @@ class UiPathDebugRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
|
101
109
|
|
|
102
110
|
# Check if it's a breakpoint result
|
|
103
111
|
if isinstance(event, UiPathBreakpointResult):
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
112
|
+
try:
|
|
113
|
+
# Hit a breakpoint - wait for resume and continue
|
|
114
|
+
await self.debug_bridge.emit_breakpoint_hit(event)
|
|
115
|
+
await self.debug_bridge.wait_for_resume()
|
|
116
|
+
|
|
117
|
+
self._inner_runtime.context.resume = True
|
|
118
|
+
|
|
119
|
+
except DebuggerQuitException:
|
|
120
|
+
final_result = UiPathRuntimeResult(
|
|
121
|
+
status=UiPathRuntimeStatus.SUCCESSFUL,
|
|
122
|
+
)
|
|
123
|
+
execution_completed = True
|
|
108
124
|
else:
|
|
109
125
|
# Normal completion or suspension with dynamic interrupt
|
|
110
126
|
execution_completed = True
|
|
@@ -382,6 +382,7 @@ class UiPathRuntimeContext(BaseModel):
|
|
|
382
382
|
log_handler: Optional[logging.Handler] = None
|
|
383
383
|
chat_handler: Optional[UiPathConversationHandler] = None
|
|
384
384
|
is_conversational: Optional[bool] = None
|
|
385
|
+
breakpoints: Optional[List[str]] = None
|
|
385
386
|
|
|
386
387
|
model_config = {"arbitrary_types_allowed": True, "extra": "allow"}
|
|
387
388
|
|
|
@@ -339,7 +339,7 @@ Llm service
|
|
|
339
339
|
|
|
340
340
|
```python
|
|
341
341
|
# Generate chat completions using UiPath's normalized LLM Gateway API.
|
|
342
|
-
sdk.llm.chat_completions(messages: List[Dict[str, str]], model: str="gpt-4o-mini-2024-07-18", max_tokens: int=4096, temperature: float=0, n: int=1, frequency_penalty: float=0, presence_penalty: float=0, top_p: Optional[float]=1, top_k: Optional[int]=None, tools: Optional[List[uipath.models.llm_gateway.ToolDefinition]]=None, tool_choice: Union[uipath.models.llm_gateway.AutoToolChoice, uipath.models.llm_gateway.RequiredToolChoice, uipath.models.llm_gateway.SpecificToolChoice, Literal['auto', 'none'], NoneType]=None, response_format: Union[Dict[str, Any], type[pydantic.main.BaseModel], NoneType]=None, api_version: str="2024-08-01-preview")
|
|
342
|
+
sdk.llm.chat_completions(messages: Union[List[Dict[str, str]], List[tuple[str, str]]], model: str="gpt-4o-mini-2024-07-18", max_tokens: int=4096, temperature: float=0, n: int=1, frequency_penalty: float=0, presence_penalty: float=0, top_p: Optional[float]=1, top_k: Optional[int]=None, tools: Optional[List[uipath.models.llm_gateway.ToolDefinition]]=None, tool_choice: Union[uipath.models.llm_gateway.AutoToolChoice, uipath.models.llm_gateway.RequiredToolChoice, uipath.models.llm_gateway.SpecificToolChoice, Literal['auto', 'none'], NoneType]=None, response_format: Union[Dict[str, Any], type[pydantic.main.BaseModel], NoneType]=None, api_version: str="2024-08-01-preview")
|
|
343
343
|
|
|
344
344
|
```
|
|
345
345
|
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from typing import Any, Dict, Optional, Union
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
4
|
+
|
|
5
|
+
from .._config import Config
|
|
6
|
+
from .._execution_context import ExecutionContext
|
|
7
|
+
from .._folder_context import FolderContext
|
|
8
|
+
from .._utils import Endpoint, RequestSpec, header_folder
|
|
9
|
+
from ..models.guardrails import BuiltInValidatorGuardrail, Guardrail
|
|
10
|
+
from ..tracing import traced
|
|
11
|
+
from ._base_service import BaseService
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BuiltInGuardrailValidationResult(BaseModel):
|
|
15
|
+
"""Result from built-in guardrail validation."""
|
|
16
|
+
|
|
17
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
18
|
+
|
|
19
|
+
validation_passed: bool = Field(alias="validation_passed")
|
|
20
|
+
reason: str = Field(alias="reason")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class GuardrailViolationError(Exception):
|
|
24
|
+
"""Exception raised when guardrail validation fails."""
|
|
25
|
+
|
|
26
|
+
def __init__(self, detected_issue: Any):
|
|
27
|
+
self.detected_issue = detected_issue
|
|
28
|
+
super().__init__(f"Guardrail violation detected: {detected_issue}")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class GuardrailsService(FolderContext, BaseService):
|
|
32
|
+
"""Service for validating text against UiPath Guardrails."""
|
|
33
|
+
|
|
34
|
+
def __init__(self, config: Config, execution_context: ExecutionContext) -> None:
|
|
35
|
+
super().__init__(config=config, execution_context=execution_context)
|
|
36
|
+
|
|
37
|
+
@traced("evaluate_guardrail", run_type="uipath")
|
|
38
|
+
def evaluate_guardrail(
|
|
39
|
+
self,
|
|
40
|
+
input_data: Union[str, Dict[str, Any]],
|
|
41
|
+
guardrail: Guardrail,
|
|
42
|
+
*,
|
|
43
|
+
folder_key: Optional[str] = None,
|
|
44
|
+
folder_path: Optional[str] = None,
|
|
45
|
+
) -> BuiltInGuardrailValidationResult:
|
|
46
|
+
"""Call the API to validate input_data with the given guardrail.
|
|
47
|
+
|
|
48
|
+
Only supports built-in guardrails for now.
|
|
49
|
+
"""
|
|
50
|
+
if isinstance(guardrail, BuiltInValidatorGuardrail):
|
|
51
|
+
parameters = [
|
|
52
|
+
param.model_dump(by_alias=True)
|
|
53
|
+
for param in guardrail.validator_parameters
|
|
54
|
+
]
|
|
55
|
+
payload = {
|
|
56
|
+
"validator": guardrail.validator_type,
|
|
57
|
+
"input": input_data if isinstance(input_data, str) else str(input_data),
|
|
58
|
+
"parameters": parameters,
|
|
59
|
+
}
|
|
60
|
+
spec = RequestSpec(
|
|
61
|
+
method="POST",
|
|
62
|
+
endpoint=Endpoint("/agentsruntime_/api/execution/guardrails/validate"),
|
|
63
|
+
json=payload,
|
|
64
|
+
headers={**header_folder(folder_key, folder_path)},
|
|
65
|
+
)
|
|
66
|
+
response = self.request(
|
|
67
|
+
spec.method,
|
|
68
|
+
url=spec.endpoint,
|
|
69
|
+
json=spec.json,
|
|
70
|
+
headers=spec.headers,
|
|
71
|
+
)
|
|
72
|
+
return BuiltInGuardrailValidationResult.model_validate(response.json())
|
|
73
|
+
else:
|
|
74
|
+
raise NotImplementedError(
|
|
75
|
+
"Custom guardrail validation is not yet supported by the API."
|
|
76
|
+
)
|
|
@@ -344,7 +344,7 @@ class UiPathLlmChatService(BaseService):
|
|
|
344
344
|
@traced(name="llm_chat_completions", run_type="uipath")
|
|
345
345
|
async def chat_completions(
|
|
346
346
|
self,
|
|
347
|
-
messages: List[Dict[str, str]],
|
|
347
|
+
messages: Union[List[Dict[str, str]], List[tuple[str, str]]],
|
|
348
348
|
model: str = ChatModels.gpt_4o_mini_2024_07_18,
|
|
349
349
|
max_tokens: int = 4096,
|
|
350
350
|
temperature: float = 0,
|
|
@@ -475,13 +475,26 @@ class UiPathLlmChatService(BaseService):
|
|
|
475
475
|
This service uses UiPath's normalized API format which provides consistent
|
|
476
476
|
behavior across different underlying model providers and enhanced enterprise features.
|
|
477
477
|
"""
|
|
478
|
+
converted_messages = []
|
|
479
|
+
|
|
480
|
+
for message in messages:
|
|
481
|
+
if isinstance(message, tuple) and len(message) == 2:
|
|
482
|
+
role, content = message
|
|
483
|
+
converted_messages.append({"role": role, "content": content})
|
|
484
|
+
elif isinstance(message, dict):
|
|
485
|
+
converted_messages.append(message)
|
|
486
|
+
else:
|
|
487
|
+
raise ValueError(
|
|
488
|
+
f"Invalid message format: {message}. Expected tuple (role, content) or dict with 'role' and 'content' keys."
|
|
489
|
+
)
|
|
490
|
+
|
|
478
491
|
endpoint = EndpointManager.get_normalized_endpoint().format(
|
|
479
492
|
model=model, api_version=api_version
|
|
480
493
|
)
|
|
481
494
|
endpoint = Endpoint("/" + endpoint)
|
|
482
495
|
|
|
483
496
|
request_body = {
|
|
484
|
-
"messages":
|
|
497
|
+
"messages": converted_messages,
|
|
485
498
|
"max_tokens": max_tokens,
|
|
486
499
|
"temperature": temperature,
|
|
487
500
|
"n": n,
|
|
@@ -6,7 +6,11 @@ from typing import Annotated, Any, Dict, List, Literal, Optional, Union
|
|
|
6
6
|
from pydantic import BaseModel, ConfigDict, Discriminator, Field, Tag, field_validator
|
|
7
7
|
|
|
8
8
|
from uipath.models import Connection
|
|
9
|
-
from uipath.models.guardrails import
|
|
9
|
+
from uipath.models.guardrails import (
|
|
10
|
+
BuiltInValidatorGuardrail,
|
|
11
|
+
CustomGuardrail,
|
|
12
|
+
FieldReference,
|
|
13
|
+
)
|
|
10
14
|
|
|
11
15
|
|
|
12
16
|
class AgentResourceType(str, Enum):
|
|
@@ -132,6 +136,37 @@ class AgentProcessToolResourceConfig(BaseAgentToolResourceConfig):
|
|
|
132
136
|
)
|
|
133
137
|
|
|
134
138
|
|
|
139
|
+
class AgentEscalationRecipientType(str, Enum):
|
|
140
|
+
"""Enum for escalation recipient types."""
|
|
141
|
+
|
|
142
|
+
USER_ID = "UserId"
|
|
143
|
+
GROUP_ID = "GroupId"
|
|
144
|
+
USER_EMAIL = "UserEmail"
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class AgentEscalationRecipient(BaseModel):
|
|
148
|
+
"""Recipient for escalation."""
|
|
149
|
+
|
|
150
|
+
type: Union[AgentEscalationRecipientType, str] = Field(..., alias="type")
|
|
151
|
+
value: str = Field(..., alias="value")
|
|
152
|
+
display_name: Optional[str] = Field(default=None, alias="displayName")
|
|
153
|
+
|
|
154
|
+
@field_validator("type", mode="before")
|
|
155
|
+
@classmethod
|
|
156
|
+
def normalize_type(cls, v: Any) -> str:
|
|
157
|
+
"""Normalize recipient type from int (1=UserId, 2=GroupId, 3=UserEmail) or string. Unknown integers are converted to string."""
|
|
158
|
+
if isinstance(v, int):
|
|
159
|
+
mapping = {
|
|
160
|
+
1: AgentEscalationRecipientType.USER_ID,
|
|
161
|
+
2: AgentEscalationRecipientType.GROUP_ID,
|
|
162
|
+
3: AgentEscalationRecipientType.USER_EMAIL,
|
|
163
|
+
}
|
|
164
|
+
return mapping.get(v, str(v))
|
|
165
|
+
return v
|
|
166
|
+
|
|
167
|
+
model_config = ConfigDict(populate_by_name=True, extra="allow")
|
|
168
|
+
|
|
169
|
+
|
|
135
170
|
class AgentIntegrationToolParameter(BaseModel):
|
|
136
171
|
"""Agent integration tool parameter."""
|
|
137
172
|
|
|
@@ -479,6 +514,116 @@ class AgentSettings(BaseModel):
|
|
|
479
514
|
)
|
|
480
515
|
|
|
481
516
|
|
|
517
|
+
class AgentGuardrailActionType(str, Enum):
|
|
518
|
+
"""Action type enumeration."""
|
|
519
|
+
|
|
520
|
+
BLOCK = "block"
|
|
521
|
+
ESCALATE = "escalate"
|
|
522
|
+
FILTER = "filter"
|
|
523
|
+
LOG = "log"
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
class AgentGuardrailBlockAction(BaseModel):
|
|
527
|
+
"""Block action model."""
|
|
528
|
+
|
|
529
|
+
action_type: Literal["block"] = Field(alias="$actionType")
|
|
530
|
+
reason: str
|
|
531
|
+
|
|
532
|
+
model_config = ConfigDict(populate_by_name=True, extra="allow")
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
class AgentGuardrailFilterAction(BaseModel):
|
|
536
|
+
"""Filter action model."""
|
|
537
|
+
|
|
538
|
+
action_type: Literal["filter"] = Field(alias="$actionType")
|
|
539
|
+
fields: List[FieldReference]
|
|
540
|
+
|
|
541
|
+
model_config = ConfigDict(populate_by_name=True, extra="allow")
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
class AgentGuardrailSeverityLevel(str, Enum):
|
|
545
|
+
"""Severity level enumeration."""
|
|
546
|
+
|
|
547
|
+
ERROR = "Error"
|
|
548
|
+
INFO = "Info"
|
|
549
|
+
WARNING = "Warning"
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
class AgentGuardrailLogAction(BaseModel):
|
|
553
|
+
"""Log action model."""
|
|
554
|
+
|
|
555
|
+
action_type: Literal["log"] = Field(alias="$actionType")
|
|
556
|
+
message: str = Field(..., alias="message")
|
|
557
|
+
severity_level: AgentGuardrailSeverityLevel = Field(alias="severityLevel")
|
|
558
|
+
|
|
559
|
+
model_config = ConfigDict(populate_by_name=True, extra="allow")
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
class AgentGuardrailEscalateActionApp(BaseModel):
|
|
563
|
+
"""Escalate action app model."""
|
|
564
|
+
|
|
565
|
+
id: Optional[str] = None
|
|
566
|
+
version: int
|
|
567
|
+
name: str
|
|
568
|
+
folder_id: Optional[str] = Field(None, alias="folderId")
|
|
569
|
+
folder_name: str = Field(alias="folderName")
|
|
570
|
+
app_process_key: Optional[str] = Field(None, alias="appProcessKey")
|
|
571
|
+
runtime: Optional[str] = None
|
|
572
|
+
|
|
573
|
+
model_config = ConfigDict(populate_by_name=True, extra="allow")
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
class AgentGuardrailEscalateAction(BaseModel):
|
|
577
|
+
"""Escalate action model."""
|
|
578
|
+
|
|
579
|
+
action_type: Literal["escalate"] = Field(alias="$actionType")
|
|
580
|
+
app: AgentGuardrailEscalateActionApp
|
|
581
|
+
recipient: AgentEscalationRecipient
|
|
582
|
+
|
|
583
|
+
model_config = ConfigDict(populate_by_name=True, extra="allow")
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
GuardrailAction = Annotated[
|
|
587
|
+
Union[
|
|
588
|
+
AgentGuardrailBlockAction,
|
|
589
|
+
AgentGuardrailFilterAction,
|
|
590
|
+
AgentGuardrailLogAction,
|
|
591
|
+
AgentGuardrailEscalateAction,
|
|
592
|
+
],
|
|
593
|
+
Field(discriminator="action_type"),
|
|
594
|
+
]
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
class AgentCustomGuardrail(CustomGuardrail):
|
|
598
|
+
"""Agent custom guardrail with action capabilities."""
|
|
599
|
+
|
|
600
|
+
action: GuardrailAction = Field(
|
|
601
|
+
..., description="Action to take when guardrail is triggered"
|
|
602
|
+
)
|
|
603
|
+
|
|
604
|
+
model_config = ConfigDict(
|
|
605
|
+
validate_by_name=True, validate_by_alias=True, extra="allow"
|
|
606
|
+
)
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
class AgentBuiltInValidatorGuardrail(BuiltInValidatorGuardrail):
|
|
610
|
+
"""Agent built-in validator guardrail with action capabilities."""
|
|
611
|
+
|
|
612
|
+
action: GuardrailAction = Field(
|
|
613
|
+
..., description="Action to take when guardrail is triggered"
|
|
614
|
+
)
|
|
615
|
+
|
|
616
|
+
model_config = ConfigDict(
|
|
617
|
+
validate_by_name=True, validate_by_alias=True, extra="allow"
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
AgentGuardrail = Annotated[
|
|
622
|
+
Union[AgentCustomGuardrail, AgentBuiltInValidatorGuardrail],
|
|
623
|
+
Field(discriminator="guardrail_type"),
|
|
624
|
+
]
|
|
625
|
+
|
|
626
|
+
|
|
482
627
|
class BaseAgentDefinition(BaseModel):
|
|
483
628
|
"""Agent definition model."""
|
|
484
629
|
|
|
@@ -488,7 +633,7 @@ class BaseAgentDefinition(BaseModel):
|
|
|
488
633
|
output_schema: Dict[str, Any] = Field(
|
|
489
634
|
..., alias="outputSchema", description="JSON schema for output arguments"
|
|
490
635
|
)
|
|
491
|
-
guardrails: Optional[List[
|
|
636
|
+
guardrails: Optional[List[AgentGuardrail]] = Field(
|
|
492
637
|
None, description="List of agent guardrails"
|
|
493
638
|
)
|
|
494
639
|
|