feat: allow guardrail evaluation to carry attachment references - #1895
apetraru-uipath wants to merge 4 commits into
Conversation
Adds an optional `attachments` keyword to GuardrailsService.evaluate_guardrail and a GuardrailAttachment model (id, fileName, mimeType, url), so a caller can tell the guardrails backend which files a guardrail should inspect instead of the backend seeing only attachment metadata embedded in the payload string. Also forwards a 60s timeout when attachments are present. The default client timeout is 30s and RequestSpec.timeout was constructed but never passed, so a validate call that waits on server-side file fetching would have timed out. Backward compatible: without `attachments` — or with an empty list — the request body is byte-identical to today, so an older backend is unaffected. uipath-platform: 31 tests pass (+4); ruff, ruff format and mypy clean. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Carries the GuardrailAttachment model and the `attachments` argument on GuardrailsService.evaluate_guardrail. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
One or more issues must be addressed before approval.
Get a fresh assessment by requesting another Copilot review.
Pull request overview
Extends uipath-platform guardrail evaluation to send file attachment references to the backend.
Changes:
- Adds and exports
GuardrailAttachment. - Serializes attachments and applies an extended timeout.
- Adds tests and bumps the package version.
File summaries
| File | Description |
|---|---|
| packages/uipath-platform/tests/services/test_guardrails_service.py | Updated as part of this pull request. |
| packages/uipath-platform/src/uipath/platform/guardrails/guardrails.py | Updated as part of this pull request. |
| packages/uipath-platform/src/uipath/platform/guardrails/_guardrails_service.py | Updated as part of this pull request. |
| packages/uipath-platform/src/uipath/platform/guardrails/init.py | Updated as part of this pull request. |
| packages/uipath-platform/pyproject.toml | Updated as part of this pull request. |
Review details
- Files reviewed: 5/5 changed files
- Comments generated: 3
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| [project] | ||
| name = "uipath-platform" | ||
| version = "0.2.28" | ||
| version = "0.2.29" |
There was a problem hiding this comment.
Fixed in 49b5032 — all three lockfiles relocked; CI's uv lock --check is green.
🤖 Generated with Claude Code
| input_data: str | dict[str, Any], | ||
| guardrail: BuiltInValidatorGuardrail, | ||
| *, | ||
| attachments: list[GuardrailAttachment] | None = None, |
There was a problem hiding this comment.
Fixed in e831652: an input_processor redacts attachments[*].url before the span records inputs, leaving payload, guardrail and attachment identity intact. Two tests cover it, including a no-mutation check.
🤖 Generated with Claude Code
| if attachments: | ||
| request_kwargs["timeout"] = _ATTACHMENT_VALIDATE_TIMEOUT_SECONDS |
There was a problem hiding this comment.
Added in e831652: one test asserts the attachment-bearing call forwards timeout=60.0 (via httpx_mock request extensions), and one asserts the default path does not.
🤖 Generated with Claude Code
CI runs `uv lock --check`; bumping the version in pyproject.toml without regenerating the lockfiles left both packages/uipath-platform/uv.lock and packages/uipath/uv.lock stale (uipath resolves uipath-platform through [tool.uv.sources]). ruff check and ruff format clean across all three packages; guardrails service tests still 31 passed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@Traced records a function's arguments on the OpenTelemetry span by default, so every GuardrailAttachment.url — a short-lived SAS credential — was landing in input.value. Flagged by Copilot on #1895. An input_processor now replaces attachments[*].url with "<redacted>" and leaves everything else (payload, guardrail, attachment identity) intact; that is tighter than hide_input=True, which would drop the useful part of the span too. Also adds the two tests Copilot noted were missing: that an attachment-bearing evaluation forwards the 60s timeout, and that the default path does not. uipath-platform: 35 tests pass (+4); ruff, ruff format, mypy clean. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
🚨 Heads up:
|



What
Adds an optional
attachmentskeyword toGuardrailsService.evaluate_guardrailand aGuardrailAttachmentmodel (id,fileName,mimeType,url), so a caller can tell the guardrails backend which files a guardrail should inspect — rather than the backend seeing only attachment metadata embedded in the payload string.Bumps
uipath-platformto 0.2.29.Review fixes
e831652c— SAS urls no longer reach the trace span.@tracedrecords a function's arguments on the OpenTelemetry span by default, so everyGuardrailAttachment.url(a short-lived SAS credential) was landing ininput.value. Aninput_processornow redactsattachments[*].urland leaves the rest of the span intact — tighter thanhide_input=True. Thanks Copilot.49b50329— lockfiles relocked after the version bump (uv lock --checkin CI).Notes for reviewers
attachments, or with an empty list, the request body is byte-identical to today.RequestSpec.timeoutwas constructed but never forwarded, so this passes 60 s explicitly when attachments are present.Test plan
packages/uipath-platform— 35 tests pass (+8 over baseline).ruff check,ruff format --check,mypy src testsclean.Pairs with UiPath/Agents#6256.
🤖 Generated with Claude Code